diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/klfx-lit.iml b/.idea/klfx-lit.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/klfx-lit.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3668dc8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f834156 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..727b8b5 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6f3c990 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index d067910..64deb39 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "typescript.tsdk": "node_modules/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true -} \ No newline at end of file + "typescript.enablePromptUseWorkspaceTsdk": true, + "cSpell.words": ["nprogress"] +} diff --git a/next.config.js b/next.config.js index dafb0c8..20b4f21 100644 --- a/next.config.js +++ b/next.config.js @@ -3,6 +3,15 @@ const nextConfig = { experimental: { appDir: true, }, -} + images: { + domains: [ + "tailwindui.com", + "flowbite.com", + "img.freepik.com", + "images.unsplash.com", + ], + dangerouslyAllowSVG: true, + }, +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/package-lock.json b/package-lock.json index 48afb04..7add8e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,22 +8,38 @@ "name": "klfx-lit", "version": "0.1.0", "dependencies": { + "@headlessui/react": "^1.7.14", "@next/font": "13.1.6", "@types/node": "18.14.0", + "autoprefixer": "^10.4.14", "eslint": "8.34.0", "eslint-config-next": "13.1.6", "firebase": "^9.17.1", "firebase-admin": "^11.5.0", "firebase-tools": "^11.24.0", "next": "13.1.6", + "postcss": "^8.4.23", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^4.7.1", + "tailwindcss": "^3.3.2", "typescript": "4.9.5" }, "devDependencies": { "@types/react": "^18.0.33", - "@types/react-dom": "^18.0.11" + "@types/react-dom": "^18.0.11", + "prettier": "2.8.8" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@babel/parser": { @@ -749,6 +765,21 @@ "node": ">=6" } }, + "node_modules/@headlessui/react": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.14.tgz", + "integrity": "sha512-znzdq9PG8rkwcu9oQ2FwIy0ZFtP9Z7ycS+BAqJ3R5EIqC/0bJGvhT7193rFf+45i9nnPsYvCQVW4V/bB9Xc+gA==", + "dependencies": { + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -779,6 +810,54 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, "node_modules/@jsdoc/salty": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.3.tgz", @@ -1472,6 +1551,28 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1580,6 +1681,38 @@ "retry": "0.13.1" } }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -1641,6 +1774,14 @@ "node": "*" } }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1667,6 +1808,33 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1692,10 +1860,18 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001456", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", - "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "funding": [ { "type": "opencollective", @@ -1704,6 +1880,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -1734,6 +1914,43 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1765,6 +1982,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -1795,6 +2020,17 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -1877,6 +2113,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1888,6 +2129,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1919,6 +2165,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.374", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.374.tgz", + "integrity": "sha512-dNP9tQNTrjgVlSXMqGaj0BdrCS+9pcUvy5/emB6x8kh0YwCoDZ0Z4ce1+7aod+KhybHUd5o5LgKrc5al4kVmzQ==" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -9944,11 +10195,36 @@ "is-callable": "^1.1.3" } }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -10582,6 +10858,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -10873,6 +11160,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/jose/-/jose-4.12.0.tgz", @@ -11100,11 +11395,24 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/limiter": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -11331,10 +11639,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11398,6 +11722,29 @@ } } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -11425,6 +11772,27 @@ "node": ">= 6.13.0" } }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11437,7 +11805,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true, "engines": { "node": ">= 6" } @@ -11679,10 +12046,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "funding": [ { "type": "opencollective", @@ -11691,10 +12074,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -11702,14 +12089,98 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -11855,6 +12326,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readable-stream": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", @@ -11869,6 +12348,17 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -11919,11 +12409,11 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12275,6 +12765,46 @@ } } }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12312,6 +12842,71 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12346,6 +12941,25 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -12383,6 +12997,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -12503,6 +13122,35 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "optional": true }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12514,8 +13162,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "optional": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "9.0.0", @@ -12670,6 +13317,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -12708,6 +13363,11 @@ } }, "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, "@babel/parser": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", @@ -13306,6 +13966,14 @@ "yargs": "^16.2.0" } }, + "@headlessui/react": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.14.tgz", + "integrity": "sha512-znzdq9PG8rkwcu9oQ2FwIy0ZFtP9Z7ycS+BAqJ3R5EIqC/0bJGvhT7193rFf+45i9nnPsYvCQVW4V/bB9Xc+gA==", + "requires": { + "client-only": "^0.0.1" + } + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -13326,6 +13994,47 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } + } + }, "@jsdoc/salty": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.3.tgz", @@ -13806,6 +14515,25 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -13890,6 +14618,19 @@ "retry": "0.13.1" } }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -13925,6 +14666,11 @@ "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "optional": true }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -13948,6 +14694,17 @@ "fill-range": "^7.0.1" } }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -13967,10 +14724,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, "caniuse-lite": { - "version": "1.0.30001456", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", - "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==" + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" }, "catharsis": { "version": "0.9.0", @@ -13990,6 +14752,31 @@ "supports-color": "^7.1.0" } }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -14018,6 +14805,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -14042,6 +14834,11 @@ "which": "^2.0.1" } }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, "csstype": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", @@ -14104,6 +14901,11 @@ "object-keys": "^1.1.1" } }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -14112,6 +14914,11 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -14140,6 +14947,11 @@ "safe-buffer": "^5.0.1" } }, + "electron-to-chromium": { + "version": "1.4.374", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.374.tgz", + "integrity": "sha512-dNP9tQNTrjgVlSXMqGaj0BdrCS+9pcUvy5/emB6x8kh0YwCoDZ0Z4ce1+7aod+KhybHUd5o5LgKrc5al4kVmzQ==" + }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -20368,11 +21180,22 @@ "is-callable": "^1.1.3" } }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -20836,6 +21659,14 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -21019,6 +21850,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" + }, "jose": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/jose/-/jose-4.12.0.tgz", @@ -21215,11 +22051,21 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, "limiter": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -21394,10 +22240,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", @@ -21427,6 +22283,18 @@ "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1" + }, + "dependencies": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } } }, "node-fetch": { @@ -21442,6 +22310,21 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -21450,8 +22333,7 @@ "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { "version": "1.12.3", @@ -21612,21 +22494,77 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -21737,6 +22675,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, "readable-stream": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", @@ -21748,6 +22694,14 @@ "util-deprecate": "^1.0.1" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -21783,11 +22737,11 @@ } }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -22020,6 +22974,35 @@ "client-only": "0.0.1" } }, + "sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22042,6 +23025,47 @@ "tslib": "^2.5.0" } }, + "tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + } + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -22070,6 +23094,22 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -22101,6 +23141,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -22189,6 +23234,15 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "optional": true }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -22200,8 +23254,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "optional": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "uuid": { "version": "9.0.0", @@ -22317,6 +23370,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index e25eece..d15deee 100644 --- a/package.json +++ b/package.json @@ -10,24 +10,34 @@ }, "dependencies": { "@headlessui/react": "^1.7.14", + "@heroicons/react": "^2.0.18", "@next/font": "13.1.6", + "@react-buddy/ide-toolbox-next": "^2.4.0", "@types/node": "18.14.0", + "@types/nprogress": "^0.2.0", "autoprefixer": "^10.4.14", + "axios": "^1.4.0", "eslint": "8.34.0", "eslint-config-next": "13.1.6", "firebase": "^9.17.1", "firebase-admin": "^11.5.0", "firebase-tools": "^11.24.0", + "flowbite": "^1.6.5", + "flowbite-react": "^0.4.4", "next": "13.1.6", + "nprogress": "^0.2.0", "postcss": "^8.4.23", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^4.7.1", + "react-tippy": "^1.4.0", + "swr": "^2.1.5", "tailwindcss": "^3.3.2", "typescript": "4.9.5" }, "devDependencies": { "@types/react": "^18.0.33", - "@types/react-dom": "^18.0.11" + "@types/react-dom": "^18.0.11", + "prettier": "2.8.8" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..a964969 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,10 @@ +const { join } = require("path"); + +module.exports = { + plugins: { + tailwindcss: { + config: join(__dirname, "tailwind.config.js"), + }, + autoprefixer: {}, + }, +}; diff --git a/public/static/free-lessons.js b/public/static/free-lessons.js new file mode 100644 index 0000000..234eb5a --- /dev/null +++ b/public/static/free-lessons.js @@ -0,0 +1,102 @@ +export const freeLessons = [ + { + courseName: "Hapat e parë në forex", + chapters: [ + { + title: "Kapitulli 1: Fillimi", + lessons: [ + { + id: 1, + title: "Mësimi 1: Hyrje Ne Forex\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 2, + title: "Mësimi 2: Hyrje ne Metatrader\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + ], + }, + { + title: "Kapitulli 2: Analiza Teknike", + lessons: [ + { + id: 1, + title: "Mësimi 1: Si të lexojmë grafikët\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + + { + id: 3, + title: "Mësimi 3: Si të lllogarisim lotet\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 4, + title: "Mësimi 4: Si të menaxhosh riskun\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "ME PAGESË", + }, + { + id: 5, + title: "Mësimi 5: Përgatitja psiologjike ne forex\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "ME PAGESË", + }, + ], + }, + ], + }, +]; diff --git a/public/static/paid-lessons.js b/public/static/paid-lessons.js new file mode 100644 index 0000000..d1a42a2 --- /dev/null +++ b/public/static/paid-lessons.js @@ -0,0 +1,211 @@ +export const paidLessons = [ + { + courseName: "Kursi i plotë", + chapters: [ + { + title: "Kapitulli 1: Fillimi", + lessons: [ + { + id: 1, + title: "Mësimi 1: Hyrje Ne Forex\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 2, + title: "Mësimi 2: Hyrje ne Metatrader\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + ], + }, + { + title: "Kapitulli 2: Analiza Teknike", + lessons: [ + { + id: 1, + title: "Mësimi 1: Si të lexojmë grafikët\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 2, + title: "Mësimi 2: Si të llogarsim pip-sat\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 3, + title: "Mësimi 3: Si të lllogarisim lotet\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 4, + title: "Mësimi 4: Si të menaxhosh riskun\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 5, + title: "Mësimi 5: Përgatitja psiologjike ne forex\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + ], + }, + { + title: "Kapitulli 3: Suporti dhe Rezistenca", + lessons: [ + { + id: 1, + title: "Mësimi 1: Si të lexojmë grafikët\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 2, + title: "Mësimi 2: Si të llogarsim pip-sat\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + + { + id: 5, + title: "Mësimi 5: Përgatitja psiologjike ne forex\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + ], + }, + { + title: "Kapitulli 4: Strategjitë", + lessons: [ + { + id: 1, + title: "Mësimi 1: Si të lexojmë grafikët\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + { + id: 2, + title: "Mësimi 2: Si të llogarsim pip-sat\n", + videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + + { + id: 5, + title: "Mësimi 5: Përgatitja psiologjike ne forex\n", + videoUrl: "", + imageSrc: + "https://tailwindui.com/img/ecommerce-images/category-page-04-image-card-01.jpg", + imageAlt: + "Tall slender porcelain bottle with natural clay textured body and cork stopper.", + duration: "6:30", + views: 300, + createdOn: "2020-10-10", + authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", + category: "FOREX", + }, + ], + }, + ], + }, +]; diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx new file mode 100644 index 0000000..dda84bc --- /dev/null +++ b/src/app/admin/page.tsx @@ -0,0 +1,177 @@ +"use client"; +import React from "react"; +import { useRouter } from "next/navigation"; +import { useFetch } from "@/hooks/useSWR"; +import NavTop from "@/components/NavTop"; +import GenericInfoText from "@/components/GenericInfoText"; +import { User } from "@/types/metadata"; +import { useAuthContext } from "@/context/AuthContext"; +import UserManagementModal from "@/components/UserManagementModal"; +import DeleteUserModal from "@/components/DeleteUserModal"; +import Link from "next/link"; +import FirebaseUser from "@/types/firebase_user"; +import { getAuth, deleteUser } from "firebase/auth"; + + +type Metadata = Record; + +const AdminPage = () => { + const router = useRouter(); + const { user } = useAuthContext() as { user: FirebaseUser | null }; + const { GetRealtimeDatabaseMetadata } = useFetch(); + const { data: metadata, error: metadataError } = GetRealtimeDatabaseMetadata(); + + const [modalVisible, setModalVisible] = React.useState(undefined); + const [openModal, setOpenModal] = React.useState(); + const [selectedUser, setSelectedUser] = React.useState(null); + + const handleRowClick = (user: User) => { + console.log("userusi: ", user) + setSelectedUser(user); + setModalVisible("dismissible"); + }; + + const handleDeleteUser = async () => { + if (user && user.email) { + try { + const auth = getAuth(); + const user = auth.currentUser; + if (user) { + //await deleteUser(user); + console.log("user deleted", user.email); + router.push("/admin"); + } + + // User deletion successful, perform any additional actions + // such as updating the UI or displaying a success message. + } catch (error) { + // An error occurred while deleting the user. + // Handle the error, display an error message, or perform any necessary actions. + console.log("Error deleting user:", error); + } + } + }; + + + if (metadataError) { + return ( + + {metadataError.toString()} + + ); + } + + if (!metadata) { + return ( + + Loading... + + ); + } + + const users: User[] = Object.values(metadata); + + return ( + <> + {user && user.email === "ramiz.aliaa@gmail.com" ? ( +
+ + +
+
+

+ Users +

+
+ +
+ + + + + + + + + + + {users.map((user) => ( + + + + + + + + ))} + +
+ Email + + Has Premium + + Access Level + + Actions +
+
handleRowClick(user)}> + {user.user} +
+
+
+ {user.customClaims.hasPremium.toString()} +
+
+
+ {user.customClaims.accessLevel} +
+
+ + +
+
+ + + + +
+
+ ) : ( + + You are not authorized to access this page. + + )} + + ); +}; + +export default AdminPage; \ No newline at end of file diff --git a/src/app/article/[id]/page.tsx b/src/app/article/[id]/page.tsx new file mode 100644 index 0000000..3873255 --- /dev/null +++ b/src/app/article/[id]/page.tsx @@ -0,0 +1,35 @@ +"use client"; +import React from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + +interface ArticlePageProps { + params: { + id: string; + }; +} + +const ArticlePage = ({ params }: ArticlePageProps) => { + return ( +
+

+ {" "} + Article {params.id}{" "} +

+ +

+ Back to Articles +

+
+ ); +}; + +export default ArticlePage; diff --git a/src/app/articles/page.tsx b/src/app/articles/page.tsx new file mode 100644 index 0000000..948fd33 --- /dev/null +++ b/src/app/articles/page.tsx @@ -0,0 +1,92 @@ +"use client"; +import React from "react"; +import { useRouter } from "next/navigation"; +import NavTop from "@/components/NavTop"; +import Link from "next/link"; +import { useFetch } from "@/hooks/useSWR"; +import { User } from "@/types/metadata"; + +const ArticlesPage = () => { + const router = useRouter(); + const { GetRealtimeDatabaseMetadata } = useFetch(); + const { data: metadata, error: metadataError } = + GetRealtimeDatabaseMetadata(); + + if (metadataError) { + return ( +
+ {metadataError.toString()} +
+ ); + } + + if (!metadata) { + return ( +
+ Loading... +
+ ); + } + + return ( +
+ +
+

+ Users +

+
+ + + + + + + + + + + {Object.values(metadata).map((user: User) => ( + + + + + + + ))} + +
+ User + + Access Level + + Has Premium + + Actions +
+
+ {user.user} +
+
+
+ {user.customClaims.accessLevel} +
+
+
+ {user.customClaims.hasPremium.toString()} +
+
+ + +
+
+
+
+ ); +}; + +export default ArticlesPage; diff --git a/src/app/dashboard/page.js b/src/app/dashboard/page.js index 772031a..2542375 100644 --- a/src/app/dashboard/page.js +++ b/src/app/dashboard/page.js @@ -2,12 +2,10 @@ import React from "react"; import { useAuthContext } from "@/context/AuthContext"; import { useRouter } from "next/navigation"; -import styles from "../../app/page.module.css"; -import signOutUser from "@/firebase/auth/signout"; import PaidLessons from "@/components/PaidLessons"; -import Link from "next/link"; -import PayPerView from "../../components/PayPerView"; import loadingStyles from "../loading.module.css"; +import NavTop from "../../components/NavTop"; +import { paidLessons } from "../../../public/static/paid-lessons"; const PaidLessonsPage = () => { const { user } = useAuthContext(); @@ -15,6 +13,8 @@ const PaidLessonsPage = () => { const [hasPremium, setHasPremium] = React.useState(false); + console.log("hasPremium", hasPremium); + React.useEffect(() => { if (user == null) // Redirect the user to the login page or homepage after 2 seconds @@ -26,29 +26,13 @@ const PaidLessonsPage = () => { } }, [router, user]); - const handleSignOut = async () => { - const { error } = await signOutUser(); - if (error) { - console.log("Error signing out:", error); - } else { - console.log("Successfully signed out"); - // Redirect the user to the login page or homepage - router.push("/"); - } - }; - return ( -
+ <> {user && ( - <> -
-

Welcome {user.email}

- - Faqja Kryesore -
- - {hasPremium ? : } - +
+ + +
)} {!user && ( @@ -57,7 +41,7 @@ const PaidLessonsPage = () => {
)} -
+ ); }; diff --git a/src/app/free-lessons/page.tsx b/src/app/free-lessons/page.tsx index 16d5610..e44b076 100644 --- a/src/app/free-lessons/page.tsx +++ b/src/app/free-lessons/page.tsx @@ -1,43 +1,17 @@ "use client"; import React from "react"; import { useRouter } from "next/navigation"; +import NavTop from "@/components/NavTop"; import FreeLessons from "@/components/FreeLessons"; -import Link from "next/link"; const FreeLessonsPage = () => { const router = useRouter(); return ( -
- - - - - - -
- -
- -
+
+ + +
); }; diff --git a/src/app/globals.css b/src/app/globals.css index 1bc6a9e..b5c61c9 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,111 +1,3 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', - 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', - 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient( - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0) - ); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} - @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; diff --git a/src/app/head.tsx b/src/app/head.tsx index bb99c92..fb32cb5 100644 --- a/src/app/head.tsx +++ b/src/app/head.tsx @@ -5,6 +5,7 @@ export default function Head() { + {/* eslint-disable-next-line @next/next/no-sync-scripts */} ); } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2815150..4f9a366 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,15 +1,36 @@ "use client"; import "./globals.css"; import { AuthContextProvider } from "@/context/AuthContext"; +import Head from "@/app/head"; +import React from "react"; +import NProgress from "nprogress"; +import Router from "next/router"; +import "./nprogress.css"; export default function RootLayout({ children, }: { children: React.ReactNode; }) { + React.useEffect(() => { + const handleRouteStart = () => NProgress.start(); + const handleRouteDone = () => NProgress.done(); + + Router.events.on("routeChangeStart", handleRouteStart); + Router.events.on("routeChangeComplete", handleRouteDone); + Router.events.on("routeChangeError", handleRouteDone); + + return () => { + // Make sure to remove the event handler on unmount! + Router.events.off("routeChangeStart", handleRouteStart); + Router.events.off("routeChangeComplete", handleRouteDone); + Router.events.off("routeChangeError", handleRouteDone); + }; + }, []); + return ( - + {children} diff --git a/src/app/lessonCard.module.css b/src/app/lessonCard.module.css index 9c689f5..b8b7f71 100644 --- a/src/app/lessonCard.module.css +++ b/src/app/lessonCard.module.css @@ -1,86 +1,78 @@ -.lessonCard { - /*display: flex;*/ - /*flex-direction: column;*/ - /*border: 1px solid #ddd;*/ - /*border-radius: 5px;*/ - /*box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);*/ - /*overflow: hidden;*/ - /*width: 100%;*/ - @apply max-w-md mx-auto bg-white rounded-xl shadow-md overflow-hidden md:max-w-2xl; -} - -.cardImage { - position: relative; - @apply md:shrink-0; -} - -.cardImage img { - width: 100%; - height: 200px; - object-fit: cover; - @apply h-48 w-full object-cover md:h-full md:w-48; - @apply transition duration-500 ease-in-out transform hover:-translate-y-1 hover:z-10 hover:shadow-2xl hover:scale-110 hover:opacity-80 hover:cursor-pointer; -} - .duration { - position: absolute; - top: 10px; - right: 10px; - padding: 5px; - background-color: rgba(0, 0, 0, 0.7); - color: #fff; - font-size: 12px; - font-weight: bold; - border-radius: 5px; -} - -.cardContent { - padding: 10px; -} - -.cardTitle { - font-size: 18px; - font-weight: bold; - margin-bottom: 10px; + position: absolute; + top: 10px; + right: 10px; + padding: 5px; + background-color: rgba(0, 0, 0, 0.7); + color: #fff; + font-size: 12px; + font-weight: bold; + border-radius: 5px; } .details { - position: absolute; - bottom: 10px; - right: 10px; - padding: 5px; - color: #fff; - font-size: 10px; - font-weight: bold; - border-radius: 5px; - color: black; - background-color: white; - + position: absolute; + bottom: 10px; + right: 10px; + padding: 5px; + font-size: 10px; + font-weight: bold; + border-radius: 5px; + color: black; + background-color: white; } -.views { - margin-right: 10px; - color: #777; +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 11; + backdrop-filter: blur(8px); } -.createdOn { - color: #777; +.modalContent { + position: relative; + width: 80%; + height: 80%; + max-width: 800px; + max-height: 600px; + background-color: white; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; } -.author { - display: flex; - align-items: center; +.modalHeader { + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: 10px; + display: flex; + justify-content: space-between; + align-items: center; + @apply text-base font-medium text-gray-900 mobile:text-xl bg-blue-50; } -.author img { - width: 30px; - height: 30px; - border-radius: 50%; - margin-right: 10px; +.modalContent iframe { + width: 100%; + height: 100%; } -.authorName { - font-size: 14px; - font-weight: bold; +.modalContent button { + position: absolute; + top: 0; + right: 0; + padding: 16px; + background-color: red; + border: none; + cursor: pointer; + z-index: 11; } - diff --git a/src/app/login/page.js b/src/app/login/page.js index 2941747..1572fde 100644 --- a/src/app/login/page.js +++ b/src/app/login/page.js @@ -2,17 +2,14 @@ import React from "react"; import signIn from "@/firebase/auth/signin"; import { useRouter } from "next/navigation"; -import styles from "../../app/page.module.css"; import { useAuthContext } from "@/context/AuthContext"; -import Link from "next/link"; -import FreeLessons from "@/components/FreeLessons"; +import AuthPageLayout from "@/components/AuthPageLayout"; +import GenericForm from "@/components/GenericForm"; const LoginPage = () => { const router = useRouter(); const { user } = useAuthContext(); - const [email, setEmail] = React.useState(""); - const [password, setPassword] = React.useState(""); const [error, setError] = React.useState(null); React.useEffect(() => { @@ -21,8 +18,7 @@ const LoginPage = () => { } }, [router, user]); - const handleSignIn = async (e) => { - e.preventDefault(); + const handleSignIn = async (email, password) => { const { error } = await signIn(email, password); if (error) { setError(error.message); @@ -32,36 +28,23 @@ const LoginPage = () => { }; return ( -
-
-

Login

-
- setEmail(e.target.value)} - required - /> - setPassword(e.target.value)} - required - /> -
- -

- Faqja Kryesore

- - Nuk ke akoma llogari? Regjistrohu pra ca pret{" "} - -
{" "} -
- {error &&

{error}

} -
-
+ + {/* Page header */} +

VisionFX Academy

+
+

Login

+ + {/* Form */} + + +
+ {error &&

{error}

} +
); }; diff --git a/src/app/nprogress.css b/src/app/nprogress.css new file mode 100644 index 0000000..3619227 --- /dev/null +++ b/src/app/nprogress.css @@ -0,0 +1,81 @@ +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #29d; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes nprogress-spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 703c9ee..8d4e16f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,18 +1,17 @@ -import styles from "./page.module.css"; -import LandingPageHeader from "../components/LandingPageHeader"; -import LandingPageMainContent from "../components/LandingPageMainContent"; -import LandingPageBottomActions from "../components/LandingPageBottomActions"; -import LandingPageFooter from "../components/LandingPageFooter"; +import HomeMain from "@/components/HomeMain"; +import PricingSection from "@/components/PricingSection"; +import FeatureSection from "@/components/FeatureSection"; +import BlogSection from "@/components/BlogSection"; +import LandingPageFooter from "@/components/LandingPageFooter"; const Home = () => { return ( <> -
- - - -
- {/* */} + + + + + ); }; diff --git a/src/app/register/page.js b/src/app/register/page.js index 293860e..cf52993 100644 --- a/src/app/register/page.js +++ b/src/app/register/page.js @@ -2,60 +2,41 @@ import React from "react"; import signUp from "@/firebase/auth/signup"; import { useRouter } from "next/navigation"; -import { useAuthContext } from "@/context/AuthContext"; -import Link from "next/link"; -import { setCustomUserClaims } from "firebase/auth"; +import AuthPageLayout from "@/components/AuthPageLayout"; +import GenericForm from "@/components/GenericForm"; const RegisterPage = () => { - const [email, setEmail] = React.useState(""); - const [password, setPassword] = React.useState(""); - const router = useRouter(); - - const handleForm = async (event) => { - event.preventDefault(); + const [error, setError] = React.useState(null); + const [success, setSuccess] = React.useState(null); + const handleSignUp = async (email, password) => { const { result, error } = await signUp(email, password); - if (error) { - return console.log(error); + setError(error.message); + } else { + setSuccess("User registered successfully! You can now log in."); } - - // else successful - console.log(result); - return router.push("/dashboard"); }; + return ( -
-
-

Regjistrohu

-
- - - - Faqja Kryesore -
-
-
+ + {/* Page header */} +

VisionFX Academy

+
+

Register

+ + {/* Form */} + + +
+ {error &&

{error}

} + {success &&

{success}

} +
); }; diff --git a/src/components/.UserManagementModal.tsx.swp b/src/components/.UserManagementModal.tsx.swp new file mode 100644 index 0000000..94bbc04 Binary files /dev/null and b/src/components/.UserManagementModal.tsx.swp differ diff --git a/src/components/AuthPageLayout.tsx b/src/components/AuthPageLayout.tsx new file mode 100644 index 0000000..cd035bb --- /dev/null +++ b/src/components/AuthPageLayout.tsx @@ -0,0 +1,16 @@ +"use client"; +import "../app/globals.css"; + +interface AuthPageLayoutProps { + children: React.ReactNode; +} + +const AuthPageLayout = ({ children }: AuthPageLayoutProps) => { + return ( +
+ {children} +
+ ); +}; + +export default AuthPageLayout; diff --git a/src/components/BlogSection.tsx b/src/components/BlogSection.tsx new file mode 100644 index 0000000..f6fd15b --- /dev/null +++ b/src/components/BlogSection.tsx @@ -0,0 +1,119 @@ +const posts = [ + { + id: 1, + title: "Boost your conversion rate", + href: "#", + description: + "Illo sint voluptas. Error voluptates culpa eligendi. Hic vel totam vitae illo. Non aliquid explicabo necessitatibus unde. Sed exercitationem placeat consectetur nulla deserunt vel. Iusto corrupti dicta.", + date: "Mar 16, 2020", + datetime: "2020-03-16", + category: { title: "Marketing", href: "#" }, + author: { + name: "Michael Foster", + role: "Co-Founder / CTO", + href: "#", + imageUrl: + "https://images.unsplash.com/photo-1519244703995-f4e0f30006d5?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80", + }, + }, + { + id: 1, + title: "Boost your conversion rate", + href: "#", + description: + "Illo sint voluptas. Error voluptates culpa eligendi. Hic vel totam vitae illo. Non aliquid explicabo necessitatibus unde. Sed exercitationem placeat consectetur nulla deserunt vel. Iusto corrupti dicta.", + date: "Mar 16, 2020", + datetime: "2020-03-16", + category: { title: "Marketing", href: "#" }, + author: { + name: "Michael Foster", + role: "Co-Founder / CTO", + href: "#", + imageUrl: + "https://images.unsplash.com/photo-1519244703995-f4e0f30006d5?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80", + }, + }, + { + id: 1, + title: "Boost your conversion rate", + href: "#", + description: + "Illo sint voluptas. Error voluptates culpa eligendi. Hic vel totam vitae illo. Non aliquid explicabo necessitatibus unde. Sed exercitationem placeat consectetur nulla deserunt vel. Iusto corrupti dicta.", + date: "Mar 16, 2020", + datetime: "2020-03-16", + category: { title: "Marketing", href: "#" }, + author: { + name: "Michael Foster", + role: "Co-Founder / CTO", + href: "#", + imageUrl: + "https://images.unsplash.com/photo-1519244703995-f4e0f30006d5?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80", + }, + }, + // More posts... +]; + +export default function Example() { + return ( +
+
+
+

+ Nga Blogu +

+

+ Mësoni se si të maksimizoni fitimet tuaja duke përdorur strategjitë + tona të provuara dhe të testuara. +

+
+
+ {posts.map((post) => ( + + ))} +
+
+
+ ); +} diff --git a/src/components/BottomBlurBar.tsx b/src/components/BottomBlurBar.tsx new file mode 100644 index 0000000..1f09bce --- /dev/null +++ b/src/components/BottomBlurBar.tsx @@ -0,0 +1,33 @@ + +import React from 'react'; + +interface BottomBlurBarProps { + text: string; + buttonText: string; +} + +const BottomBlurBar = ({ text, buttonText }: BottomBlurBarProps) => { + return ( +
+
+
+
+
+

+ {text} +

+ + {buttonText} + +
+
+
+
+
+ ); +} + +export default BottomBlurBar; \ No newline at end of file diff --git a/src/components/DeleteUserModal.tsx b/src/components/DeleteUserModal.tsx new file mode 100644 index 0000000..074c92e --- /dev/null +++ b/src/components/DeleteUserModal.tsx @@ -0,0 +1,37 @@ +'use client'; + +import { Button, Modal } from 'flowbite-react'; +import React from "react"; +import { HiOutlineExclamationCircle } from "react-icons/hi"; + +const DeleteUserModal = ({ openModal, setOpenModal }: { openModal: string | undefined, setOpenModal: React.Dispatch> }) => { + const props = { openModal, setOpenModal }; + + return ( + <> + props.setOpenModal(undefined)} className="h-screen overflow-hidden"> + + +
+ +

+ Je i sigurt qe doni ta fshini kete person? +

+
+ + +
+
+
+
+ + ) +} + +export default DeleteUserModal; + + diff --git a/src/components/FeatureSection.tsx b/src/components/FeatureSection.tsx new file mode 100644 index 0000000..0554953 --- /dev/null +++ b/src/components/FeatureSection.tsx @@ -0,0 +1,73 @@ +import { + CloudArrowUpIcon, + LockClosedIcon, + ServerIcon, +} from "@heroicons/react/20/solid"; + +const features = [ + { + name: "Push to deploy.", + description: + "Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.", + icon: CloudArrowUpIcon, + }, + { + name: "SSL certificates.", + description: + "Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo.", + icon: LockClosedIcon, + }, + { + name: "Database backups.", + description: + "Ac tincidunt sapien vehicula erat auctor pellentesque rhoncus. Et magna sit morbi lobortis.", + icon: ServerIcon, + }, +]; + +export default function FeatureSection() { + return ( +
+
+
+
+
+

+ Deploy faster +

+

+ Merr ne kontroll tradet e tua +

+

+ Me ane te ketij kursi ju do te mesoni si te beheni nje trader i + sukseshem dhe i kontrolluar fale eksperiencave personale dhe + keshillave me te mira. +

+
+ {features.map((feature) => ( +
+
+
{" "} +
{feature.description}
+
+ ))} +
+
+
+ Product screenshot +
+
+
+ ); +} diff --git a/src/components/FreeLessons.js b/src/components/FreeLessons.js index e7799f5..0041062 100644 --- a/src/components/FreeLessons.js +++ b/src/components/FreeLessons.js @@ -1,82 +1,50 @@ import React from "react"; -import LessonCard from "./LessonCard"; +import LessonCard from "@/components/LessonCard"; +import BottomBlurBar from "@/components/BottomBlurBar"; +import { freeLessons } from "../../public/static/free-lessons"; const FreeLessons = () => { - const [lessons, setLessons] = React.useState([ - { - id: 1, - title: "Bej lek pa lek", - videoUrl: "https://www.youtube.com/watch?v=7CqJlxBYj-M", - imageUrl: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - duration: "1:30", - views: 100, - createdOn: "2020-10-10", - authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - category: "FOREX", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec auctor, nisl vitae tincidunt ultricies, nunc nisl ultricies nunc, vitae luctus", - }, - { - id: 2, - title: "Menaxho rrezikun o cun", - videoUrl: "https://www.youtube.com/watch?v=xPZoHsaRVzM", - imageUrl: "https://i.ytimg.com/vi/mxK8b99iJTg/maxresdefault.jpg", - duration: "5:30", - views: 200, - createdOn: "2020-10-10", - authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - category: "FOREX", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec auctor, nisl vitae tincidunt ultricies, nunc nisl ultricies nunc, vitae luctus", - - }, - { - id: 3, - title: "Fibonaci, esht me lek, mvje keq ;)", - videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", - imageUrl: "https://i.ytimg.com/vi/mxK8b99iJTg/maxresdefault.jpg", - duration: "6:30", - views: 300, - createdOn: "2020-10-10", - authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - category: "CRYPTO", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec auctor, nisl vitae tincidunt ultricies, nunc nisl ultricies nunc, vitae luctus", - }, - { - id: 2, - title: "Menaxho rrezikun o cun", - videoUrl: "https://www.youtube.com/watch?v=xPZoHsaRVzM", - imageUrl: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - duration: "5:30", - views: 200, - createdOn: "2020-10-10", - authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - category: "FOREX", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec auctor, nisl vitae tincidunt ultricies, nunc nisl ultricies nunc, vitae luctus", - - }, - { - id: 3, - title: "Fibonaci, esht me lek, mvje keq ;)", - videoUrl: "https://www.youtube.com/watch?v=mxK8b99iJTg", - imageUrl: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - duration: "6:30", - views: 300, - createdOn: "2020-10-10", - authorImage: "https://i.ytimg.com/vi/7CqJlxBYj-M/maxresdefault.jpg", - category: "CRYPTO", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec auctor, nisl vitae tincidunt ultricies, nunc nisl ultricies nunc, vitae luctus", - }, - - ]); - return ( -
-

Mesime Pa Lek

- {lessons.map((lesson) => ( - - ))} +
+ {freeLessons.map((course) => ( + <> +
+
+

+ {course.courseName} +

+ {course.chapters.map((chapter) => ( +
+

+ {chapter.title} +

+
+ {chapter.lessons.map((lesson) => ( + + ))} +
+
+ ))} +
+
+ + ))} + {/* space between content and footer */} +
+
+ {/* add blur effect and spread */} +
- - +
); }; diff --git a/src/components/GenericForm.tsx b/src/components/GenericForm.tsx new file mode 100644 index 0000000..ac8f309 --- /dev/null +++ b/src/components/GenericForm.tsx @@ -0,0 +1,78 @@ +import React, { useState, FormEvent } from "react"; +import Link from "next/link"; + +interface GenericFormProps { + handleSubmit: (email: string, password: string) => void; + buttonText: string; + linkText: string; + linkHref: string; +} + +const GenericForm: React.FC = ({ + handleSubmit, + buttonText, + linkText, + linkHref, +}) => { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + + const handleSubmitForm = (e: FormEvent) => { + e.preventDefault(); + handleSubmit(email, password); // Pass email and password values to handleSubmit function + }; + + return ( +
+ + setEmail(e.target.value)} + required + /> + + + setPassword(e.target.value)} + required + /> + +
+ + Faqja Kryesore + + + / + + {linkText} + + + / + + Reset Password + +
+
+ ); +}; + +export default GenericForm; diff --git a/src/components/GenericInfoText.tsx b/src/components/GenericInfoText.tsx new file mode 100644 index 0000000..3bc3392 --- /dev/null +++ b/src/components/GenericInfoText.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import Link from "next/link"; + +interface GenericInfoTextProps { + children: React.ReactNode; + textSize: string; + textAlignment: string; + textColor: string; + customStyles: string; +} + +const GenericInfoText: React.FC = ({ + children, + textSize, + textAlignment, + textColor, + customStyles, +}) => { + return ( +
+ {children} +
+ // Desired outcome: + // "text-4xl text-center font-medium text-gray-500 hover:text-gray-900" + ); +}; + +export default GenericInfoText; diff --git a/src/components/HomeMain.tsx b/src/components/HomeMain.tsx new file mode 100644 index 0000000..d717f7b --- /dev/null +++ b/src/components/HomeMain.tsx @@ -0,0 +1,212 @@ +"use client"; +import { useState } from "react"; +import { Dialog } from "@headlessui/react"; +import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; +import Link from "next/link"; +import Image from "next/image"; + +const navigation = [ + { name: "Kursi falas", href: "/free-lessons" }, + { name: "Kursi me pagesë", href: "/dashboard" }, + { name: "Analiza Teknine", href: "#" }, + { name: "Kompania", href: "#" }, +]; + +const HomeMain = () => { + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + + return ( +
+
+ + +
+ +
+ + Your Company + logos + + +
+
+
+
+ {navigation.map((item) => ( + + {item.name} + + ))} +
+
+ + Log in + +
+
+
+
+
+
+ +
+ + ); +}; + +export default HomeMain; diff --git a/src/components/LandingPageBottomActions.js b/src/components/LandingPageBottomActions.js index 6d330d9..c5a4d1f 100644 --- a/src/components/LandingPageBottomActions.js +++ b/src/components/LandingPageBottomActions.js @@ -16,34 +16,79 @@ const LandingPageBottomActions = () => { rel="noopener noreferrer" >

- Mesime Falas -> + Mesime Falas{" "} + + + + +

Mesime falas per te gjithe qe deshiron te futen ne boten e Forex-it + dhe per te mesuar me shume

- Kursi me pagese -> + Kursi me pagese{" "} + + + + +

Analizat teknike dhe pergatitje e avancuar per te bere i suksesshem ne - forex + forex dhe per te bere para

- +

- Analiza Teknike -> + Artikuj Teknik{" "} + + + + +

Shpjegimi i disa koncepteve bazike te menyres sesi funksionon analiza - teknike + teknike plus artikuj te ndryshem nga bota e forex-it

diff --git a/src/components/LandingPageFooter.js b/src/components/LandingPageFooter.js index 2d3b99a..ba1d35c 100644 --- a/src/components/LandingPageFooter.js +++ b/src/components/LandingPageFooter.js @@ -1,57 +1,61 @@ -import styles from "../app/footer.module.css"; -import { FaFacebook, FaTwitter, FaInstagram } from "react-icons/fa"; +import Image from "next/image"; const LandingPageFooter = () => { return ( -