diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5f8e88d..fcc0113 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,6 +9,8 @@ "version": "0.0.0", "dependencies": { "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", @@ -49,6 +51,8 @@ "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.16", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard-with-typescript": "19.0.1", @@ -56,7 +60,10 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^3.2.5" + "postcss": "^8.4.32", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.5", + "vite": "^5.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -79,6 +86,414 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", @@ -90,6 +505,64 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/darwin-x64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", @@ -425,6 +898,37 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", + "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-arrow": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", @@ -448,6 +952,62 @@ } } }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", + "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", @@ -1183,6 +1743,47 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1437,6 +2038,25 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", @@ -1719,6 +2339,7 @@ "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1810,6 +2431,7 @@ "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -1877,6 +2499,7 @@ "version": "1.0.30001600", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -2009,6 +2632,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", @@ -2218,7 +2847,8 @@ "node_modules/electron-to-chromium": { "version": "1.4.721", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.721.tgz", - "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==" + "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==", + "dev": true }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -2436,6 +3066,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, "engines": { "node": ">=6" } @@ -3337,6 +3968,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, "engines": { "node": "*" }, @@ -3399,6 +4031,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -4208,6 +4849,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4528,7 +5181,8 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4542,6 +5196,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5144,6 +5799,15 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -5957,6 +6621,15 @@ "node": ">=0.8" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6158,6 +6831,7 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, "funding": [ { "type": "opencollective", diff --git a/frontend/package.json b/frontend/package.json index cadf074..64da555 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-navigation-menu": "^1.1.4", "@vitejs/plugin-react-swc": "^3.5.0", "autoprefixer": "^10.4.19", "class-variance-authority": "^0.7.0", @@ -43,7 +44,9 @@ "tailwindcss-animate": "^1.0.7", "typescript": "^5.2.2", "vite": "^5.2.0", - "zod": "^3.22.4" + "zod": "^3.22.4", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4" }, "devDependencies": { "@types/node": "^20.11.30", @@ -58,6 +61,11 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^3.2.5" + "prettier": "^3.2.5", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.5", + "vite": "^5.0.0" } } diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 0000000..1eaa180 --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,125 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* *=========== Default theme =========== */ +/* @layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} */ + +/* *=========== Green theme =========== */ +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 142.1 76.2% 36.3%; + --primary-foreground: 355.7 100% 97.3%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 142.1 76.2% 36.3%; + --radius: 0.5rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 0 0% 95%; + --card: 24 9.8% 10%; + --card-foreground: 0 0% 95%; + --popover: 0 0% 9%; + --popover-foreground: 0 0% 95%; + --primary: 142.1 70.6% 45.3%; + --primary-foreground: 144.9 80.4% 10%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 15%; + --muted-foreground: 240 5% 64.9%; + --accent: 12 6.5% 15.1%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 85.7% 97.3%; + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 142.4 71.8% 29.2%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/frontend/src/assets/cube-leg.png b/frontend/src/assets/cube-leg.png new file mode 100644 index 0000000..388ba8c Binary files /dev/null and b/frontend/src/assets/cube-leg.png differ diff --git a/frontend/src/assets/growth.png b/frontend/src/assets/growth.png new file mode 100644 index 0000000..2a04fca Binary files /dev/null and b/frontend/src/assets/growth.png differ diff --git a/frontend/src/assets/icon.ico b/frontend/src/assets/icon.ico new file mode 100644 index 0000000..ac12869 Binary files /dev/null and b/frontend/src/assets/icon.ico differ diff --git a/frontend/src/assets/icon.png b/frontend/src/assets/icon.png new file mode 100644 index 0000000..8ccc37f Binary files /dev/null and b/frontend/src/assets/icon.png differ diff --git a/frontend/src/assets/looking-ahead.png b/frontend/src/assets/looking-ahead.png new file mode 100644 index 0000000..fc8cf55 Binary files /dev/null and b/frontend/src/assets/looking-ahead.png differ diff --git a/frontend/src/assets/pilot.png b/frontend/src/assets/pilot.png new file mode 100644 index 0000000..e190bb2 Binary files /dev/null and b/frontend/src/assets/pilot.png differ diff --git a/frontend/src/assets/reflecting.png b/frontend/src/assets/reflecting.png new file mode 100644 index 0000000..60101e8 Binary files /dev/null and b/frontend/src/assets/reflecting.png differ diff --git a/frontend/src/components/About.tsx b/frontend/src/components/About.tsx new file mode 100644 index 0000000..b56821c --- /dev/null +++ b/frontend/src/components/About.tsx @@ -0,0 +1,40 @@ +import { Statistics } from "./Statistics"; +import pilot from "../assets/pilot.png"; + +export const About = () => { + return ( +
+
+
+ +
+
+

+ + About{" "} + + Company +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut + enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit + amet, consectetur adipiscing elit. +

+
+ + +
+
+
+
+ ); +}; diff --git a/frontend/src/components/Cta.tsx b/frontend/src/components/Cta.tsx new file mode 100644 index 0000000..305274f --- /dev/null +++ b/frontend/src/components/Cta.tsx @@ -0,0 +1,38 @@ +import { Button } from "./ui/button"; + +export const Cta = () => { + return ( +
+
+
+

+ All Your + + {" "} + Ideas & Concepts{" "} + + In One Interface +

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, + beatae. Ipsa tempore ipsum iste quibusdam illum ducimus eos. Quasi, + sed! +

+
+ +
+ + +
+
+
+ ); +}; diff --git a/frontend/src/components/FAQ.tsx b/frontend/src/components/FAQ.tsx new file mode 100644 index 0000000..67bf025 --- /dev/null +++ b/frontend/src/components/FAQ.tsx @@ -0,0 +1,90 @@ +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "../components/ui/accordion"; + +interface FAQProps { + question: string; + answer: string; + value: string; +} + +const FAQList: FAQProps[] = [ + { + question: "Is this template free?", + answer: "Yes. It is a free ChadcnUI template.", + value: "item-1", + }, + { + question: "Lorem ipsum dolor sit amet consectetur adipisicing elit?", + answer: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint labore quidem quam? Consectetur sapiente iste rerum reiciendis animi nihil nostrum sit quo, modi quod.", + value: "item-2", + }, + { + question: + "Lorem ipsum dolor sit amet Consectetur natus dolores minus quibusdam?", + answer: + "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Labore qui nostrum reiciendis veritatis necessitatibus maxime quis ipsa vitae cumque quo?", + value: "item-3", + }, + { + question: "Lorem ipsum dolor sit amet, consectetur adipisicing elit?", + answer: "Lorem ipsum dolor sit amet consectetur, adipisicing elit.", + value: "item-4", + }, + { + question: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur natus?", + answer: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint labore quidem quam? Consectetur sapiente iste rerum reiciendis animi nihil nostrum sit quo, modi quod.", + value: "item-5", + }, +]; + +export const FAQ = () => { + return ( +
+

+ Frequently Asked{" "} + + Questions + +

+ + + {FAQList.map(({ question, answer, value }: FAQProps) => ( + + + {question} + + + {answer} + + ))} + + +

+ Still have questions?{" "} + + Contact us + +

+
+ ); +}; diff --git a/frontend/src/components/Features.tsx b/frontend/src/components/Features.tsx new file mode 100644 index 0000000..6cd916b --- /dev/null +++ b/frontend/src/components/Features.tsx @@ -0,0 +1,99 @@ +import { Badge } from "./ui/badge"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "../components/ui/card"; +import image from "../assets/growth.png"; +import image3 from "../assets/reflecting.png"; +import image4 from "../assets/looking-ahead.png"; + +interface FeatureProps { + title: string; + description: string; + image: string; +} + +const features: FeatureProps[] = [ + { + title: "Responsive Design", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + image: image4, + }, + { + title: "Intuitive user interface", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + image: image3, + }, + { + title: "AI-Powered insights", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + image: image, + }, +]; + +const featureList: string[] = [ + "Dark/Light theme", + "Reviews", + "Features", + "Pricing", + "Contact form", + "Our team", + "Responsive design", + "Newsletter", + "Minimalist", +]; + +export const Features = () => { + return ( +
+

+ Many{" "} + + Great Features + +

+ +
+ {featureList.map((feature: string) => ( +
+ + {feature} + +
+ ))} +
+ +
+ {features.map(({ title, description, image }: FeatureProps) => ( + + + {title} + + + {description} + + + About feature + + + ))} +
+
+ ); +}; diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx new file mode 100644 index 0000000..0fcad37 --- /dev/null +++ b/frontend/src/components/Footer.tsx @@ -0,0 +1,154 @@ +import { LogoIcon } from "./Icons"; + +export const Footer = () => { + return ( + + ); +}; diff --git a/frontend/src/components/Hero.tsx b/frontend/src/components/Hero.tsx new file mode 100644 index 0000000..cd08dc4 --- /dev/null +++ b/frontend/src/components/Hero.tsx @@ -0,0 +1,56 @@ +import { Button } from "./ui/button"; +import { buttonVariants } from "./ui/button"; +import { HeroCards } from "./HeroCards"; +import { GitHubLogoIcon } from "@radix-ui/react-icons"; + +export const Hero = () => { + return ( +
+
+
+

+ + Shadcn + {" "} + landing page +

{" "} + for{" "} +

+ + React + {" "} + developers +

+
+ +

+ Build your React landing page effortlessly with the required sections + to your project. +

+ +
+ + + + Github Repository + + +
+
+ + {/* Hero cards sections */} +
+ +
+ + {/* Shadow effect */} +
+
+ ); +}; diff --git a/frontend/src/components/HeroCards.tsx b/frontend/src/components/HeroCards.tsx new file mode 100644 index 0000000..53da696 --- /dev/null +++ b/frontend/src/components/HeroCards.tsx @@ -0,0 +1,170 @@ +import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; +import { Badge } from "./ui/badge"; +import { Button, buttonVariants } from "../components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, + CardFooter, +} from "../components/ui/card"; +import { Check, Linkedin } from "lucide-react"; +import { LightBulbIcon } from "./Icons"; +import { GitHubLogoIcon } from "@radix-ui/react-icons"; + +export const HeroCards = () => { + return ( +
+ {/* Testimonial */} + + + + + SH + + +
+ John Doe React + @john_doe +
+
+ + This landig page is awesome! +
+ + {/* Team */} + + + user avatar + Leo Miranda + + Frontend Developer + + + + +

+ I really enjoy transforming ideas into functional software that + exceeds expectations +

+
+ + +
+ + Github icon + + + + X icon + + X + + + + + + Linkedin icon + + +
+
+
+ + {/* Pricing */} + + + + Free + + Most popular + + +
+ $0 + /month +
+ + + Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit. + +
+ + + + + +
+ + +
+ {["4 Team member", "4 GB Storage", "Upto 6 pages"].map( + (benefit: string) => ( + + {" "} +

{benefit}

+
+ ) + )} +
+
+
+ + {/* Service */} + + +
+ +
+
+ Light & dark mode + + Lorem ipsum dolor sit amet consect adipisicing elit. Consectetur + natusm. + +
+
+
+
+ ); +}; diff --git a/frontend/src/components/HowItWorks.tsx b/frontend/src/components/HowItWorks.tsx new file mode 100644 index 0000000..3c4cd27 --- /dev/null +++ b/frontend/src/components/HowItWorks.tsx @@ -0,0 +1,73 @@ +import { Card, CardContent, CardHeader, CardTitle } from "./ui/card"; +import { MedalIcon, MapIcon, PlaneIcon, GiftIcon } from "../components/Icons"; + +interface FeatureProps { + icon: JSX.Element; + title: string; + description: string; +} + +const features: FeatureProps[] = [ + { + icon: , + title: "Accesibility", + description: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum", + }, + { + icon: , + title: "Community", + description: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum", + }, + { + icon: , + title: "Scalability", + description: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum", + }, + { + icon: , + title: "Gamification", + description: + "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum", + }, +]; + +export const HowItWorks = () => { + return ( +
+

+ How It{" "} + + Works{" "} + + Step-by-Step Guide +

+

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. Veritatis + dolor pariatur sit! +

+ +
+ {features.map(({ icon, title, description }: FeatureProps) => ( + + + + {icon} + {title} + + + {description} + + ))} +
+
+ ); +}; diff --git a/frontend/src/components/Icons.tsx b/frontend/src/components/Icons.tsx new file mode 100644 index 0000000..d2afc56 --- /dev/null +++ b/frontend/src/components/Icons.tsx @@ -0,0 +1,664 @@ +export const LogoIcon = () => { + return ( + + + + + + ); +}; + +export const MedalIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + + ); +}; + +export const MapIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + ); +}; + +export const PlaneIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + ); +}; + +export const GiftIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const LightBulbIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + ); +}; + +export const WalletIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const ChartIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + ); +}; + +export const MagnifierIcon = () => { + return ( + + Free Icons + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx new file mode 100644 index 0000000..0185315 --- /dev/null +++ b/frontend/src/components/Navbar.tsx @@ -0,0 +1,141 @@ +import { useState } from "react"; +import { + NavigationMenu, + NavigationMenuItem, + NavigationMenuList, +} from "../components/ui/navigation-menu"; +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetTrigger, +} from "../components/ui/sheet"; + +import { GitHubLogoIcon } from "@radix-ui/react-icons"; +import { buttonVariants } from "./ui/button"; +import { Menu } from "lucide-react"; +import { ModeToggle } from "./mode-toggle"; +import { LogoIcon } from "./Icons"; + +interface RouteProps { + href: string; + label: string; +} + +const routeList: RouteProps[] = [ + { + href: "#features", + label: "Features", + }, + { + href: "#testimonials", + label: "Testimonials", + }, + { + href: "#pricing", + label: "Pricing", + }, + { + href: "#faq", + label: "FAQ", + }, +]; + +export const Navbar = () => { + const [isOpen, setIsOpen] = useState(false); + return ( +
+ + + + + + ShadcnUI/React + + + + {/* mobile */} + + + + + + setIsOpen(true)} + > + Menu Icon + + + + + + + Shadcn/React + + + + + + + + {/* desktop */} + + + + + +
+ ); +}; diff --git a/frontend/src/components/Newsletter.tsx b/frontend/src/components/Newsletter.tsx new file mode 100644 index 0000000..faf01f6 --- /dev/null +++ b/frontend/src/components/Newsletter.tsx @@ -0,0 +1,41 @@ +import { Button } from "./ui/button"; +import { Input } from "./ui/input"; + +export const Newsletter = () => { + const handleSubmit = (e: any) => { + e.preventDefault(); + console.log("Subscribed!"); + }; + + return ( +
+
+ +
+

+ Join Our Daily{" "} + + Newsletter + +

+

+ Lorem ipsum dolor sit amet consectetur. +

+ +
+ + +
+
+ +
+
+ ); +}; diff --git a/frontend/src/components/Pricing.tsx b/frontend/src/components/Pricing.tsx new file mode 100644 index 0000000..e024494 --- /dev/null +++ b/frontend/src/components/Pricing.tsx @@ -0,0 +1,147 @@ +import { Badge } from "../components/ui/badge"; +import { Button } from "../components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "../components/ui/card"; +import { Check } from "lucide-react"; + +enum PopularPlanType { + NO = 0, + YES = 1, +} + +interface PricingProps { + title: string; + popular: PopularPlanType; + price: number; + description: string; + buttonText: string; + benefitList: string[]; +} + +const pricingList: PricingProps[] = [ + { + title: "Free", + popular: 0, + price: 0, + description: + "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.", + buttonText: "Get Started", + benefitList: [ + "1 Team member", + "2 GB Storage", + "Upto 4 pages", + "Community support", + "lorem ipsum dolor", + ], + }, + { + title: "Premium", + popular: 1, + price: 5, + description: + "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.", + buttonText: "Start Free Trial", + benefitList: [ + "4 Team member", + "4 GB Storage", + "Upto 6 pages", + "Priority support", + "lorem ipsum dolor", + ], + }, + { + title: "Enterprise", + popular: 0, + price: 40, + description: + "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.", + buttonText: "Contact US", + benefitList: [ + "10 Team member", + "8 GB Storage", + "Upto 10 pages", + "Priority support", + "lorem ipsum dolor", + ], + }, +]; + +export const Pricing = () => { + return ( +
+

+ Get + + {" "} + Unlimited{" "} + + Access +

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias + reiciendis. +

+
+ {pricingList.map((pricing: PricingProps) => ( + + + + {pricing.title} + {pricing.popular === PopularPlanType.YES ? ( + + Most popular + + ) : null} + +
+ ${pricing.price} + /month +
+ + {pricing.description} +
+ + + + + +
+ + +
+ {pricing.benefitList.map((benefit: string) => ( + + {" "} +

{benefit}

+
+ ))} +
+
+
+ ))} +
+
+ ); +}; diff --git a/frontend/src/components/ScrollToTop.tsx b/frontend/src/components/ScrollToTop.tsx new file mode 100644 index 0000000..8a21c75 --- /dev/null +++ b/frontend/src/components/ScrollToTop.tsx @@ -0,0 +1,38 @@ +import { useState, useEffect } from "react"; +import { Button } from "./ui/button"; +import { ArrowUpToLine } from "lucide-react"; + +export const ScrollToTop = () => { + const [showTopBtn, setShowTopBtn] = useState(false); + + useEffect(() => { + window.addEventListener("scroll", () => { + if (window.scrollY > 400) { + setShowTopBtn(true); + } else { + setShowTopBtn(false); + } + }); + }, []); + + const goToTop = () => { + window.scroll({ + top: 0, + left: 0, + }); + }; + + return ( + <> + {showTopBtn && ( + + )} + + ); +}; diff --git a/frontend/src/components/Services.tsx b/frontend/src/components/Services.tsx new file mode 100644 index 0000000..493c4b3 --- /dev/null +++ b/frontend/src/components/Services.tsx @@ -0,0 +1,76 @@ +import { Card, CardDescription, CardHeader, CardTitle } from "./ui/card"; +import { MagnifierIcon, WalletIcon, ChartIcon } from "./Icons"; +import cubeLeg from "../assets/cube-leg.png"; + +interface ServiceProps { + title: string; + description: string; + icon: JSX.Element; +} + +const serviceList: ServiceProps[] = [ + { + title: "Code Collaboration", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + icon: , + }, + { + title: "Project Management", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + icon: , + }, + { + title: "Task Automation", + description: + "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.", + icon: , + }, +]; + +export const Services = () => { + return ( +
+
+
+

+ + Client-Centric{" "} + + Services +

+ +

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. Veritatis + dolor. +

+ +
+ {serviceList.map(({ icon, title, description }: ServiceProps) => ( + + +
+ {icon} +
+
+ {title} + + {description} + +
+
+
+ ))} +
+
+ + About services +
+
+ ); +}; diff --git a/frontend/src/components/Sponsors.tsx b/frontend/src/components/Sponsors.tsx new file mode 100644 index 0000000..7819982 --- /dev/null +++ b/frontend/src/components/Sponsors.tsx @@ -0,0 +1,58 @@ +import { Radar } from "lucide-react"; + +interface SponsorProps { + icon: JSX.Element; + name: string; +} + +const sponsors: SponsorProps[] = [ + { + icon: , + name: "Sponsor 1", + }, + { + icon: , + name: "Sponsor 2", + }, + { + icon: , + name: "Sponsor 3", + }, + { + icon: , + name: "Sponsor 4", + }, + { + icon: , + name: "Sponsor 5", + }, + { + icon: , + name: "Sponsor 6", + }, +]; + +export const Sponsors = () => { + return ( +
+

+ Investors and founders +

+ +
+ {sponsors.map(({ icon, name }: SponsorProps) => ( +
+ {icon} +

{name}

+
+ ))} +
+
+ ); +}; diff --git a/frontend/src/components/Statistics.tsx b/frontend/src/components/Statistics.tsx new file mode 100644 index 0000000..a8b252d --- /dev/null +++ b/frontend/src/components/Statistics.tsx @@ -0,0 +1,41 @@ +export const Statistics = () => { + interface statsProps { + quantity: string; + description: string; + } + + const stats: statsProps[] = [ + { + quantity: "2.7K+", + description: "Users", + }, + { + quantity: "1.8K+", + description: "Subscribers", + }, + { + quantity: "112", + description: "Downloads", + }, + { + quantity: "4", + description: "Products", + }, + ]; + + return ( +
+
+ {stats.map(({ quantity, description }: statsProps) => ( +
+

{quantity}

+

{description}

+
+ ))} +
+
+ ); +}; diff --git a/frontend/src/components/Team.tsx b/frontend/src/components/Team.tsx new file mode 100644 index 0000000..d7b1d51 --- /dev/null +++ b/frontend/src/components/Team.tsx @@ -0,0 +1,161 @@ +import { buttonVariants } from "../components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "../components/ui/card"; +import { Facebook, Instagram, Linkedin } from "lucide-react"; + +interface TeamProps { + imageUrl: string; + name: string; + position: string; + socialNetworks: SociaNetworkslProps[]; +} + +interface SociaNetworkslProps { + name: string; + url: string; +} + +const teamList: TeamProps[] = [ + { + imageUrl: "https://i.pravatar.cc/150?img=35", + name: "Emma Smith", + position: "Product Manager", + socialNetworks: [ + { name: "Linkedin", url: "http://linkedin.com" }, + { + name: "Facebook", + url: "https://www.facebook.com/", + }, + { + name: "Instagram", + url: "https://www.instagram.com/", + }, + ], + }, + { + imageUrl: "https://i.pravatar.cc/150?img=60", + name: "John Doe", + position: "Tech Lead", + socialNetworks: [ + { name: "Linkedin", url: "http://linkedin.com" }, + { + name: "Facebook", + url: "https://www.facebook.com/", + }, + { + name: "Instagram", + url: "https://www.instagram.com/", + }, + ], + }, + { + imageUrl: "https://i.pravatar.cc/150?img=36", + name: "Ashley Ross", + position: "Frontend Developer", + socialNetworks: [ + { name: "Linkedin", url: "http://linkedin.com" }, + + { + name: "Instagram", + url: "https://www.instagram.com/", + }, + ], + }, + { + imageUrl: "https://i.pravatar.cc/150?img=17", + name: "Bruce Rogers", + position: "Backend Developer", + socialNetworks: [ + { name: "Linkedin", url: "http://linkedin.com" }, + { + name: "Facebook", + url: "https://www.facebook.com/", + }, + ], + }, +]; + +export const Team = () => { + const socialIcon = (iconName: string) => { + switch (iconName) { + case "Linkedin": + return ; + + case "Facebook": + return ; + + case "Instagram": + return ; + } + }; + + return ( +
+

+ + Our Dedicated{" "} + + Crew +

+ +

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. Veritatis + dolor pariatur sit! +

+ +
+ {teamList.map( + ({ imageUrl, name, position, socialNetworks }: TeamProps) => ( + + + {`${name} + {name} + + {position} + + + + +

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

+
+ + + {socialNetworks.map(({ name, url }: SociaNetworkslProps) => ( + + ))} + +
+ ) + )} +
+
+ ); +}; diff --git a/frontend/src/components/Testimonials.tsx b/frontend/src/components/Testimonials.tsx new file mode 100644 index 0000000..1bab485 --- /dev/null +++ b/frontend/src/components/Testimonials.tsx @@ -0,0 +1,111 @@ +import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "../components/ui/card"; + +interface TestimonialProps { + image: string; + name: string; + userName: string; + comment: string; +} + +const testimonials: TestimonialProps[] = [ + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe", + comment: "This landing page is awesome!", + }, + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe1", + comment: + "Lorem ipsum dolor sit amet,empor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.", + }, + + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe2", + comment: + "Lorem ipsum dolor sit amet,exercitation. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident.", + }, + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe3", + comment: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.", + }, + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe4", + comment: + "Lorem ipsum dolor sit amet, tempor incididunt aliqua. Ut enim ad minim veniam, quis nostrud.", + }, + { + image: "https://github.com/shadcn.png", + name: "John Doe React", + userName: "@john_Doe5", + comment: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + }, +]; + +export const Testimonials = () => { + return ( +
+

+ Discover Why + + {" "} + People Love{" "} + + This Landing Page +

+ +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non unde error + facere hic reiciendis illo +

+ +
+ {testimonials.map( + ({ image, name, userName, comment }: TestimonialProps) => ( + + + + + OM + + +
+ {name} + {userName} +
+
+ + {comment} +
+ ) + )} +
+
+ ); +}; diff --git a/frontend/src/components/entities/PlayerCard/PlayerCard.tsx b/frontend/src/components/entities/PlayerCard/PlayerCard.tsx index 1bab982..7952b43 100644 --- a/frontend/src/components/entities/PlayerCard/PlayerCard.tsx +++ b/frontend/src/components/entities/PlayerCard/PlayerCard.tsx @@ -21,7 +21,7 @@ const PlayerCard = () =>{ - {t("open")} + {t("open")} фио diff --git a/frontend/src/components/mode-toggle.tsx b/frontend/src/components/mode-toggle.tsx index cb704cc..884d529 100644 --- a/frontend/src/components/mode-toggle.tsx +++ b/frontend/src/components/mode-toggle.tsx @@ -1,41 +1,40 @@ -import { Moon, Sun } from "lucide-react" - -import { Button } from "./shared/ui/button" -import { useTheme } from "./theme-provider" -import { useTranslation } from "react-i18next" -import { MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem, MenubarSeparator, MenubarShortcut } from "./shared/ui/menubar" -import { ResetIcon } from "@radix-ui/react-icons" - - +import { Button } from "../components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "../components/ui/dropdown-menu"; +import { useTheme } from "../components/theme-provider"; +import { Moon, Sun } from "lucide-react"; export function ModeToggle() { - const { setTheme } = useTheme() - - const { t } = useTranslation(); + const { setTheme } = useTheme(); return ( - - - - - - setTheme("light")}> - {t("LightTheme")}⌘L - - setTheme("dark")}> - {t("DarkTheme")}⌘D - - - setTheme("system")}> - {t("SystemTheme")} - - - - ) + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); } - - diff --git a/frontend/src/components/pages/Admin/Admin.tsx b/frontend/src/components/pages/Admin/Admin.tsx index ccab961..6d2fdf7 100644 --- a/frontend/src/components/pages/Admin/Admin.tsx +++ b/frontend/src/components/pages/Admin/Admin.tsx @@ -1,30 +1,32 @@ -import { Button } from "../../shared/ui/button" -import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "../../shared/ui/resizable" -import less from "./Admin.module.less" -import PlayerCard from "../../entities/PlayerCard/PlayerCard" -import { useTranslation } from "react-i18next" -import CreateTeam from "../../widgets/CreateTeams/CreateTeams" +import { Button } from "../../shared/ui/button"; +import { + ResizableHandle, + ResizablePanel, + ResizablePanelGroup, +} from "../../shared/ui/resizable"; +import less from "./Admin.module.less"; +import PlayerCard from "../../entities/PlayerCard/PlayerCard"; +import { useTranslation } from "react-i18next"; +import CreateTeam from "../../widgets/CreateTeams/CreateTeams"; -const AdminPage = () =>{ - const { t } = useTranslation(); - return( - - -
- - -
- -
- - - - - - - - -
- ) -} -export default AdminPage \ No newline at end of file +const AdminPage = () => { + const { t } = useTranslation(); + return ( + + +
+ + +
+
+ + + + + + + +
+ ); +}; +export default AdminPage; diff --git a/frontend/src/components/pages/Landing/Landing.tsx b/frontend/src/components/pages/Landing/Landing.tsx index 6230ed9..0397245 100644 --- a/frontend/src/components/pages/Landing/Landing.tsx +++ b/frontend/src/components/pages/Landing/Landing.tsx @@ -1,22 +1,41 @@ -import less from "./Landing.module.less" -import '../../../i18n' -import { Button } from "../../shared/ui/button" -import { Label } from "@radix-ui/react-menubar" -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import { About } from "../../About"; +import { Cta } from "../../Cta"; +import { FAQ } from "../../FAQ"; +import { Features } from "../../Features"; +import { Footer } from "../../Footer"; +import { Hero } from "../../Hero"; +import { HowItWorks } from "../../HowItWorks"; +import { Navbar } from "../../Navbar"; +import { Newsletter } from "../../Newsletter"; +import { Pricing } from "../../Pricing"; +import { ScrollToTop } from "../../ScrollToTop"; +import { Services } from "../../Services"; +import { Sponsors } from "../../Sponsors"; +import { Team } from "../../Team"; +import { Testimonials } from "../../Testimonials"; +import "../../../App.css"; +import { ThemeProvider } from "../../theme-provider.tsx"; function Landing() { - const { t } = useTranslation(); - return ( - <>
-

{t("landingLogo")}

-
- - -
- - ) + + + + + + + + + + + + + + +