diff --git a/package-lock.json b/package-lock.json index 3983c0b..f832c6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@tailwindcss/vite": "^4.1.17", "axios": "^1.13.2", "framer-motion": "^12.23.24", - "lightswind": "^3.1.15", + "lightswind": "^3.1.18", "lucide-react": "^0.553.0", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -1199,6 +1199,23 @@ "three": ">= 0.159.0" } }, + "node_modules/@motionone/types": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", + "license": "MIT" + }, + "node_modules/@motionone/utils": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", + "license": "MIT", + "dependencies": { + "@motionone/types": "^10.17.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "node_modules/@mui/core-downloads-tracker": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.5.tgz", @@ -2063,6 +2080,471 @@ "vite": "^5.2.0 || ^6 || ^7" } }, + "node_modules/@tsparticles/basic": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/basic/-/basic-3.9.1.tgz", + "integrity": "sha512-ijr2dHMx0IQHqhKW3qA8tfwrR2XYbbWYdaJMQuBo2CkwBVIhZ76U+H20Y492j/NXpd1FUnt2aC0l4CEVGVGdeQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1", + "@tsparticles/move-base": "3.9.1", + "@tsparticles/plugin-hex-color": "3.9.1", + "@tsparticles/plugin-hsl-color": "3.9.1", + "@tsparticles/plugin-rgb-color": "3.9.1", + "@tsparticles/shape-circle": "3.9.1", + "@tsparticles/updater-color": "3.9.1", + "@tsparticles/updater-opacity": "3.9.1", + "@tsparticles/updater-out-modes": "3.9.1", + "@tsparticles/updater-size": "3.9.1" + } + }, + "node_modules/@tsparticles/engine": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.9.1.tgz", + "integrity": "sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "hasInstallScript": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsparticles/interaction-external-attract": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-attract/-/interaction-external-attract-3.9.1.tgz", + "integrity": "sha512-5AJGmhzM9o4AVFV24WH5vSqMBzOXEOzIdGLIr+QJf4fRh9ZK62snsusv/ozKgs2KteRYQx+L7c5V3TqcDy2upg==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-bounce": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-bounce/-/interaction-external-bounce-3.9.1.tgz", + "integrity": "sha512-bv05+h70UIHOTWeTsTI1AeAmX6R3s8nnY74Ea6p6AbQjERzPYIa0XY19nq/hA7+Nrg+EissP5zgoYYeSphr85A==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-bubble": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-bubble/-/interaction-external-bubble-3.9.1.tgz", + "integrity": "sha512-tbd8ox/1GPl+zr+KyHQVV1bW88GE7OM6i4zql801YIlCDrl9wgTDdDFGIy9X7/cwTvTrCePhrfvdkUamXIribQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-connect": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-connect/-/interaction-external-connect-3.9.1.tgz", + "integrity": "sha512-sq8YfUNsIORjXHzzW7/AJQtfi/qDqLnYG2qOSE1WOsog39MD30RzmiOloejOkfNeUdcGUcfsDgpUuL3UhzFUOA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-grab": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-grab/-/interaction-external-grab-3.9.1.tgz", + "integrity": "sha512-QwXza+sMMWDaMiFxd8y2tJwUK6c+nNw554+/9+tEZeTTk2fCbB0IJ7p/TH6ZGWDL0vo2muK54Njv2fEey191ow==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-pause": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-pause/-/interaction-external-pause-3.9.1.tgz", + "integrity": "sha512-Gzv4/FeNir0U/tVM9zQCqV1k+IAgaFjDU3T30M1AeAsNGh/rCITV2wnT7TOGFkbcla27m4Yxa+Fuab8+8pzm+g==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-push": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-push/-/interaction-external-push-3.9.1.tgz", + "integrity": "sha512-GvnWF9Qy4YkZdx+WJL2iy9IcgLvzOIu3K7aLYJFsQPaxT8d9TF8WlpoMlWKnJID6H5q4JqQuMRKRyWH8aAKyQw==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-remove": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-remove/-/interaction-external-remove-3.9.1.tgz", + "integrity": "sha512-yPThm4UDWejDOWW5Qc8KnnS2EfSo5VFcJUQDWc1+Wcj17xe7vdSoiwwOORM0PmNBzdDpSKQrte/gUnoqaUMwOA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-repulse": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-repulse/-/interaction-external-repulse-3.9.1.tgz", + "integrity": "sha512-/LBppXkrMdvLHlEKWC7IykFhzrz+9nebT2fwSSFXK4plEBxDlIwnkDxd3FbVOAbnBvx4+L8+fbrEx+RvC8diAw==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-external-slow": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-slow/-/interaction-external-slow-3.9.1.tgz", + "integrity": "sha512-1ZYIR/udBwA9MdSCfgADsbDXKSFS0FMWuPWz7bm79g3sUxcYkihn+/hDhc6GXvNNR46V1ocJjrj0u6pAynS1KQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-particles-attract": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-attract/-/interaction-particles-attract-3.9.1.tgz", + "integrity": "sha512-CYYYowJuGwRLUixQcSU/48PTKM8fCUYThe0hXwQ+yRMLAn053VHzL7NNZzKqEIeEyt5oJoy9KcvubjKWbzMBLQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-particles-collisions": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-collisions/-/interaction-particles-collisions-3.9.1.tgz", + "integrity": "sha512-ggGyjW/3v1yxvYW1IF1EMT15M6w31y5zfNNUPkqd/IXRNPYvm0Z0ayhp+FKmz70M5p0UxxPIQHTvAv9Jqnuj8w==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/interaction-particles-links": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-links/-/interaction-particles-links-3.9.1.tgz", + "integrity": "sha512-MsLbMjy1vY5M5/hu/oa5OSRZAUz49H3+9EBMTIOThiX+a+vpl3sxc9AqNd9gMsPbM4WJlub8T6VBZdyvzez1Vg==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/move-base": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/move-base/-/move-base-3.9.1.tgz", + "integrity": "sha512-X4huBS27d8srpxwOxliWPUt+NtCwY+8q/cx1DvQxyqmTA8VFCGpcHNwtqiN+9JicgzOvSuaORVqUgwlsc7h4pQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/move-parallax": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/move-parallax/-/move-parallax-3.9.1.tgz", + "integrity": "sha512-whlOR0bVeyh6J/hvxf/QM3DqvNnITMiAQ0kro6saqSDItAVqg4pYxBfEsSOKq7EhjxNvfhhqR+pFMhp06zoCVA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/plugin-easing-quad": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/plugin-easing-quad/-/plugin-easing-quad-3.9.1.tgz", + "integrity": "sha512-C2UJOca5MTDXKUTBXj30Kiqr5UyID+xrY/LxicVWWZPczQW2bBxbIbfq9ULvzGDwBTxE2rdvIB8YFKmDYO45qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/plugin-hex-color": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/plugin-hex-color/-/plugin-hex-color-3.9.1.tgz", + "integrity": "sha512-vZgZ12AjUicJvk7AX4K2eAmKEQX/D1VEjEPFhyjbgI7A65eX72M465vVKIgNA6QArLZ1DLs7Z787LOE6GOBWsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/plugin-hsl-color": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/plugin-hsl-color/-/plugin-hsl-color-3.9.1.tgz", + "integrity": "sha512-jJd1iGgRwX6eeNjc1zUXiJivaqC5UE+SC2A3/NtHwwoQrkfxGWmRHOsVyLnOBRcCPgBp/FpdDe6DIDjCMO715w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/plugin-rgb-color": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/plugin-rgb-color/-/plugin-rgb-color-3.9.1.tgz", + "integrity": "sha512-SBxk7f1KBfXeTnnklbE2Hx4jBgh6I6HOtxb+Os1gTp0oaghZOkWcCD2dP4QbUu7fVNCMOcApPoMNC8RTFcy9wQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsparticles/react/-/react-3.0.0.tgz", + "integrity": "sha512-hjGEtTT1cwv6BcjL+GcVgH++KYs52bIuQGW3PWv7z3tMa8g0bd6RI/vWSLj7p//NZ3uTjEIeilYIUPBh7Jfq/Q==", + "peerDependencies": { + "@tsparticles/engine": "^3.0.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@tsparticles/shape-circle": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-circle/-/shape-circle-3.9.1.tgz", + "integrity": "sha512-DqZFLjbuhVn99WJ+A9ajz9YON72RtCcvubzq6qfjFmtwAK7frvQeb6iDTp6Ze9FUipluxVZWVRG4vWTxi2B+/g==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-emoji": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-emoji/-/shape-emoji-3.9.1.tgz", + "integrity": "sha512-ifvY63usuT+hipgVHb8gelBHSeF6ryPnMxAAEC1RGHhhXfpSRWMtE6ybr+pSsYU52M3G9+TF84v91pSwNrb9ZQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-image": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-image/-/shape-image-3.9.1.tgz", + "integrity": "sha512-fCA5eme8VF3oX8yNVUA0l2SLDKuiZObkijb0z3Ky0qj1HUEVlAuEMhhNDNB9E2iELTrWEix9z7BFMePp2CC7AA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-line": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-line/-/shape-line-3.9.1.tgz", + "integrity": "sha512-wT8NSp0N9HURyV05f371cHKcNTNqr0/cwUu6WhBzbshkYGy1KZUP9CpRIh5FCrBpTev34mEQfOXDycgfG0KiLQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-polygon": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-polygon/-/shape-polygon-3.9.1.tgz", + "integrity": "sha512-dA77PgZdoLwxnliH6XQM/zF0r4jhT01pw5y7XTeTqws++hg4rTLV9255k6R6eUqKq0FPSW1/WBsBIl7q/MmrqQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-square": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-square/-/shape-square-3.9.1.tgz", + "integrity": "sha512-DKGkDnRyZrAm7T2ipqNezJahSWs6xd9O5LQLe5vjrYm1qGwrFxJiQaAdlb00UNrexz1/SA7bEoIg4XKaFa7qhQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/shape-star": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/shape-star/-/shape-star-3.9.1.tgz", + "integrity": "sha512-kdMJpi8cdeb6vGrZVSxTG0JIjCwIenggqk0EYeKAwtOGZFBgL7eHhF2F6uu1oq8cJAbXPujEoabnLsz6mW8XaA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/slim": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/slim/-/slim-3.9.1.tgz", + "integrity": "sha512-CL5cDmADU7sDjRli0So+hY61VMbdroqbArmR9Av+c1Fisa5ytr6QD7Jv62iwU2S6rvgicEe9OyRmSy5GIefwZw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "license": "MIT", + "dependencies": { + "@tsparticles/basic": "3.9.1", + "@tsparticles/engine": "3.9.1", + "@tsparticles/interaction-external-attract": "3.9.1", + "@tsparticles/interaction-external-bounce": "3.9.1", + "@tsparticles/interaction-external-bubble": "3.9.1", + "@tsparticles/interaction-external-connect": "3.9.1", + "@tsparticles/interaction-external-grab": "3.9.1", + "@tsparticles/interaction-external-pause": "3.9.1", + "@tsparticles/interaction-external-push": "3.9.1", + "@tsparticles/interaction-external-remove": "3.9.1", + "@tsparticles/interaction-external-repulse": "3.9.1", + "@tsparticles/interaction-external-slow": "3.9.1", + "@tsparticles/interaction-particles-attract": "3.9.1", + "@tsparticles/interaction-particles-collisions": "3.9.1", + "@tsparticles/interaction-particles-links": "3.9.1", + "@tsparticles/move-parallax": "3.9.1", + "@tsparticles/plugin-easing-quad": "3.9.1", + "@tsparticles/shape-emoji": "3.9.1", + "@tsparticles/shape-image": "3.9.1", + "@tsparticles/shape-line": "3.9.1", + "@tsparticles/shape-polygon": "3.9.1", + "@tsparticles/shape-square": "3.9.1", + "@tsparticles/shape-star": "3.9.1", + "@tsparticles/updater-life": "3.9.1", + "@tsparticles/updater-rotate": "3.9.1", + "@tsparticles/updater-stroke-color": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-color": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-color/-/updater-color-3.9.1.tgz", + "integrity": "sha512-XGWdscrgEMA8L5E7exsE0f8/2zHKIqnTrZymcyuFBw2DCB6BIV+5z6qaNStpxrhq3DbIxxhqqcybqeOo7+Alpg==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-life": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-life/-/updater-life-3.9.1.tgz", + "integrity": "sha512-Oi8aF2RIwMMsjssUkCB6t3PRpENHjdZf6cX92WNfAuqXtQphr3OMAkYFJFWkvyPFK22AVy3p/cFt6KE5zXxwAA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-opacity": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-opacity/-/updater-opacity-3.9.1.tgz", + "integrity": "sha512-w778LQuRZJ+IoWzeRdrGykPYSSaTeWfBvLZ2XwYEkh/Ss961InOxZKIpcS6i5Kp/Zfw0fS1ZAuqeHwuj///Osw==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-out-modes": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-out-modes/-/updater-out-modes-3.9.1.tgz", + "integrity": "sha512-cKQEkAwbru+hhKF+GTsfbOvuBbx2DSB25CxOdhtW2wRvDBoCnngNdLw91rs+0Cex4tgEeibkebrIKFDDE6kELg==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-rotate": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-rotate/-/updater-rotate-3.9.1.tgz", + "integrity": "sha512-9BfKaGfp28JN82MF2qs6Ae/lJr9EColMfMTHqSKljblwbpVDHte4umuwKl3VjbRt87WD9MGtla66NTUYl+WxuQ==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-size": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-size/-/updater-size-3.9.1.tgz", + "integrity": "sha512-3NSVs0O2ApNKZXfd+y/zNhTXSFeG1Pw4peI8e6z/q5+XLbmue9oiEwoPy/tQLaark3oNj3JU7Q903ZijPyXSzw==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, + "node_modules/@tsparticles/updater-stroke-color": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/updater-stroke-color/-/updater-stroke-color-3.9.1.tgz", + "integrity": "sha512-3x14+C2is9pZYTg9T2TiA/aM1YMq4wLdYaZDcHm3qO30DZu5oeQq0rm/6w+QOGKYY1Z3Htg9rlSUZkhTHn7eDA==", + "license": "MIT", + "dependencies": { + "@tsparticles/engine": "3.9.1" + } + }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", @@ -2209,6 +2691,15 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", @@ -2320,6 +2811,12 @@ "meshoptimizer": "~0.22.0" } }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/@types/webxr": { "version": "0.5.24", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", @@ -2978,6 +3475,36 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3058,6 +3585,15 @@ "node": ">=6" } }, + "node_modules/cobe": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cobe/-/cobe-0.6.5.tgz", + "integrity": "sha512-MA8bu81EFY6JjQpj+FovEuhyJ25khx2Q7Lh+ot/UkCJe5yKyDgzdc6u2lGZIOmsZTXK6Itg1i4lQZIJZbPWnAg==", + "license": "MIT", + "dependencies": { + "phenomenon": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3096,6 +3632,16 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -3922,6 +4468,19 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -4023,6 +4582,19 @@ "dev": true, "license": "ISC" }, + "node_modules/flip-toolkit": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/flip-toolkit/-/flip-toolkit-7.2.4.tgz", + "integrity": "sha512-NT81ikyHPk72riMe1U01x698YIMSypMF5mQBhRklWVgf2xgWH3EPfrrVRAkz/+TSCq0rLPsr/uKIYkwHrowKZQ==", + "license": "MIT", + "dependencies": { + "rematrix": "0.2.2" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -4059,6 +4631,14 @@ "node": ">= 6" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/framer-motion": { "version": "12.23.24", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz", @@ -4279,6 +4859,33 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -4296,6 +4903,27 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, "node_modules/hls.js": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", @@ -4426,6 +5054,30 @@ "node": ">= 0.10" } }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4459,6 +5111,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4480,6 +5142,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4963,15 +5635,19 @@ } }, "node_modules/lightswind": { - "version": "3.1.15", - "resolved": "https://registry.npmjs.org/lightswind/-/lightswind-3.1.15.tgz", - "integrity": "sha512-9F1TWRADkw3Ti0jeM/aPhjV5We2KwXIPaoCPPCAp3nb8L4v+McMbIW7OAxiSYCqR6o3XwB/ioIsafwEbbYqiig==", + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/lightswind/-/lightswind-3.1.18.tgz", + "integrity": "sha512-rZuwzhgz9yAaapb6gatWTZ0Z6CMtAVGW29VgH8VIZ87i/AfSitgzf1KyVGUGwAeb8XsjkUJEaN7XZFru+mXW+A==", "license": "MIT", "dependencies": { + "@motionone/utils": "^10.18.0", "@react-three/drei": "^9.119.0", "@react-three/fiber": "^8.17.10", + "@tsparticles/react": "^3.0.0", + "@tsparticles/slim": "^3.8.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "cobe": "^0.6.4", "date-fns": "^3.6.0", "embla-carousel-react": "^8.3.0", "framer-motion": "^12.18.1", @@ -4979,10 +5655,14 @@ "gsap": "^3.12.7", "input-otp": "^1.4.2", "lucide-react": "^0.363.0", + "ogl": "^1.0.11", "react-day-picker": "^8.10.1", + "react-flip-toolkit": "^7.2.4", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.3", + "react-syntax-highlighter": "^15.6.1", "recharts": "^2.12.7", + "simplex-noise": "^4.0.3", "slick-carousel": "^1.8.1", "swiper": "^11.1.7", "tailwind-merge": "^2.2.0", @@ -5377,6 +6057,20 @@ "loose-envify": "cli.js" } }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5609,6 +6303,12 @@ "node": ">= 6" } }, + "node_modules/ogl": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz", + "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==", + "license": "Unlicense" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5680,6 +6380,24 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -5731,6 +6449,12 @@ "node": ">=8" } }, + "node_modules/phenomenon": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/phenomenon/-/phenomenon-1.6.0.tgz", + "integrity": "sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6005,6 +6729,15 @@ "node": ">= 0.8.0" } }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/promise-worker-transferable": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", @@ -6032,6 +6765,19 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6100,6 +6846,24 @@ "react": "^19.2.0" } }, + "node_modules/react-flip-toolkit": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-flip-toolkit/-/react-flip-toolkit-7.2.4.tgz", + "integrity": "sha512-+aZBZwzHBDfJzMRLjAAOKiBkrk8PV0YFVE0k1x85+UsykApLwg8a0LlQ5H80uFltFZmGtrQ7EE1krhiZ1jI5ig==", + "license": "MIT", + "dependencies": { + "flip-toolkit": "7.2.4", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">= 16.x", + "react-dom": ">= 16.x" + } + }, "node_modules/react-hook-form": { "version": "7.66.1", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.1.tgz", @@ -6208,6 +6972,23 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/react-syntax-highlighter": { + "version": "15.6.6", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", + "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -6322,6 +7103,36 @@ "node": ">= 0.10" } }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rematrix": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rematrix/-/rematrix-0.2.2.tgz", + "integrity": "sha512-agFFS3RzrLXJl5LY5xg/xYyXvUuVAnkhgKO7RaO9J1Ssth6yvbO+PIiV67V59MB5NCdAK2flvGvNT4mdKVniFA==", + "license": "MIT" + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6599,6 +7410,12 @@ "node": ">=8" } }, + "node_modules/simplex-noise": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/simplex-noise/-/simplex-noise-4.0.3.tgz", + "integrity": "sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==", + "license": "MIT" + }, "node_modules/slick-carousel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", @@ -6645,6 +7462,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stats-gl": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", @@ -7513,6 +8340,15 @@ "node": ">=0.10.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 4ff2cc0..6646263 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@tailwindcss/vite": "^4.1.17", "axios": "^1.13.2", "framer-motion": "^12.23.24", - "lightswind": "^3.1.15", + "lightswind": "^3.1.18", "lucide-react": "^0.553.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/src/App.css b/src/App.css index e69de29..ee2f7cd 100644 --- a/src/App.css +++ b/src/App.css @@ -0,0 +1,19 @@ +button{ + cursor: pointer; +} + +.body-bg { + background-image: url("./assets/images/bg3.jpg"); + background-size: contain; + background-position: center; + position: relative; + background-repeat: repeat; + height: 100%; +} + +.body-bg::before { + content: ""; + position: absolute; + inset: 0; + background: rgba(255, 255, 255, 0.7); /* white overlay */ +} diff --git a/src/assets/images/How_it_works.svg b/src/assets/images/How_it_works.svg new file mode 100644 index 0000000..27225b5 --- /dev/null +++ b/src/assets/images/How_it_works.svg @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/apppromo.png b/src/assets/images/apppromo.png new file mode 100644 index 0000000..6224399 Binary files /dev/null and b/src/assets/images/apppromo.png differ diff --git a/src/assets/images/bg.jpg b/src/assets/images/bg.jpg new file mode 100644 index 0000000..3c1a9b2 Binary files /dev/null and b/src/assets/images/bg.jpg differ diff --git a/src/assets/images/bg2.jpg b/src/assets/images/bg2.jpg new file mode 100644 index 0000000..c35656c Binary files /dev/null and b/src/assets/images/bg2.jpg differ diff --git a/src/assets/images/bg3.jpg b/src/assets/images/bg3.jpg new file mode 100644 index 0000000..e96ddea Binary files /dev/null and b/src/assets/images/bg3.jpg differ diff --git a/src/assets/images/nomoreimg.png b/src/assets/images/nomoreimg.png new file mode 100644 index 0000000..98c90b0 Binary files /dev/null and b/src/assets/images/nomoreimg.png differ diff --git a/src/assets/images/records-new-1.svg b/src/assets/images/records-new-1.svg new file mode 100644 index 0000000..b7ea37e --- /dev/null +++ b/src/assets/images/records-new-1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/images/records-new-2.svg b/src/assets/images/records-new-2.svg new file mode 100644 index 0000000..be90ac2 --- /dev/null +++ b/src/assets/images/records-new-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/records-new-3.svg b/src/assets/images/records-new-3.svg new file mode 100644 index 0000000..c3c72d6 --- /dev/null +++ b/src/assets/images/records-new-3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/trusted-couple-banner-img.avif b/src/assets/images/trusted-couple-banner-img.avif new file mode 100644 index 0000000..ada833a Binary files /dev/null and b/src/assets/images/trusted-couple-banner-img.avif differ diff --git a/src/components/common/BorderBeam.jsx b/src/components/common/BorderBeam.jsx new file mode 100644 index 0000000..9044283 --- /dev/null +++ b/src/components/common/BorderBeam.jsx @@ -0,0 +1,19 @@ +import { BorderBeam } from "../lightswind/border-beam"; + +export default function BorderBeamDemo() { + return ( +
+ +
+ Content with animated border +
+
+ ); +} \ No newline at end of file diff --git a/src/components/common/DemoScrollTrigger.jsx b/src/components/common/DemoScrollTrigger.jsx new file mode 100644 index 0000000..96a269c --- /dev/null +++ b/src/components/common/DemoScrollTrigger.jsx @@ -0,0 +1,18 @@ +export default function DemoScrollTrigger() { + return ( + + +
+ Item 1 +
+
+ Item 2 +
+
+ Item 3 +
+
+ {/* You can add more rows to create a 3D layered effect */} +
+ ); +} diff --git a/src/components/common/LandingHeader.jsx b/src/components/common/LandingHeader.jsx index b35cfee..b54298b 100644 --- a/src/components/common/LandingHeader.jsx +++ b/src/components/common/LandingHeader.jsx @@ -1,4 +1,3 @@ -import { useState } from "react"; import * as React from "react"; import AppBar from "@mui/material/AppBar"; import Box from "@mui/material/Box"; @@ -22,14 +21,102 @@ import Divider from "@mui/material/Divider"; import AdbIcon from "@mui/icons-material/Adb"; import ListItemIcon from "@mui/material/ListItemIcon"; import { InboxIcon, MailIcon } from "lucide-react"; - +import LazyImage from "./LazyImage"; +import Logo from "../../assets/images/logo.png" +import { Navigate, useNavigate } from "react-router-dom"; const pages = ["Matches", "Search", "Help"]; const settings = ["Profile", "Account", "Dashboard", "Logout"]; + +import { useState, useRef, useEffect } from 'react'; +import { Home, Search, Heart, MessageCircle, User, Settings } from 'lucide-react'; + +// Sparkle Navbar Component +const SparkleNavbar = ({ items, color = "#0fec1eff", onItemClick }) => { + const [activeIndex, setActiveIndex] = useState(0); + const [indicatorStyle, setIndicatorStyle] = useState({}); + const [isAnimating, setIsAnimating] = useState(false); + const navRef = useRef(null); + const buttonRefs = useRef([]); + + useEffect(() => { + updateIndicator(activeIndex); + }, []); + + const updateIndicator = (index) => { + const button = buttonRefs.current[index]; + if (button && navRef.current) { + const navRect = navRef.current.getBoundingClientRect(); + const btnRect = button.getBoundingClientRect(); + setIndicatorStyle({ + left: btnRect.left - navRect.left + btnRect.width / 2 - 18, + opacity: 1 + }); + } + }; + + const handleClick = (index) => { + if (index === activeIndex || isAnimating) return; + setIsAnimating(true); + const newButton = buttonRefs.current[index]; + + if (newButton && navRef.current) { + const navRect = navRef.current.getBoundingClientRect(); + const newRect = newButton.getBoundingClientRect(); + + setIndicatorStyle(prev => ({ + ...prev, + left: newRect.left - navRect.left + newRect.width / 2 - 18, + })); + + setTimeout(() => { + setActiveIndex(index); + setIsAnimating(false); + if (onItemClick) onItemClick(items[index], index); + }, 300); + } + }; + + return ( + + ); +}; + + const LandingHeader = () => { + const navigate = useNavigate(); const [drawerOpen, setDrawerOpen] = useState(false); const [anchorElUser, setAnchorElUser] = React.useState(null); - + const [selectedItem, setSelectedItem] = useState('Home'); const toggleDrawer = (open) => () => { setDrawerOpen(open); }; @@ -99,12 +186,11 @@ const LandingHeader = () => { return ( <> - + {/* Desktop Logo */} - - { fontFamily: "monospace", fontWeight: 700, letterSpacing: ".3rem", - color: "inherit", + color: "#000000", textDecoration: "none", position:"sticky", zIndex:"99" }} > LOGO - + */} + + + {/* Mobile Drawer Button */} - + {/* Mobile Logo */} - - + navigate("/")} + /> + + {/* { fontFamily: "monospace", fontWeight: 700, letterSpacing: ".3rem", - color: "inherit", + color: "#000000", textDecoration: "none", }} > LOGO - + */} {/* Desktop Menu */} - - {pages.map((page) => ( - - ))} + ))} */} + + setSelectedItem(item)} + /> {/* Avatar Menu */} diff --git a/src/components/common/MatrimonySwipeCards.jsx b/src/components/common/MatrimonySwipeCards.jsx new file mode 100644 index 0000000..60875b2 --- /dev/null +++ b/src/components/common/MatrimonySwipeCards.jsx @@ -0,0 +1,279 @@ +import { useState, useRef, useMemo } from 'react'; +import { Heart, X, RotateCcw, MapPin, Briefcase, GraduationCap } from 'lucide-react'; +import LazyImage from './LazyImage'; +import nomoreimg from "../../assets/images/nomoreimg.png"; +const TinderCard = ({ children, onSwipe, onCardLeftScreen, preventSwipe, className }) => { + const [pos, setPos] = useState({ x: 0, y: 0 }); + const [dragging, setDragging] = useState(false); + const [startPos, setStartPos] = useState({ x: 0, y: 0 }); + const [gone, setGone] = useState(false); + + const handleStart = (clientX, clientY) => { + if (gone) return; + setDragging(true); + setStartPos({ x: clientX - pos.x, y: clientY - pos.y }); + }; + + const handleMove = (clientX, clientY) => { + if (!dragging || gone) return; + setPos({ x: clientX - startPos.x, y: clientY - startPos.y }); + }; + + const handleEnd = () => { + if (gone) return; + setDragging(false); + if (Math.abs(pos.x) > 120) { + const dir = pos.x > 0 ? 'right' : 'left'; + if (onSwipe) onSwipe(dir); + setGone(true); + setTimeout(() => onCardLeftScreen && onCardLeftScreen(dir), 300); + } else { + setPos({ x: 0, y: 0 }); + } + }; + + if (gone) return null; + + const rotation = pos.x / 20; + const opacity = Math.min(Math.abs(pos.x) / 100, 1); + + return ( +
handleStart(e.clientX, e.clientY)} + onMouseMove={(e) => handleMove(e.clientX, e.clientY)} + onMouseUp={handleEnd} + onMouseLeave={() => dragging && handleEnd()} + onTouchStart={(e) => handleStart(e.touches[0].clientX, e.touches[0].clientY)} + onTouchMove={(e) => handleMove(e.touches[0].clientX, e.touches[0].clientY)} + onTouchEnd={handleEnd} + > + {pos.x > 50 && ( +
+ LIKE +
+ )} + {pos.x < -50 && ( +
+ NOPE +
+ )} + {children} +
+ ); +}; + +const profiles = [ + { + id: 1, + name: 'Priya Sharma', + age: 26, + location: 'Mumbai, India', + profession: 'Software Engineer', + education: 'B.Tech from IIT Bombay', + about: 'Love traveling, reading, and cooking. Looking for someone who values family.', + image: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=500&fit=crop' + }, + { + id: 2, + name: 'Ananya Patel', + age: 24, + location: 'Bangalore, India', + profession: 'Doctor', + education: 'MBBS from AIIMS', + about: 'Passionate about healthcare and music. Seeking a caring life partner.', + image: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=400&h=500&fit=crop' + }, + { + id: 3, + name: 'Neha Gupta', + age: 27, + location: 'Delhi, India', + profession: 'CA', + education: 'CA from ICAI', + about: 'Enjoy yoga and meditation. Looking for someone with similar values.', + image: 'https://images.unsplash.com/photo-1517841905240-472988babdf9?w=400&h=500&fit=crop' + }, + { + id: 4, + name: 'Kavya Reddy', + age: 25, + location: 'Hyderabad, India', + profession: 'Marketing Manager', + education: 'MBA from ISB', + about: 'Creative soul who loves art and dance. Seeking a supportive partner.', + image: 'https://images.unsplash.com/photo-1524504388940-b1c1722653e1?w=400&h=500&fit=crop' + } +]; + +export default function MatrimonySwipeCards() { + const [swipedCards, setSwipedCards] = useState(new Set()); + const [lastDirection, setLastDirection] = useState(''); + const [likedProfiles, setLikedProfiles] = useState([]); + const [dislikedProfiles, setDislikedProfiles] = useState([]); + const [key, setKey] = useState(0); + + const activeProfiles = profiles.filter(p => !swipedCards.has(p.id)); + const canSwipe = activeProfiles.length > 0; + + const swiped = (direction, profile) => { + setLastDirection(direction); + setSwipedCards(prev => new Set([...prev, profile.id])); + if (direction === 'right') { + setLikedProfiles(prev => [...prev, profile]); + } else { + setDislikedProfiles(prev => [...prev, profile]); + } + }; + + const swipe = (dir) => { + if (canSwipe) { + const topProfile = activeProfiles[activeProfiles.length - 1]; + swiped(dir, topProfile); + } + }; + + const reset = () => { + setSwipedCards(new Set()); + setLikedProfiles([]); + setDislikedProfiles([]); + setLastDirection(''); + setKey(prev => prev + 1); + }; + + return ( +
+
+ {/*

+ ๐Ÿ’ Find Your Match +

+

+ Swipe right to like, left to pass +

*/} + + {/* Card Container with overflow hidden */} +
+
+ {!canSwipe ? ( +
+

No more profiles!

+ + +
+ ) : ( + profiles + .filter(p => !swipedCards.has(p.id)) + .map((profile, index) => ( + swiped(dir, profile)} + onCardLeftScreen={() => {}} + preventSwipe={['up', 'down']} + className="absolute w-full max-w-sm cursor-grab active:cursor-grabbing" + > +
+
+ {profile.name} +
+

+ {profile.name}, {profile.age} +

+
+
+ +
+
+ + {profile.location} +
+
+ + {profile.profession} +
+
+ + {profile.education} +
+

+ {profile.about} +

+
+
+
+ )) + )} +
+
+ + {/* Action Buttons */} + {canSwipe && ( +
+ + + +
+ )} + + {/* Stats */} + {/*
+
+

๐Ÿ‘ Liked: {likedProfiles.length}

+
+
+

๐Ÿ‘Ž Passed: {dislikedProfiles.length}

+
+
*/} + + {/* Liked Profiles Preview */} + {/* {likedProfiles.length > 0 && ( +
+

๐Ÿ’š Your Likes

+
+ {likedProfiles.map(p => ( +
+ {p.name} + {p.name.split(' ')[0]} +
+ ))} +
+
+ )} */} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/common/Threemarquee.jsx b/src/components/common/Threemarquee.jsx new file mode 100644 index 0000000..6fb4125 --- /dev/null +++ b/src/components/common/Threemarquee.jsx @@ -0,0 +1,133 @@ +import ThreeDScrollTriggerRow, { + ThreeDScrollTriggerContainer, +} from "../lightswind/ThreeDScrollTrigger"; +import React, { useState } from "react"; +const reviews = [ + { + name: "Aria Thompson", + company: "CreativePixel Studio", + image: + "https://images.unsplash.com/photo-1517841905240-472988babdf9?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "Lightswind UI has completely changed how we design modern interfaces. Every component feels elegant, responsive, and intuitive.", + }, + { + name: "Ethan Rivera", + company: "CodeLoom Technologies", + image: + "https://images.unsplash.com/photo-1465101162946-4377e57745c3?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "The customization options in Lightswind UI are unmatched. We built an entire SaaS dashboard in days instead of weeks.", + }, + { + name: "Liam Patel", + company: "NextGen Interfaces", + image: + "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "From landing pages to complex dashboards, Lightswind UI makes building visually consistent UIs effortless and fun.", + }, + { + name: "Liam Patel", + company: "NextGen Interfaces", + image: + "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "From landing pages to complex dashboards, Lightswind UI makes building visually consistent UIs effortless and fun.", + }, + { + name: "Liam Patel", + company: "NextGen Interfaces", + image: + "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "From landing pages to complex dashboards, Lightswind UI makes building visually consistent UIs effortless and fun.", + }, + { + name: "Liam Patel", + company: "NextGen Interfaces", + image: + "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "From landing pages to complex dashboards, Lightswind UI makes building visually consistent UIs effortless and fun.", + }, + { + name: "Liam Patel", + company: "NextGen Interfaces", + image: + "https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?auto=format&fit=facearea&w=96&h=96&facepad=2", + review: + "From landing pages to complex dashboards, Lightswind UI makes building visually consistent UIs effortless and fun.", + }, +]; + +export default function ThreeScrollTrigger() { + // Split reviews across 3 rows for masonry feel + // Split reviews across 3 rows + const row1 = [reviews[0], reviews[1]]; + const row2 = [reviews[2], reviews[3]]; + const row3 = [reviews[4], reviews[5], reviews[6]]; + const [paused, setPaused] = useState(false); + return ( +
+ + + + +
+ {row1.map((rev, idx) => ( + setPaused(true)} + onMouseLeave={() => setPaused(false)} + /> + ))} +
+
+ + +
+ {row2.map((rev, idx) => ( + setPaused(true)} + onMouseLeave={() => setPaused(false)} /> + ))} +
+
+ + +
+ {row3.map((rev, idx) => ( + setPaused(true)} + onMouseLeave={() => setPaused(false)} /> + ))} +
+
+
+
+ ); +} + +// Card component for clarity and reuse +function ReviewCard({ name, company, image, review ,onMouseEnter, onMouseLeave}) { + return ( +
+
+ {name} +
+
{name}
+
{company}
+
+
+
+ {review} +
+
+ ); +} diff --git a/src/components/landing/AppPromoteSection.jsx b/src/components/landing/AppPromoteSection.jsx index beb6d7c..8104bca 100644 --- a/src/components/landing/AppPromoteSection.jsx +++ b/src/components/landing/AppPromoteSection.jsx @@ -1,11 +1,23 @@ +import { useState, useEffect } from "react"; +import { motion } from "framer-motion"; +import { + Users, + Shield, + Lock, + Download, + Smartphone, + QrCode, +} from "lucide-react"; +import { BorderBeam } from "../lightswind/border-beam"; +import LazyImage from "../common/LazyImage"; +import records1 from "../../assets/images/records-new-1.svg" +import records2 from "../../assets/images/records-new-2.svg" -import { useState, useEffect } from 'react'; -import { motion } from 'framer-motion'; -import { Users, Shield, Lock, Download, Smartphone, QrCode } from 'lucide-react'; +import records3 from "../../assets/images/records-new-3.svg" +import MatrimonySwipeCards from "../common/MatrimonySwipeCards"; const AppPromoteSection = () => { - - const [isVisible, setIsVisible] = useState(false); + const [isVisible, setIsVisible] = useState(false); useEffect(() => { setIsVisible(true); @@ -13,11 +25,11 @@ const AppPromoteSection = () => { const fadeInUp = { hidden: { opacity: 0, y: 60 }, - visible: { - opacity: 1, + visible: { + opacity: 1, y: 0, - transition: { duration: 0.6, ease: "easeOut" } - } + transition: { duration: 0.6, ease: "easeOut" }, + }, }; const staggerContainer = { @@ -25,317 +37,248 @@ const AppPromoteSection = () => { visible: { opacity: 1, transition: { - staggerChildren: 0.2 - } - } + staggerChildren: 0.2, + }, + }, }; const scaleIn = { hidden: { opacity: 0, scale: 0.8 }, - visible: { - opacity: 1, + visible: { + opacity: 1, scale: 1, - transition: { duration: 0.5 } - } + transition: { duration: 0.5 }, + }, }; const features = [ { - icon: , + icon: records1, title: "100% Screened Profiles", - description: "Search by location, community, profession & more from lakhs of active profiles", - color: "bg-pink-50 dark:bg-pink-900/20" + description: + "Search by location, community, profession & more from lakhs of active profiles", + color: "bg-pink-50 dark:bg-pink-900/20", }, { - icon: , + icon: records2, title: "Verifications by Personal Visit", - description: "Special listing for profiles verified by our agents through personal visits", - color: "bg-blue-50 dark:bg-blue-900/20" + description: + "Special listing for profiles verified by our agents through personal visits", + color: "bg-blue-50 dark:bg-blue-900/20", }, { - icon: , + icon: records3, title: "Control over Privacy", - description: "Restrict unwanted access to contact details & photos/videos", - color: "bg-purple-50 dark:bg-purple-900/20" - } + description: + "Restrict unwanted access to contact details & photos/videos", + color: "bg-purple-50 dark:bg-purple-900/20", + }, ]; return ( <> - -
- {/* Hero Section */} -
- {/* Background Image with Overlay */} -
+
-
-
- - {/* Content */} -
- - + {/* Background Image with Overlay */} +
- MORE THAN 25 YEARS OF - - - Bringing People Together - - + {/*
*/} +
- {/* Features Grid */} - - {features.map((feature, index) => ( + {/* Content */} +
- - {feature.icon} - -

- {feature.title} -

-

- {feature.description} -

+ Bringing People{" "} + Together + */}
- ))} - -
-
- {/* App Download Section */} -
-
-
- {/* Left Content */} - -

- Download the Jeevansathi app -

-

- Connect with your matches anytime, anywhere -

- -
-

- Point your phone camera at the QR code or use
one of the download links below -

- - {/* QR Code */} -
- -
- -
-
-
- - {/* Download Buttons */} -
- - -
-
GET IT ON
-
Google Play
-
-
- - - -
-
Download on the
-
App Store
-
-
-
- -

- - Or get a download link - - on your SMS/Email -

-
-
- - {/* Right - Phone Mockup */} - -
- {/* Phone Frame */} - -
-
- {/* Phone Screen Content */} -
-
-

My Matches

-
-
-
-
- - {/* Profile Cards */} -
- {[1, 2].map((i) => ( - -
-
-
-

Profile Name

-

25 yrs, 5'6"

-
-
-
- - -
-
- ))} -
- - {/* Features Tags */} -
- - โœ“ Easy Verification - - - โœ“ Voice & Video Calls - -
-
+ {/* Features Grid */} + + {features.map((feature, index) => ( +
+ +
+ + + + +

+ {feature.title} +

+

+ {feature.description} +

+
+ ))} +
+
+
+ + {/* App Download Section */} +
+
+
+ {/* Left Content */} + + +

+ Connect with your matches anytime, anywhere +

+

+ Impress your matches with instant chats! +

+ + +
+ {/* Jeevansathi Match Hour */} +
+

+ Jeevansathi Match Hour +

+

+ Register to join an online event to connect with members of your community in a short time +

+
+ + + {/* Voice & Video Calling */} + +
+

+ Voice & Video Calling +

+

+ Enjoy secure conversations using our voice & video calling services without revealing your number +

+
+ + + + {/* Introducing Video Profiles */} + +
+

+ Introducing Video Profiles +

+

+ Stand out amongst others and engage faster! Introduce yourself by adding a video to your profile +

+
+ +
+
- {/* Download Badge */} - -

10M+ downloads

+ + +
- -
+
+ + + {/* Stats Section */} + +
+
+ {[ + { number: "25+", label: "Years of Trust" }, + { number: "10M+", label: "Happy Users" }, + { number: "100%", label: "Verified Profiles" }, + { number: "24/7", label: "Support" }, + ].map((stat, index) => ( + + + {stat.number} + +

+ {stat.label} +

+
+ ))} +
+
+
- - {/* Stats Section */} - -
-
- {[ - { number: "25+", label: "Years of Trust" }, - { number: "10M+", label: "Happy Users" }, - { number: "100%", label: "Verified Profiles" }, - { number: "24/7", label: "Support" } - ].map((stat, index) => ( - - - {stat.number} - -

{stat.label}

-
- ))} -
-
-
- - - ) -} + ); +}; -export default AppPromoteSection +export default AppPromoteSection; diff --git a/src/components/landing/AppQRCode.jsx b/src/components/landing/AppQRCode.jsx new file mode 100644 index 0000000..4cf2191 --- /dev/null +++ b/src/components/landing/AppQRCode.jsx @@ -0,0 +1,191 @@ +import { Star, StarBorder } from '@mui/icons-material'; +import apppromo from "../../assets/images/apppromo.png"; +import LazyImage from '../common/LazyImage'; +const AppQRCode = () => { + return ( + <> +
+
+
+ {/* Left Content Section */} +
+ {/* QR Code */} +
+ QR Code +
+ + {/* Heading */} +
+

+ To speed up your partner
search, download +

+

+ Thirukalyanam App +

+
+ + {/* App Store Buttons */} + + + {/* App Info */} +
+

+ Thirukalyanam Matrimonyยฎ - Official & Trusted Matrimony App +

+

+ 1M+ Downloads +

+ + {/* Rating */} +
+ 4.2 +
+ {[...Array(4)].map((_, i) => ( + + ))} + +
+
+

+ Based on Customer Reviews +

+
+
+ + {/* Right Mobile Mockup Section */} + {/*
+
+ +
+
+
+
+ Profile +
+ + + +
+ Thumb +
+
+
+
+

Pragati Ram

+

27 Yrs, 5 ft 5 in

+

B.Sc, Computer Science

+

Administrative Professional

+
+ + +
+
+
+
+ +
+
+
+
+ Regular + PRIME +
+ +
+
+
+
+

Arjun

+

Mahadewan

+
+
+
+

All matches (9524)

+
+
+ Match 1 +

Priyanka Sani...

+

28 Yrs, 5'7"

+
+
+ Match 2 +

Karthika

+

26 Yrs, 5'4"

+
+
+
+
+

New matches (524)

+
+
+
+
+
+
+
+
+
*/} + +
+ + +
+ +
+
+
+ + + ) +} + +export default AppQRCode diff --git a/src/components/lightswind/ThreeDScrollTrigger.jsx b/src/components/lightswind/ThreeDScrollTrigger.jsx new file mode 100644 index 0000000..8348b00 --- /dev/null +++ b/src/components/lightswind/ThreeDScrollTrigger.jsx @@ -0,0 +1,193 @@ +"use client"; + +import React, { + useRef, + useEffect, + useState, + useMemo, + useContext, +} from "react"; +import { + motion, + useAnimationFrame, + useMotionValue, + useScroll, + useSpring, + useTransform, + useVelocity, +} from "framer-motion"; + +// Utility for merging classnames (replace with own utility if needed) +function cn(...classes) { + return classes.filter(Boolean).join(" "); +} + +// Utility: wrap +export const wrap = (min, max, v) => { + const rangeSize = max - min; + return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min; +}; + +// Context to share velocity +const ThreeDScrollTriggerContext = React.createContext(null); + +// Container providing velocity +export function ThreeDScrollTriggerContainer({ children, className, ...props }) { + const { scrollY } = useScroll(); + const scrollVelocity = useVelocity(scrollY); + const smoothVelocity = useSpring(scrollVelocity, { + damping: 50, + stiffness: 400, + }); + + // map to bounded factor [-5...5] + const velocityFactor = useTransform(smoothVelocity, (v) => { + const sign = v < 0 ? -1 : 1; + const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5); + return sign * magnitude; + }); + + return ( + +
+ {children} +
+
+ ); +} + +// Row chooses shared or local velocity +export function ThreeDScrollTriggerRow(props) { + const sharedVelocityFactor = useContext(ThreeDScrollTriggerContext); + if (sharedVelocityFactor) { + return ( + + ); + } + return ; +} + +// Row implementation +function ThreeDScrollTriggerRowImpl({ + children, + baseVelocity = 5, + direction = 1, + paused = false, + className, + velocityFactor, + ...props +}) { + const containerRef = useRef(null); + const [numCopies, setNumCopies] = useState(3); + const x = useMotionValue(0); + + const prevTimeRef = useRef(null); + const unitWidthRef = useRef(0); + const baseXRef = useRef(0); + + // Memoized children + const childrenArray = useMemo(() => React.Children.toArray(children), [children]); + + const BlockContent = useMemo(() => ( +
+ {childrenArray} +
+ ), [childrenArray]); + + // Measure block width + useEffect(() => { + const container = containerRef.current; + if (!container) return; + const block = container.querySelector(".threed-scroll-trigger-block"); + if (block) { + unitWidthRef.current = block.scrollWidth; + const containerWidth = container.offsetWidth; + const needed = Math.max(3, Math.ceil(containerWidth / unitWidthRef.current) + 2); + setNumCopies(needed); + } + }, [childrenArray]); + + // Animation loop + useAnimationFrame((time) => { + if (paused) return; // <--- THIS STOPS SCROLL WHEN PAUSED + if (prevTimeRef.current == null) prevTimeRef.current = time; + const dt = Math.max(0, (time - prevTimeRef.current) / 1000); + prevTimeRef.current = time; + + const unitWidth = unitWidthRef.current; + if (unitWidth <= 0) return; + + const velocity = velocityFactor.get(); + const speedMultiplier = Math.min(5, Math.abs(velocity)); + const scrollDirection = velocity >= 0 ? 1 : -1; + const currentDirection = direction * scrollDirection; + + const pixelsPerSecond = (unitWidth * baseVelocity) / 100; + const moveBy = currentDirection * pixelsPerSecond * (1 + speedMultiplier) * dt; + + const newX = baseXRef.current + moveBy; + + // Proper wrapping in both directions + if (newX >= unitWidth) { + baseXRef.current = newX % unitWidth; + } else if (newX <= 0) { + baseXRef.current = unitWidth + (newX % unitWidth); + } else { + baseXRef.current = newX; + } + + x.set(baseXRef.current); + }); + + const xTransform = useTransform(x, (v) => `translate3d(${-v}px,0,0)`); + + return ( +
+ + {Array.from({ length: numCopies }).map((_, i) => ( +
+ {BlockContent} +
+ ))} +
+
+ ); +} + +// Local row: if no shared velocity +function ThreeDScrollTriggerRowLocal(props) { + const { scrollY } = useScroll(); + const localVelocity = useVelocity(scrollY); + const localSmoothVelocity = useSpring(localVelocity, { + damping: 50, + stiffness: 400, + }); + const localVelocityFactor = useTransform(localSmoothVelocity, (v) => { + const sign = v < 0 ? -1 : 1; + const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5); + return sign * magnitude; + }); + + return ( + + ); +} + +// Optionally export default +export default ThreeDScrollTriggerRow; diff --git a/src/components/lightswind/border-beam.jsx b/src/components/lightswind/border-beam.jsx new file mode 100644 index 0000000..431755f --- /dev/null +++ b/src/components/lightswind/border-beam.jsx @@ -0,0 +1,72 @@ +"use client"; + +import { motion } from "framer-motion"; + +export const BorderBeam = ({ + className, + size = 50, + delay = 0, + duration = 6, + colorFrom = "#7400ff", + colorTo = "#9b41ff", + transition, + style, + reverse = false, + initialOffset = 0, + borderThickness = 5, + opacity = 1, + glowIntensity = 0, + beamBorderRadius, + pauseOnHover = false, + speedMultiplier = 1, +}) => { + + // Calculate actual duration + const actualDuration = speedMultiplier ? duration / speedMultiplier : duration; + + // Glow shadow + const glowEffect = + glowIntensity > 0 + ? `0 0 ${glowIntensity * 5}px ${glowIntensity * 2}px var(--color-from)` + : undefined; + + return ( +
+ +
+ ); +}; diff --git a/src/components/ui/ThreeDMarquee.jsx b/src/components/ui/ThreeDMarquee.jsx index 05d0a76..5c58e71 100644 --- a/src/components/ui/ThreeDMarquee.jsx +++ b/src/components/ui/ThreeDMarquee.jsx @@ -21,14 +21,14 @@ const ThreeDMarquee = ({ images = [], className = "", cols = 4, onImageClick }) return (
-
+

Now, chat for free !

Finding your perfect match just become easier

diff --git a/src/index.css b/src/index.css index a041a74..aad5ae9 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,3 @@ @import "tailwindcss"; - +@plugin "lightswind/plugin"; diff --git a/src/layout/LandingLayout.jsx b/src/layout/LandingLayout.jsx index cdba822..d3ebaf9 100644 --- a/src/layout/LandingLayout.jsx +++ b/src/layout/LandingLayout.jsx @@ -4,7 +4,7 @@ const LandingLayout = () => { return ( <> -
+
diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index de7d92d..cc3c8dc 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -12,6 +12,10 @@ import wedding9 from "../assets/images/wedding9.avif"; import wedding10 from "../assets/images/wedding10.jpg"; import wedding11 from "../assets/images/wedding11.jpg"; import wedding12 from "../assets/images/wedding12.avif"; +import MatrimonySwipeCards from "../components/common/MatrimonySwipeCards"; +import ThreeScrollTrigger from "../components/common/Threemarquee"; +import AppQRCode from "../components/landing/AppQRCode"; + const HomePage = () => { @@ -63,8 +67,22 @@ const HomePage = () => { return (
+
+
+
+
+ + +
); };