From 85ef56f3016b02570d3bc8036d689672a4d79271 Mon Sep 17 00:00:00 2001 From: codebox283 Date: Tue, 24 Jun 2025 18:28:47 +0530 Subject: [PATCH] Full Chat Interface and added the other sections below --- .env.example | 2 + index.html | 2 + package-lock.json | 138 +++----------- package.json | 2 + src/App.css | 4 + src/App.tsx | 2 + src/components/ChatInterface.tsx | 158 +++++++++------- src/components/Header.tsx | 26 ++- src/components/HeroSection.tsx | 104 +++++++++++ src/components/LeftSidebar.tsx | 156 +++++++++++----- src/components/MCPSection.tsx | 127 +++++++++++++ src/components/MonetizeSection.tsx | 208 ++++++++++++++++++++++ src/components/SidebarPanel.tsx | 4 +- src/components/content/DynamicContent.tsx | 50 ++++++ src/components/ui/input.tsx | 2 +- src/hooks/useChat.ts | 83 +++++++++ src/pages/Index.tsx | 68 ++++++- src/services/geminiService.ts | 71 ++++++++ tailwind.config.ts | 44 ++++- 19 files changed, 1012 insertions(+), 239 deletions(-) create mode 100644 .env.example create mode 100644 src/components/HeroSection.tsx create mode 100644 src/components/MCPSection.tsx create mode 100644 src/components/MonetizeSection.tsx create mode 100644 src/components/content/DynamicContent.tsx create mode 100644 src/hooks/useChat.ts create mode 100644 src/services/geminiService.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5da1525 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +# Google Gemini API Key +NEXT_PUBLIC_GEMINI_API_KEY=AIzaSyAK8AyA8JYTprpqIif4qBiPql84Uh0VFh4 diff --git a/index.html b/index.html index 485a0de..e4480ca 100644 --- a/index.html +++ b/index.html @@ -21,6 +21,8 @@ + + diff --git a/package-lock.json b/package-lock.json index 0954d98..e24d1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "vite_react_shadcn_ts", "version": "0.0.0", "dependencies": { + "@google/generative-ai": "^0.24.1", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", @@ -55,6 +56,7 @@ "recharts": "^2.12.7", "sonner": "^1.5.0", "tailwind-merge": "^2.5.2", + "tailwind-scrollbar-hide": "^4.0.0", "tailwindcss-animate": "^1.0.7", "vaul": "^0.9.3", "zod": "^3.23.8" @@ -83,7 +85,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -750,6 +751,15 @@ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", "license": "MIT" }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@hookform/resolvers": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", @@ -815,7 +825,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -833,7 +842,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -848,7 +856,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -858,7 +865,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -868,14 +874,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -886,7 +890,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -900,7 +903,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -910,7 +912,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -924,7 +925,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -2925,14 +2925,14 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2943,7 +2943,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -3235,7 +3235,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3248,7 +3247,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3264,14 +3262,12 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, "license": "MIT" }, "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==", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3285,7 +3281,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3349,14 +3344,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3380,7 +3373,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -3436,7 +3428,6 @@ "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==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -3484,7 +3475,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -3509,7 +3499,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -3920,7 +3909,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3933,14 +3921,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -3957,7 +3943,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3971,7 +3956,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -4158,14 +4142,12 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, "license": "Apache-2.0" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, "license": "MIT" }, "node_modules/dom-helpers": { @@ -4182,7 +4164,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { @@ -4224,7 +4205,6 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, "license": "MIT" }, "node_modules/esbuild": { @@ -4503,7 +4483,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4520,7 +4499,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -4547,7 +4525,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -4570,7 +4547,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -4621,7 +4597,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -4652,7 +4627,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4667,7 +4641,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4686,7 +4659,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -4707,7 +4679,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -4720,7 +4691,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4730,7 +4700,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -4776,7 +4745,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4854,7 +4822,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -4867,7 +4834,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -4883,7 +4849,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4893,7 +4858,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4903,7 +4867,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -4916,7 +4879,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4926,14 +4888,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -4949,7 +4909,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -5023,7 +4982,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -5036,7 +4994,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -5546,7 +5503,6 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, "license": "ISC" }, "node_modules/lucide-react": { @@ -5571,7 +5527,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -5581,7 +5536,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -5608,7 +5562,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -5625,7 +5578,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -5637,7 +5589,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -5680,7 +5631,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5709,7 +5659,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -5769,7 +5718,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { @@ -5799,7 +5747,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5809,14 +5756,12 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -5833,14 +5778,12 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -5853,7 +5796,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5863,7 +5805,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -5873,7 +5814,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5902,7 +5842,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -5920,7 +5859,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -5940,7 +5878,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -5976,7 +5913,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -6002,7 +5938,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -6016,7 +5951,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { @@ -6060,7 +5994,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -6294,7 +6227,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -6304,7 +6236,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -6355,7 +6286,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -6383,7 +6313,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -6430,7 +6359,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -6476,7 +6404,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6489,7 +6416,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6499,7 +6425,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -6522,7 +6447,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6532,7 +6456,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -6551,7 +6474,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -6566,7 +6488,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6576,14 +6497,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -6596,7 +6515,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -6613,7 +6531,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -6626,7 +6543,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6649,7 +6565,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -6685,7 +6600,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6704,11 +6618,19 @@ "url": "https://github.com/sponsors/dcastil" } }, + "node_modules/tailwind-scrollbar-hide": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-4.0.0.tgz", + "integrity": "sha512-gobtvVcThB2Dxhy0EeYSS1RKQJ5baDFkamkhwBvzvevwX6L4XQfpZ3me9s25Ss1ecFVT5jPYJ50n+7xTBJG9WQ==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20" + } + }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -6762,7 +6684,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -6772,7 +6693,6 @@ "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==", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -6791,7 +6711,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -6817,7 +6736,6 @@ "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==", - "dev": true, "license": "Apache-2.0" }, "node_modules/tslib": { @@ -6972,7 +6890,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/vaul": { @@ -7074,7 +6991,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7100,7 +7016,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -7119,7 +7034,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -7137,7 +7051,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7147,14 +7060,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -7169,7 +7080,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -7182,7 +7092,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -7195,7 +7104,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", - "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 51d7960..2e20ecf 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "preview": "vite preview" }, "dependencies": { + "@google/generative-ai": "^0.24.1", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", @@ -58,6 +59,7 @@ "recharts": "^2.12.7", "sonner": "^1.5.0", "tailwind-merge": "^2.5.2", + "tailwind-scrollbar-hide": "^4.0.0", "tailwindcss-animate": "^1.0.7", "vaul": "^0.9.3", "zod": "^3.23.8" diff --git a/src/App.css b/src/App.css index b9d355d..eac26c9 100644 --- a/src/App.css +++ b/src/App.css @@ -18,6 +18,10 @@ filter: drop-shadow(0 0 2em #61dafbaa); } +html, body, #root { + font-family: 'Quicksand', sans-serif; +} + @keyframes logo-spin { from { transform: rotate(0deg); diff --git a/src/App.tsx b/src/App.tsx index 18daf2e..2d32392 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,11 +14,13 @@ const App = () => ( +
} /> {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} } /> +
diff --git a/src/components/ChatInterface.tsx b/src/components/ChatInterface.tsx index c4fd0df..5347c30 100644 --- a/src/components/ChatInterface.tsx +++ b/src/components/ChatInterface.tsx @@ -1,13 +1,15 @@ - -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import TypingAnimation from './TypingAnimation'; import { getPromptContent } from '../utils/promptContent'; +import { Plus, Send, Upload } from 'lucide-react'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; interface ChatInterfaceProps { onPromptSelect: (prompt: string, content: any) => void; isExpanded: boolean; + onStartNewChat?: () => void; } const prompts = [ @@ -21,9 +23,10 @@ const ChatInterface: React.FC = ({ onPromptSelect, isExpande const [messages, setMessages] = useState>([]); const [inputValue, setInputValue] = useState(''); const [isThinking, setIsThinking] = useState(false); + const [chatKey, setChatKey] = useState(0); + const scrollAnchorRef = useRef(null); const handlePromptClick = (prompt: string) => { - // Add user message setMessages(prev => [...prev, { text: prompt, isUser: true }]); setIsThinking(true); @@ -40,48 +43,47 @@ const ChatInterface: React.FC = ({ onPromptSelect, isExpande const handleSendMessage = () => { if (!inputValue.trim()) return; - const prompt = inputValue; setInputValue(''); handlePromptClick(prompt); }; const handleKeyPress = (e: React.KeyboardEvent) => { - if (e.key === 'Enter') { - handleSendMessage(); - } + if (e.key === 'Enter') handleSendMessage(); }; - // Listen for messages from left sidebar + useEffect(() => { const handleLeftSidebarPrompt = (event: CustomEvent) => { handlePromptClick(event.detail.prompt); }; - window.addEventListener('leftSidebarPrompt' as any, handleLeftSidebarPrompt); - return () => { window.removeEventListener('leftSidebarPrompt' as any, handleLeftSidebarPrompt); }; }, []); + useEffect(() => { + if (scrollAnchorRef.current) { + scrollAnchorRef.current.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } + }, [messages, isThinking]); + return ( -
+
{/* Hero Section */} {messages.length === 0 && (
-

- Build an MCP server and become part of the new world +

+ Build an MCP server and become a part of the new world.

-

- Where AI chatbots are the modern interface +

+ Where AI chatbots are the modern interface.

- - {/* Glassmorphism card with prompts */}

How can I help you today? @@ -104,61 +106,97 @@ const ChatInterface: React.FC = ({ onPromptSelect, isExpande {/* Chat Messages */} {messages.length > 0 && ( -
- {messages.map((message, index) => ( -
+
+
+ {messages.map((message, index) => (
- {message.isTyping ? ( - - ) : ( - message.text - )} -
-
- ))} - - {isThinking && ( -
-
-
-
-
-
-
-
- AI is thinking... +
+ {message.isTyping ? ( + + ) : ( + message.text + )}
-
- )} + ))} + {isThinking && ( +
+
+
+
+
+
+
+
+ Hmm good question... +
+
+
+ )} + {/* Anchor stays inside this container */} +
+
)} {/* Input Area */} -
-
- setInputValue(e.target.value)} - onKeyPress={handleKeyPress} - placeholder="Ask me anything about MCP..." - className="flex-1 border-0 bg-transparent focus:ring-0 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400" - /> +
+ {/* First Line: Text Input */} + setInputValue(e.target.value)} + onKeyDown={handleKeyPress} + placeholder="Ask me anything about MCP..." + className="border-0 bg-transparent focus:outline-none focus:ring-0 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400" + /> + + {/* Second Line: Dropdown + Upload + Send */} +
+
+ {/* Dropdown */} + + + {/* Upload Icon */} + +
+ + {/* Send Button */}
diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 46b1e23..3eb7969 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -2,20 +2,34 @@ import React from 'react'; import { useTheme } from '../contexts/ThemeContext'; import { Button } from '@/components/ui/button'; -import { FiSun, FiMoon } from 'react-icons/fi'; +import { FiSun, FiMoon, FiMenu } from 'react-icons/fi'; -const Header = () => { +interface HeaderProps { + onMenuClick?: () => void; +} + +const Header: React.FC = ({ onMenuClick }) => { const { isDark, toggleTheme } = useTheme(); return (
-
+ {onMenuClick && ( + + )} + {/*
M -
-

- MCP Platform +

*/} +

+ Fastcode

diff --git a/src/components/HeroSection.tsx b/src/components/HeroSection.tsx new file mode 100644 index 0000000..1015a14 --- /dev/null +++ b/src/components/HeroSection.tsx @@ -0,0 +1,104 @@ + +import { Button } from "@/components/ui/button" +import { ArrowRight, Play, MessageSquare, Zap, Sparkles } from "lucide-react" + +const HeroSection = () => { + return ( +
+ {/* Background grid */} +
+ + {/* Floating elements */} + {/*
+
+
*/} + +
+
+ {/* Badge */} +
+ + Now in Beta +
+ + {/* Main headline */} +

+ + Monetize Your AI Ideas. + +
+ No Code Needed. +

+ + {/* Subtext */} +

+ Create, deploy, and sell Everyday Series and MCPs—whether you're a dev or not. + Turn your AI concepts into revenue streams with our powerful platform. +

+ + {/* CTA Buttons */} +
+ + + +
+ + {/* ChatGPT-style interface preview */} +
+
+
+
+
+
+
+
+
MCP Chat Interface
+
+ +
+
+
+ +
+
+

+ "Create a trading bot that monitors crypto prices and executes trades based on technical indicators" +

+
+
+ +
+
+ +
+
+

+ ✨ Perfect! I've created your trading bot MCP. It's now live and earning $2.50 per execution.
+ Revenue this month: $847 +

+
+
+
+
+
+
+
+
+ ) +} + +export default HeroSection diff --git a/src/components/LeftSidebar.tsx b/src/components/LeftSidebar.tsx index f0af448..176695d 100644 --- a/src/components/LeftSidebar.tsx +++ b/src/components/LeftSidebar.tsx @@ -1,11 +1,13 @@ - -import React from 'react'; +import React, { useRef, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { useTheme } from '../contexts/ThemeContext'; -import { FiMenu, FiX, FiHelpCircle, FiUsers, FiDollarSign, FiZap, FiExternalLink } from 'react-icons/fi'; +import { FiMenu, FiX, FiHelpCircle, FiUsers, FiDollarSign, FiZap, FiExternalLink, FiMoon, FiSun } from 'react-icons/fi'; +import { LucideCodeXml } from 'lucide-react'; +import { useNavigate } from "react-router-dom"; interface LeftSidebarProps { onPromptSelect: (prompt: string, content: any) => void; + onStartNewChat?: () => void; // Add this prop } const suggestedQuestions = [ @@ -15,11 +17,41 @@ const suggestedQuestions = [ { text: "What can you help me with?", icon: FiZap }, ]; -const LeftSidebar: React.FC = ({ onPromptSelect }) => { +const navLinks = [ + { text: "Home", icon: FiHelpCircle, to: "#home" }, + { text: "MCPs", icon: FiUsers, to: "#mcps" }, + { text: "Monetize", icon: FiDollarSign, to: "#monetize" }, +]; + +const LeftSidebar: React.FC = ({ onPromptSelect, onStartNewChat }) => { const { sidebarOpen, setSidebarOpen } = useTheme(); + const { isDark, toggleTheme } = useTheme(); + const sidebarRef = useRef(null); + const navigate = useNavigate(); + + // Close sidebar on outside click + useEffect(() => { + if (!sidebarOpen) return; + const handleClickOutside = (event: MouseEvent) => { + if ( + sidebarRef.current && + !sidebarRef.current.contains(event.target as Node) + ) { + setSidebarOpen(false); + } + }; + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [sidebarOpen, setSidebarOpen]); const handlePromptClick = (prompt: string) => { - // This will trigger the same logic as in ChatInterface + // Dispatch a custom event to notify ChatInterface + const event = new CustomEvent('leftSidebarPrompt', { detail: { prompt } }); + window.dispatchEvent(event); + + // Trigger the same logic as in ChatInterface onPromptSelect(prompt, null); }; @@ -38,67 +70,97 @@ const LeftSidebar: React.FC = ({ onPromptSelect }) => { {/* Sidebar */}
-
-
- {/* Header */} -
-

- Quick Start -

- +
+ {/* Top Section: Logo, Navigation, Theme Toggle */} +
+ {/* Logo */} +
+ {/* Logo */} + + FastCode
+ {/* Theme Toggle */} + +
- {/* Suggested Questions */} -
-
-

- Explore Features + {/* Nav menu */} + {/*
+

+ Navigation +

+ {navLinks.map((nav, index) => ( + + ))} +
*/} + + {/* Main Section: Suggested Questions & Start New Chat */} +
+
+

+ Quick Start

{suggestedQuestions.map((question, index) => ( - + ))}
-
- - {/* Website Link */} -
-

- Resources -

+ {/* Start New Chat Button */}
+ {/* Bottom Section: Visit Website */} +
+

+ Resources +

+

diff --git a/src/components/MCPSection.tsx b/src/components/MCPSection.tsx new file mode 100644 index 0000000..deeeffa --- /dev/null +++ b/src/components/MCPSection.tsx @@ -0,0 +1,127 @@ +import { Button } from "@/components/ui/button" +import { Code, Cpu, DollarSign, Zap, ArrowRight, Box } from "lucide-react" + +const MCPSection = () => { + return ( +
+ +
+
+
+ + Monetizable Code Packages +
+ +

+ What is an MCP? +

+ +

+ MCP = a wrapper on an API that works with LLMs. Think of it as a packaged AI behavior + ready to be deployed or sold. No complex infrastructure needed. +

+
+ +
+ {/* Simple to Create */} +
+
+ +
+

Simple to Create

+

+ Use our visual builder or write custom code. MCPs wrap your logic into LLM-compatible packages. +

+
+ // Example MCP
+ function weatherBot()
+ → Returns: Live weather data +
+
+ + {/* Easy to Deploy */} +
+
+ +
+

Easy to Deploy

+

+ One-click deployment to our global network. Your MCP becomes instantly available to LLMs worldwide. +

+
+
+ Status: Live & Earning +
+
+ + {/* Ready to Monetize */} +
+
+ +
+

Ready to Monetize

+

+ Set your pricing, track usage, and get paid automatically. Turn your AI ideas into recurring revenue. +

+
+
+ Per-use pricing: + $0.01 - $10.00 +
+
+ Monthly revenue: + $500 - $5000+ +
+
+
+
+ + {/* Example MCPs */} +
+

Popular MCP Examples

+
+
+
+ +
+

Code Generator

+

Generates clean, documented code in any language

+
$2.50/use • 1.2k uses this month
+
+ +
+
+ +
+

Data Analyzer

+

Converts raw data into actionable insights

+
$5.00/use • 800 uses this month
+
+ +
+
+ +
+

Content Creator

+

Writes engaging content for any platform

+
$1.00/use • 2.1k uses this month
+
+
+
+ +
+ +
+
+
+ ) +} + +export default MCPSection diff --git a/src/components/MonetizeSection.tsx b/src/components/MonetizeSection.tsx new file mode 100644 index 0000000..c761d55 --- /dev/null +++ b/src/components/MonetizeSection.tsx @@ -0,0 +1,208 @@ +import { Button } from "@/components/ui/button" +import { DollarSign, TrendingUp, Zap, Globe, ArrowRight, BarChart3 } from "lucide-react" + +const MonetizeSection = () => { + return ( +
+ {/* Background grid pattern */} +
+ +
+
+
+ + Revenue Streams +
+ +

+ Monetize Your Creations +

+ +

+ Turn your MCPs into profitable APIs. Create disposable apps that live and die per use. + Build the future of AI-powered commerce. +

+
+ + {/* Revenue Models */} +
+
+
+ +
+

Per-Use Pricing

+

+ Charge users each time they access your MCP. Perfect for high-value, specialized tools. +

+
+
+ Typical range: + $0.01 - $50 +
+
+ Revenue share: + 85% to you +
+
+
+ +
+
+ +
+

Subscription Series

+

+ Monthly recurring revenue from your Everyday Series. Build loyal audiences that pay regularly. +

+
+
+ Monthly pricing: + $2.99 - $99 +
+
+ Revenue share: + 90% to you +
+
+
+ +
+
+ +
+

Disposable Apps

+

+ Lightweight apps that serve one purpose, then disappear. Zero maintenance, pure profit. +

+
+
+ App lifespan: + 1 use - 24 hours +
+
+ Revenue share: + 85% to you +
+
+
+
+ + {/* Network Effect Visualization */} +
+

The MCP Network Effect

+ +
+ {/* Central hub */} +
+ YOU +
+ + {/* Connection lines */} +
+
+ {/* Animated connection lines */} + {[0, 45, 90, 135, 180, 225, 270, 315].map((angle, index) => ( +
+ ))} +
+
+ + {/* Network nodes */} +
+
+
+ +
+
AI Agents
+
+$2.4k/mo
+
+ +
+
+ +
+
Users
+
8.2k active
+
+ +
+
+ +
+
Apps
+
150+ deployed
+
+ +
+
+ +
+
Revenue
+
$45k total
+
+ +
+
+ +
+
APIs
+
24/7 uptime
+
+ +
+
+ +
+
Analytics
+
Real-time
+
+ +
+
+ +
+
Global CDN
+
Edge compute
+
+ +
+
+ +
+
Scaling
+
Auto-scale
+
+
+
+ +

+ Your MCPs become nodes in a global AI network. Every connection multiplies your earning potential. + Build once, earn everywhere. +

+
+ +
+ +
+
+
+ ) +} + +export default MonetizeSection diff --git a/src/components/SidebarPanel.tsx b/src/components/SidebarPanel.tsx index cf6a49c..d69adeb 100644 --- a/src/components/SidebarPanel.tsx +++ b/src/components/SidebarPanel.tsx @@ -12,11 +12,11 @@ interface SidebarPanelProps { const SidebarPanel: React.FC = ({ isOpen, content, onClose }) => { return (
-
+

diff --git a/src/components/content/DynamicContent.tsx b/src/components/content/DynamicContent.tsx new file mode 100644 index 0000000..85bac45 --- /dev/null +++ b/src/components/content/DynamicContent.tsx @@ -0,0 +1,50 @@ +import React, { useEffect, useState } from 'react'; +import { generateResponse } from '@/services/geminiService'; + +interface DynamicContentProps { + content: any; +} + +const DynamicContent: React.FC = ({ content }) => { + const [geminiAnswer, setGeminiAnswer] = useState(null); + const [loading, setLoading] = useState(false); + + useEffect(() => { + const fetchGemini = async () => { + if (content?.type === 'gemini' && content.prompt) { + setLoading(true); + const res = await generateResponse(content.prompt, []); + setGeminiAnswer(res.message); + setLoading(false); + } + }; + fetchGemini(); + }, [content]); + + if (!content) return null; + + if (content.type === 'gemini') { + return ( +
+

Gemini Answer

+ {loading ? ( +
Loading...
+ ) : ( +
{geminiAnswer}
+ )} +
+ ); + } + + // If content is a React node/component, render it + if (React.isValidElement(content)) return content; + + // Fallback: render as text + return ( +
+ {typeof content === 'string' ? content : JSON.stringify(content)} +
+ ); +}; + +export default DynamicContent; \ No newline at end of file diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 68551b9..7e524a3 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ const Input = React.forwardRef>( { + const [messages, setMessages] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const addMessage = useCallback((message: Omit) => { + const newMessage: Message = { + ...message, + id: Date.now().toString(), + timestamp: Date.now(), + }; + setMessages(prev => [...prev, newMessage]); + return newMessage; + }, []); + + const sendMessage = useCallback(async (content: string) => { + if (!content.trim()) return; + + const userMessage = addMessage({ + role: 'user', + content, + }); + + setIsLoading(true); + setError(null); + + try { + const chatHistory = messages + .filter(m => m.role === 'user' || m.role === 'model') + .map(m => ({ + role: m.role, + parts: m.content, + })); + + const response = await generateResponse(content, chatHistory); + + if (response.success) { + const isUnknown = isQuestionUnknown(response.message); + addMessage({ + role: 'model', + content: response.message, + isUnknown, + }); + } else { + throw new Error(response.message); + } + } catch (err) { + console.error('Error in sendMessage:', err); + setError(err instanceof Error ? err.message : 'An unknown error occurred'); + addMessage({ + role: 'model', + content: 'Sorry, I encountered an error while processing your request. Please try again later.', + isUnknown: true, + }); + } finally { + setIsLoading(false); + } + }, [addMessage, messages]); + + const clearChat = useCallback(() => { + setMessages([]); + setError(null); + }, []); + + return { + messages, + isLoading, + error, + sendMessage, + clearChat, + }; +}; diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 947a887..523109c 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,4 +1,3 @@ - import React, { useState } from 'react'; import Header from '../components/Header'; import ChatInterface from '../components/ChatInterface'; @@ -6,10 +5,21 @@ import SidebarPanel from '../components/SidebarPanel'; import LeftSidebar from '../components/LeftSidebar'; import { ThemeProvider } from '../contexts/ThemeContext'; import { getPromptContent } from '../utils/promptContent'; +import { FiInfo } from 'react-icons/fi'; // Add this import +import HeroSection from '@/components/HeroSection'; +import MCPSection from '@/components/MCPSection'; +import MonetizeSection from '@/components/MonetizeSection'; const Index = () => { const [selectedPrompt, setSelectedPrompt] = useState(null); const [sidebarContent, setSidebarContent] = useState(null); + const [chatKey, setChatKey] = useState(0); + + const handleStartNewChat = () => { + setChatKey(prev => prev + 1); // This will remount ChatInterface and reset its state + setSelectedPrompt(null); + setSidebarContent(null); + }; const handlePromptSelect = (prompt: string, content?: any) => { setSelectedPrompt(prompt); @@ -23,25 +33,44 @@ const Index = () => { setSidebarContent(null); }; + // Add a default info content if needed + const defaultInfoContent = { + title: "Chatbot Side Panel", + description: "Welcome to MCP Verse Spark! Here you can chat with our AI, explore features, and learn more about MCP." + }; + return ( -
-
+
+ {/*
*/} + {/* CHAT INTERFACE */}
{/* Left Sidebar */} - + {/* Main Chat Interface */}
+ {/* Sidebar Open Icon */} + {!selectedPrompt && ( + + )} + {/* Right Sliding Sidebar Panel */} {
{/* Subtle light leaks */} -
+ {/*
+
*/} + + {/* Authentic light leaks with warmth and blur */} + {/*
+
+
+
+
+
*/} + + {/* Realistic Film Camera Light Leaks */} +
+ {/* Horizontal streak from left */} +
+ + {/* Vertical burn from bottom */} +
+ + {/* Angled streak from top right */} +
+ + {/* Blobby irregular light spot */} +
+ + + + + +
); diff --git a/src/services/geminiService.ts b/src/services/geminiService.ts new file mode 100644 index 0000000..0b55a0b --- /dev/null +++ b/src/services/geminiService.ts @@ -0,0 +1,71 @@ +import { GoogleGenerativeAI } from '@google/generative-ai'; + +// Initialize the Gemini API with your API key +const genAI = new GoogleGenerativeAI(process.env.NEXT_PUBLIC_GEMINI_API_KEY || ''); + +const SYSTEM_PROMPT = `You are an AI assistant that helps users navigate and answer queries of a website which promotes the monetization of MCPs.` + +export const generateResponse = async (prompt: string, chatHistory: Array<{role: 'user' | 'model', parts: string}>) => { + try { + // Get the Gemini Pro model + const model = genAI.getGenerativeModel({ model: 'gemini-pro' }); + + // Format chat history for the API + const chat = model.startChat({ + history: [ + { + role: 'user', + parts: [{ text: SYSTEM_PROMPT }], + }, + { + role: 'model', + parts: [{ text: 'I understand. I will follow these guidelines when responding to questions, especially when I don\'t have complete information.' }], + }, + ...chatHistory.map(msg => ({ + role: msg.role === 'user' ? 'user' : 'model', + parts: [{ text: msg.parts }], + })), + ], + generationConfig: { + maxOutputTokens: 1000, + temperature: 0.7, + }, + }); + + // Send the message and get the response + const result = await chat.sendMessage(prompt); + const response = await result.response; + const text = response.text(); + + return { + success: true, + message: text, + }; + } catch (error) { + console.error('Error generating response:', error); + return { + success: false, + message: 'Sorry, I encountered an error while processing your request. Please try again later.' + }; + } +}; + +export const isQuestionUnknown = (response: string): boolean => { + // Simple check for phrases that might indicate the model doesn't know the answer + const unknownPhrases = [ + 'i don\'t know', + 'i\'m not sure', + 'i don\'t have that information', + 'i don\'t have specific information', + 'i don\'t have access to', + 'i don\'t have the capability', + 'i don\'t have enough information', + 'i can\'t provide', + 'i\'m unable to', + 'i don\'t have the ability', + ]; + + return unknownPhrases.some(phrase => + response.toLowerCase().includes(phrase) + ); +}; diff --git a/tailwind.config.ts b/tailwind.config.ts index 6a94538..5b818db 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -64,6 +64,9 @@ export default { ring: 'hsl(var(--sidebar-ring))' } }, + fontFamily: { + sans: ['Quicksand', 'ui-sans-serif', 'system-ui'], + }, borderRadius: { lg: 'var(--radius)', md: 'calc(var(--radius) - 2px)', @@ -88,13 +91,48 @@ export default { to: { height: '0' } - } + }, + flicker: { + '0%, 100%': { opacity: '0.15' }, + '50%': { opacity: '0.25' }, + }, + pulse: { + '0%, 100%': { opacity: '1' }, + '50%': { opacity: '0.5' }, + }, + 'pulse-slow': { + '0%, 100%': { opacity: '1' }, + '50%': { opacity: '0.7' }, + }, + 'pulse-slower': { + '0%, 100%': { opacity: '1' }, + '50%': { opacity: '0.8' }, + }, + driftX: { + '0%': { transform: 'translateX(0px) rotate(-5deg)' }, + '50%': { transform: 'translateX(20px) rotate(-4deg)' }, + '100%': { transform: 'translateX(0px) rotate(-5deg)' }, + }, + driftY: { + '0%': { transform: 'translateY(0px) rotate(12deg)' }, + '50%': { transform: 'translateY(-20px) rotate(10deg)' }, + '100%': { transform: 'translateY(0px) rotate(12deg)' }, + }, }, animation: { 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out' + 'accordion-up': 'accordion-up 0.2s ease-out', + flicker: 'flicker 5s ease-in-out infinite', + driftX: 'driftX 10s ease-in-out infinite', + driftY: 'driftY 12s ease-in-out infinite', + pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'pulse-slow': 'pulse-slow 3s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'pulse-slower': 'pulse-slower 4s cubic-bezier(0.4, 0, 0.6, 1) infinite', } } }, - plugins: [require("tailwindcss-animate")], + plugins: [ + require('tailwind-scrollbar-hide'), + require("tailwindcss-animate") + ], } satisfies Config;