diff --git a/package-lock.json b/package-lock.json index 3e84374..0d4b34c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "@react-three/drei": "^9.120.4", "@react-three/fiber": "^8.17.10", "clsx": "^2.1.1", - "framer-motion": "^11.13.5", + "depcheck": "^1.4.7", "lenis": "^1.1.18", - "motion": "^11.13.5", + "motion": "^11.14.1", "next": "15.0.4", "react": "^18.3.1", "react-dom": "^18.2.0", @@ -48,6 +48,69 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", @@ -60,6 +123,60 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "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", @@ -646,7 +763,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -661,7 +777,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -671,7 +786,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -681,14 +795,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1179,6 +1291,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.17.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", @@ -1195,6 +1313,12 @@ "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.1.tgz", @@ -1503,6 +1627,62 @@ "react": ">= 16.8.0" } }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, "node_modules/@webgpu/types": { "version": "0.1.51", "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz", @@ -1566,7 +1746,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1640,6 +1819,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", @@ -1661,6 +1849,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -1781,6 +1978,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -1828,7 +2034,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -1877,7 +2082,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1888,7 +2092,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -1965,16 +2168,35 @@ "node": ">= 0.4" } }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -2075,6 +2297,75 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2102,7 +2393,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2115,7 +2405,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -2143,9 +2432,33 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -2268,7 +2581,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2325,6 +2637,125 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depcheck": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.7.tgz", + "integrity": "sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@vue/compiler-sfc": "^3.3.4", + "callsite": "^1.0.0", + "camelcase": "^6.3.0", + "cosmiconfig": "^7.1.0", + "debug": "^4.3.4", + "deps-regex": "^0.2.0", + "findup-sync": "^5.0.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.0", + "js-yaml": "^3.14.1", + "json5": "^2.2.3", + "lodash": "^4.17.21", + "minimatch": "^7.4.6", + "multimatch": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "readdirp": "^3.6.0", + "require-package-name": "^2.0.1", + "resolve": "^1.22.3", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "yargs": "^16.2.0" + }, + "bin": { + "depcheck": "bin/depcheck.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/depcheck/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/depcheck/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/depcheck/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/depcheck/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/depcheck/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/depcheck/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/deps-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.2.0.tgz", + "integrity": "sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==", + "license": "MIT" + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-gpu": { "version": "5.0.60", "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.60.tgz", @@ -2420,6 +2851,33 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.23.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", @@ -2584,6 +3042,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3051,6 +3518,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -3087,6 +3567,12 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3097,6 +3583,18 @@ "node": ">=0.10.0" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3188,7 +3686,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -3214,6 +3711,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -3263,13 +3775,13 @@ } }, "node_modules/framer-motion": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.13.5.tgz", - "integrity": "sha512-rArI0zPU9VkpS3Wt0J7dmRxAFUWtzPWoSofNQAP0UO276CmJ+Xlf5xN19GMw3w2QsdrS2sU+0+Q2vtuz4IEZaw==", + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.14.1.tgz", + "integrity": "sha512-6B7jC54zgnefmUSa2l4gkc/2CrqclHL9AUbDxxRfbFyWKLd+4guUYtEabzoYMU8G5ICZ6CdJdydOLy74Ekd7ag==", "license": "MIT", "dependencies": { - "motion-dom": "^11.13.0", - "motion-utils": "^11.13.0", + "motion-dom": "^11.14.1", + "motion-utils": "^11.14.1", "tslib": "^2.4.0" }, "peerDependencies": { @@ -3308,7 +3820,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3343,6 +3854,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", @@ -3457,6 +3977,48 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -3602,7 +4164,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3617,6 +4178,18 @@ "integrity": "sha512-wA66nnYFvQa1o4DO/BFgLNRKnBTVXpNeldGRBJ2Y0SvFtdwvFKCbqa9zhHoZLoxHhZ+jYsj3aIBkWQQCPNOhMw==", "license": "Apache-2.0" }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3641,7 +4214,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -3657,7 +4229,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -3680,6 +4251,12 @@ "node": ">=0.8.19" } }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -3808,7 +4385,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -3856,7 +4432,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3882,7 +4457,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3908,7 +4482,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -3947,7 +4520,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4118,6 +4690,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -4214,6 +4795,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4221,6 +4814,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4356,7 +4955,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -4375,6 +4973,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4411,6 +5015,15 @@ "three": ">=0.134.0" } }, + "node_modules/magic-string": { + "version": "0.30.15", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz", + "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4440,7 +5053,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -4454,7 +5066,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -4484,18 +5095,18 @@ } }, "node_modules/motion": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/motion/-/motion-11.13.5.tgz", - "integrity": "sha512-zmX/dz60w1ZtQB5NP9xYkLcCKwX9gc+pnHp4/mFhD9YW8wUe2ZmT8OPOtrTtq26/huxElSDu3hB7BMTSJa5iIQ==", + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/motion/-/motion-11.14.1.tgz", + "integrity": "sha512-dOZnRp9+YKI2ZfZWX7mfkDXzt/C0Kyw6b8OGpBgBhYrIDTjMtzbM9KhklgZT751PwmIsgqxxZFa3XmB3Sg5m9A==", "license": "MIT", "dependencies": { - "framer-motion": "^11.13.5", + "framer-motion": "^11.14.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/is-prop-valid": { @@ -4510,22 +5121,42 @@ } }, "node_modules/motion-dom": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.13.0.tgz", - "integrity": "sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w==" + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.1.tgz", + "integrity": "sha512-Y68tHWR0d2HxHDskNxpeY3pzUdz7L/m5A8TV7VSE6Sq4XUNJdZV8zXco1aeAQ44o48u0i8UKjt8TGIqkZSQ8ew==", + "license": "MIT" }, "node_modules/motion-utils": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.13.0.tgz", - "integrity": "sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==" + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.1.tgz", + "integrity": "sha512-R6SsehArpkEBUHydkcwQ/8ij8k2PyKWAJ7Y8PN3ztnFwq5RBU3zIamYH6esTp09OgsbwB57mBEZ9DORaN1WTxQ==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -4844,7 +5475,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -4853,6 +5483,33 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4876,7 +5533,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -4896,6 +5552,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4906,7 +5571,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -4935,6 +5599,15 @@ "node": ">= 6" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -4949,7 +5622,6 @@ "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5274,7 +5946,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -5331,6 +6002,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5340,11 +6020,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -5358,11 +6043,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -5463,7 +6160,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5472,6 +6168,12 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5618,6 +6320,12 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, "node_modules/stable-hash": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", @@ -5954,7 +6662,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6133,7 +6840,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -6652,6 +7358,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yaml": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", @@ -6665,6 +7380,74 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index c729c71..9f67afb 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@react-three/fiber": "^8.17.10", "clsx": "^2.1.1", "depcheck": "^1.4.7", + "lenis": "^1.1.18", "motion": "^11.14.1", "next": "15.0.4", "react": "^18.3.1", diff --git a/src/components/arrowUpRight.tsx b/src/components/arrowUpRight.tsx deleted file mode 100644 index a46cb40..0000000 --- a/src/components/arrowUpRight.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { SizeColourProps } from "@/components/util/interfaces"; - -const ArrowUpRight = (props: SizeColourProps) => { - return

; -}; - -export default ArrowUpRight; diff --git a/src/components/buttons/CTAButtons.tsx b/src/components/buttons/CTAButtons.tsx new file mode 100644 index 0000000..81b5d0d --- /dev/null +++ b/src/components/buttons/CTAButtons.tsx @@ -0,0 +1,269 @@ +import { motion } from "motion/react"; +import { useRouter } from "next/router"; +import clsx from "clsx"; +import { ColorVariant, FillMode } from "../color/Color"; + +const SHOP_URL = "https://shop.kscale.dev/collections/all"; + +const getVariantClass = (variant: ColorVariant, mode: FillMode): string => { + if (mode === FillMode.FILL) { + switch (variant) { + case ColorVariant.METHYL: + return "bg-methyl text-filament"; + case ColorVariant.PLASMA: + return "bg-plasma text-filament"; + case ColorVariant.OXIDE: + return "bg-oxide text-filament"; + case ColorVariant.RUST: + return "bg-rust text-filament"; + case ColorVariant.MOLTEN: + return "bg-molten text-filament"; + case ColorVariant.SOL: + return "bg-sol text-filament"; + default: + return "bg-carbon text-filament"; + } + } else if (mode === FillMode.INVERT) { + switch (variant) { + case ColorVariant.METHYL: + return "bg-filament text-methyl"; + case ColorVariant.PLASMA: + return "bg-filament text-plasma"; + case ColorVariant.OXIDE: + return "bg-filament text-oxide"; + case ColorVariant.RUST: + return "bg-filament text-rust"; + case ColorVariant.MOLTEN: + return "bg-filament text-molten"; + case ColorVariant.SOL: + return "bg-filament text-sol"; + default: + return "bg-filament text-carbon"; + } + } else if (mode === FillMode.STROKE) { + switch (variant) { + case ColorVariant.METHYL: + return "border border-methyl text-methyl"; + case ColorVariant.PLASMA: + return "border border-plasma text-plasma"; + case ColorVariant.OXIDE: + return "border border-oxide text-oxide"; + case ColorVariant.RUST: + return "border border-rust text-rust"; + case ColorVariant.MOLTEN: + return "border border-molten text-molten"; + case ColorVariant.SOL: + return "border border-sol text-sol"; + default: + return "border border-foregrounds text-foreground"; + } + } else { + switch (variant) { + case ColorVariant.METHYL: + return "bg-methyl dark:bg-filament text-filament dark:text-methyl"; + case ColorVariant.PLASMA: + return "bg-plasma dark:bg-filament text-filament dark:text-plasma"; + case ColorVariant.OXIDE: + return "bg-oxide dark:bg-filament text-filament dark:text-oxide"; + case ColorVariant.RUST: + return "bg-rust dark:bg-filament text-filament dark:text-rust"; + case ColorVariant.MOLTEN: + return "bg-molten dark:bg-filament text-filament dark:text-molten"; + case ColorVariant.SOL: + return "bg-sol dark:bg-filament text-filament dark:text-sol"; + default: + return "bg-carbon dark:bg-filament text-filament dark:text-carbon"; + } + } +}; + +const hoverVariants = { + hover: { + scale: 1.05, + }, + tap: { + scale: 0.95, + opacity: 0.8, + }, +}; + +export enum Size { + THIN, + NORMAL, +} + +export const NavCTAButton = ({ + children, + href = SHOP_URL, + className, + variant = ColorVariant.RUST, + mode = FillMode.DEFAULT, + size = Size.THIN, + target = "_self", +}: { + children: React.ReactNode; + href?: string; + className?: string; + variant?: ColorVariant; + mode?: FillMode; + size?: Size; + target?: string; +}) => { + const router = useRouter(); + + return target === "_blank" ? ( + + + {children} + + + ) : ( + router.push(href ? href : SHOP_URL)} + > + {children} + + ); +}; + +export const CTASubtitleButton = ({ + className, + children, + subtitle, + href = SHOP_URL, + variant = ColorVariant.RUST, + mode = FillMode.DEFAULT, + target = "_self", +}: { + className?: string; + children: React.ReactNode; + subtitle: string; + href?: string; + variant?: ColorVariant; + mode?: FillMode; + target?: string; +}) => { + const router = useRouter(); + + return target === "_blank" ? ( + + + {children} + {subtitle} + + + ) : ( + router.push(href ? href : SHOP_URL)} + > + {children} + {subtitle} + + ); +}; + +export const InlineCTA = ({ + children, + href, + target = "_blank", +}: { + children: React.ReactNode; + href?: string; + target?: string; +}) => { + return ( + + {children} + + ); +}; diff --git a/src/components/buttons/ctaButton.tsx b/src/components/buttons/ctaButton.tsx deleted file mode 100644 index 9bb38e5..0000000 --- a/src/components/buttons/ctaButton.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import { motion } from "motion/react"; -import { transitionEaseLinearDuration300 } from "@/components/util/constants"; -import { useRouter } from "next/router"; -import clsx from "clsx"; - -const SHOP_URL = "https://shop.kscale.dev/collections/all"; - -export enum CTAButtonVariant { - METHYL, - PLASMA, - OXIDE, - RUST, - MOLTEN, - SOL, -} - -export enum CTAButtonMode { - FILL, - INVERT, - STROKE, -} - -const getVariantClass = (variant: CTAButtonVariant, mode: CTAButtonMode): string => { - if (mode === CTAButtonMode.FILL) { - switch (variant) { - case CTAButtonVariant.METHYL: - return "bg-methyl text-background dark:text-foreground-dark"; - case CTAButtonVariant.PLASMA: - return "bg-plasma text-background dark:text-foreground-dark"; - case CTAButtonVariant.OXIDE: - return "bg-oxide text-background dark:text-foreground-dark"; - case CTAButtonVariant.RUST: - return "bg-rust dark:bg-rust-dark text-background dark:text-foreground-dark"; - case CTAButtonVariant.MOLTEN: - return "bg-molten text-background dark:text-foreground-dark"; - case CTAButtonVariant.SOL: - return "bg-sol text-background dark:text-foreground-dark "; - default: - return "bg-foreground dark:bg-foreground-dark text-background dark:text-background-dark"; - } - } else if (mode === CTAButtonMode.INVERT) { - switch (variant) { - case CTAButtonVariant.METHYL: - return "bg-background text-methyl dark:bg-foreground-dark dark:text-methyl-dark"; - case CTAButtonVariant.PLASMA: - return "bg-background text-plasma dark:bg-foreground-dark dark:text-plasma-dark"; - case CTAButtonVariant.OXIDE: - return "bg-background text-oxide dark:bg-foreground-dark dark:text-oxide-dark"; - case CTAButtonVariant.RUST: - return "bg-background text-rust dark:bg-foreground-dark dark:text-rust-dark"; - case CTAButtonVariant.MOLTEN: - return "bg-background text-molten dark:bg-foreground-dark dark:text-molten-dark"; - case CTAButtonVariant.SOL: - return "bg-background text-sol dark:bg-foreground-dark dark:text-sol-dark"; - default: - return "bg-foreground dark:bg-foreground-dark text-background dark:text-background-dark"; - } - } else { - switch (variant) { - case CTAButtonVariant.METHYL: - return "bg-background text-methyl dark:bg-foreground-dark dark:text-methyl-dark"; - case CTAButtonVariant.PLASMA: - return "bg-background text-plasma dark:bg-foreground-dark dark:text-plasma-dark"; - case CTAButtonVariant.OXIDE: - return "bg-background text-oxide dark:bg-foreground-dark dark:text-oxide-dark"; - case CTAButtonVariant.RUST: - return "bg-background text-rust dark:bg-foreground-dark dark:text-rust-dark"; - case CTAButtonVariant.MOLTEN: - return "bg-background text-molten dark:bg-foreground-dark dark:text-molten-dark"; - case CTAButtonVariant.SOL: - return "bg-background text-sol dark:bg-foreground-dark dark:text-sol-dark"; - default: - return "bg-foreground dark:bg-foreground-dark text-background dark:text-background-dark"; - } - } -}; - -const hoverVariants = { - hover: { - scale: 1.05, - }, - tap: { - scale: 0.95, - opacity: 0.8, - }, -}; - -export const CTAButton = ({ - children, - href = SHOP_URL, - className, - variant = CTAButtonVariant.RUST, - mode = CTAButtonMode.FILL, -}: { - children: React.ReactNode; - href?: string; - className?: string; - variant?: CTAButtonVariant; - mode?: CTAButtonMode; -}) => { - const router = useRouter(); - - return ( - router.push(href ? href : SHOP_URL)} - > - {children} - - ); -}; - -export const CTASubtitleButton = ({ - className, - children, - subtitle, - href = SHOP_URL, - variant = CTAButtonVariant.RUST, - mode = CTAButtonMode.FILL, -}: { - className?: string; - children: React.ReactNode; - subtitle: string; - href?: string; - variant?: CTAButtonVariant; - mode?: CTAButtonMode; -}) => { - const router = useRouter(); - - return ( - router.push(href ? href : SHOP_URL)} - > - {children} - {subtitle} - - ); -}; - -export default CTAButton; diff --git a/src/components/color/Color.tsx b/src/components/color/Color.tsx new file mode 100644 index 0000000..d9bef4c --- /dev/null +++ b/src/components/color/Color.tsx @@ -0,0 +1,15 @@ +export enum ColorVariant { + METHYL, + PLASMA, + OXIDE, + RUST, + MOLTEN, + SOL, +} + +export enum FillMode { + DEFAULT, + FILL, + INVERT, + STROKE, +} diff --git a/src/components/footer/SocialMediaItem.tsx b/src/components/footer/SocialMediaItem.tsx index dbddb80..0a3765b 100644 --- a/src/components/footer/SocialMediaItem.tsx +++ b/src/components/footer/SocialMediaItem.tsx @@ -1,10 +1,28 @@ import { SocialMediaItemProps } from "@/components/util/interfaces"; +import { motion } from "motion/react"; import Link from "next/link"; const SocialMediaItem = (props: SocialMediaItemProps) => { return ( - {props.iconSvg} + + {props.iconSvg} + ); }; diff --git a/src/components/footer/footer.tsx b/src/components/footer/footer.tsx index ff6b8ea..9cff7b2 100644 --- a/src/components/footer/footer.tsx +++ b/src/components/footer/footer.tsx @@ -1,9 +1,10 @@ -import { motion } from "motion/react"; +import { AnimatePresence, cubicBezier, motion } from "motion/react"; import SocialMediaItem from "@/components/footer/SocialMediaItem"; import { Discord, Github, LinkedIn, Twitter } from "@/components/footer/socialMediaSvgs"; import FooterLogotype from "@/components/logos/footerLogotype"; import Link from "next/link"; -import { JSX } from "react"; +import { JSX, useEffect, useState } from "react"; +import { circOut } from "motion"; const socialMediaSvgs: JSX.Element[] = [ , @@ -29,16 +30,21 @@ const FooterSectionList = ({ extraStyling, items, title }: FooterSectionListProp return (

{title}

-
{ +import { motion } from "motion/react"; +import { ColorVariant } from "../color/Color"; +import clsx from "clsx"; + +export enum IconMode { + FULL, + SET, +} + +const getVariantClass = (variant: ColorVariant): string => { + switch (variant) { + case ColorVariant.METHYL: + return "bg-methyl text-filament "; + case ColorVariant.PLASMA: + return "bg-plasma text-filament"; + case ColorVariant.OXIDE: + return "bg-oxide text-filament"; + case ColorVariant.RUST: + return "bg-rust text-filament"; + case ColorVariant.MOLTEN: + return "bg-molten text-filament"; + case ColorVariant.SOL: + return "bg-sol text-filament"; + default: + return "bg-foreground text-background "; + } +}; + +const socialVariants = (mode: IconMode) => { + return { + initial: { + scale: 1, + rotate: 0, + }, + hover: { + scale: 1.2, + rotate: mode === IconMode.SET ? 15 : 0, + }, + }; +}; + +export const Discord = ({ mode = IconMode.FULL }: { mode?: IconMode }) => { return ( - - + ); }; -export const LinkedIn = () => { +export const LinkedIn = ({ mode = IconMode.FULL }: { mode?: IconMode }) => { return ( - - + ); }; -export const Twitter = () => { +export const Twitter = ({ mode = IconMode.FULL }: { mode?: IconMode }) => { return ( - - + ); }; -export const Facebook = () => { +export const Facebook = ({ mode = IconMode.FULL }: { mode?: IconMode }) => { return ( - - + ); }; -export const Github = () => { +export const Github = ({ mode = IconMode.FULL }: { mode?: IconMode }) => { return ( - - + ); }; diff --git a/src/components/grid/Grid.tsx b/src/components/grid/Grid.tsx index 44a0938..1f942bb 100644 --- a/src/components/grid/Grid.tsx +++ b/src/components/grid/Grid.tsx @@ -22,7 +22,7 @@ export const Grid = () => { initial={{ opacity: 0 }} animate={{ opacity: active ? 1 : 0 }} exit={{ opacity: 0 }} - className="fixed inset-0 z-[1000] grid-r auto-rows-auto pointer-events-none" + className="fixed inset-0 z-[1000] grid-a auto-rows-auto pointer-events-none" >
diff --git a/src/components/iconography/Iconography.tsx b/src/components/iconography/Iconography.tsx index f144f36..3f82508 100644 --- a/src/components/iconography/Iconography.tsx +++ b/src/components/iconography/Iconography.tsx @@ -1,6 +1,9 @@ import { motion } from "motion/react"; -export const ExpressiveArrow = () => { +import { ColorVariant } from "@/components/color/Color"; +import { ExpressiveArrowProps } from "@/components/util/interfaces"; + +export const ExpressiveArrow = (props: ExpressiveArrowProps) => { const arrowVariants = { initial: { x: "0", @@ -24,7 +27,7 @@ export const ExpressiveArrow = () => { }; return ( -
+
@@ -34,3 +37,49 @@ export const ExpressiveArrow = () => {
); }; + +export const DownloadIcon = ({ color }: { color?: ColorVariant }) => { + const topPath = { + initial: { + y: "-100%", + }, + hover: { + y: "0", + }, + }; + const bottomPath = { + initial: { + y: "0", + }, + hover: { + y: "100%", + }, + }; + return ( + + + + + + + + + + + + + + ); +}; diff --git a/src/components/iconography/ResearchIcons.tsx b/src/components/iconography/ResearchIcons.tsx new file mode 100644 index 0000000..538724f --- /dev/null +++ b/src/components/iconography/ResearchIcons.tsx @@ -0,0 +1,133 @@ +import { motion } from "motion/react"; + +export const EVLAIcon = () => { + return ( + + + + + + + + + + + + + + + + + + ); +}; + +export const KOSIcon = () => { + return ( + + + + + + + ); +}; + +export const KLANGIcon = () => { + return ( + + + + + + + + ); +}; + +export const KRECIcon = () => { + return ( + + + + + + + + + + ); +}; + +export const KSIMIcon = () => { + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/src/components/logos/footerLogotype.tsx b/src/components/logos/footerLogotype.tsx index cdf26c4..49680be 100644 --- a/src/components/logos/footerLogotype.tsx +++ b/src/components/logos/footerLogotype.tsx @@ -1,6 +1,5 @@ import React from "react"; import Link from "next/link"; -import { transitionEaseLinearDuration300 } from "@/components/util/constants"; const FooterLogotype = () => { return ( @@ -16,46 +15,46 @@ const FooterLogotype = () => { > - + - + - + diff --git a/src/components/logos/logotype.tsx b/src/components/logos/logotype.tsx index fe89ff4..0cc6cbd 100644 --- a/src/components/logos/logotype.tsx +++ b/src/components/logos/logotype.tsx @@ -16,55 +16,55 @@ const Logotype = () => { > diff --git a/src/components/navbar/DarkModeToggle.tsx b/src/components/navbar/DarkModeToggle.tsx deleted file mode 100644 index 85afe44..0000000 --- a/src/components/navbar/DarkModeToggle.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useDarkMode } from "../providers/DarkModeProvider"; - -export default function DarkModeToggle() { - const { isDark, toggle } = useDarkMode(); - - return ( - - ); -} diff --git a/src/components/navbar/burgerButton.tsx b/src/components/navbar/burgerButton.tsx deleted file mode 100644 index ceb3c8b..0000000 --- a/src/components/navbar/burgerButton.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { motion } from "motion/react"; -import { Text2Props } from "@/components/util/interfaces"; -import Link from "next/link"; -import { textBlackDarkWhite, transitionEaseLinearDuration300 } from "@/components/util/constants"; - -const BurgerButton = (props: Text2Props) => { - return ( - - - {props.text} - - - ); -}; - -export default BurgerButton; diff --git a/src/components/navbar/burgerMenu.tsx b/src/components/navbar/burgerMenu.tsx index 59dbe21..f7e87e4 100644 --- a/src/components/navbar/burgerMenu.tsx +++ b/src/components/navbar/burgerMenu.tsx @@ -1,26 +1,40 @@ -import BurgerButton from "@/components/navbar/burgerButton"; +import { + navItemLinks, + navItems, + textBlackDarkWhite, + transitionEaseLinearDuration300, +} from "@/components/util/constants"; +import { ExpressiveArrow } from "@/components/iconography/Iconography"; import { motion } from "motion/react"; +import Link from "next/link"; -interface BurgerMenuProps { - isOpen: boolean; - items: { name: string; link: string }[]; -} - -const BurgerMenu = ({ isOpen, items }: BurgerMenuProps) => { +const BurgerMenu = (isOpen: boolean) => { return isOpen ? ( - - {items.map((item, index) => ( -
  • - -
  • - ))} -
    - ) : null; +
    + {navItems.map((navItem, index) => { + return ( + + + {navItem} + + {index !== 1 ? : <>} + + ); + })} +
    + ) : ( + <> + ); }; export default BurgerMenu; diff --git a/src/components/navbar/navButton.tsx b/src/components/navbar/navButton.tsx deleted file mode 100644 index 9c05971..0000000 --- a/src/components/navbar/navButton.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Text2Props } from "@/components/util/interfaces"; -import { motion } from "motion/react"; -import React from "react"; -import Link from "next/link"; -import { - textBlackDarkWhite, - navMotionTransition, - transitionEaseLinearDuration300, - scaleMotionNumber, -} from "@/components/util/constants"; - -const NavButton = (props: Text2Props) => { - return ( - - - {props.text} - - - ); -}; - -export default NavButton; diff --git a/src/components/navbar/navButtons.tsx b/src/components/navbar/navButtons.tsx new file mode 100644 index 0000000..9114a35 --- /dev/null +++ b/src/components/navbar/navButtons.tsx @@ -0,0 +1,40 @@ +import { motion } from "motion/react"; +import React from "react"; +import { ExpressiveArrow } from "@/components/iconography/Iconography"; +import { navItemLinks, navItems } from "@/components/util/constants"; + +const arrowLinkVariants = { + hover: { + opacity: 0.5, + }, +}; + +export const NavLogInButton = () => { + return ( + + {navItems[1]} + + ); +}; + +export const NavDocsButton = () => { + return ( + + {navItems[0]} + + ); +}; diff --git a/src/components/navbar/navbar.tsx b/src/components/navbar/navbar.tsx index e9d6d28..cae1957 100644 --- a/src/components/navbar/navbar.tsx +++ b/src/components/navbar/navbar.tsx @@ -1,21 +1,25 @@ -import CTAButton from "@/components/buttons/ctaButton"; +import { NavCTAButton } from "@/components/buttons/CTAButtons"; import Logotype from "@/components/logos/logotype"; -import BurgerMenu from "@/components/navbar/burgerMenu"; import BurgerOpenButton from "@/components/navbar/burgerOpenButton"; -import DarkModeToggle from "@/components/navbar/DarkModeToggle"; -import NavButton from "@/components/navbar/navButton"; +import { NavDocsButton, NavLogInButton } from "@/components/navbar/navButtons"; import { useWindowSize } from "@/components/util/functions"; -import clsx from "clsx"; import { motion, useMotionValueEvent, useScroll } from "motion/react"; -import { useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { ExpressiveArrow } from "@/components/iconography/Iconography"; -// import { useLenis } from "lenis/react"; +import BurgerMenu from "@/components/navbar/burgerMenu"; +import { FillMode } from "../color/Color"; + +const navButtons: React.ReactNode[] = [ + { component: , key: "docs" }, + { component: , key: "login" }, +].map((item) => React.cloneElement(item.component, { key: item.key })); + const navVariants = { visible: { y: "0%", }, hidden: { - y: "-100%", + y: "-150%", }, }; @@ -24,13 +28,7 @@ const navItemVariants = { y: "0%", }, hidden: { - y: "-100%", - }, -}; - -const arrowLinkVariants = { - hover: { - opacity: 0.5, + y: "-150%", }, }; @@ -55,119 +53,80 @@ export default function NavBar() { const width = useWindowSize().width; const navBasedOnWidth = (isDesktop: boolean) => { - return mobileNavBar(); + return isDesktop ? desktopNavBar() : mobileNavBar(); }; - // const lenis = useLenis(); - const mobileNavBar = () => { return ( - - - {width >= 768 ? ( - <> - - Docs - - - Log in - - - Buy GPR - - - ) : ( -
    - Buy GPR - -
    - )} - - {/* {width < 640 && BurgerMenu({ isOpen: mobileShouldOpenBurger, items: navItems })} */} +
    + + +
    + {BurgerMenu(mobileShouldOpenBurger)}
    ); }; - // const desktopNavBar = () => { - // return ( - // <> - // - //
    - // - // {navItems.map((item, i) => ( - // - // - // - // ))} - // - // - // - // - // - //
    - // - // ); - // }; + const desktopNavBar = () => { + return ( +
    + +
    + + {navButtons.map((navItem, i) => ( + + {navItem} + + ))} + + + {`Buy GPR`} + + + + +
    +
    + ); + }; useEffect(() => { if (mobileShouldOpenBurger) { document.body.classList.add("scroll-lock"); - // lenis.stop(); } else { document.body.classList.remove("scroll-lock"); - // lenis.start(); } - // Cleanup on component unmount return () => { document.body.classList.remove("scroll-lock"); }; }, [mobileShouldOpenBurger]); - return ; -} -function useLenis() { - throw new Error("Function not implemented."); + return ; } diff --git a/src/components/providers/DarkModeProvider.tsx b/src/components/providers/DarkModeProvider.tsx deleted file mode 100644 index f18532a..0000000 --- a/src/components/providers/DarkModeProvider.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; - -import { createContext, useContext, useEffect, useState } from "react"; - -interface DarkModeContextType { - isDark: boolean; - toggle: () => void; -} - -const DarkModeContext = createContext({ - isDark: false, - toggle: () => {}, -}); - -export const useDarkMode = () => useContext(DarkModeContext); - -export function DarkModeProvider({ children }: { children: React.ReactNode }) { - const [isDark, setIsDark] = useState(false); - - useEffect(() => { - // Check system preference on mount - const darkModePreference = window.matchMedia("(prefers-color-scheme: dark)"); - setIsDark(darkModePreference.matches); - - // Update class on document - if (darkModePreference.matches) { - document.documentElement.classList.add("dark"); - } - - // Listen for system preference changes - const handleChange = (e: MediaQueryListEvent) => { - setIsDark(e.matches); - if (e.matches) { - document.documentElement.classList.add("dark"); - } else { - document.documentElement.classList.remove("dark"); - } - }; - - darkModePreference.addEventListener("change", handleChange); - return () => darkModePreference.removeEventListener("change", handleChange); - }, []); - - const toggle = () => { - setIsDark(!isDark); - document.documentElement.classList.toggle("dark"); - }; - - return {children}; -} diff --git a/src/components/util/constants.tsx b/src/components/util/constants.tsx index 5e3dc71..4a5d5cc 100644 --- a/src/components/util/constants.tsx +++ b/src/components/util/constants.tsx @@ -1,7 +1,7 @@ export const transitionEaseLinearDuration300: string = " transition ease-linear duration-300 "; -export const bgBlackDarkWhite: string = " bg-foreground dark:bg-foreground-dark "; -export const textBlackDarkWhite: string = " text-foreground dark:text-foreground-dark "; -export const fillBlackDarkWhite: string = " fill-foreground dark:fill-foreground-dark "; +export const bgBlackDarkWhite: string = " bg-foreground"; +export const textBlackDarkWhite: string = " text-foreground"; +export const fillBlackDarkWhite: string = " fill-foreground"; export const navMotionTransition = { duration: 0.7, @@ -12,3 +12,10 @@ export const navMotionTransition = { export const scaleMotionNumber = { scale: 0.95, }; + +export const navItems: string[] = ["Docs", "Log In", "Buy GPR"]; +export const navItemLinks: string[] = [ + "https://docs.kscale.dev/", + "https://dashboard.kscale.dev", + "https://shop.kscale.dev/", +]; diff --git a/src/components/util/interfaces.tsx b/src/components/util/interfaces.tsx index 0de519c..b745191 100644 --- a/src/components/util/interfaces.tsx +++ b/src/components/util/interfaces.tsx @@ -1,32 +1,12 @@ import { Dispatch, JSX, SetStateAction } from "react"; -export interface TextProps { - text: string; -} - -export interface Text2Props { - text: string; - text2: string; -} - -export interface TextColourProps { - text: string; - color: string; -} - -export interface FooterSectionListProps { - title: string; - itemTitles: string[]; - itemUrls: string[]; - extraStyling: string; -} export interface SocialMediaItemProps { linkURL: string; iconSvg: JSX.Element; } -export interface SizeColourProps { - styling: string; +export interface ExpressiveArrowProps { + size: string; } export interface BurgerOpenButtonProps { diff --git a/src/components/util/isDarkMode.tsx b/src/components/util/isDarkMode.tsx new file mode 100644 index 0000000..a1af094 --- /dev/null +++ b/src/components/util/isDarkMode.tsx @@ -0,0 +1,3 @@ +export function isDarkMode(): boolean { + return false; +} diff --git a/src/landing/CommunitySection.tsx b/src/landing/CommunitySection.tsx new file mode 100644 index 0000000..0f9d261 --- /dev/null +++ b/src/landing/CommunitySection.tsx @@ -0,0 +1,48 @@ +import { ExpressiveArrow } from "@/components/iconography/Iconography"; +import { ColorVariant, FillMode } from "@/components/color/Color"; +import { Discord, IconMode } from "@/components/footer/socialMediaSvgs"; +import { InlineCTA, NavCTAButton, Size } from "@/components/buttons/CTAButtons"; + +const CommunitySection = () => { + return ( +
    +
    + Community +

    Take ownership of how we keep building.

    +

    + With over 2000 people in our Discord, our community has collaboratively on 6 humanoid + robot projects, building off each other's work and publishing papers on the forefront + of embodied AI tools. +

    +
    + + + Join the Discord + + + Send feedback + + + +
    +

    About us

    +

    + We're hackers, engineers, and researchers that believe in a world where robots are + made for everyone. +

    +

    + We're from Tesla AI, Google, Meta FAIR, Stanford, and Xiaomi building opportunities + for robots to be more than workers. +

    +
    +
    + ); +}; + +export default CommunitySection; diff --git a/src/landing/DataSection.tsx b/src/landing/DataSection.tsx new file mode 100644 index 0000000..ab34c3a --- /dev/null +++ b/src/landing/DataSection.tsx @@ -0,0 +1,16 @@ +const DataSection = () => { + return ( +
    +
    + Data buy-back +

    Get refunded each month that you send us data.

    +

    + If you collect at least 100 hours of telemetry over the course of a month we'll pay + you back the month's payment. +

    +
    +
    + ); +}; + +export default DataSection; diff --git a/src/landing/GallerySection.tsx b/src/landing/GallerySection.tsx new file mode 100644 index 0000000..f59c10d --- /dev/null +++ b/src/landing/GallerySection.tsx @@ -0,0 +1,40 @@ +import { motion, useTransform, useScroll } from "motion/react"; +import { useRef } from "react"; + +const GallerySection = () => { + const scrollRef = useRef(null); + const { scrollYProgress } = useScroll({ + target: scrollRef, + offset: ["start start", "end start"], + }); + + return ( +
    + + + + + +
    + ); +}; + +export default GallerySection; diff --git a/src/landing/HeaderSection.tsx b/src/landing/HeaderSection.tsx new file mode 100644 index 0000000..cd5a95a --- /dev/null +++ b/src/landing/HeaderSection.tsx @@ -0,0 +1,22 @@ +import { CTASubtitleButton } from "@/components/buttons/CTAButtons"; +import { FillMode } from "@/components/color/Color"; + +const HeaderSection = () => { + return ( +
    + {/* Header */} +
    +

    Made to be modified

    +

    + GPR 1.0 is an open-source & auditable robot, for those who prefer transparency over + trust. +

    + + Order GPR 0.5 + +
    +
    + ); +}; + +export default HeaderSection; diff --git a/src/landing/PricingSection.tsx b/src/landing/PricingSection.tsx new file mode 100644 index 0000000..37b6d8f --- /dev/null +++ b/src/landing/PricingSection.tsx @@ -0,0 +1,51 @@ +import { CTASubtitleButton } from "@/components/buttons/CTAButtons"; +import { FillMode } from "@/components/color/Color"; +import { isDarkMode } from "@/components/util/isDarkMode"; + +const PricingSection = () => { + const darkMode = isDarkMode(); + return ( +
    +
    +
    + Limited edition — 20 units total +

    + Get free yearly hardware upgrades as a founder +

    +
    +

    + Priority delivery and yearly service on new parts and hardware, for the rest of your life. +

    + + Order GPR Founders' Edition + +
    + +
    +
    + Available for all engineers +

    + Our plug and play robotics solution, at an accessible price. +

    +
    +

    + {`Invest in yourself and your engineering potential with GPR's embodied AI ecosystem.`} +

    + + Order GPR Developers' Edition + +
    +
    + ); +}; + +export default PricingSection; diff --git a/src/landing/ResearchSection.tsx b/src/landing/ResearchSection.tsx new file mode 100644 index 0000000..0d45597 --- /dev/null +++ b/src/landing/ResearchSection.tsx @@ -0,0 +1,269 @@ +import { NavCTAButton } from "@/components/buttons/CTAButtons"; +import { ColorVariant, FillMode } from "@/components/color/Color"; +import { + EVLAIcon, + KOSIcon, + KRECIcon, + KSIMIcon, + KLANGIcon, +} from "@/components/iconography/ResearchIcons"; +import { useWindowSize } from "@/components/util/functions"; +import { cubicBezier, motion, useMotionValue } from "motion/react"; +import { useMemo } from "react"; +import { useEffect } from "react"; +import { useState } from "react"; + +const RESEARCH_ITEMS = [ + { + title: "Edge VLA", + description: + "Our general purpose foundation AI model, helping robots complete tasks autonomously. Through open-source data contributions, we're training a highly efficient model together.", + image: "/images/research/edge-vla.png", + link: "/", + icon: , + }, + { + title: "K-OS", + description: + "We've been refining our Rust-based package manager, streamlined operations for humanoid robotics hardware. 40% faster compiling compared to other ROS2-based systems.", + image: "/images/research/edge-vla.png", + link: "/", + icon: , + }, + { + title: "Klang", + description: + "Dedicated to efficiently parsing natural language, Klang acts a simple and flexible way to get started building robot applications. As of now, it supports EVLA to turn language into actions.", + image: "/images/research/edge-vla.png", + link: "/", + icon: , + }, + { + title: "kRec", + description: + "Our system for organizing and managing all your robot data produced during your research.", + image: "/images/research/edge-vla.png", + link: "/", + icon: , + }, + { + title: "kSim", + description: + "Built off of Issac Gym, get started with locomotion and manipulation with our simulation packages. We're working on building this out further to help you test your robot's movements on screen and in the physical world. ", + image: "/images/research/edge-vla.png", + link: "/", + icon: , + }, +]; + +interface ResearchItem { + title: string; + description: string; + image: string; + link: string; + index: number; + icon: React.ReactNode; +} + +const ResearchCard = ({ title, description, image, link, index, icon }: ResearchItem) => { + return ( + +
    + {icon} +
    +

    {title}

    +

    {description}

    + + View project + +
    +
    +
    + ); +}; + +const DRAG_BUFFER = 50; + +const SPRING_OPTIONS = { + type: "spring", + mass: 1, + stiffness: 100, + damping: 20, +}; + +export const SwipeCarousel = () => { + const [imgIndex, setImgIndex] = useState(0); + const width = useWindowSize().width; + + const dimensions = useMemo(() => { + if (width < 640) { + return { + card: 66.25, + gap: 5, + max: RESEARCH_ITEMS.length - 1, + }; + } + if (width < 768) { + return { + card: 170 / 3 + 2.5, + gap: 2.5, + max: RESEARCH_ITEMS.length - 1, + }; + } + if (width < 1440) { + return { + card: 280 / 9 + 7.5, + gap: 2.5, + max: RESEARCH_ITEMS.length - 2, + }; + } + if (width < 1920) { + return { + card: 87.5 / 3, + gap: 1.25, + max: RESEARCH_ITEMS.length - 3, + }; + } + return { + card: 21.25, + gap: 1.25, + max: RESEARCH_ITEMS.length - 4, + }; + }, [width]); + + const dragX = useMotionValue(0); + + const onDragEnd = () => { + const x = dragX.get(); + if (x <= -DRAG_BUFFER && imgIndex < dimensions.max) { + setImgIndex((pv) => Math.min(pv + Math.round(x / -DRAG_BUFFER), dimensions.max)); + } else if (x >= DRAG_BUFFER && imgIndex > 0) { + setImgIndex((pv) => Math.max(pv - Math.round(x / DRAG_BUFFER), 0)); + } + }; + + const decrement = () => { + if (imgIndex > 0) { + setImgIndex((pv) => pv - 1); + } + }; + + const increment = () => { + if (imgIndex < dimensions.max) { + setImgIndex((pv) => pv + 1); + } + }; + + useEffect(() => { + setImgIndex(0); + }, [width]); + + return ( +
    + + 0 ? 1 : 0.5 }} + transition={{ duration: 0.2 }} + > + ← + + + → + + +
    + {/*
    + {imgIndex} {dimensions.card} {dimensions.gap} +
    */} + + + +
    +
    + ); +}; + +const Images = () => { + return ( + <> + {RESEARCH_ITEMS.map((item, i) => ( + + ))} + + ); +}; + +// const Dots = ({ imgIndex, setImgIndex }) => { +// return ( +//
    +// {imgs.map((_, idx) => { +// return ( +//
    +// ); +// }; + +const ResearchSection = () => { + return ( +
    +
    + Research +

    + The humanoid robot is as strong as its brain, not its body. +

    +

    + While we provide robust, accessible hardware, our end-to-end model is what makes GPR 1.0 + perform. Here's some of the progress we've made: +

    +
    + {/* */} + +
    + ); +}; + +export default ResearchSection; diff --git a/src/landing/RobotSection.tsx b/src/landing/RobotSection.tsx new file mode 100644 index 0000000..a9db8a9 --- /dev/null +++ b/src/landing/RobotSection.tsx @@ -0,0 +1,11 @@ +import RobotRenderer from "@/components/robot/robotRenderer"; + +const RobotSection = () => { + return ( +
    + +
    + ); +}; + +export default RobotSection; diff --git a/src/landing/SpecSection.tsx b/src/landing/SpecSection.tsx new file mode 100644 index 0000000..d8e80cf --- /dev/null +++ b/src/landing/SpecSection.tsx @@ -0,0 +1,45 @@ +import { InlineCTA } from "@/components/buttons/CTAButtons"; +import { DownloadIcon } from "@/components/iconography/Iconography"; +import Link from "next/link"; + +const SpecSection = () => { + return ( +
    +
    +
    + What is GPR? +

    + A 4.5 foot humanoid robot, optimized for our approach to software for embodied AI. +

    +
    + + Read tech specs + +
    +
    +

    + {`We've built GPR 0.5 with an aerospace-grade alumininum body, for under $20,000 USD. `} + + Anodized with a matte black finish, because it looks cooler. + +

    +
    +
    +
    +

    + Equipped with 120 N m actuators at the hips, taking advantage of strong torque for dynamic + walking and manipulation. +

    +
    +
    +
    +

    + Explore the potential of any idea with 32 TOPS of AI performance. +

    +
    +
    +
    + ); +}; + +export default SpecSection; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 45e9795..94e19f5 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,21 +1,41 @@ import "@/styles/globals.css"; import type { AppProps } from "next/app"; import Head from "next/head"; +import { ReactLenis } from "lenis/dist/lenis-react"; export default function App({ Component, pageProps }: AppProps) { return ( - <> + K-Scale Labs - + + + + + + + + + + + - + ); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 8ad2663..38f61b6 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,280 +1,23 @@ -import { CTAButtonMode, CTASubtitleButton } from "@/components/buttons/ctaButton"; import Footer from "@/components/footer/footer"; import { Grid } from "@/components/grid/Grid"; -import { ExpressiveArrow } from "@/components/iconography/Iconography"; import NavBar from "@/components/navbar/navbar"; -import RobotRenderer from "@/components/robot/robotRenderer"; -import { motion } from "motion/react"; -import Link from "next/link"; - -const HeaderSection = () => { - return ( -
    - {/* Header */} -
    -

    Made to be modified

    -

    - GPR 1.0 is an open-source & auditable robot, for those who prefer transparency over - trust. -

    - - Order GPR 0.5 - -
    -
    - ); -}; - -const ResearchSection = () => { - return ( -
    -
    - Research -

    - The humanoid robot is as strong as its brain, not its body. -

    -

    - While we provide robust, accessible hardware, our end-to-end model is what makes GPR 1.0 - perform. Here's some of the progress we've made: -

    -
    -
    -
    - {[0, 1, 2, 3, 4].map((i) => ( - -
    - - - -
    -

    Edge VLA

    -

    - Our general purpose foundation AI model, helping robots complete tasks - autonomously. Through open-source data contributions, we're training a - highly efficient model together. -

    -
    -
    -
    - ))} -
    -
    -
    - ); -}; - -const SpecSection = () => { - return ( -
    -
    -
    - What is GPR? -

    - A 4.5 foot humanoid robot, optimized for our approach to software for embodied AI. -

    -
    - - Read tech specs{" "} - - - - -
    -
    -

    - {`We've built GPR 0.5 with an aerospace-grade alumininum body, for under $20,000 USD.`} - - Anodized with a matte black finish, because it looks cooler. - -

    -
    -
    -
    -

    - Equipped with 120 N m actuators at the hips, taking advantage of strong torque for dynamic - walking and manipulation. -

    -
    -
    -
    -

    - Explore the potential of any idea with 32 TOPS of AI performance. -

    -
    -
    -
    - ); -}; - -const RobotSection = () => { - return ( -
    - -
    - ); -}; - -const GallerySection = () => { - return ( -
    - ); -}; - -const PricingSection = () => { - return ( -
    -
    -
    - Limited edition — 20 units total -

    - Get free yearly hardware upgrades as a founder -

    -
    -

    - Priority delivery and yearly service on new parts and hardware, for the rest of your life. -

    - - Order GPR Founders' Edition - -
    - -
    -
    - Available for all engineers -

    - Our plug and play robotics solution, at an accessible price. -

    -
    -

    - {`Invest in yourself and your engineering potential with GPR's embodied AI ecosystem.`} -

    - - Order GPR Developers' Edition - -
    -
    - ); -}; - -const DataSection = () => { - return ( -
    -
    - Data buy-back -

    Get refunded each month that you send us data.

    -

    - If you collect at least 100 hours of telemetry over the course of a month we'll pay - you back the month's payment. -

    -
    -
    - ); -}; - -const CommunitySection = () => { - return ( -
    -
    - Community -

    Take ownership of how we keep building.

    -

    - With over 2000 people in our Discord, our community has collaboratively on 6 humanoid - robot projects, building off each other's work and publishing papers on the forefront - of embodied AI tools. -

    -
    - - - Read tech specs{" "} - - - - - - - Send feedback - - - -
    -

    About us

    -

    - We're hackers, engineers, and researchers that believe in a world where robots are - made for everyone -

    -

    - We're from: Tesla AI, Google, Meta FAIR, Stanford, Xiaomi building opportunities for - robots to be more than workers. -

    -
    -
    - ); -}; +import HeaderSection from "@/landing/HeaderSection"; +import ResearchSection from "@/landing/ResearchSection"; +import SpecSection from "@/landing/SpecSection"; +import RobotSection from "@/landing/RobotSection"; +import GallerySection from "@/landing/GallerySection"; +import PricingSection from "@/landing/PricingSection"; +import DataSection from "@/landing/DataSection"; +import CommunitySection from "@/landing/CommunitySection"; +import { ExpressiveArrow } from "@/components/iconography/Iconography"; export default function Home() { return (
    - -
    +
    + diff --git a/src/styles/globals.css b/src/styles/globals.css index e6dd977..744ee78 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -75,7 +75,7 @@ } *::selection { - @apply bg-rust text-background dark:text-foreground-dark; + @apply bg-rust text-background; } body { @@ -91,10 +91,9 @@ main { font-size: 17px; line-height: 20px; letter-spacing: -0.01em; - margin-left: 5%; - margin-right: 5%; grid-template-columns: repeat(4, 1fr); - gap: 5%; + gap: 5vw; + padding: 0 5vw; } h1 { @@ -159,21 +158,21 @@ pre { @media (min-width: 640px) { main { grid-template-columns: repeat(6, 1fr); - gap: 2.5%; + gap: 2.5vw; } } -@media (min-width: 1024px) { +@media (min-width: 768px) { main { grid-template-columns: repeat(9, 1fr); - gap: 2.5%; + gap: 2.5vw; } } @media (min-width: 1440px) { main { grid-template-columns: repeat(12, 1fr); - gap: 1.25%; + gap: 1.25vw; font-size: 24px; line-height: 28px; letter-spacing: -0.01em; @@ -226,14 +225,39 @@ pre { height: 100vh; /* Prevents resizing quirks */ } -.grid-r { - @apply px-[5vw] grid grid-cols-4 sm:grid-cols-6 md:grid-cols-9 2xl:grid-cols-12 gap-x-[5vw] sm:gap-x-[2.5vw] 2xl:gap-x-[1.25vw] auto-rows-min; +.grid-a { + @apply px-[5vw] grid grid-cols-4 sm:grid-cols-6 md:grid-cols-9 2xl:grid-cols-12 gap-x-[5vw] sm:gap-x-[2.5vw] 2xl:gap-x-[1.25vw]; +} + +.grid-m { + @apply grid-a auto-rows-min; } html { @apply text-[125%] 2xl:text-[175%] 5xl:text-[200%]; } +html.lenis, +html.lenis body { + height: auto; +} + +.lenis.lenis-smooth { + scroll-behavior: auto !important; +} + +.lenis.lenis-smooth [data-lenis-prevent] { + overscroll-behavior: contain; +} + +.lenis.lenis-stopped { + overflow: clip; +} + +.lenis.lenis-smooth iframe { + pointer-events: none; +} + /*::-webkit-scrollbar {*/ /* width: 0.75vw;*/ /*}*/ diff --git a/tailwind.config.ts b/tailwind.config.ts index 306bad0..df83bf0 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,14 +1,15 @@ -import { DEFAULT } from "@react-three/fiber/dist/declarations/src/core/utils"; import type { Config } from "tailwindcss"; const config: Config = { content: [ + "./src/**/**/*.{js,ts,jsx,tsx,mdx}", "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/landing/**/*.{js,ts,jsx,tsx,mdx}", "./src/app/**/*.{js,ts,jsx,tsx,mdx}", "./src/styles/**/*.{js,ts,jsx,tsx,mdx}", ], - darkMode: "class", + darkMode: "media", theme: { extend: { screens: { @@ -72,38 +73,16 @@ const config: Config = { ], }, colors: { - background: { - DEFAULT: "#F8F4F2", - dark: "#0F0F10", - }, - foreground: { - DEFAULT: "#120E15", - dark: "#EDE6E1", - }, - methyl: { - DEFAULT: "#7D0D8C", - dark: "#771584", - }, - plasma: { - DEFAULT: "#B90674", - dark: "#A81770", - }, - oxide: { - DEFAULT: "#C90E33", - dark: "#98253C", - }, - rust: { - DEFAULT: "#FA4300", - dark: "#DE4208", - }, - molten: { - DEFAULT: "#FF9000", - dark: "#F18A03", - }, - sol: { - DEFAULT: "#F2F091", - dark: "#EAE9BC", - }, + background: "var(--background)", + foreground: "var(--foreground)", + filament: "var(--filament)", + carbon: "var(--carbon)", + methyl: "var(--methyl)", + plasma: "var(--plasma)", + oxide: "var(--oxide)", + rust: "var(--rust)", + molten: "var(--molten)", + sol: "var(--sol)", }, fontFamily: { apparat: ["KMR Apparat", "sans-serif"],