diff --git a/.env.example b/.env.example index 1031dbb..0ed5698 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,16 @@ # ── Supabase ────────────────────────────────────────────── # Your Supabase project URL (found in Project Settings → API) -NEXT_PUBLIC_SUPABASE_URL="https://your-project-ref.supabase.co" +NEXT_PUBLIC_SUPABASE_URL="https://acbqiepwwaaswkmxjlzu.supabase.co" # Your Supabase anon/public key (found in Project Settings → API) -NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." +NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFjYnFpZXB3d2Fhc3drbXhqbHp1Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODMyMjkyMDEsImV4cCI6MjA5ODgwNTIwMX0.mik5QjphcBc55R_EvcgBZC2c0vEdpnqOVW9ForBuMNg" # Database connection string — Transaction Pooler (for Prisma queries) # Found in: Supabase Dashboard → Project Settings → Database → Connection string → Transaction -DATABASE_URL="postgresql://postgres.your-project-ref:password@aws-0-region.pooler.supabase.com:6543/postgres?pgbouncer=true" - +DATABASE_URL="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFjYnFpZXB3d2Fhc3drbXhqbHp1Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc4MzIyOTIwMSwiZXhwIjoyMDk4ODA1MjAxfQ.cXy2Q3hwp9FRX35vNZphBTTY7xgJaC8K_bl4-H_WV_g" # Database connection string — Session mode (for Prisma migrations) # Found in: Supabase Dashboard → Project Settings → Database → Connection string → Session -DIRECT_URL="postgresql://postgres.your-project-ref:password@aws-0-region.pooler.supabase.com:5432/postgres" +DIRECT_URL="DATABASE_URL="postgresql://postgres:@aws-.pooler.supabase.com:5432/postgres?sslmode=require"" # ── Groq AI (for AI Insights feature) ──────────────────── # Get your free API key at: https://console.groq.com/keys diff --git a/app/blocks/home/ChatWidget.module.css b/app/blocks/home/ChatWidget.module.css new file mode 100644 index 0000000..cbab724 --- /dev/null +++ b/app/blocks/home/ChatWidget.module.css @@ -0,0 +1,143 @@ +.chatWrapper { + position: fixed; + bottom: 20px; + right: 20px; + z-index: 9999; + font-family: sans-serif; +} + +/* Floating Button */ +.fab { + background: #00ff88; + color: black; + border: none; + padding: 14px; + border-radius: 50%; + cursor: pointer; + box-shadow: 0 0 15px #00ff88; + animation: glow 2s infinite; +} + +/* Chat Box */ +.chatBox { + width: 320px; + height: 420px; + background: #111; + color: white; + display: flex; + flex-direction: column; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 0 20px rgba(0, 255, 136, 0.2); +} + +/* Header */ +.header { + padding: 10px; + background: #00ff88; + color: black; + display: flex; + justify-content: space-between; + font-weight: 600; +} + +/* Chat body */ +.body { + flex: 1; + padding: 10px; + overflow-y: auto; +} + +/* Messages */ +.user { + text-align: right; + margin: 5px 0; + color: white; +} + +.bot { + text-align: left; + margin: 5px 0; + color: #00ff88; + text-shadow: 0 0 6px #00ff88; +} + +/* Input area */ +.inputBox { + display: flex; +} + +.inputBox input { + flex: 1; + padding: 8px; + border: none; + outline: none; +} + +.inputBox button { + background: #00ff88; + border: none; + color: black; + padding: 8px 12px; + cursor: pointer; +} + +/* Suggestions */ +.suggestions { + display: flex; + flex-wrap: wrap; + gap: 4px; + padding: 6px; +} + +.suggestions button { + font-size: 10px; + border: none; + padding: 4px 6px; + cursor: pointer; +} + +/* Hover effects */ +.fab:hover, +.inputBox button:hover, +.suggestions button:hover { + box-shadow: 0 0 10px #00ff88; + transform: scale(1.05); +} + +/* Glow animation */ +@keyframes glow { + 0% { box-shadow: 0 0 5px #00ff88; } + 50% { box-shadow: 0 0 20px #00ff88; } + 100% { box-shadow: 0 0 5px #00ff88; } +} + +.suggestions { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 10px; +} + +.suggestionBtn { + background: rgba(0, 255, 136, 0.08); + border: 1px solid rgba(0, 255, 136, 0.4); + color: #00ff88; + padding: 6px 12px; + border-radius: 20px; + font-size: 12px; + cursor: pointer; + transition: all 0.2s ease; + white-space: nowrap; +} + +.suggestionBtn:hover { + background: #00ff88; + color: #0b0f0e; + transform: translateY(-1px); + box-shadow: 0 0 10px rgba(0, 255, 136, 0.4); +} + +.suggestionBtn:active { + transform: scale(0.95); +} \ No newline at end of file diff --git a/app/blocks/home/ChatWidget.tsx b/app/blocks/home/ChatWidget.tsx new file mode 100644 index 0000000..430a9d6 --- /dev/null +++ b/app/blocks/home/ChatWidget.tsx @@ -0,0 +1,135 @@ +"use client"; + +import { useState } from "react"; +import styles from "./ChatWidget.module.css"; +import { starterPrompts } from "./StarterPrompts"; +import { chatbotData } from "./chatbotData"; + +type Message = { + role: "user" | "assistant"; + content: string; +}; + +export default function ChatWidget() { + const [open, setOpen] = useState(false); + const [input, setInput] = useState(""); + const [messages, setMessages] = useState([]); + const [loading, setLoading] = useState(false); + + // 🔁 LOCAL FAQ MATCH FUNCTION + const findLocalAnswer = (text: string) => { + const msg = text.toLowerCase().trim(); + + const match = chatbotData.find((item) => + msg.includes(item.question) + ); + + return match?.answer || null; + }; + + const sendMessage = async (text: string) => { + if (!text.trim()) return; + + const newMessages: Message[] = [ + ...messages, + { role: "user", content: text }, + ]; + + setMessages(newMessages); + setInput(""); + setLoading(true); + + // 🔥 STEP 1: LOCAL LOOP CHECK (FAST RESPONSE) + const localAnswer = findLocalAnswer(text); + + if (localAnswer) { + setMessages([ + ...newMessages, + { role: "assistant", content: localAnswer }, + ]); + setLoading(false); + return; + } + + // 🌐 STEP 2: BACKEND FALLBACK (/api/chat) + try { + const res = await fetch("/api/chat", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ messages: newMessages }), + }); + + const data = await res.json(); + + setMessages([ + ...newMessages, + { role: "assistant", content: data.reply || "No response" }, + ]); + } catch { + setMessages([ + ...newMessages, + { role: "assistant", content: "Error connecting to server." }, + ]); + } + + setLoading(false); + }; + + return ( +
+ {/* Floating button */} + {!open && ( + + )} + + {/* Chat window */} + {open && ( +
+
+ FlipTrack Assistant + +
+ + {/* Messages */} +
+ {messages.map((m, i) => ( +
+ {m.content} +
+ ))} + + {loading &&
Typing...
} +
+ + {/* Suggested questions */} +
+ {chatbotData.map((p) => ( + + ))} +
+ + {/* Input box */} +
+ setInput(e.target.value)} + placeholder="Ask about FlipTrack..." + /> + +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/app/blocks/home/StarterPrompts.ts b/app/blocks/home/StarterPrompts.ts new file mode 100644 index 0000000..c39759f --- /dev/null +++ b/app/blocks/home/StarterPrompts.ts @@ -0,0 +1,8 @@ +export const starterPrompts = [ + "What is FlipTrack?", + "Who is FlipTrack designed for?", + "How does inventory management work?", + "How are profits tracked?", + "What AI features are available?", + "How do I get started?" +]; \ No newline at end of file diff --git a/app/blocks/home/chatbotData.ts b/app/blocks/home/chatbotData.ts new file mode 100644 index 0000000..1a61335 --- /dev/null +++ b/app/blocks/home/chatbotData.ts @@ -0,0 +1,22 @@ +export const chatbotData = [ + { + question: "what is fliptrack", + answer: + "FlipTrack is a universal reselling platform that helps you manage inventory, track profits, and analyze your business in real time." + }, + { + question: "who is it for", + answer: + "FlipTrack is built for resellers of sneakers, electronics, fashion, collectibles, and any physical goods." + }, + { + question: "how does inventory work", + answer: + "You can add items with cost price, selling price, status, and track profit/loss automatically." + }, + { + question: "ai features", + answer: + "FlipTrack uses AI to give insights on pricing, selling timing, and profit optimization." + } +]; \ No newline at end of file diff --git a/app/root.tsx b/app/root.tsx index a5f8ffc..cd898f8 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -1,4 +1,5 @@ import { useEffect } from "react"; + import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"; import type { Route } from "./+types/root"; import { ErrorBoundary as ErrorBoundaryRoot } from "~/components/error-boundary/error-boundary"; @@ -87,7 +88,8 @@ function RootLayout({ children }: { children: React.ReactNode }) { )} - + + ); } diff --git a/app/routes.ts b/app/routes.ts index 602d51a..076dd6c 100644 --- a/app/routes.ts +++ b/app/routes.ts @@ -11,6 +11,7 @@ export default [ route("/blog/:slug", "routes/blog-post.tsx"), route("/changelog", "routes/changelog-page.tsx"), route("/privacy", "routes/privacy-policy.tsx"), +route("/api/chat", "routes/api.chat.ts"), route("/terms", "routes/terms-of-service.tsx"), ...prefix("/app", [ diff --git a/app/routes/api.chat.ts b/app/routes/api.chat.ts new file mode 100644 index 0000000..83feb90 --- /dev/null +++ b/app/routes/api.chat.ts @@ -0,0 +1,32 @@ +import type { ActionFunctionArgs } from "react-router"; + +export async function action({ request }: ActionFunctionArgs) { { + try { + const { messages } = await request.json(); + + const lastMessage = messages?.at(-1)?.content || ""; + + return new Response( + JSON.stringify({ + reply: `FlipTrack AI: ${lastMessage}`, + }), + { + headers: { + "Content-Type": "application/json", + }, + } + ); + } catch (err) { + return new Response( + JSON.stringify({ + reply: "Server error", + }), + { + status: 500, + headers: { + "Content-Type": "application/json", + }, + } + ); + } +} \ No newline at end of file diff --git a/app/routes/home.tsx b/app/routes/home.tsx index 12a5aa4..0cc89dd 100644 --- a/app/routes/home.tsx +++ b/app/routes/home.tsx @@ -1,4 +1,5 @@ import styles from "./home.module.css"; +import ChatWidget from "~/blocks/home/ChatWidget"; import { HeroSection } from "~/blocks/home/hero-section"; import { ProblemSolutionStrip } from "~/blocks/home/problem-solution-strip"; import { FeaturesShowcase } from "~/blocks/home/features-showcase"; @@ -27,6 +28,8 @@ export default function HomePage() { + + ); } diff --git a/package-lock.json b/package-lock.json index fde8452..d1ce232 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,6 @@ "@supabase/ssr": "^0.10.3", "@supabase/supabase-js": "^2.107.0", "@tabler/icons-react": "^3.44.0", - "@vercel/functions": "^3.7.5", - "ai": "^6.0.195", "classnames": "^2.5.1", "isbot": "^5.1.40", "radix-ui": "^1.4.3", @@ -42,23 +40,6 @@ "vite": "^8.0.16" } }, - "node_modules/@ai-sdk/gateway": { - "version": "3.0.123", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.123.tgz", - "integrity": "sha512-rL+3Sp9crOlfE7MwguFPS30qVp6HFcr9na0KYMb4CcQdxAIjBJec3EEdCjc94UyRVZWLmgQ6Yr605FmPlFIi0w==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@vercel/oidc": "3.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/@ai-sdk/groq": { "version": "3.0.39", "resolved": "https://registry.npmjs.org/@ai-sdk/groq/-/groq-3.0.39.tgz", @@ -726,15 +707,6 @@ "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@oxc-project/types": { "version": "0.133.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", @@ -3012,84 +2984,6 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, - "node_modules/@vercel/cli-config": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.0.tgz", - "integrity": "sha512-fJRRRB7734BDuXZ89yBEaA2ncYhH7bWX30mk04W80J6VAfQc+4iB8lyzAdaGpFV3/vNlkt9VZt+/uoQoWX6UsQ==", - "license": "Apache-2.0", - "dependencies": { - "xdg-app-paths": "5", - "zod": "4.1.11" - } - }, - "node_modules/@vercel/cli-config/node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@vercel/cli-exec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vercel/cli-exec/-/cli-exec-1.0.0.tgz", - "integrity": "sha512-kQF8LGie/Hbdq9/psJxLE7owRTcqMQMhgybU04gCeR7cbQAr5t8OrjefDNColJv1QSSucFt4pLwRiARVmlOnug==", - "license": "Apache-2.0", - "dependencies": { - "execa": "5.1.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@vercel/functions": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-3.7.5.tgz", - "integrity": "sha512-ESf8BbeDebqRUyMi09JwRbQqpLn4g6fjcVVHPsHB56j2dSqRrSHO4h3X4aaxJf6iQQjzhAtDGI2xCWQ27JE8PA==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/oidc": "3.8.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-web-identity": "*", - "ws": ">=8" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-provider-web-identity": { - "optional": true - }, - "ws": { - "optional": true - } - } - }, - "node_modules/@vercel/functions/node_modules/@vercel/oidc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.8.0.tgz", - "integrity": "sha512-r00laGW6Pv778RoR6M2NxX91ycSj+PBwVo+fOb9Bif+F0IyUKt25zrvBzfEzQpeAzbqOgPZyQibEWDdDFApd+A==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/cli-config": "0.2.0", - "@vercel/cli-exec": "1.0.0", - "jose": "^5.9.6" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, "node_modules/@xmldom/xmldom": { "version": "0.9.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", @@ -3121,24 +3015,6 @@ "node": ">= 0.6" } }, - "node_modules/ai": { - "version": "6.0.195", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.195.tgz", - "integrity": "sha512-IYZpuVz0boWbpIQYyinfWFrvQ1N0dG+EVB63it45B2YAU/MxxCnwz4zBswjYnPtHnJBedpMPNrwVbeczbl2GKg==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "3.0.123", - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@opentelemetry/api": "^1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3482,20 +3358,6 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -3834,29 +3696,6 @@ "node": ">=18.0.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/exit-hook": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", @@ -4104,18 +3943,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -4178,15 +4005,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/iceberg-js": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", @@ -4242,18 +4060,6 @@ "node": ">= 0.10" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isbot": { "version": "5.1.40", "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.40.tgz", @@ -4263,33 +4069,6 @@ "node": ">=18" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4634,12 +4413,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -4691,15 +4464,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/morgan": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", @@ -4793,18 +4557,6 @@ "node": ">=18" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -4849,30 +4601,6 @@ "node": ">= 0.8" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-paths": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", - "integrity": "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==", - "license": "MIT", - "engines": { - "node": ">= 6.0" - } - }, "node_modules/p-map": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", @@ -4895,15 +4623,6 @@ "node": ">= 0.8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/path-to-regexp": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", @@ -5555,27 +5274,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -5648,12 +5346,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, "node_modules/sonner": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", @@ -5702,15 +5394,6 @@ "node": ">= 0.8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/stripe": { "version": "22.2.0", "resolved": "https://registry.npmjs.org/stripe/-/stripe-22.2.0.tgz", @@ -6075,46 +5758,6 @@ "dev": true, "license": "MIT" }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/xdg-app-paths": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.5.1.tgz", - "integrity": "sha512-hI3flOB4PLZIy5prbtTpirobtPE2ZtZ52szO+2mM9Efp6ErM398La+C1lIpNWDfNoQk+6Lsi6nMcCwVB7pxeMQ==", - "license": "MIT", - "dependencies": { - "os-paths": "^4.0.1", - "xdg-portable": "^7.2.0" - }, - "engines": { - "node": ">= 6.0" - } - }, - "node_modules/xdg-portable": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz", - "integrity": "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==", - "license": "MIT", - "dependencies": { - "os-paths": "^4.0.1" - }, - "engines": { - "node": ">= 6.0" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 7c1380d..9e95406 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,6 @@ "@supabase/ssr": "^0.10.3", "@supabase/supabase-js": "^2.107.0", "@tabler/icons-react": "^3.44.0", - "@vercel/functions": "^3.7.5", - "ai": "^6.0.195", "classnames": "^2.5.1", "isbot": "^5.1.40", "radix-ui": "^1.4.3",