├── .env.example ├── .gitignore ├── README.md ├── app ├── api │ └── exaanswer │ │ └── route.ts ├── component │ ├── Citation.tsx │ └── MessageContent.tsx ├── favicon.ico ├── fonts │ ├── ABCDiatype-Bold.otf │ ├── ABCDiatype-Regular.otf │ ├── GeistMonoVF.woff │ ├── GeistVF.woff │ ├── RecklessTRIAL-Medium.woff2 │ ├── RecklessTRIAL-Regular.otf │ └── RecklessTRIAL-Regular.woff2 ├── globals.css ├── layout.tsx ├── opengraph-image.jpg ├── page.tsx └── utils.ts ├── middleware.ts ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.mjs ├── tailwind.config.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | EXA_API_KEY=Your-Exa-API-Key 2 | 3 | # Get Your Exa API Key from https://dashboard.exa.ai/api-keys -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 💬 Exa Answer Chat App 2 | ### Powered by [Exa](https://exa.ai) - The Web Search API 3 | 4 | An open-source chat app showcasing the power of Exa's Answer endpoint. 5 | 6 | ![Screenshot](https://demo.exa.ai/answer/opengraph-image.jpg) 7 | 8 | ### ✨ Try it yourself: 9 | - [Try the Answer Endpoint](https://dashboard.exa.ai/playground/answer?q=What%20makes%20some%20LLMs%20so%20much%20better%20than%20others%3F&filters=%7B%22model%22%3A%22exa-pro%22%7D) - Experience the Answer endpoint directly on Exa dashboard 10 | 11 | - [Live Demo](https://demo.exa.ai/answer) - See the chat app in action 12 | 13 |
14 | 15 | ## 🎯 What is Exa Answer Chat App? 16 | 17 | Exa Answer Chat App is a free and open-source application that shows how to use Exa's Answer endpoint. It provides a modern chat interface with real-time streaming responses and citation support. 18 | 19 |
20 | 21 | ## 💻 Tech Stack 22 | - **Backend**: [Exa API](https://exa.ai) - Answer endpoint 23 | - **Frontend**: [Next.js](https://nextjs.org/docs) with App Router 24 | - **Styling**: [TailwindCSS](https://tailwindcss.com) 25 | - **Language**: TypeScript 26 | - **Hosting**: [Vercel](https://vercel.com/) 27 | 28 |
29 | 30 | ## 🚀 Getting Started 31 | 32 | ### Prerequisites 33 | - Node.js 18+ installed 34 | - Exa API key ([Get it here](https://dashboard.exa.ai/api-keys)) 35 | 36 | ### Installation 37 | 38 | 1. Clone the repository 39 | ```bash 40 | git clone https://github.com/exa-labs/answer-chat-app.git 41 | cd answer-chat-app 42 | ``` 43 | 44 | 2. Install dependencies 45 | ```bash 46 | npm install 47 | ``` 48 | 49 | 3. Set up environment variables 50 | ```bash 51 | cp .env.example .env.local 52 | ``` 53 | Then add your Exa API key to `.env.local`: 54 | ``` 55 | EXA_API_KEY=your-api-key-here 56 | ``` 57 | 58 | 4. Run the development server 59 | ```bash 60 | npm run dev 61 | ``` 62 | 63 | 5. Open [http://localhost:3000/answer](http://localhost:3000/answer) in your browser 64 | 65 |
66 | 67 | ## ⭐ About [Exa](https://exa.ai) 68 | 69 | This project showcases [Exa's](https://exa.ai) Answer endpoint, which provides: 70 | 71 | * Real-time streaming responses 72 | * High-quality answers with citations 73 | * Simple API integration (with OpenAI compatible API) 74 | 75 | [Try Exa API](https://dashboard.exa.ai) today and build your own AI-powered applications! 76 | 77 |
78 | 79 | --- 80 | 81 | Built with ❤️ using [Exa](https://exa.ai) 82 | -------------------------------------------------------------------------------- /app/api/exaanswer/route.ts: -------------------------------------------------------------------------------- 1 | // app/api/exaanswer/route.ts 2 | import { NextRequest } from 'next/server'; 3 | import Exa from "exa-js"; 4 | 5 | export const maxDuration = 60; 6 | export const dynamic = 'force-dynamic'; 7 | 8 | const exa = new Exa(process.env.EXA_API_KEY as string); 9 | 10 | export async function POST(req: NextRequest) { 11 | try { 12 | const { query } = await req.json(); 13 | if (!query) { 14 | return new Response(JSON.stringify({ error: 'query is required' }), { status: 400 }); 15 | } 16 | 17 | const stream = exa.streamAnswer(query, { model: "exa-pro" }); 18 | 19 | const encoder = new TextEncoder(); 20 | 21 | const streamResponse = new ReadableStream({ 22 | async start(controller) { 23 | try { 24 | for await (const chunk of stream) { 25 | // Send citations if present 26 | if (chunk.citations?.length) { 27 | controller.enqueue(encoder.encode(JSON.stringify({ citations: chunk.citations }) + '\n')); 28 | } 29 | 30 | // Send content 31 | controller.enqueue(encoder.encode(JSON.stringify({ 32 | choices: [{ delta: { content: chunk.content } }] 33 | }) + '\n')); 34 | } 35 | controller.close(); 36 | } catch (error) { 37 | controller.error(error); 38 | } 39 | }, 40 | }); 41 | 42 | return new Response(streamResponse, { 43 | headers: { 44 | 'Content-Type': 'text/event-stream', 45 | 'Cache-Control': 'no-cache', 46 | 'Connection': 'keep-alive', 47 | }, 48 | }); 49 | } catch (error: any) { 50 | return new Response( 51 | JSON.stringify({ error: `Failed to perform search | ${error.message}` }), 52 | { status: 500 } 53 | ); 54 | } 55 | } -------------------------------------------------------------------------------- /app/component/Citation.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | interface CitationProps { 4 | citations: any[]; 5 | } 6 | 7 | export default function Citation({ citations }: CitationProps) { 8 | // Debug log 9 | console.log('Citation component received:', citations); 10 | 11 | if (!citations || citations.length === 0) { 12 | console.log('No citations to display'); 13 | return null; 14 | } 15 | 16 | return ( 17 |
18 | {/* Header */} 19 |
20 |

Exa Search Results

21 |
22 | 23 | {/* Results */} 24 |
25 |
26 | {citations.map((citation, idx) => ( 27 |
28 | 32 | [{idx + 1}] {citation.title || citation.url} 33 | {citation.favicon && ( 34 | 39 | )} 40 | 41 | {/* URL tooltip */} 42 |
43 | {citation.url} 44 |
45 |
46 | ))} 47 |
48 |
49 |
50 | ); 51 | } -------------------------------------------------------------------------------- /app/component/MessageContent.tsx: -------------------------------------------------------------------------------- 1 | interface MessageContentProps { 2 | content: string; 3 | } 4 | 5 | export default function MessageContent({ content }: MessageContentProps) { 6 | // Function to process the content and format links and bold text 7 | const formatContent = (text: string) => { 8 | // Regular expressions for markdown-style links and bold text 9 | const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; 10 | const boldRegex = /\*\*([^*]+)\*\*/g; 11 | 12 | // Split the text into parts (text, links, and bold) 13 | const parts: (string | JSX.Element)[] = []; 14 | let lastIndex = 0; 15 | let workingText = text; 16 | 17 | // First process bold text 18 | const boldParts: (string | JSX.Element)[] = []; 19 | let boldLastIndex = 0; 20 | let boldMatch; 21 | 22 | while ((boldMatch = boldRegex.exec(workingText)) !== null) { 23 | // Add text before the bold 24 | if (boldMatch.index > boldLastIndex) { 25 | boldParts.push(workingText.slice(boldLastIndex, boldMatch.index)); 26 | } 27 | 28 | // Add the bold text 29 | boldParts.push( 30 | 31 | {boldMatch[1]} 32 | 33 | ); 34 | 35 | boldLastIndex = boldMatch.index + boldMatch[0].length; 36 | } 37 | 38 | // Add remaining text after last bold 39 | if (boldLastIndex < workingText.length) { 40 | boldParts.push(workingText.slice(boldLastIndex)); 41 | } 42 | 43 | // Now process links within each part 44 | boldParts.forEach((part, index) => { 45 | if (typeof part === 'string') { 46 | const linkParts: (string | JSX.Element)[] = []; 47 | let linkLastIndex = 0; 48 | let linkMatch; 49 | 50 | while ((linkMatch = linkRegex.exec(part)) !== null) { 51 | // Add text before the link 52 | if (linkMatch.index > linkLastIndex) { 53 | linkParts.push(part.slice(linkLastIndex, linkMatch.index)); 54 | } 55 | 56 | // Add the formatted link 57 | linkParts.push( 58 | 65 | {linkMatch[1]} 66 | 67 | ); 68 | 69 | linkLastIndex = linkMatch.index + linkMatch[0].length; 70 | } 71 | 72 | // Add remaining text after last link 73 | if (linkLastIndex < part.length) { 74 | linkParts.push(part.slice(linkLastIndex)); 75 | } 76 | 77 | parts.push(...linkParts); 78 | } else { 79 | parts.push(part); 80 | } 81 | }); 82 | 83 | return parts; 84 | }; 85 | 86 | return <>{formatContent(content)}; 87 | } -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/favicon.ico -------------------------------------------------------------------------------- /app/fonts/ABCDiatype-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/ABCDiatype-Bold.otf -------------------------------------------------------------------------------- /app/fonts/ABCDiatype-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/ABCDiatype-Regular.otf -------------------------------------------------------------------------------- /app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /app/fonts/RecklessTRIAL-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/RecklessTRIAL-Medium.woff2 -------------------------------------------------------------------------------- /app/fonts/RecklessTRIAL-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/RecklessTRIAL-Regular.otf -------------------------------------------------------------------------------- /app/fonts/RecklessTRIAL-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/fonts/RecklessTRIAL-Regular.woff2 -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 231, 231, 245; 8 | --background-end-rgb: 255, 255, 255; 9 | 10 | /* COLORS */ 11 | --brand-default: #254bf1; 12 | --brand-fainter: #e7ebfd; 13 | --brand-faint: #c6cfff; 14 | --brand-subtle: #a1aff7; 15 | --brand-muted: #4d87e7; 16 | --brand-dark: #0d2189; 17 | --brand-darker: #000a40; 18 | 19 | --secondary-accent: #9f9672; 20 | --secondary-accent2x: #89805d; 21 | --secondary-dark: #f4f1e7; 22 | --secondary-darker: #efebdc; 23 | --secondary-darkest: #e5e0cd; 24 | --secondary-default: #faf7ec; 25 | --secondary-faint: #fffdf5; 26 | --secondary-fainter: #fffefa; 27 | 28 | --gray-50: #fafafa; 29 | --gray-100: #f5f5f5; 30 | --gray-200: #e5e5e5; 31 | --gray-300: #d4d4d4; 32 | --gray-400: #a3a3a3; 33 | --gray-500: #737373; 34 | --gray-600: #525252; 35 | --gray-700: #404040; 36 | --gray-800: #262626; 37 | --gray-900: #171717; 38 | --gray-950: #0a0a0a; 39 | 40 | --black: #000000; 41 | --white: #ffffff; 42 | 43 | --accent-yellow-light: #fef3c7; 44 | --accent-yellow-dark: #92400e; 45 | --accent-skyblue-light: #dbeafe; 46 | --accent-skyblue-dark: #1e40af; 47 | --accent-green: #50b40a; 48 | --accent-red: #d32f2f; 49 | --accent-darkgreen-dark: #065f46; 50 | --accent-darkgreen-light: #d1fae5; 51 | --accent-purple-dark: #5b21b6; 52 | --accent-purple-light: #ede9fe; 53 | --accent-pink-dark: #9d174d; 54 | --accent-pink-light: #fce7f3; 55 | --accent-maroon-dark: #991b1b; 56 | --accent-maroon-light: #fee2e2; 57 | } 58 | 59 | body { 60 | color: rgb(var(--foreground-rgb)); 61 | background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); 62 | } 63 | 64 | @layer utilities { 65 | .text-balance { 66 | text-wrap: balance; 67 | } 68 | } 69 | 70 | :root { 71 | --background: var(--secondary-default); 72 | --accent: var(--brand-default); 73 | --accent-background: var(--brand-default); 74 | } 75 | 76 | :root { 77 | --border-default: var(--gray-300); 78 | --border-radius-default: 2px; 79 | 80 | /* Typography */ 81 | --font-family-sans: 'ABCDiatype', 'Trebuchet MS', sans-serif; 82 | --font-family-serif: 'Reckless', Georgia, serif; 83 | --text-light-default: #111827; 84 | --text-light-muted: #6b7280; 85 | --text-light-subtle: #9ca3af; 86 | --text-light-faint: #e5e7eb; 87 | --text-light-link: #1f40ed; 88 | } 89 | 90 | body { 91 | color: var(--foreground); 92 | background: var(--background); 93 | 94 | /* Apply ABCDiatype for body */ 95 | font-family: var(--font-abcd-diatype), sans-serif; 96 | } 97 | 98 | /* Apply Reckless for headings */ 99 | h1, h2, h3, h4, h5, h6 { 100 | font-family: var(--font-reckless), serif; 101 | } 102 | 103 | 104 | @layer utilities { 105 | .text-balance { 106 | text-wrap: balance; 107 | } 108 | } -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import localFont from "next/font/local"; 3 | import "./globals.css"; 4 | import { Analytics } from '@vercel/analytics/next'; 5 | 6 | // Load the ABCDiatype font (Regular and Bold only) 7 | const abcdDiatype = localFont({ 8 | src: [ 9 | { path: "./fonts/ABCDiatype-Regular.otf", weight: "400" }, 10 | { path: "./fonts/ABCDiatype-Bold.otf", weight: "700" }, 11 | ], 12 | variable: "--font-abcd-diatype", 13 | }); 14 | 15 | // Load the Reckless font (Regular and Medium only) 16 | const reckless = localFont({ 17 | src: [ 18 | { path: "./fonts/RecklessTRIAL-Regular.woff2", weight: "400" }, 19 | { path: "./fonts/RecklessTRIAL-Medium.woff2", weight: "500" }, 20 | ], 21 | variable: "--font-reckless", 22 | }); 23 | 24 | export const metadata: Metadata = { 25 | title: "Exa Answer Chat App", 26 | description: "An opensource chat application built with Exa Answer endpoint.", 27 | openGraph: { 28 | title: "Exa Answer Chat App", 29 | description: "An opensource chat application built with Exa Answer endpoint.", 30 | type: "website", 31 | locale: "en_US", 32 | images: [ 33 | { 34 | url: "https://demo.exa.ai/answer/opengraph-image.jpg", 35 | width: 1200, 36 | height: 630, 37 | alt: "Exa Answer Chat App" 38 | } 39 | ] 40 | }, 41 | twitter: { 42 | card: "summary_large_image", 43 | title: "Exa Answer Chat App", 44 | description: "An opensource chat application built with Exa Answer endpoint.", 45 | images: ["https://demo.exa.ai/answer/opengraph-image.jpg"] 46 | }, 47 | metadataBase: new URL("https://demo.exa.ai/answer"), 48 | robots: { 49 | index: true, 50 | follow: true 51 | }, 52 | }; 53 | 54 | export default function RootLayout({ 55 | children, 56 | }: Readonly<{ 57 | children: React.ReactNode; 58 | }>) { 59 | return ( 60 | 61 | 62 | 63 | 64 | 67 | {children} 68 | 69 | 70 | 71 | ); 72 | } -------------------------------------------------------------------------------- /app/opengraph-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exa-labs/answer-chat-app/882bca0407d046b96760feb2267d61496b3023e5/app/opengraph-image.jpg -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { useState, useRef } from 'react'; 4 | import MessageContent from './component/MessageContent'; 5 | import Citation from './component/Citation'; 6 | import { getAssetPath } from './utils'; 7 | 8 | interface Message { 9 | id: string; 10 | role: 'user' | 'assistant'; 11 | content: string; 12 | citations?: any[]; 13 | } 14 | 15 | export default function Page() { 16 | const [messages, setMessages] = useState([]); 17 | const [input, setInput] = useState(''); 18 | const [isLoading, setIsLoading] = useState(false); 19 | const abortControllerRef = useRef(null); 20 | 21 | const handleInputChange = (e: React.ChangeEvent) => { 22 | setInput(e.target.value); 23 | }; 24 | 25 | const handleSubmit = async (e: React.FormEvent) => { 26 | e.preventDefault(); 27 | if (!input.trim() || isLoading) return; 28 | 29 | // Cancel any ongoing request 30 | if (abortControllerRef.current) { 31 | abortControllerRef.current.abort(); 32 | } 33 | 34 | const messageId = Date.now().toString(); 35 | const userMessage: Message = { 36 | id: messageId, 37 | role: 'user', 38 | content: input, 39 | }; 40 | 41 | setMessages(prev => [...prev, userMessage]); 42 | setInput(''); 43 | setIsLoading(true); 44 | 45 | const assistantMessage: Message = { 46 | id: (Date.now() + 1).toString(), 47 | role: 'assistant', 48 | content: '', 49 | }; 50 | 51 | setMessages(prev => [...prev, assistantMessage]); 52 | 53 | try { 54 | abortControllerRef.current = new AbortController(); 55 | 56 | // Format previous messages into conversation history 57 | const conversationHistory = messages.map(msg => 58 | `${msg.role === 'user' ? 'User' : 'Assistant'}: ${msg.content}` 59 | ).join('\n'); 60 | 61 | // Combine history with new query 62 | const fullQuery = conversationHistory 63 | ? `${conversationHistory}\nUser: ${input}` 64 | : input; 65 | 66 | const response = await fetch(getAssetPath('/api/exaanswer'), { 67 | method: 'POST', 68 | headers: { 'Content-Type': 'application/json' }, 69 | body: JSON.stringify({ query: fullQuery }), 70 | signal: abortControllerRef.current.signal, 71 | }); 72 | 73 | if (!response.ok) throw new Error('Failed to fetch response'); 74 | 75 | const reader = response.body?.getReader(); 76 | if (!reader) throw new Error('No reader available'); 77 | 78 | let content = ''; 79 | let citations: any[] = []; 80 | 81 | while (true) { 82 | const { done, value } = await reader.read(); 83 | if (done) break; 84 | 85 | // Convert the chunk to text 86 | const chunk = new TextDecoder().decode(value); 87 | const lines = chunk.split('\n').filter(line => line.trim()); 88 | 89 | for (const line of lines) { 90 | try { 91 | const data = JSON.parse(line); 92 | if (data.citations) { 93 | citations = data.citations; 94 | // Update message with new citations immediately 95 | setMessages(prev => 96 | prev.map(msg => 97 | msg.id === assistantMessage.id 98 | ? { ...msg, citations: data.citations } 99 | : msg 100 | ) 101 | ); 102 | } else if (data.choices?.[0]?.delta?.content) { 103 | content += data.choices[0].delta.content; 104 | setMessages(prev => 105 | prev.map(msg => 106 | msg.id === assistantMessage.id 107 | ? { ...msg, content, citations } 108 | : msg 109 | ) 110 | ); 111 | } 112 | } catch (e) { 113 | console.error('Error parsing chunk:', e); 114 | } 115 | } 116 | } 117 | } catch (error: any) { 118 | if (error.name === 'AbortError') { 119 | console.log('Request was aborted'); 120 | } else { 121 | console.error('Error:', error); 122 | setMessages(prev => 123 | prev.map(msg => 124 | msg.id === assistantMessage.id 125 | ? { ...msg, content: 'Sorry, there was an error processing your request.' } 126 | : msg 127 | ) 128 | ); 129 | } 130 | } finally { 131 | setIsLoading(false); 132 | abortControllerRef.current = null; 133 | } 134 | }; 135 | 136 | const hasMessages = messages.length > 0; 137 | 138 | return ( 139 | <> 140 | {/* Top Navigation Bar */} 141 |
142 | 183 |
184 | 185 | {/* Chat Messages */} 186 |
187 |
188 | {messages.map((message) => ( 189 |
190 |
195 |
202 |
203 | 204 |
205 | {message.citations && message.citations.length > 0 && ( 206 | 207 | )} 208 |
209 |
210 |
211 | ))} 212 | 213 | {/* Loading indicator */} 214 | {isLoading && ( 215 |
216 |
217 |
218 |
219 | Asking Exa... 220 |
221 | )} 222 |
223 |
224 | 225 | {/* Input Form - centered when no messages, fixed bottom otherwise */} 226 |
231 |
236 | {/* New Chat Button - Only show when there are messages */} 237 | {hasMessages && ( 238 | 247 | )} 248 |
249 | 259 | 269 |
270 | {!hasMessages && ( 271 |
272 | powered by 273 | 274 | Exa - The Web Search API 275 | 276 |
277 | )} 278 |
279 |
280 | 281 | ); 282 | } -------------------------------------------------------------------------------- /app/utils.ts: -------------------------------------------------------------------------------- 1 | export const getAssetPath = (path: string): string => { 2 | return `/answer${path}`; 3 | }; -------------------------------------------------------------------------------- /middleware.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | import type { NextRequest } from 'next/server' 3 | export function middleware(request: NextRequest) { 4 | if (request.headers.get('host') === 'https://answer-chat-app.vercel.app/') { 5 | return NextResponse.redirect('https://demo.exa.ai/answer', { 6 | status: 301 7 | }) 8 | } 9 | return NextResponse.next() 10 | } 11 | export const config = { 12 | matcher: '/:path*' 13 | } -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | 3 | const nextConfig = { 4 | basePath: "/answer", 5 | experimental: { 6 | serverActions: { 7 | allowedOrigins: ["demo.exa.ai"], 8 | allowedForwardedHosts: ["demo.exa.ai"], 9 | }, 10 | }, 11 | }; 12 | 13 | export default nextConfig; 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "answer-chat-app", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "answer-chat-app", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "@tailwindcss/typography": "^0.5.16", 12 | "@vercel/analytics": "^1.5.0", 13 | "exa-js": "^1.4.10", 14 | "next": "14.2.17", 15 | "react": "^18", 16 | "react-dom": "^18", 17 | "tailwindcss-animate": "^1.0.7" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^20", 21 | "@types/react": "^18", 22 | "@types/react-dom": "^18", 23 | "postcss": "^8", 24 | "tailwindcss": "^3.4.1", 25 | "typescript": "^5" 26 | } 27 | }, 28 | "node_modules/@alloc/quick-lru": { 29 | "version": "5.2.0", 30 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 31 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 32 | "engines": { 33 | "node": ">=10" 34 | }, 35 | "funding": { 36 | "url": "https://github.com/sponsors/sindresorhus" 37 | } 38 | }, 39 | "node_modules/@isaacs/cliui": { 40 | "version": "8.0.2", 41 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 42 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 43 | "dependencies": { 44 | "string-width": "^5.1.2", 45 | "string-width-cjs": "npm:string-width@^4.2.0", 46 | "strip-ansi": "^7.0.1", 47 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 48 | "wrap-ansi": "^8.1.0", 49 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 50 | }, 51 | "engines": { 52 | "node": ">=12" 53 | } 54 | }, 55 | "node_modules/@jridgewell/gen-mapping": { 56 | "version": "0.3.8", 57 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 58 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 59 | "dependencies": { 60 | "@jridgewell/set-array": "^1.2.1", 61 | "@jridgewell/sourcemap-codec": "^1.4.10", 62 | "@jridgewell/trace-mapping": "^0.3.24" 63 | }, 64 | "engines": { 65 | "node": ">=6.0.0" 66 | } 67 | }, 68 | "node_modules/@jridgewell/resolve-uri": { 69 | "version": "3.1.2", 70 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 71 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 72 | "engines": { 73 | "node": ">=6.0.0" 74 | } 75 | }, 76 | "node_modules/@jridgewell/set-array": { 77 | "version": "1.2.1", 78 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 79 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 80 | "engines": { 81 | "node": ">=6.0.0" 82 | } 83 | }, 84 | "node_modules/@jridgewell/sourcemap-codec": { 85 | "version": "1.5.0", 86 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 87 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 88 | }, 89 | "node_modules/@jridgewell/trace-mapping": { 90 | "version": "0.3.25", 91 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 92 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 93 | "dependencies": { 94 | "@jridgewell/resolve-uri": "^3.1.0", 95 | "@jridgewell/sourcemap-codec": "^1.4.14" 96 | } 97 | }, 98 | "node_modules/@next/env": { 99 | "version": "14.2.17", 100 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.17.tgz", 101 | "integrity": "sha512-MCgO7VHxXo8sYR/0z+sk9fGyJJU636JyRmkjc7ZJY8Hurl8df35qG5hoAh5KMs75FLjhlEo9bb2LGe89Y/scDA==" 102 | }, 103 | "node_modules/@next/swc-darwin-arm64": { 104 | "version": "14.2.17", 105 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.17.tgz", 106 | "integrity": "sha512-WiOf5nElPknrhRMTipXYTJcUz7+8IAjOYw3vXzj3BYRcVY0hRHKWgTgQ5439EvzQyHEko77XK+yN9x9OJ0oOog==", 107 | "cpu": [ 108 | "arm64" 109 | ], 110 | "optional": true, 111 | "os": [ 112 | "darwin" 113 | ], 114 | "engines": { 115 | "node": ">= 10" 116 | } 117 | }, 118 | "node_modules/@next/swc-darwin-x64": { 119 | "version": "14.2.17", 120 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.17.tgz", 121 | "integrity": "sha512-29y425wYnL17cvtxrDQWC3CkXe/oRrdt8ie61S03VrpwpPRI0XsnTvtKO06XCisK4alaMnZlf8riwZIbJTaSHQ==", 122 | "cpu": [ 123 | "x64" 124 | ], 125 | "optional": true, 126 | "os": [ 127 | "darwin" 128 | ], 129 | "engines": { 130 | "node": ">= 10" 131 | } 132 | }, 133 | "node_modules/@next/swc-linux-arm64-gnu": { 134 | "version": "14.2.17", 135 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.17.tgz", 136 | "integrity": "sha512-SSHLZls3ZwNEHsc+d0ynKS+7Af0Nr8+KTUBAy9pm6xz9SHkJ/TeuEg6W3cbbcMSh6j4ITvrjv3Oi8n27VR+IPw==", 137 | "cpu": [ 138 | "arm64" 139 | ], 140 | "optional": true, 141 | "os": [ 142 | "linux" 143 | ], 144 | "engines": { 145 | "node": ">= 10" 146 | } 147 | }, 148 | "node_modules/@next/swc-linux-arm64-musl": { 149 | "version": "14.2.17", 150 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.17.tgz", 151 | "integrity": "sha512-VFge37us5LNPatB4F7iYeuGs9Dprqe4ZkW7lOEJM91r+Wf8EIdViWHLpIwfdDXinvCdLl6b4VyLpEBwpkctJHA==", 152 | "cpu": [ 153 | "arm64" 154 | ], 155 | "optional": true, 156 | "os": [ 157 | "linux" 158 | ], 159 | "engines": { 160 | "node": ">= 10" 161 | } 162 | }, 163 | "node_modules/@next/swc-linux-x64-gnu": { 164 | "version": "14.2.17", 165 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.17.tgz", 166 | "integrity": "sha512-aaQlpxUVb9RZ41adlTYVQ3xvYEfBPUC8+6rDgmQ/0l7SvK8S1YNJzPmDPX6a4t0jLtIoNk7j+nroS/pB4nx7vQ==", 167 | "cpu": [ 168 | "x64" 169 | ], 170 | "optional": true, 171 | "os": [ 172 | "linux" 173 | ], 174 | "engines": { 175 | "node": ">= 10" 176 | } 177 | }, 178 | "node_modules/@next/swc-linux-x64-musl": { 179 | "version": "14.2.17", 180 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.17.tgz", 181 | "integrity": "sha512-HSyEiFaEY3ay5iATDqEup5WAfrhMATNJm8dYx3ZxL+e9eKv10XKZCwtZByDoLST7CyBmyDz+OFJL1wigyXeaoA==", 182 | "cpu": [ 183 | "x64" 184 | ], 185 | "optional": true, 186 | "os": [ 187 | "linux" 188 | ], 189 | "engines": { 190 | "node": ">= 10" 191 | } 192 | }, 193 | "node_modules/@next/swc-win32-arm64-msvc": { 194 | "version": "14.2.17", 195 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.17.tgz", 196 | "integrity": "sha512-h5qM9Btqv87eYH8ArrnLoAHLyi79oPTP2vlGNSg4CDvUiXgi7l0+5KuEGp5pJoMhjuv9ChRdm7mRlUUACeBt4w==", 197 | "cpu": [ 198 | "arm64" 199 | ], 200 | "optional": true, 201 | "os": [ 202 | "win32" 203 | ], 204 | "engines": { 205 | "node": ">= 10" 206 | } 207 | }, 208 | "node_modules/@next/swc-win32-ia32-msvc": { 209 | "version": "14.2.17", 210 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.17.tgz", 211 | "integrity": "sha512-BD/G++GKSLexQjdyoEUgyo5nClU7er5rK0sE+HlEqnldJSm96CIr/+YOTT063LVTT/dUOeQsNgp5DXr86/K7/A==", 212 | "cpu": [ 213 | "ia32" 214 | ], 215 | "optional": true, 216 | "os": [ 217 | "win32" 218 | ], 219 | "engines": { 220 | "node": ">= 10" 221 | } 222 | }, 223 | "node_modules/@next/swc-win32-x64-msvc": { 224 | "version": "14.2.17", 225 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.17.tgz", 226 | "integrity": "sha512-vkQfN1+4V4KqDibkW2q0sJ6CxQuXq5l2ma3z0BRcfIqkAMZiiW67T9yCpwqJKP68QghBtPEFjPAlaqe38O6frw==", 227 | "cpu": [ 228 | "x64" 229 | ], 230 | "optional": true, 231 | "os": [ 232 | "win32" 233 | ], 234 | "engines": { 235 | "node": ">= 10" 236 | } 237 | }, 238 | "node_modules/@nodelib/fs.scandir": { 239 | "version": "2.1.5", 240 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 241 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 242 | "dependencies": { 243 | "@nodelib/fs.stat": "2.0.5", 244 | "run-parallel": "^1.1.9" 245 | }, 246 | "engines": { 247 | "node": ">= 8" 248 | } 249 | }, 250 | "node_modules/@nodelib/fs.stat": { 251 | "version": "2.0.5", 252 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 253 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 254 | "engines": { 255 | "node": ">= 8" 256 | } 257 | }, 258 | "node_modules/@nodelib/fs.walk": { 259 | "version": "1.2.8", 260 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 261 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 262 | "dependencies": { 263 | "@nodelib/fs.scandir": "2.1.5", 264 | "fastq": "^1.6.0" 265 | }, 266 | "engines": { 267 | "node": ">= 8" 268 | } 269 | }, 270 | "node_modules/@pkgjs/parseargs": { 271 | "version": "0.11.0", 272 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 273 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 274 | "optional": true, 275 | "engines": { 276 | "node": ">=14" 277 | } 278 | }, 279 | "node_modules/@swc/counter": { 280 | "version": "0.1.3", 281 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 282 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" 283 | }, 284 | "node_modules/@swc/helpers": { 285 | "version": "0.5.5", 286 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", 287 | "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", 288 | "dependencies": { 289 | "@swc/counter": "^0.1.3", 290 | "tslib": "^2.4.0" 291 | } 292 | }, 293 | "node_modules/@tailwindcss/typography": { 294 | "version": "0.5.16", 295 | "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", 296 | "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", 297 | "dependencies": { 298 | "lodash.castarray": "^4.4.0", 299 | "lodash.isplainobject": "^4.0.6", 300 | "lodash.merge": "^4.6.2", 301 | "postcss-selector-parser": "6.0.10" 302 | }, 303 | "peerDependencies": { 304 | "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" 305 | } 306 | }, 307 | "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { 308 | "version": "6.0.10", 309 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 310 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 311 | "dependencies": { 312 | "cssesc": "^3.0.0", 313 | "util-deprecate": "^1.0.2" 314 | }, 315 | "engines": { 316 | "node": ">=4" 317 | } 318 | }, 319 | "node_modules/@types/node": { 320 | "version": "20.17.19", 321 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.19.tgz", 322 | "integrity": "sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==", 323 | "dev": true, 324 | "dependencies": { 325 | "undici-types": "~6.19.2" 326 | } 327 | }, 328 | "node_modules/@types/prop-types": { 329 | "version": "15.7.14", 330 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", 331 | "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", 332 | "dev": true 333 | }, 334 | "node_modules/@types/react": { 335 | "version": "18.3.18", 336 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", 337 | "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", 338 | "dev": true, 339 | "dependencies": { 340 | "@types/prop-types": "*", 341 | "csstype": "^3.0.2" 342 | } 343 | }, 344 | "node_modules/@types/react-dom": { 345 | "version": "18.3.5", 346 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", 347 | "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", 348 | "dev": true, 349 | "peerDependencies": { 350 | "@types/react": "^18.0.0" 351 | } 352 | }, 353 | "node_modules/@vercel/analytics": { 354 | "version": "1.5.0", 355 | "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz", 356 | "integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==", 357 | "peerDependencies": { 358 | "@remix-run/react": "^2", 359 | "@sveltejs/kit": "^1 || ^2", 360 | "next": ">= 13", 361 | "react": "^18 || ^19 || ^19.0.0-rc", 362 | "svelte": ">= 4", 363 | "vue": "^3", 364 | "vue-router": "^4" 365 | }, 366 | "peerDependenciesMeta": { 367 | "@remix-run/react": { 368 | "optional": true 369 | }, 370 | "@sveltejs/kit": { 371 | "optional": true 372 | }, 373 | "next": { 374 | "optional": true 375 | }, 376 | "react": { 377 | "optional": true 378 | }, 379 | "svelte": { 380 | "optional": true 381 | }, 382 | "vue": { 383 | "optional": true 384 | }, 385 | "vue-router": { 386 | "optional": true 387 | } 388 | } 389 | }, 390 | "node_modules/ansi-regex": { 391 | "version": "6.1.0", 392 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 393 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 394 | "engines": { 395 | "node": ">=12" 396 | }, 397 | "funding": { 398 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 399 | } 400 | }, 401 | "node_modules/ansi-styles": { 402 | "version": "6.2.1", 403 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 404 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 405 | "engines": { 406 | "node": ">=12" 407 | }, 408 | "funding": { 409 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 410 | } 411 | }, 412 | "node_modules/any-promise": { 413 | "version": "1.3.0", 414 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 415 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" 416 | }, 417 | "node_modules/anymatch": { 418 | "version": "3.1.3", 419 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 420 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 421 | "dependencies": { 422 | "normalize-path": "^3.0.0", 423 | "picomatch": "^2.0.4" 424 | }, 425 | "engines": { 426 | "node": ">= 8" 427 | } 428 | }, 429 | "node_modules/arg": { 430 | "version": "5.0.2", 431 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 432 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" 433 | }, 434 | "node_modules/balanced-match": { 435 | "version": "1.0.2", 436 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 437 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 438 | }, 439 | "node_modules/binary-extensions": { 440 | "version": "2.3.0", 441 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 442 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 443 | "engines": { 444 | "node": ">=8" 445 | }, 446 | "funding": { 447 | "url": "https://github.com/sponsors/sindresorhus" 448 | } 449 | }, 450 | "node_modules/brace-expansion": { 451 | "version": "2.0.1", 452 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 453 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 454 | "dependencies": { 455 | "balanced-match": "^1.0.0" 456 | } 457 | }, 458 | "node_modules/braces": { 459 | "version": "3.0.3", 460 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 461 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 462 | "dependencies": { 463 | "fill-range": "^7.1.1" 464 | }, 465 | "engines": { 466 | "node": ">=8" 467 | } 468 | }, 469 | "node_modules/busboy": { 470 | "version": "1.6.0", 471 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 472 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 473 | "dependencies": { 474 | "streamsearch": "^1.1.0" 475 | }, 476 | "engines": { 477 | "node": ">=10.16.0" 478 | } 479 | }, 480 | "node_modules/camelcase-css": { 481 | "version": "2.0.1", 482 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 483 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 484 | "engines": { 485 | "node": ">= 6" 486 | } 487 | }, 488 | "node_modules/caniuse-lite": { 489 | "version": "1.0.30001700", 490 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", 491 | "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", 492 | "funding": [ 493 | { 494 | "type": "opencollective", 495 | "url": "https://opencollective.com/browserslist" 496 | }, 497 | { 498 | "type": "tidelift", 499 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 500 | }, 501 | { 502 | "type": "github", 503 | "url": "https://github.com/sponsors/ai" 504 | } 505 | ] 506 | }, 507 | "node_modules/chokidar": { 508 | "version": "3.6.0", 509 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 510 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 511 | "dependencies": { 512 | "anymatch": "~3.1.2", 513 | "braces": "~3.0.2", 514 | "glob-parent": "~5.1.2", 515 | "is-binary-path": "~2.1.0", 516 | "is-glob": "~4.0.1", 517 | "normalize-path": "~3.0.0", 518 | "readdirp": "~3.6.0" 519 | }, 520 | "engines": { 521 | "node": ">= 8.10.0" 522 | }, 523 | "funding": { 524 | "url": "https://paulmillr.com/funding/" 525 | }, 526 | "optionalDependencies": { 527 | "fsevents": "~2.3.2" 528 | } 529 | }, 530 | "node_modules/chokidar/node_modules/glob-parent": { 531 | "version": "5.1.2", 532 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 533 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 534 | "dependencies": { 535 | "is-glob": "^4.0.1" 536 | }, 537 | "engines": { 538 | "node": ">= 6" 539 | } 540 | }, 541 | "node_modules/client-only": { 542 | "version": "0.0.1", 543 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 544 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 545 | }, 546 | "node_modules/color-convert": { 547 | "version": "2.0.1", 548 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 549 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 550 | "dependencies": { 551 | "color-name": "~1.1.4" 552 | }, 553 | "engines": { 554 | "node": ">=7.0.0" 555 | } 556 | }, 557 | "node_modules/color-name": { 558 | "version": "1.1.4", 559 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 560 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 561 | }, 562 | "node_modules/commander": { 563 | "version": "4.1.1", 564 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 565 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 566 | "engines": { 567 | "node": ">= 6" 568 | } 569 | }, 570 | "node_modules/cross-fetch": { 571 | "version": "4.1.0", 572 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", 573 | "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", 574 | "dependencies": { 575 | "node-fetch": "^2.7.0" 576 | } 577 | }, 578 | "node_modules/cross-spawn": { 579 | "version": "7.0.6", 580 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 581 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 582 | "dependencies": { 583 | "path-key": "^3.1.0", 584 | "shebang-command": "^2.0.0", 585 | "which": "^2.0.1" 586 | }, 587 | "engines": { 588 | "node": ">= 8" 589 | } 590 | }, 591 | "node_modules/cssesc": { 592 | "version": "3.0.0", 593 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 594 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 595 | "bin": { 596 | "cssesc": "bin/cssesc" 597 | }, 598 | "engines": { 599 | "node": ">=4" 600 | } 601 | }, 602 | "node_modules/csstype": { 603 | "version": "3.1.3", 604 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 605 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 606 | "dev": true 607 | }, 608 | "node_modules/didyoumean": { 609 | "version": "1.2.2", 610 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 611 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" 612 | }, 613 | "node_modules/dlv": { 614 | "version": "1.1.3", 615 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 616 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" 617 | }, 618 | "node_modules/dotenv": { 619 | "version": "16.4.7", 620 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 621 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 622 | "engines": { 623 | "node": ">=12" 624 | }, 625 | "funding": { 626 | "url": "https://dotenvx.com" 627 | } 628 | }, 629 | "node_modules/eastasianwidth": { 630 | "version": "0.2.0", 631 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 632 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 633 | }, 634 | "node_modules/emoji-regex": { 635 | "version": "9.2.2", 636 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 637 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 638 | }, 639 | "node_modules/exa-js": { 640 | "version": "1.4.10", 641 | "resolved": "https://registry.npmjs.org/exa-js/-/exa-js-1.4.10.tgz", 642 | "integrity": "sha512-rffYWPU568gOiYmsHW3L5J6atoNfLJTrtAk/DAKyPuGtdDXrE9fsSfltP1X1pNVtLTsz8DIyhUHOXErueNLJrQ==", 643 | "dependencies": { 644 | "cross-fetch": "^4.0.0", 645 | "dotenv": "^16.4.7" 646 | } 647 | }, 648 | "node_modules/fast-glob": { 649 | "version": "3.3.3", 650 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 651 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 652 | "dependencies": { 653 | "@nodelib/fs.stat": "^2.0.2", 654 | "@nodelib/fs.walk": "^1.2.3", 655 | "glob-parent": "^5.1.2", 656 | "merge2": "^1.3.0", 657 | "micromatch": "^4.0.8" 658 | }, 659 | "engines": { 660 | "node": ">=8.6.0" 661 | } 662 | }, 663 | "node_modules/fast-glob/node_modules/glob-parent": { 664 | "version": "5.1.2", 665 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 666 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 667 | "dependencies": { 668 | "is-glob": "^4.0.1" 669 | }, 670 | "engines": { 671 | "node": ">= 6" 672 | } 673 | }, 674 | "node_modules/fastq": { 675 | "version": "1.19.0", 676 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", 677 | "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", 678 | "dependencies": { 679 | "reusify": "^1.0.4" 680 | } 681 | }, 682 | "node_modules/fill-range": { 683 | "version": "7.1.1", 684 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 685 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 686 | "dependencies": { 687 | "to-regex-range": "^5.0.1" 688 | }, 689 | "engines": { 690 | "node": ">=8" 691 | } 692 | }, 693 | "node_modules/foreground-child": { 694 | "version": "3.3.0", 695 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 696 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 697 | "dependencies": { 698 | "cross-spawn": "^7.0.0", 699 | "signal-exit": "^4.0.1" 700 | }, 701 | "engines": { 702 | "node": ">=14" 703 | }, 704 | "funding": { 705 | "url": "https://github.com/sponsors/isaacs" 706 | } 707 | }, 708 | "node_modules/fsevents": { 709 | "version": "2.3.3", 710 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 711 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 712 | "hasInstallScript": true, 713 | "optional": true, 714 | "os": [ 715 | "darwin" 716 | ], 717 | "engines": { 718 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 719 | } 720 | }, 721 | "node_modules/function-bind": { 722 | "version": "1.1.2", 723 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 724 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 725 | "funding": { 726 | "url": "https://github.com/sponsors/ljharb" 727 | } 728 | }, 729 | "node_modules/glob": { 730 | "version": "10.4.5", 731 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 732 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 733 | "dependencies": { 734 | "foreground-child": "^3.1.0", 735 | "jackspeak": "^3.1.2", 736 | "minimatch": "^9.0.4", 737 | "minipass": "^7.1.2", 738 | "package-json-from-dist": "^1.0.0", 739 | "path-scurry": "^1.11.1" 740 | }, 741 | "bin": { 742 | "glob": "dist/esm/bin.mjs" 743 | }, 744 | "funding": { 745 | "url": "https://github.com/sponsors/isaacs" 746 | } 747 | }, 748 | "node_modules/glob-parent": { 749 | "version": "6.0.2", 750 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 751 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 752 | "dependencies": { 753 | "is-glob": "^4.0.3" 754 | }, 755 | "engines": { 756 | "node": ">=10.13.0" 757 | } 758 | }, 759 | "node_modules/graceful-fs": { 760 | "version": "4.2.11", 761 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 762 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 763 | }, 764 | "node_modules/hasown": { 765 | "version": "2.0.2", 766 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 767 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 768 | "dependencies": { 769 | "function-bind": "^1.1.2" 770 | }, 771 | "engines": { 772 | "node": ">= 0.4" 773 | } 774 | }, 775 | "node_modules/is-binary-path": { 776 | "version": "2.1.0", 777 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 778 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 779 | "dependencies": { 780 | "binary-extensions": "^2.0.0" 781 | }, 782 | "engines": { 783 | "node": ">=8" 784 | } 785 | }, 786 | "node_modules/is-core-module": { 787 | "version": "2.16.1", 788 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 789 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 790 | "dependencies": { 791 | "hasown": "^2.0.2" 792 | }, 793 | "engines": { 794 | "node": ">= 0.4" 795 | }, 796 | "funding": { 797 | "url": "https://github.com/sponsors/ljharb" 798 | } 799 | }, 800 | "node_modules/is-extglob": { 801 | "version": "2.1.1", 802 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 803 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 804 | "engines": { 805 | "node": ">=0.10.0" 806 | } 807 | }, 808 | "node_modules/is-fullwidth-code-point": { 809 | "version": "3.0.0", 810 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 811 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 812 | "engines": { 813 | "node": ">=8" 814 | } 815 | }, 816 | "node_modules/is-glob": { 817 | "version": "4.0.3", 818 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 819 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 820 | "dependencies": { 821 | "is-extglob": "^2.1.1" 822 | }, 823 | "engines": { 824 | "node": ">=0.10.0" 825 | } 826 | }, 827 | "node_modules/is-number": { 828 | "version": "7.0.0", 829 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 830 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 831 | "engines": { 832 | "node": ">=0.12.0" 833 | } 834 | }, 835 | "node_modules/isexe": { 836 | "version": "2.0.0", 837 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 838 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 839 | }, 840 | "node_modules/jackspeak": { 841 | "version": "3.4.3", 842 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 843 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 844 | "dependencies": { 845 | "@isaacs/cliui": "^8.0.2" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/sponsors/isaacs" 849 | }, 850 | "optionalDependencies": { 851 | "@pkgjs/parseargs": "^0.11.0" 852 | } 853 | }, 854 | "node_modules/jiti": { 855 | "version": "1.21.7", 856 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", 857 | "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", 858 | "bin": { 859 | "jiti": "bin/jiti.js" 860 | } 861 | }, 862 | "node_modules/js-tokens": { 863 | "version": "4.0.0", 864 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 865 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 866 | }, 867 | "node_modules/lilconfig": { 868 | "version": "3.1.3", 869 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 870 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 871 | "engines": { 872 | "node": ">=14" 873 | }, 874 | "funding": { 875 | "url": "https://github.com/sponsors/antonk52" 876 | } 877 | }, 878 | "node_modules/lines-and-columns": { 879 | "version": "1.2.4", 880 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 881 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 882 | }, 883 | "node_modules/lodash.castarray": { 884 | "version": "4.4.0", 885 | "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 886 | "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" 887 | }, 888 | "node_modules/lodash.isplainobject": { 889 | "version": "4.0.6", 890 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 891 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 892 | }, 893 | "node_modules/lodash.merge": { 894 | "version": "4.6.2", 895 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 896 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 897 | }, 898 | "node_modules/loose-envify": { 899 | "version": "1.4.0", 900 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 901 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 902 | "dependencies": { 903 | "js-tokens": "^3.0.0 || ^4.0.0" 904 | }, 905 | "bin": { 906 | "loose-envify": "cli.js" 907 | } 908 | }, 909 | "node_modules/lru-cache": { 910 | "version": "10.4.3", 911 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 912 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" 913 | }, 914 | "node_modules/merge2": { 915 | "version": "1.4.1", 916 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 917 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 918 | "engines": { 919 | "node": ">= 8" 920 | } 921 | }, 922 | "node_modules/micromatch": { 923 | "version": "4.0.8", 924 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 925 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 926 | "dependencies": { 927 | "braces": "^3.0.3", 928 | "picomatch": "^2.3.1" 929 | }, 930 | "engines": { 931 | "node": ">=8.6" 932 | } 933 | }, 934 | "node_modules/minimatch": { 935 | "version": "9.0.5", 936 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 937 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 938 | "dependencies": { 939 | "brace-expansion": "^2.0.1" 940 | }, 941 | "engines": { 942 | "node": ">=16 || 14 >=14.17" 943 | }, 944 | "funding": { 945 | "url": "https://github.com/sponsors/isaacs" 946 | } 947 | }, 948 | "node_modules/minipass": { 949 | "version": "7.1.2", 950 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 951 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 952 | "engines": { 953 | "node": ">=16 || 14 >=14.17" 954 | } 955 | }, 956 | "node_modules/mz": { 957 | "version": "2.7.0", 958 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 959 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 960 | "dependencies": { 961 | "any-promise": "^1.0.0", 962 | "object-assign": "^4.0.1", 963 | "thenify-all": "^1.0.0" 964 | } 965 | }, 966 | "node_modules/nanoid": { 967 | "version": "3.3.8", 968 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 969 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 970 | "funding": [ 971 | { 972 | "type": "github", 973 | "url": "https://github.com/sponsors/ai" 974 | } 975 | ], 976 | "bin": { 977 | "nanoid": "bin/nanoid.cjs" 978 | }, 979 | "engines": { 980 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 981 | } 982 | }, 983 | "node_modules/next": { 984 | "version": "14.2.17", 985 | "resolved": "https://registry.npmjs.org/next/-/next-14.2.17.tgz", 986 | "integrity": "sha512-hNo/Zy701DDO3nzKkPmsLRlDfNCtb1OJxFUvjGEl04u7SFa3zwC6hqsOUzMajcaEOEV8ey1GjvByvrg0Qr5AiQ==", 987 | "dependencies": { 988 | "@next/env": "14.2.17", 989 | "@swc/helpers": "0.5.5", 990 | "busboy": "1.6.0", 991 | "caniuse-lite": "^1.0.30001579", 992 | "graceful-fs": "^4.2.11", 993 | "postcss": "8.4.31", 994 | "styled-jsx": "5.1.1" 995 | }, 996 | "bin": { 997 | "next": "dist/bin/next" 998 | }, 999 | "engines": { 1000 | "node": ">=18.17.0" 1001 | }, 1002 | "optionalDependencies": { 1003 | "@next/swc-darwin-arm64": "14.2.17", 1004 | "@next/swc-darwin-x64": "14.2.17", 1005 | "@next/swc-linux-arm64-gnu": "14.2.17", 1006 | "@next/swc-linux-arm64-musl": "14.2.17", 1007 | "@next/swc-linux-x64-gnu": "14.2.17", 1008 | "@next/swc-linux-x64-musl": "14.2.17", 1009 | "@next/swc-win32-arm64-msvc": "14.2.17", 1010 | "@next/swc-win32-ia32-msvc": "14.2.17", 1011 | "@next/swc-win32-x64-msvc": "14.2.17" 1012 | }, 1013 | "peerDependencies": { 1014 | "@opentelemetry/api": "^1.1.0", 1015 | "@playwright/test": "^1.41.2", 1016 | "react": "^18.2.0", 1017 | "react-dom": "^18.2.0", 1018 | "sass": "^1.3.0" 1019 | }, 1020 | "peerDependenciesMeta": { 1021 | "@opentelemetry/api": { 1022 | "optional": true 1023 | }, 1024 | "@playwright/test": { 1025 | "optional": true 1026 | }, 1027 | "sass": { 1028 | "optional": true 1029 | } 1030 | } 1031 | }, 1032 | "node_modules/next/node_modules/postcss": { 1033 | "version": "8.4.31", 1034 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1035 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1036 | "funding": [ 1037 | { 1038 | "type": "opencollective", 1039 | "url": "https://opencollective.com/postcss/" 1040 | }, 1041 | { 1042 | "type": "tidelift", 1043 | "url": "https://tidelift.com/funding/github/npm/postcss" 1044 | }, 1045 | { 1046 | "type": "github", 1047 | "url": "https://github.com/sponsors/ai" 1048 | } 1049 | ], 1050 | "dependencies": { 1051 | "nanoid": "^3.3.6", 1052 | "picocolors": "^1.0.0", 1053 | "source-map-js": "^1.0.2" 1054 | }, 1055 | "engines": { 1056 | "node": "^10 || ^12 || >=14" 1057 | } 1058 | }, 1059 | "node_modules/node-fetch": { 1060 | "version": "2.7.0", 1061 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1062 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1063 | "dependencies": { 1064 | "whatwg-url": "^5.0.0" 1065 | }, 1066 | "engines": { 1067 | "node": "4.x || >=6.0.0" 1068 | }, 1069 | "peerDependencies": { 1070 | "encoding": "^0.1.0" 1071 | }, 1072 | "peerDependenciesMeta": { 1073 | "encoding": { 1074 | "optional": true 1075 | } 1076 | } 1077 | }, 1078 | "node_modules/normalize-path": { 1079 | "version": "3.0.0", 1080 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1081 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1082 | "engines": { 1083 | "node": ">=0.10.0" 1084 | } 1085 | }, 1086 | "node_modules/object-assign": { 1087 | "version": "4.1.1", 1088 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1089 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1090 | "engines": { 1091 | "node": ">=0.10.0" 1092 | } 1093 | }, 1094 | "node_modules/object-hash": { 1095 | "version": "3.0.0", 1096 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1097 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1098 | "engines": { 1099 | "node": ">= 6" 1100 | } 1101 | }, 1102 | "node_modules/package-json-from-dist": { 1103 | "version": "1.0.1", 1104 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1105 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" 1106 | }, 1107 | "node_modules/path-key": { 1108 | "version": "3.1.1", 1109 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1110 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1111 | "engines": { 1112 | "node": ">=8" 1113 | } 1114 | }, 1115 | "node_modules/path-parse": { 1116 | "version": "1.0.7", 1117 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1118 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1119 | }, 1120 | "node_modules/path-scurry": { 1121 | "version": "1.11.1", 1122 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1123 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1124 | "dependencies": { 1125 | "lru-cache": "^10.2.0", 1126 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1127 | }, 1128 | "engines": { 1129 | "node": ">=16 || 14 >=14.18" 1130 | }, 1131 | "funding": { 1132 | "url": "https://github.com/sponsors/isaacs" 1133 | } 1134 | }, 1135 | "node_modules/picocolors": { 1136 | "version": "1.1.1", 1137 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1138 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 1139 | }, 1140 | "node_modules/picomatch": { 1141 | "version": "2.3.1", 1142 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1143 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1144 | "engines": { 1145 | "node": ">=8.6" 1146 | }, 1147 | "funding": { 1148 | "url": "https://github.com/sponsors/jonschlinkert" 1149 | } 1150 | }, 1151 | "node_modules/pify": { 1152 | "version": "2.3.0", 1153 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1154 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1155 | "engines": { 1156 | "node": ">=0.10.0" 1157 | } 1158 | }, 1159 | "node_modules/pirates": { 1160 | "version": "4.0.6", 1161 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 1162 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 1163 | "engines": { 1164 | "node": ">= 6" 1165 | } 1166 | }, 1167 | "node_modules/postcss": { 1168 | "version": "8.5.2", 1169 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", 1170 | "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", 1171 | "funding": [ 1172 | { 1173 | "type": "opencollective", 1174 | "url": "https://opencollective.com/postcss/" 1175 | }, 1176 | { 1177 | "type": "tidelift", 1178 | "url": "https://tidelift.com/funding/github/npm/postcss" 1179 | }, 1180 | { 1181 | "type": "github", 1182 | "url": "https://github.com/sponsors/ai" 1183 | } 1184 | ], 1185 | "dependencies": { 1186 | "nanoid": "^3.3.8", 1187 | "picocolors": "^1.1.1", 1188 | "source-map-js": "^1.2.1" 1189 | }, 1190 | "engines": { 1191 | "node": "^10 || ^12 || >=14" 1192 | } 1193 | }, 1194 | "node_modules/postcss-import": { 1195 | "version": "15.1.0", 1196 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 1197 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 1198 | "dependencies": { 1199 | "postcss-value-parser": "^4.0.0", 1200 | "read-cache": "^1.0.0", 1201 | "resolve": "^1.1.7" 1202 | }, 1203 | "engines": { 1204 | "node": ">=14.0.0" 1205 | }, 1206 | "peerDependencies": { 1207 | "postcss": "^8.0.0" 1208 | } 1209 | }, 1210 | "node_modules/postcss-js": { 1211 | "version": "4.0.1", 1212 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 1213 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 1214 | "dependencies": { 1215 | "camelcase-css": "^2.0.1" 1216 | }, 1217 | "engines": { 1218 | "node": "^12 || ^14 || >= 16" 1219 | }, 1220 | "funding": { 1221 | "type": "opencollective", 1222 | "url": "https://opencollective.com/postcss/" 1223 | }, 1224 | "peerDependencies": { 1225 | "postcss": "^8.4.21" 1226 | } 1227 | }, 1228 | "node_modules/postcss-load-config": { 1229 | "version": "4.0.2", 1230 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 1231 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 1232 | "funding": [ 1233 | { 1234 | "type": "opencollective", 1235 | "url": "https://opencollective.com/postcss/" 1236 | }, 1237 | { 1238 | "type": "github", 1239 | "url": "https://github.com/sponsors/ai" 1240 | } 1241 | ], 1242 | "dependencies": { 1243 | "lilconfig": "^3.0.0", 1244 | "yaml": "^2.3.4" 1245 | }, 1246 | "engines": { 1247 | "node": ">= 14" 1248 | }, 1249 | "peerDependencies": { 1250 | "postcss": ">=8.0.9", 1251 | "ts-node": ">=9.0.0" 1252 | }, 1253 | "peerDependenciesMeta": { 1254 | "postcss": { 1255 | "optional": true 1256 | }, 1257 | "ts-node": { 1258 | "optional": true 1259 | } 1260 | } 1261 | }, 1262 | "node_modules/postcss-nested": { 1263 | "version": "6.2.0", 1264 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 1265 | "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 1266 | "funding": [ 1267 | { 1268 | "type": "opencollective", 1269 | "url": "https://opencollective.com/postcss/" 1270 | }, 1271 | { 1272 | "type": "github", 1273 | "url": "https://github.com/sponsors/ai" 1274 | } 1275 | ], 1276 | "dependencies": { 1277 | "postcss-selector-parser": "^6.1.1" 1278 | }, 1279 | "engines": { 1280 | "node": ">=12.0" 1281 | }, 1282 | "peerDependencies": { 1283 | "postcss": "^8.2.14" 1284 | } 1285 | }, 1286 | "node_modules/postcss-selector-parser": { 1287 | "version": "6.1.2", 1288 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 1289 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 1290 | "dependencies": { 1291 | "cssesc": "^3.0.0", 1292 | "util-deprecate": "^1.0.2" 1293 | }, 1294 | "engines": { 1295 | "node": ">=4" 1296 | } 1297 | }, 1298 | "node_modules/postcss-value-parser": { 1299 | "version": "4.2.0", 1300 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1301 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 1302 | }, 1303 | "node_modules/queue-microtask": { 1304 | "version": "1.2.3", 1305 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1306 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1307 | "funding": [ 1308 | { 1309 | "type": "github", 1310 | "url": "https://github.com/sponsors/feross" 1311 | }, 1312 | { 1313 | "type": "patreon", 1314 | "url": "https://www.patreon.com/feross" 1315 | }, 1316 | { 1317 | "type": "consulting", 1318 | "url": "https://feross.org/support" 1319 | } 1320 | ] 1321 | }, 1322 | "node_modules/react": { 1323 | "version": "18.3.1", 1324 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", 1325 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", 1326 | "dependencies": { 1327 | "loose-envify": "^1.1.0" 1328 | }, 1329 | "engines": { 1330 | "node": ">=0.10.0" 1331 | } 1332 | }, 1333 | "node_modules/react-dom": { 1334 | "version": "18.3.1", 1335 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", 1336 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", 1337 | "dependencies": { 1338 | "loose-envify": "^1.1.0", 1339 | "scheduler": "^0.23.2" 1340 | }, 1341 | "peerDependencies": { 1342 | "react": "^18.3.1" 1343 | } 1344 | }, 1345 | "node_modules/read-cache": { 1346 | "version": "1.0.0", 1347 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1348 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1349 | "dependencies": { 1350 | "pify": "^2.3.0" 1351 | } 1352 | }, 1353 | "node_modules/readdirp": { 1354 | "version": "3.6.0", 1355 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1356 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1357 | "dependencies": { 1358 | "picomatch": "^2.2.1" 1359 | }, 1360 | "engines": { 1361 | "node": ">=8.10.0" 1362 | } 1363 | }, 1364 | "node_modules/resolve": { 1365 | "version": "1.22.10", 1366 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1367 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1368 | "dependencies": { 1369 | "is-core-module": "^2.16.0", 1370 | "path-parse": "^1.0.7", 1371 | "supports-preserve-symlinks-flag": "^1.0.0" 1372 | }, 1373 | "bin": { 1374 | "resolve": "bin/resolve" 1375 | }, 1376 | "engines": { 1377 | "node": ">= 0.4" 1378 | }, 1379 | "funding": { 1380 | "url": "https://github.com/sponsors/ljharb" 1381 | } 1382 | }, 1383 | "node_modules/reusify": { 1384 | "version": "1.0.4", 1385 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1386 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1387 | "engines": { 1388 | "iojs": ">=1.0.0", 1389 | "node": ">=0.10.0" 1390 | } 1391 | }, 1392 | "node_modules/run-parallel": { 1393 | "version": "1.2.0", 1394 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1395 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1396 | "funding": [ 1397 | { 1398 | "type": "github", 1399 | "url": "https://github.com/sponsors/feross" 1400 | }, 1401 | { 1402 | "type": "patreon", 1403 | "url": "https://www.patreon.com/feross" 1404 | }, 1405 | { 1406 | "type": "consulting", 1407 | "url": "https://feross.org/support" 1408 | } 1409 | ], 1410 | "dependencies": { 1411 | "queue-microtask": "^1.2.2" 1412 | } 1413 | }, 1414 | "node_modules/scheduler": { 1415 | "version": "0.23.2", 1416 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", 1417 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", 1418 | "dependencies": { 1419 | "loose-envify": "^1.1.0" 1420 | } 1421 | }, 1422 | "node_modules/shebang-command": { 1423 | "version": "2.0.0", 1424 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1425 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1426 | "dependencies": { 1427 | "shebang-regex": "^3.0.0" 1428 | }, 1429 | "engines": { 1430 | "node": ">=8" 1431 | } 1432 | }, 1433 | "node_modules/shebang-regex": { 1434 | "version": "3.0.0", 1435 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1436 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1437 | "engines": { 1438 | "node": ">=8" 1439 | } 1440 | }, 1441 | "node_modules/signal-exit": { 1442 | "version": "4.1.0", 1443 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1444 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1445 | "engines": { 1446 | "node": ">=14" 1447 | }, 1448 | "funding": { 1449 | "url": "https://github.com/sponsors/isaacs" 1450 | } 1451 | }, 1452 | "node_modules/source-map-js": { 1453 | "version": "1.2.1", 1454 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1455 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1456 | "engines": { 1457 | "node": ">=0.10.0" 1458 | } 1459 | }, 1460 | "node_modules/streamsearch": { 1461 | "version": "1.1.0", 1462 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1463 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1464 | "engines": { 1465 | "node": ">=10.0.0" 1466 | } 1467 | }, 1468 | "node_modules/string-width": { 1469 | "version": "5.1.2", 1470 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1471 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1472 | "dependencies": { 1473 | "eastasianwidth": "^0.2.0", 1474 | "emoji-regex": "^9.2.2", 1475 | "strip-ansi": "^7.0.1" 1476 | }, 1477 | "engines": { 1478 | "node": ">=12" 1479 | }, 1480 | "funding": { 1481 | "url": "https://github.com/sponsors/sindresorhus" 1482 | } 1483 | }, 1484 | "node_modules/string-width-cjs": { 1485 | "name": "string-width", 1486 | "version": "4.2.3", 1487 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1488 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1489 | "dependencies": { 1490 | "emoji-regex": "^8.0.0", 1491 | "is-fullwidth-code-point": "^3.0.0", 1492 | "strip-ansi": "^6.0.1" 1493 | }, 1494 | "engines": { 1495 | "node": ">=8" 1496 | } 1497 | }, 1498 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1499 | "version": "5.0.1", 1500 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1501 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1502 | "engines": { 1503 | "node": ">=8" 1504 | } 1505 | }, 1506 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1507 | "version": "8.0.0", 1508 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1509 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1510 | }, 1511 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1512 | "version": "6.0.1", 1513 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1514 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1515 | "dependencies": { 1516 | "ansi-regex": "^5.0.1" 1517 | }, 1518 | "engines": { 1519 | "node": ">=8" 1520 | } 1521 | }, 1522 | "node_modules/strip-ansi": { 1523 | "version": "7.1.0", 1524 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1525 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1526 | "dependencies": { 1527 | "ansi-regex": "^6.0.1" 1528 | }, 1529 | "engines": { 1530 | "node": ">=12" 1531 | }, 1532 | "funding": { 1533 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1534 | } 1535 | }, 1536 | "node_modules/strip-ansi-cjs": { 1537 | "name": "strip-ansi", 1538 | "version": "6.0.1", 1539 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1540 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1541 | "dependencies": { 1542 | "ansi-regex": "^5.0.1" 1543 | }, 1544 | "engines": { 1545 | "node": ">=8" 1546 | } 1547 | }, 1548 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1549 | "version": "5.0.1", 1550 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1551 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1552 | "engines": { 1553 | "node": ">=8" 1554 | } 1555 | }, 1556 | "node_modules/styled-jsx": { 1557 | "version": "5.1.1", 1558 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 1559 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 1560 | "dependencies": { 1561 | "client-only": "0.0.1" 1562 | }, 1563 | "engines": { 1564 | "node": ">= 12.0.0" 1565 | }, 1566 | "peerDependencies": { 1567 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 1568 | }, 1569 | "peerDependenciesMeta": { 1570 | "@babel/core": { 1571 | "optional": true 1572 | }, 1573 | "babel-plugin-macros": { 1574 | "optional": true 1575 | } 1576 | } 1577 | }, 1578 | "node_modules/sucrase": { 1579 | "version": "3.35.0", 1580 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 1581 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 1582 | "dependencies": { 1583 | "@jridgewell/gen-mapping": "^0.3.2", 1584 | "commander": "^4.0.0", 1585 | "glob": "^10.3.10", 1586 | "lines-and-columns": "^1.1.6", 1587 | "mz": "^2.7.0", 1588 | "pirates": "^4.0.1", 1589 | "ts-interface-checker": "^0.1.9" 1590 | }, 1591 | "bin": { 1592 | "sucrase": "bin/sucrase", 1593 | "sucrase-node": "bin/sucrase-node" 1594 | }, 1595 | "engines": { 1596 | "node": ">=16 || 14 >=14.17" 1597 | } 1598 | }, 1599 | "node_modules/supports-preserve-symlinks-flag": { 1600 | "version": "1.0.0", 1601 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1602 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1603 | "engines": { 1604 | "node": ">= 0.4" 1605 | }, 1606 | "funding": { 1607 | "url": "https://github.com/sponsors/ljharb" 1608 | } 1609 | }, 1610 | "node_modules/tailwindcss": { 1611 | "version": "3.4.17", 1612 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", 1613 | "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", 1614 | "dependencies": { 1615 | "@alloc/quick-lru": "^5.2.0", 1616 | "arg": "^5.0.2", 1617 | "chokidar": "^3.6.0", 1618 | "didyoumean": "^1.2.2", 1619 | "dlv": "^1.1.3", 1620 | "fast-glob": "^3.3.2", 1621 | "glob-parent": "^6.0.2", 1622 | "is-glob": "^4.0.3", 1623 | "jiti": "^1.21.6", 1624 | "lilconfig": "^3.1.3", 1625 | "micromatch": "^4.0.8", 1626 | "normalize-path": "^3.0.0", 1627 | "object-hash": "^3.0.0", 1628 | "picocolors": "^1.1.1", 1629 | "postcss": "^8.4.47", 1630 | "postcss-import": "^15.1.0", 1631 | "postcss-js": "^4.0.1", 1632 | "postcss-load-config": "^4.0.2", 1633 | "postcss-nested": "^6.2.0", 1634 | "postcss-selector-parser": "^6.1.2", 1635 | "resolve": "^1.22.8", 1636 | "sucrase": "^3.35.0" 1637 | }, 1638 | "bin": { 1639 | "tailwind": "lib/cli.js", 1640 | "tailwindcss": "lib/cli.js" 1641 | }, 1642 | "engines": { 1643 | "node": ">=14.0.0" 1644 | } 1645 | }, 1646 | "node_modules/tailwindcss-animate": { 1647 | "version": "1.0.7", 1648 | "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", 1649 | "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", 1650 | "peerDependencies": { 1651 | "tailwindcss": ">=3.0.0 || insiders" 1652 | } 1653 | }, 1654 | "node_modules/thenify": { 1655 | "version": "3.3.1", 1656 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1657 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1658 | "dependencies": { 1659 | "any-promise": "^1.0.0" 1660 | } 1661 | }, 1662 | "node_modules/thenify-all": { 1663 | "version": "1.6.0", 1664 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1665 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1666 | "dependencies": { 1667 | "thenify": ">= 3.1.0 < 4" 1668 | }, 1669 | "engines": { 1670 | "node": ">=0.8" 1671 | } 1672 | }, 1673 | "node_modules/to-regex-range": { 1674 | "version": "5.0.1", 1675 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1676 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1677 | "dependencies": { 1678 | "is-number": "^7.0.0" 1679 | }, 1680 | "engines": { 1681 | "node": ">=8.0" 1682 | } 1683 | }, 1684 | "node_modules/tr46": { 1685 | "version": "0.0.3", 1686 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1687 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1688 | }, 1689 | "node_modules/ts-interface-checker": { 1690 | "version": "0.1.13", 1691 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1692 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" 1693 | }, 1694 | "node_modules/tslib": { 1695 | "version": "2.8.1", 1696 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1697 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1698 | }, 1699 | "node_modules/typescript": { 1700 | "version": "5.7.3", 1701 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 1702 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 1703 | "dev": true, 1704 | "bin": { 1705 | "tsc": "bin/tsc", 1706 | "tsserver": "bin/tsserver" 1707 | }, 1708 | "engines": { 1709 | "node": ">=14.17" 1710 | } 1711 | }, 1712 | "node_modules/undici-types": { 1713 | "version": "6.19.8", 1714 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1715 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1716 | "dev": true 1717 | }, 1718 | "node_modules/util-deprecate": { 1719 | "version": "1.0.2", 1720 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1721 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1722 | }, 1723 | "node_modules/webidl-conversions": { 1724 | "version": "3.0.1", 1725 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1726 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1727 | }, 1728 | "node_modules/whatwg-url": { 1729 | "version": "5.0.0", 1730 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1731 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1732 | "dependencies": { 1733 | "tr46": "~0.0.3", 1734 | "webidl-conversions": "^3.0.0" 1735 | } 1736 | }, 1737 | "node_modules/which": { 1738 | "version": "2.0.2", 1739 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1740 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1741 | "dependencies": { 1742 | "isexe": "^2.0.0" 1743 | }, 1744 | "bin": { 1745 | "node-which": "bin/node-which" 1746 | }, 1747 | "engines": { 1748 | "node": ">= 8" 1749 | } 1750 | }, 1751 | "node_modules/wrap-ansi": { 1752 | "version": "8.1.0", 1753 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1754 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1755 | "dependencies": { 1756 | "ansi-styles": "^6.1.0", 1757 | "string-width": "^5.0.1", 1758 | "strip-ansi": "^7.0.1" 1759 | }, 1760 | "engines": { 1761 | "node": ">=12" 1762 | }, 1763 | "funding": { 1764 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1765 | } 1766 | }, 1767 | "node_modules/wrap-ansi-cjs": { 1768 | "name": "wrap-ansi", 1769 | "version": "7.0.0", 1770 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1771 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1772 | "dependencies": { 1773 | "ansi-styles": "^4.0.0", 1774 | "string-width": "^4.1.0", 1775 | "strip-ansi": "^6.0.0" 1776 | }, 1777 | "engines": { 1778 | "node": ">=10" 1779 | }, 1780 | "funding": { 1781 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1782 | } 1783 | }, 1784 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1785 | "version": "5.0.1", 1786 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1787 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1788 | "engines": { 1789 | "node": ">=8" 1790 | } 1791 | }, 1792 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1793 | "version": "4.3.0", 1794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1795 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1796 | "dependencies": { 1797 | "color-convert": "^2.0.1" 1798 | }, 1799 | "engines": { 1800 | "node": ">=8" 1801 | }, 1802 | "funding": { 1803 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1804 | } 1805 | }, 1806 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1807 | "version": "8.0.0", 1808 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1809 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1810 | }, 1811 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1812 | "version": "4.2.3", 1813 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1814 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1815 | "dependencies": { 1816 | "emoji-regex": "^8.0.0", 1817 | "is-fullwidth-code-point": "^3.0.0", 1818 | "strip-ansi": "^6.0.1" 1819 | }, 1820 | "engines": { 1821 | "node": ">=8" 1822 | } 1823 | }, 1824 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1825 | "version": "6.0.1", 1826 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1827 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1828 | "dependencies": { 1829 | "ansi-regex": "^5.0.1" 1830 | }, 1831 | "engines": { 1832 | "node": ">=8" 1833 | } 1834 | }, 1835 | "node_modules/yaml": { 1836 | "version": "2.7.0", 1837 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 1838 | "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 1839 | "bin": { 1840 | "yaml": "bin.mjs" 1841 | }, 1842 | "engines": { 1843 | "node": ">= 14" 1844 | } 1845 | } 1846 | } 1847 | } 1848 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "answer-chat-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@tailwindcss/typography": "^0.5.16", 13 | "@vercel/analytics": "^1.5.0", 14 | "exa-js": "^1.4.10", 15 | "next": "14.2.17", 16 | "react": "^18", 17 | "react-dom": "^18", 18 | "tailwindcss-animate": "^1.0.7" 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^20", 22 | "@types/react": "^18", 23 | "@types/react-dom": "^18", 24 | "postcss": "^8", 25 | "tailwindcss": "^3.4.1", 26 | "typescript": "^5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | darkMode: ["class"], 5 | content: [ 6 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 8 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 9 | ], 10 | theme: { 11 | extend: { 12 | colors: { 13 | foreground: 'hsl(var(--foreground))', 14 | 'background-start': 'rgb(var(--background-start-rgb))', 15 | 'background-end': 'rgb(var(--background-end-rgb))', 16 | 'brand-default': 'var(--brand-default)', 17 | 'brand-fainter': 'var(--brand-fainter)', 18 | 'brand-faint': 'var(--brand-faint)', 19 | 'brand-subtle': 'var(--brand-subtle)', 20 | 'brand-muted': 'var(--brand-muted)', 21 | 'brand-dark': 'var(--brand-dark)', 22 | 'brand-darker': 'var(--brand-darker)', 23 | 'secondary-accent': 'var(--secondary-accent)', 24 | 'secondary-accent2x': 'var(--secondary-accent2x)', 25 | 'secondary-dark': 'var(--secondary-dark)', 26 | 'secondary-darker': 'var(--secondary-darker)', 27 | 'secondary-darkest': 'var(--secondary-darkest)', 28 | 'secondary-default': 'var(--secondary-default)', 29 | 'secondary-faint': 'var(--secondary-faint)', 30 | 'secondary-fainter': 'var(--secondary-fainter)', 31 | 'gray-100': 'var(--gray-100)', 32 | 'gray-200': 'var(--gray-200)', 33 | 'gray-300': 'var(--gray-300)', 34 | 'gray-400': 'var(--gray-400)', 35 | 'gray-50': 'var(--gray-50)', 36 | 'gray-500': 'var(--gray-500)', 37 | 'gray-600': 'var(--gray-600)', 38 | 'gray-700': 'var(--gray-700)', 39 | 'gray-800': 'var(--gray-800)', 40 | 'gray-900': 'var(--gray-900)', 41 | 'gray-950': 'var(--gray-950)', 42 | black: 'var(--black)', 43 | white: 'var(--white)', 44 | 'accent-yellow-light': 'var(--accent-yellow-light)', 45 | 'accent-yellow-dark': 'var(--accent-yellow-dark)', 46 | 'accent-skyblue-light': 'var(--accent-skyblue-light)', 47 | 'accent-skyblue-dark': 'var(--accent-skyblue-dark)', 48 | 'accent-green': 'var(--accent-green)', 49 | 'accent-red': 'var(--accent-red)', 50 | 'accent-darkgreen-dark': 'var(--accent-darkgreen-dark)', 51 | 'accent-darkgreen-light': 'var(--accent-darkgreen-light)', 52 | 'accent-purple-dark': 'var(--accent-purple-dark)', 53 | 'accent-purple-light': 'var(--accent-purple-light)', 54 | 'accent-pink-dark': 'var(--accent-pink-dark)', 55 | 'accent-pink-light': 'var(--accent-pink-light)', 56 | 'accent-maroon-dark': 'var(--accent-maroon-dark)', 57 | 'accent-maroon-light': 'var(--accent-maroon-light)', 58 | 'dark-accent-skyblue-dark': 'var(--dark-accent-skyblue-dark)', 59 | 'dark-accent-skyblue-light': 'var(--dark-accent-skyblue-light)', 60 | 'dark-accent-maroon-dark': 'var(--dark-accent-maroon-dark)', 61 | 'dark-accent-maroon-light': 'var(--dark-accent-maroon-light)', 62 | 'dark-accent-green-dark': 'var(--dark-accent-green-dark)', 63 | 'dark-accent-green-light': 'var(--dark-accent-green-light)', 64 | 'dark-accent-yellow-dark': 'var(--dark-accent-yellow-dark)', 65 | 'dark-accent-yellow-light': 'var(--dark-accent-yellow-light)', 66 | 'dark-accent-purple-dark': 'var(--dark-accent-purple-dark)', 67 | 'dark-accent-purple-light': 'var(--dark-accent-purple-light)', 68 | 'dark-accent-pink-dark': 'var(--dark-accent-pink-dark)', 69 | 'dark-accent-pink-light': 'var(--dark-accent-pink-light)', 70 | background: 'hsl(var(--background))', 71 | card: { 72 | DEFAULT: 'hsl(var(--card))', 73 | foreground: 'hsl(var(--card-foreground))' 74 | }, 75 | popover: { 76 | DEFAULT: 'hsl(var(--popover))', 77 | foreground: 'hsl(var(--popover-foreground))' 78 | }, 79 | primary: { 80 | DEFAULT: 'hsl(var(--primary))', 81 | foreground: 'hsl(var(--primary-foreground))' 82 | }, 83 | secondary: { 84 | DEFAULT: 'hsl(var(--secondary))', 85 | foreground: 'hsl(var(--secondary-foreground))' 86 | }, 87 | muted: { 88 | DEFAULT: 'hsl(var(--muted))', 89 | foreground: 'hsl(var(--muted-foreground))' 90 | }, 91 | accent: { 92 | DEFAULT: 'hsl(var(--accent))', 93 | foreground: 'hsl(var(--accent-foreground))' 94 | }, 95 | destructive: { 96 | DEFAULT: 'hsl(var(--destructive))', 97 | foreground: 'hsl(var(--destructive-foreground))' 98 | }, 99 | border: 'hsl(var(--border))', 100 | input: 'hsl(var(--input))', 101 | ring: 'hsl(var(--ring))', 102 | chart: { 103 | '1': 'hsl(var(--chart-1))', 104 | '2': 'hsl(var(--chart-2))', 105 | '3': 'hsl(var(--chart-3))', 106 | '4': 'hsl(var(--chart-4))', 107 | '5': 'hsl(var(--chart-5))' 108 | } 109 | }, 110 | animation: { 111 | 'fade-up': 'fade-up 0.5s ease-out forwards' 112 | }, 113 | keyframes: { 114 | 'fade-up': { 115 | '0%': { 116 | opacity: '0', 117 | transform: 'translateY(20px)' 118 | }, 119 | '100%': { 120 | opacity: '1', 121 | transform: 'translateY(0)' 122 | } 123 | } 124 | }, 125 | borderRadius: { 126 | lg: 'var(--radius)', 127 | md: 'calc(var(--radius) - 2px)', 128 | sm: 'calc(var(--radius) - 4px)' 129 | }, 130 | backgroundImage: { 131 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', 132 | 'gradient-conic': 133 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', 134 | }, 135 | } 136 | }, 137 | plugins: [ 138 | require("tailwindcss-animate"), 139 | require('@tailwindcss/typography'), 140 | ], 141 | }; 142 | export default config; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | --------------------------------------------------------------------------------