├── .gitignore ├── LICENSE ├── README.md ├── app ├── [productId] │ └── page.tsx ├── favicon.ico ├── globals.css ├── layout.tsx └── page.tsx ├── components.json ├── components ├── ai-review-summary.tsx ├── five-star-rating.tsx ├── reviews.tsx └── ui │ ├── avatar.tsx │ ├── card.tsx │ └── separator.tsx ├── lib ├── ai-summary.ts ├── sample-data.ts ├── types.ts └── utils.ts ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── next.svg ├── placeholder-user.jpg └── vercel.svg ├── tailwind.config.ts └── tsconfig.json /.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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2024 Vercel Inc 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a demo of AI generated summaries of customer reviews for an e-commerce storefront. 2 | 3 | The demo takes a set of customer reviews, and uses an LLM to create summaries of those reviews. 4 | It then displays the summary and the reviews in a demo UI. 5 | 6 | The benefit of such an AI summary is that the user can get a quick overview of the sentiment 7 | of reviewers of the product without reading them all. 8 | 9 | [A deployed version can be found here.](https://review-summary.vercel.app/) 10 | 11 | [Install the template on Vercel](https://vercel.com/templates/next.js/customer-reviews-ai-summary-nextjs-vercel) 12 | 13 | ## Getting Started 14 | 15 | First, run the development server: 16 | 17 | ```bash 18 | pnpm dev 19 | ``` 20 | 21 | ## AI key 22 | 23 | This demo requires an API key for Perplexity's inference API. This can be installed via 24 | [Vercel's AI Marketplace](https://vercel.com/docs/integrations/ai). 25 | 26 | Any other LLM model can be connected via minimal changes to `lib/ai-summary.ts` through [Vercel's AI SDK](https://sdk.vercel.ai/docs). 27 | -------------------------------------------------------------------------------- /app/[productId]/page.tsx: -------------------------------------------------------------------------------- 1 | import { Reviews } from "@/components/reviews"; 2 | import { getProduct, sampleProductsReviews } from "@/lib/sample-data"; 3 | 4 | export default async function ProductPage({ 5 | params: { productId }, 6 | }: { 7 | params: { productId: string }; 8 | }) { 9 | const product = await getProduct(productId); 10 | 11 | return ; 12 | } 13 | 14 | export async function generateStaticParams() { 15 | const productIds = Object.keys(sampleProductsReviews); 16 | 17 | return productIds.map((id) => ({ 18 | productId: id, 19 | })); 20 | } 21 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vercel/ai-review-summary/45813fac9579e3b24cd2268f3bc0d371d019ddfe/app/favicon.ico -------------------------------------------------------------------------------- /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: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | body { 12 | color: rgb(var(--foreground-rgb)); 13 | } 14 | 15 | @layer utilities { 16 | .text-balance { 17 | text-wrap: balance; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import "./globals.css"; 4 | import Link from "next/link"; 5 | import { sampleProductsReviews } from "@/lib/sample-data"; 6 | 7 | const inter = Inter({ subsets: ["latin"] }); 8 | 9 | export const metadata: Metadata = { 10 | title: "Review summary", 11 | description: "AI summaries of customer reviews", 12 | }; 13 | 14 | export default function RootLayout({ 15 | children, 16 | }: Readonly<{ 17 | children: React.ReactNode; 18 | }>) { 19 | const products = sampleProductsReviews; 20 | return ( 21 | 22 | 23 | 34 |

35 | This is a demo of AI-generated summaries of customer reviews. To learn 36 | more, see the{" "} 37 | 42 | complete template 43 | 44 | .{"\n "} 45 |

46 |
{children}
47 | 48 | 49 | ); 50 | } 51 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import { Reviews } from "@/components/reviews"; 2 | import { getProduct } from "@/lib/sample-data"; 3 | 4 | export default async function Home() { 5 | const product = await getProduct("mower"); 6 | 7 | return ; 8 | } 9 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "gray", 10 | "cssVariables": false 11 | }, 12 | "aliases": { 13 | "utils": "@/lib/utils", 14 | "components": "@/components" 15 | } 16 | } -------------------------------------------------------------------------------- /components/ai-review-summary.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | CardTitle, 3 | CardDescription, 4 | CardHeader, 5 | CardContent, 6 | Card, 7 | } from "@/components/ui/card"; 8 | import { Product } from "@/lib/types"; 9 | import { summarizeReviews } from "@/lib/ai-summary"; 10 | import { FiveStarRating } from "./five-star-rating"; 11 | 12 | export async function AIReviewSummary({ product }: { product: Product }) { 13 | const summary = await summarizeReviews(product); 14 | const averageRating = 15 | product.reviews.reduce((acc, review) => acc + review.stars, 0) / 16 | product.reviews.length; 17 | return ( 18 | 19 | 20 |
21 | AI Summary 22 | 23 | Based on {product.reviews.length} customer ratings 24 | 25 |
26 |
27 | 28 | 29 | {numberWithOneDecimal(averageRating)} out of 5 30 | 31 |
32 |
33 | 34 |

35 | {summary} 36 |

37 |
38 |
39 | ); 40 | } 41 | 42 | function numberWithOneDecimal(num: number) { 43 | if (num === Math.round(num)) return num; 44 | return Math.round(num * 10) / 10; 45 | } 46 | -------------------------------------------------------------------------------- /components/five-star-rating.tsx: -------------------------------------------------------------------------------- 1 | export function FiveStarRating({ rating }: { rating: number }) { 2 | return ( 3 |
4 | {[...Array(5)].map((_, i) => 5 | i < rating ? ( 6 | 7 | ) : ( 8 | 12 | ) 13 | )} 14 |
15 | ); 16 | } 17 | 18 | function StarIcon(props: any) { 19 | return ( 20 | 32 | 33 | 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /components/reviews.tsx: -------------------------------------------------------------------------------- 1 | import { AvatarImage, AvatarFallback, Avatar } from "@/components/ui/avatar"; 2 | import { Product, Review as ReviewType } from "@/lib/types"; 3 | import ms from "ms"; 4 | import { FiveStarRating } from "./five-star-rating"; 5 | import { AIReviewSummary } from "./ai-review-summary"; 6 | 7 | export async function Reviews({ product }: { product: Product }) { 8 | return ( 9 |
10 | 11 | {product.reviews.map((review) => ( 12 |
13 | 14 |
15 | ))} 16 |
17 | ); 18 | } 19 | 20 | export function Review({ review }: { review: ReviewType }) { 21 | const date = new Date(review.date); 22 | return ( 23 |
24 | 25 | 26 | CN 27 | 28 |
29 |
30 |
31 |

{review.authorName}

32 | 38 |
39 |
40 | 41 |
42 |
43 |
44 |

{review.review}

45 |
46 |
47 |
48 | ); 49 | } 50 | 51 | /** 52 | * You probably want to wrap the parent element of this component with `suppressHydrationWarning` 53 | */ 54 | const timeAgo = (date: Date, suffix = true) => { 55 | if (Date.now() - date.getTime() < 1000) { 56 | return "Just now"; 57 | } 58 | return `${ms(Date.now() - date.getTime(), { long: true })}${ 59 | suffix ? " ago" : "" 60 | }`; 61 | }; 62 | -------------------------------------------------------------------------------- /components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AvatarPrimitive from "@radix-ui/react-avatar" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Avatar = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, ...props }, ref) => ( 12 | 20 | )) 21 | Avatar.displayName = AvatarPrimitive.Root.displayName 22 | 23 | const AvatarImage = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 32 | )) 33 | AvatarImage.displayName = AvatarPrimitive.Image.displayName 34 | 35 | const AvatarFallback = React.forwardRef< 36 | React.ElementRef, 37 | React.ComponentPropsWithoutRef 38 | >(({ className, ...props }, ref) => ( 39 | 47 | )) 48 | AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName 49 | 50 | export { Avatar, AvatarImage, AvatarFallback } 51 | -------------------------------------------------------------------------------- /components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )) 18 | Card.displayName = "Card" 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )) 30 | CardHeader.displayName = "CardHeader" 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLParagraphElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |

44 | )) 45 | CardTitle.displayName = "CardTitle" 46 | 47 | const CardDescription = React.forwardRef< 48 | HTMLParagraphElement, 49 | React.HTMLAttributes 50 | >(({ className, ...props }, ref) => ( 51 |

56 | )) 57 | CardDescription.displayName = "CardDescription" 58 | 59 | const CardContent = React.forwardRef< 60 | HTMLDivElement, 61 | React.HTMLAttributes 62 | >(({ className, ...props }, ref) => ( 63 |

64 | )) 65 | CardContent.displayName = "CardContent" 66 | 67 | const CardFooter = React.forwardRef< 68 | HTMLDivElement, 69 | React.HTMLAttributes 70 | >(({ className, ...props }, ref) => ( 71 |
76 | )) 77 | CardFooter.displayName = "CardFooter" 78 | 79 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } 80 | -------------------------------------------------------------------------------- /components/ui/separator.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as SeparatorPrimitive from "@radix-ui/react-separator" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Separator = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >( 12 | ( 13 | { className, orientation = "horizontal", decorative = true, ...props }, 14 | ref 15 | ) => ( 16 | 27 | ) 28 | ) 29 | Separator.displayName = SeparatorPrimitive.Root.displayName 30 | 31 | export { Separator } 32 | -------------------------------------------------------------------------------- /lib/ai-summary.ts: -------------------------------------------------------------------------------- 1 | import { unstable_cache } from "next/cache"; 2 | import OpenAI from "openai"; 3 | import { OpenAIStream, StreamingTextResponse } from "ai"; 4 | import { Product } from "./types"; 5 | 6 | if (!process.env.PERPLEXITY_API_KEY) { 7 | throw new Error( 8 | "PERPLEXITY_API_KEY environment variable is required. You can get this via https://vercel.com/docs/integrations/ai" 9 | ); 10 | } 11 | const perplexity = new OpenAI({ 12 | apiKey: process.env.PERPLEXITY_API_KEY || "", 13 | baseURL: "https://api.perplexity.ai", 14 | }); 15 | 16 | export async function summarizeReviews(product: Product) { 17 | const averageRating = 18 | product.reviews.reduce((acc, review) => acc + review.stars, 0) / 19 | product.reviews.length; 20 | 21 | const prompt = `Write a summary of the reviews for the ${ 22 | product.name 23 | } product. The product's average rating is ${averageRating} out of 5 stars. 24 | Your goal is to highlight the most common themes and sentiments expressed by customers. 25 | If multiple themes are present, try to capture the most important ones. 26 | If no patterns emerge but there is a shared sentiment, capture that instead. 27 | Try to use natural language and keep the summary concise. 28 | Use a maximum of 4 sentences and 30 words. 29 | Don't include any word count or character count. 30 | No need to reference which reviews you're summarizing. 31 | Do not reference the star rating in the summary. 32 | 33 | Start the summary with "Customers like…" or "Customers mention…" 34 | 35 | Here are 3 examples of a good summarie: 36 | Example 1: Customers like the quality, space, fit and value of the sport equipment bag case. They mention it's heavy duty, has lots of space and pockets, and can fit all their gear. They also appreciate the portability and appearance. That said, some disagree on the zipper. 37 | Example 2: Customers like the quality, ease of installation, and value of the transport rack. They mention that it holds on to everything really well, and is reliable. Some complain about the wind noise, saying it makes a whistling noise at high speeds. Opinions are mixed on fit, and performance. 38 | Example 3: Customers like the quality and value of the body deodorant. They say it works great and provides freshness for a long time after application. Some customers have different opinions on smell and durability. 39 | 40 | Hit the following tone based on rating: 41 | - 1-2 stars: negative 42 | - 3 stars: neutral 43 | - 4-5 stars: positive 44 | 45 | The customer reviews to summarize are as follows: 46 | ${product.reviews 47 | .map((review, i) => `Review ${i + 1}:\n${review.review}`) 48 | .join("\n\n")}`; 49 | 50 | const query = { 51 | model: "pplx-7b-chat", 52 | stream: true, 53 | messages: buildPrompt(prompt), 54 | max_tokens: 1000, 55 | temperature: 0.75, 56 | top_p: 1, 57 | frequency_penalty: 1, 58 | } as const; 59 | 60 | return unstable_cache(async () => { 61 | const response = await perplexity.chat.completions.create(query); 62 | 63 | // Convert the response into a friendly text-stream 64 | const stream = OpenAIStream(response); 65 | 66 | // Respond with the stream 67 | const streamingResponse = new StreamingTextResponse(stream); 68 | let text = await streamingResponse.text(); 69 | // Remove the quotes from the response tht the LLM sometimes adds. 70 | text = text 71 | .trim() 72 | .replace(/^"/, "") 73 | .replace(/"$/, "") 74 | .replace(/[\[\(]\d+ words[\]\)]/g, ""); 75 | return text; 76 | }, [ 77 | JSON.stringify(query), 78 | "1.0", 79 | process.env.VERCEL_BRANCH_URL || "", 80 | process.env.NODE_ENV || "", 81 | ])(); 82 | } 83 | 84 | function buildPrompt(prompt: string): [{ role: "user"; content: string }] { 85 | return [ 86 | { 87 | role: "user", 88 | content: prompt, 89 | }, 90 | ]; 91 | } 92 | -------------------------------------------------------------------------------- /lib/sample-data.ts: -------------------------------------------------------------------------------- 1 | import { notFound } from "next/navigation"; 2 | import { Product } from "./types"; 3 | 4 | export async function getProduct(id: string) { 5 | const product = sampleProductsReviews[id] as Product; 6 | if (!product) { 7 | notFound(); 8 | } 9 | return product; 10 | } 11 | 12 | export const sampleProductsReviews: Record = { 13 | mower: { 14 | name: "Mower3000", 15 | reviews: [ 16 | { 17 | review: 18 | "Absolutely love the Mower3000! Installation was a breeze, thanks to the clear instructions and videos. It navigates my complex yard with ease, even the steep parts. Plus, it's so quiet, I barely notice it's working. Truly a game-changer for lawn care.", 19 | authorName: "Jake P.", 20 | date: "2024-02-15", 21 | stars: 5, 22 | }, 23 | { 24 | review: 25 | "The Mower3000 has been a solid addition to my garden tools. It handles the lawn autonomously, freeing up my weekends. The app control is intuitive, though I wish the Bluetooth range was better. Overall, a reliable lawn mower that does its job well.", 26 | authorName: "Marianne L.", 27 | date: "2024-01-28", 28 | stars: 4, 29 | }, 30 | { 31 | review: 32 | "Mower3000 promises a lot but delivers just enough. It's great on flat surfaces but struggles a bit on my sloped edges. The noise level is as advertised—very quiet. The boundary wire setup took some time, but it's working fine. A decent purchase.", 33 | authorName: "Chris T.", 34 | date: "2024-02-10", 35 | stars: 3, 36 | }, 37 | { 38 | review: 39 | "I had high hopes for the Mower3000, but it's been a mixed bag. The setup was more complicated than expected, and it occasionally misses spots on the lawn. It's quiet and the safety features are reassuring, but I expected more precision for the price.", 40 | authorName: "Alexa R.", 41 | date: "2023-12-20", 42 | stars: 3, 43 | }, 44 | { 45 | review: 46 | "The Mower3000's streak-free technology is not as flawless as advertised. My lawn looks mostly good, but there are areas where it seems to have missed or cut unevenly. The app and setup are user-friendly, but I'm a bit disappointed in the overall performance.", 47 | authorName: "Derek S.", 48 | date: "2024-01-05", 49 | stars: 3, 50 | }, 51 | { 52 | review: 53 | "Not impressed with the Mower3000. It's supposed to navigate narrow spaces, yet it's gotten stuck multiple times in areas of my yard that aren't that complicated. The noise level is fine, but what's the use if it can't do its primary job right?", 54 | authorName: "Patricia N.", 55 | date: "2024-02-03", 56 | stars: 2, 57 | }, 58 | { 59 | review: 60 | "Disappointed with the Mower3000. It struggles with slopes and often leaves uneven cuts. The boundary wire installation was a hassle, and the Bluetooth connectivity is hit or miss. Expected more from such an expensive gadget.", 61 | authorName: "Ron J.", 62 | date: "2023-11-15", 63 | stars: 2, 64 | }, 65 | { 66 | review: 67 | "Frustrated with the Mower3000. It frequently loses its boundary wire signal and ends up mowing outside its zone, causing a mess. The concept is great, but the execution is lacking. Plus, customer service hasn't been very helpful in resolving my issues.", 68 | authorName: "Simone K.", 69 | date: "2024-01-22", 70 | stars: 1, 71 | }, 72 | { 73 | review: 74 | "The Mower3000 is decent. It mows the lawn autonomously, which is convenient. However, the setup took some effort, and the app could be more stable. It's nice to have, but I'm not sure it's worth the investment for smaller yards.", 75 | authorName: "Gary W.", 76 | date: "2024-02-05", 77 | stars: 3, 78 | }, 79 | { 80 | review: 81 | "Overall, the Mower3000 is a good buy. It handles most of my lawn well, including the slope. The silent operation is a huge plus. Just wish the battery life was longer, as it doesn't always finish in one go. Still, it's much better than manual mowing.", 82 | authorName: "Bethany E.", 83 | date: "2024-01-19", 84 | stars: 4, 85 | }, 86 | ], 87 | }, 88 | ecoBright: { 89 | name: "Smart LED", 90 | reviews: [ 91 | { 92 | review: 93 | "The EcoBright 360 didn't live up to its promise of lasting 20,000 hours. Mine burnt out in less than 6 months with moderate use. Disappointed.", 94 | authorName: "Jenna M.", 95 | date: "2024-01-15", 96 | stars: 2, 97 | }, 98 | { 99 | review: 100 | "While the energy savings are noticeable, the light emitted is a bit too harsh for my living room. Not quite the warm glow I was hoping for.", 101 | authorName: "Gregory F.", 102 | date: "2024-01-20", 103 | stars: 3, 104 | }, 105 | { 106 | review: 107 | "Decent bulb for the price, but the smart features are a bit clunky to use. Sometimes it doesn't respond to the app as quickly as I'd like.", 108 | authorName: "Samantha K.", 109 | date: "2024-02-05", 110 | stars: 3, 111 | }, 112 | { 113 | review: 114 | "The app setup was a breeze, and I love being able to control the lighting from anywhere in the house. However, the bulb does not always connect to WiFi on the first try.", 115 | authorName: "Alex P.", 116 | date: "2024-02-10", 117 | stars: 4, 118 | }, 119 | { 120 | review: 121 | "This bulb is great for its price point. Energy-efficient and mostly reliable. Just wish the brightness was a tad higher for outdoor use.", 122 | authorName: "Michelle T.", 123 | date: "2024-02-12", 124 | stars: 3, 125 | }, 126 | { 127 | review: 128 | "The connectivity with my smart home devices is hit or miss, which is frustrating. I expected better integration for a 'smart' bulb.", 129 | authorName: "Leonard W.", 130 | date: "2024-02-14", 131 | stars: 2, 132 | }, 133 | { 134 | review: 135 | "Fantastic product! The EcoBright 360 has completely transformed the ambiance of my home. The scheduling feature is perfect for my routine.", 136 | authorName: "Isabella R.", 137 | date: "2024-02-15", 138 | stars: 5, 139 | }, 140 | { 141 | review: 142 | "Very disappointed. The bulb flickers occasionally, and resetting it doesn't seem to fix the issue. Not what I expected for the price.", 143 | authorName: "Derek S.", 144 | date: "2024-02-16", 145 | stars: 1, 146 | }, 147 | { 148 | review: 149 | "I'm impressed with the energy efficiency and how easy it was to install and use. A great addition to my smart home setup.", 150 | authorName: "Nora Q.", 151 | date: "2024-02-17", 152 | stars: 4, 153 | }, 154 | { 155 | review: 156 | "Light quality is superb, and the dimming feature works like a charm. Makes for a cozy atmosphere in the evenings. A bit pricey, but worth it.", 157 | authorName: "Carlos D.", 158 | date: "2024-02-18", 159 | stars: 4, 160 | }, 161 | ], 162 | }, 163 | ecoSmart: { 164 | name: "Tankless Water Heater", 165 | reviews: [ 166 | { 167 | review: 168 | "Absolutely love the EcoSmart ECO 11! It was surprisingly easy to install and it's been a game changer for our utility bills. The compact size is perfect for our small home, and we've enjoyed endless hot water without any issues. Highly recommend for anyone looking to save on energy costs.", 169 | authorName: "Jessica M.", 170 | date: "2024-01-15", 171 | stars: 5, 172 | }, 173 | { 174 | review: 175 | "The EcoSmart tankless water heater is fantastic. I noticed a significant decrease in my electric bill, and it's great not having to wait for water to heat up. The temperature control is precise and easy to adjust. Great product for the environmentally conscious homeowner.", 176 | authorName: "Brian K.", 177 | date: "2024-02-01", 178 | stars: 5, 179 | }, 180 | { 181 | review: 182 | "I was a bit skeptical about switching to a tankless water heater, but the EcoSmart ECO 11 has exceeded my expectations. Installation was straightforward, and the performance has been flawless. It's efficient, saves space, and provides hot water on demand. What more could you ask for?", 183 | authorName: "Samantha L.", 184 | date: "2023-12-20", 185 | stars: 5, 186 | }, 187 | { 188 | review: 189 | "This water heater is a solid choice. It heats water quickly and is much more efficient than our old tank model. We've seen a drop in our electricity use, and I appreciate the modern, compact design. It fits perfectly in our utility closet.", 190 | authorName: "Derek H.", 191 | date: "2024-01-28", 192 | stars: 4, 193 | }, 194 | { 195 | review: 196 | "I've had the EcoSmart ECO 11 for a few months now, and it's been pretty good. The installation process was a bit of a hassle, but once set up, it's been working well. The temperature consistency is better than I expected, though I wish it were a little faster in heating up.", 197 | authorName: "Clara N.", 198 | date: "2023-11-05", 199 | stars: 4, 200 | }, 201 | { 202 | review: 203 | "The EcoSmart ECO 11 is a decent upgrade from a traditional water heater. The energy savings are noticeable, and it's convenient to have hot water on demand. However, the initial cost and installation might be a deterrent for some. Overall, a good investment if you're planning to stay in your home for a while.", 204 | authorName: "Alex F.", 205 | date: "2024-02-10", 206 | stars: 4, 207 | }, 208 | { 209 | review: 210 | "I was excited about the energy efficiency of the EcoSmart ECO 11, and it hasn't disappointed. It does take a bit of getting used to, especially figuring out the right temperature settings, but once you do, it's great. Saves space and money in the long run.", 211 | authorName: "Nina P.", 212 | date: "2023-12-01", 213 | stars: 4, 214 | }, 215 | { 216 | review: 217 | "The EcoSmart ECO 11 is a game changer. My water heating bills have plummeted, and the space savings is a huge plus. It's incredibly efficient, and I've had no issues with water temperature. Definitely one of the best home improvements I've made.", 218 | authorName: "Mark S.", 219 | date: "2024-01-10", 220 | stars: 5, 221 | }, 222 | { 223 | review: 224 | "I'm thrilled with my purchase of the EcoSmart ECO 11. It's environmentally friendly, which is very important to me, and the performance has been outstanding. Hot water is always available when I need it, and the unit itself is sleek and unobtrusive.", 225 | authorName: "Lori D.", 226 | date: "2023-11-15", 227 | stars: 5, 228 | }, 229 | { 230 | review: 231 | "The EcoSmart ECO 11 tankless water heater is incredible. Installation was easier than anticipated, and the impact on our energy bill was noticeable right away. The consistent hot water supply is exactly what our large family needed. Highly recommend this to anyone looking to make the switch to tankless.", 232 | authorName: "Tom G.", 233 | date: "2024-02-05", 234 | stars: 5, 235 | }, 236 | ], 237 | }, 238 | }; 239 | -------------------------------------------------------------------------------- /lib/types.ts: -------------------------------------------------------------------------------- 1 | export interface Review { 2 | review: string; 3 | authorName: string; 4 | date: string; 5 | stars: number; 6 | } 7 | 8 | export interface Product { 9 | name: string; 10 | reviews: Review[]; 11 | } 12 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "review-summary", 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 | "@radix-ui/react-avatar": "^1.0.4", 13 | "@radix-ui/react-icons": "^1.3.0", 14 | "@radix-ui/react-separator": "^1.0.3", 15 | "@types/ms": "^0.7.34", 16 | "ai": "^2.2.35", 17 | "class-variance-authority": "^0.7.0", 18 | "clsx": "^2.1.0", 19 | "lucide-react": "^0.331.0", 20 | "ms": "^2.1.3", 21 | "next": "14.1.0", 22 | "openai": "^4.28.0", 23 | "react": "^18", 24 | "react-dom": "^18", 25 | "tailwind-merge": "^2.2.1", 26 | "tailwindcss-animate": "^1.0.7" 27 | }, 28 | "devDependencies": { 29 | "@types/node": "^20", 30 | "@types/react": "^18", 31 | "@types/react-dom": "^18", 32 | "autoprefixer": "^10.0.1", 33 | "postcss": "^8", 34 | "tailwindcss": "^3.3.0", 35 | "typescript": "^5" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@radix-ui/react-avatar': 9 | specifier: ^1.0.4 10 | version: 1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) 11 | '@radix-ui/react-icons': 12 | specifier: ^1.3.0 13 | version: 1.3.0(react@18.2.0) 14 | '@radix-ui/react-separator': 15 | specifier: ^1.0.3 16 | version: 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) 17 | '@types/ms': 18 | specifier: ^0.7.34 19 | version: 0.7.34 20 | ai: 21 | specifier: ^2.2.35 22 | version: 2.2.35(react@18.2.0)(solid-js@1.8.15)(svelte@4.2.11)(vue@3.4.19) 23 | class-variance-authority: 24 | specifier: ^0.7.0 25 | version: 0.7.0 26 | clsx: 27 | specifier: ^2.1.0 28 | version: 2.1.0 29 | lucide-react: 30 | specifier: ^0.331.0 31 | version: 0.331.0(react@18.2.0) 32 | ms: 33 | specifier: ^2.1.3 34 | version: 2.1.3 35 | next: 36 | specifier: 14.1.0 37 | version: 14.1.0(react-dom@18.2.0)(react@18.2.0) 38 | openai: 39 | specifier: ^4.28.0 40 | version: 4.28.0 41 | react: 42 | specifier: ^18 43 | version: 18.2.0 44 | react-dom: 45 | specifier: ^18 46 | version: 18.2.0(react@18.2.0) 47 | tailwind-merge: 48 | specifier: ^2.2.1 49 | version: 2.2.1 50 | tailwindcss-animate: 51 | specifier: ^1.0.7 52 | version: 1.0.7(tailwindcss@3.4.1) 53 | 54 | devDependencies: 55 | '@types/node': 56 | specifier: ^20 57 | version: 20.11.19 58 | '@types/react': 59 | specifier: ^18 60 | version: 18.2.55 61 | '@types/react-dom': 62 | specifier: ^18 63 | version: 18.2.19 64 | autoprefixer: 65 | specifier: ^10.0.1 66 | version: 10.4.17(postcss@8.4.35) 67 | postcss: 68 | specifier: ^8 69 | version: 8.4.35 70 | tailwindcss: 71 | specifier: ^3.3.0 72 | version: 3.4.1 73 | typescript: 74 | specifier: ^5 75 | version: 5.3.3 76 | 77 | packages: 78 | 79 | /@alloc/quick-lru@5.2.0: 80 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 81 | engines: {node: '>=10'} 82 | 83 | /@ampproject/remapping@2.2.1: 84 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 85 | engines: {node: '>=6.0.0'} 86 | dependencies: 87 | '@jridgewell/gen-mapping': 0.3.3 88 | '@jridgewell/trace-mapping': 0.3.22 89 | dev: false 90 | 91 | /@babel/helper-string-parser@7.23.4: 92 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 93 | engines: {node: '>=6.9.0'} 94 | dev: false 95 | 96 | /@babel/helper-validator-identifier@7.22.20: 97 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 98 | engines: {node: '>=6.9.0'} 99 | dev: false 100 | 101 | /@babel/parser@7.23.9: 102 | resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} 103 | engines: {node: '>=6.0.0'} 104 | hasBin: true 105 | dependencies: 106 | '@babel/types': 7.23.9 107 | dev: false 108 | 109 | /@babel/runtime@7.23.9: 110 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 111 | engines: {node: '>=6.9.0'} 112 | dependencies: 113 | regenerator-runtime: 0.14.1 114 | dev: false 115 | 116 | /@babel/types@7.23.9: 117 | resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} 118 | engines: {node: '>=6.9.0'} 119 | dependencies: 120 | '@babel/helper-string-parser': 7.23.4 121 | '@babel/helper-validator-identifier': 7.22.20 122 | to-fast-properties: 2.0.0 123 | dev: false 124 | 125 | /@isaacs/cliui@8.0.2: 126 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 127 | engines: {node: '>=12'} 128 | dependencies: 129 | string-width: 5.1.2 130 | string-width-cjs: /string-width@4.2.3 131 | strip-ansi: 7.1.0 132 | strip-ansi-cjs: /strip-ansi@6.0.1 133 | wrap-ansi: 8.1.0 134 | wrap-ansi-cjs: /wrap-ansi@7.0.0 135 | 136 | /@jridgewell/gen-mapping@0.3.3: 137 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 138 | engines: {node: '>=6.0.0'} 139 | dependencies: 140 | '@jridgewell/set-array': 1.1.2 141 | '@jridgewell/sourcemap-codec': 1.4.15 142 | '@jridgewell/trace-mapping': 0.3.22 143 | 144 | /@jridgewell/resolve-uri@3.1.2: 145 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 146 | engines: {node: '>=6.0.0'} 147 | 148 | /@jridgewell/set-array@1.1.2: 149 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 150 | engines: {node: '>=6.0.0'} 151 | 152 | /@jridgewell/sourcemap-codec@1.4.15: 153 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 154 | 155 | /@jridgewell/trace-mapping@0.3.22: 156 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 157 | dependencies: 158 | '@jridgewell/resolve-uri': 3.1.2 159 | '@jridgewell/sourcemap-codec': 1.4.15 160 | 161 | /@next/env@14.1.0: 162 | resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} 163 | dev: false 164 | 165 | /@next/swc-darwin-arm64@14.1.0: 166 | resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} 167 | engines: {node: '>= 10'} 168 | cpu: [arm64] 169 | os: [darwin] 170 | requiresBuild: true 171 | dev: false 172 | optional: true 173 | 174 | /@next/swc-darwin-x64@14.1.0: 175 | resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} 176 | engines: {node: '>= 10'} 177 | cpu: [x64] 178 | os: [darwin] 179 | requiresBuild: true 180 | dev: false 181 | optional: true 182 | 183 | /@next/swc-linux-arm64-gnu@14.1.0: 184 | resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} 185 | engines: {node: '>= 10'} 186 | cpu: [arm64] 187 | os: [linux] 188 | requiresBuild: true 189 | dev: false 190 | optional: true 191 | 192 | /@next/swc-linux-arm64-musl@14.1.0: 193 | resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} 194 | engines: {node: '>= 10'} 195 | cpu: [arm64] 196 | os: [linux] 197 | requiresBuild: true 198 | dev: false 199 | optional: true 200 | 201 | /@next/swc-linux-x64-gnu@14.1.0: 202 | resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} 203 | engines: {node: '>= 10'} 204 | cpu: [x64] 205 | os: [linux] 206 | requiresBuild: true 207 | dev: false 208 | optional: true 209 | 210 | /@next/swc-linux-x64-musl@14.1.0: 211 | resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} 212 | engines: {node: '>= 10'} 213 | cpu: [x64] 214 | os: [linux] 215 | requiresBuild: true 216 | dev: false 217 | optional: true 218 | 219 | /@next/swc-win32-arm64-msvc@14.1.0: 220 | resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} 221 | engines: {node: '>= 10'} 222 | cpu: [arm64] 223 | os: [win32] 224 | requiresBuild: true 225 | dev: false 226 | optional: true 227 | 228 | /@next/swc-win32-ia32-msvc@14.1.0: 229 | resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} 230 | engines: {node: '>= 10'} 231 | cpu: [ia32] 232 | os: [win32] 233 | requiresBuild: true 234 | dev: false 235 | optional: true 236 | 237 | /@next/swc-win32-x64-msvc@14.1.0: 238 | resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} 239 | engines: {node: '>= 10'} 240 | cpu: [x64] 241 | os: [win32] 242 | requiresBuild: true 243 | dev: false 244 | optional: true 245 | 246 | /@nodelib/fs.scandir@2.1.5: 247 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 248 | engines: {node: '>= 8'} 249 | dependencies: 250 | '@nodelib/fs.stat': 2.0.5 251 | run-parallel: 1.2.0 252 | 253 | /@nodelib/fs.stat@2.0.5: 254 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 255 | engines: {node: '>= 8'} 256 | 257 | /@nodelib/fs.walk@1.2.8: 258 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 259 | engines: {node: '>= 8'} 260 | dependencies: 261 | '@nodelib/fs.scandir': 2.1.5 262 | fastq: 1.17.1 263 | 264 | /@pkgjs/parseargs@0.11.0: 265 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 266 | engines: {node: '>=14'} 267 | requiresBuild: true 268 | optional: true 269 | 270 | /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): 271 | resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} 272 | peerDependencies: 273 | '@types/react': '*' 274 | '@types/react-dom': '*' 275 | react: ^16.8 || ^17.0 || ^18.0 276 | react-dom: ^16.8 || ^17.0 || ^18.0 277 | peerDependenciesMeta: 278 | '@types/react': 279 | optional: true 280 | '@types/react-dom': 281 | optional: true 282 | dependencies: 283 | '@babel/runtime': 7.23.9 284 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.55)(react@18.2.0) 285 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) 286 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.55)(react@18.2.0) 287 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.55)(react@18.2.0) 288 | '@types/react': 18.2.55 289 | '@types/react-dom': 18.2.19 290 | react: 18.2.0 291 | react-dom: 18.2.0(react@18.2.0) 292 | dev: false 293 | 294 | /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.55)(react@18.2.0): 295 | resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 296 | peerDependencies: 297 | '@types/react': '*' 298 | react: ^16.8 || ^17.0 || ^18.0 299 | peerDependenciesMeta: 300 | '@types/react': 301 | optional: true 302 | dependencies: 303 | '@babel/runtime': 7.23.9 304 | '@types/react': 18.2.55 305 | react: 18.2.0 306 | dev: false 307 | 308 | /@radix-ui/react-context@1.0.1(@types/react@18.2.55)(react@18.2.0): 309 | resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 310 | peerDependencies: 311 | '@types/react': '*' 312 | react: ^16.8 || ^17.0 || ^18.0 313 | peerDependenciesMeta: 314 | '@types/react': 315 | optional: true 316 | dependencies: 317 | '@babel/runtime': 7.23.9 318 | '@types/react': 18.2.55 319 | react: 18.2.0 320 | dev: false 321 | 322 | /@radix-ui/react-icons@1.3.0(react@18.2.0): 323 | resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} 324 | peerDependencies: 325 | react: ^16.x || ^17.x || ^18.x 326 | dependencies: 327 | react: 18.2.0 328 | dev: false 329 | 330 | /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): 331 | resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 332 | peerDependencies: 333 | '@types/react': '*' 334 | '@types/react-dom': '*' 335 | react: ^16.8 || ^17.0 || ^18.0 336 | react-dom: ^16.8 || ^17.0 || ^18.0 337 | peerDependenciesMeta: 338 | '@types/react': 339 | optional: true 340 | '@types/react-dom': 341 | optional: true 342 | dependencies: 343 | '@babel/runtime': 7.23.9 344 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.55)(react@18.2.0) 345 | '@types/react': 18.2.55 346 | '@types/react-dom': 18.2.19 347 | react: 18.2.0 348 | react-dom: 18.2.0(react@18.2.0) 349 | dev: false 350 | 351 | /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0): 352 | resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} 353 | peerDependencies: 354 | '@types/react': '*' 355 | '@types/react-dom': '*' 356 | react: ^16.8 || ^17.0 || ^18.0 357 | react-dom: ^16.8 || ^17.0 || ^18.0 358 | peerDependenciesMeta: 359 | '@types/react': 360 | optional: true 361 | '@types/react-dom': 362 | optional: true 363 | dependencies: 364 | '@babel/runtime': 7.23.9 365 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.19)(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0) 366 | '@types/react': 18.2.55 367 | '@types/react-dom': 18.2.19 368 | react: 18.2.0 369 | react-dom: 18.2.0(react@18.2.0) 370 | dev: false 371 | 372 | /@radix-ui/react-slot@1.0.2(@types/react@18.2.55)(react@18.2.0): 373 | resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 374 | peerDependencies: 375 | '@types/react': '*' 376 | react: ^16.8 || ^17.0 || ^18.0 377 | peerDependenciesMeta: 378 | '@types/react': 379 | optional: true 380 | dependencies: 381 | '@babel/runtime': 7.23.9 382 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0) 383 | '@types/react': 18.2.55 384 | react: 18.2.0 385 | dev: false 386 | 387 | /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.55)(react@18.2.0): 388 | resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 389 | peerDependencies: 390 | '@types/react': '*' 391 | react: ^16.8 || ^17.0 || ^18.0 392 | peerDependenciesMeta: 393 | '@types/react': 394 | optional: true 395 | dependencies: 396 | '@babel/runtime': 7.23.9 397 | '@types/react': 18.2.55 398 | react: 18.2.0 399 | dev: false 400 | 401 | /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.55)(react@18.2.0): 402 | resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 403 | peerDependencies: 404 | '@types/react': '*' 405 | react: ^16.8 || ^17.0 || ^18.0 406 | peerDependenciesMeta: 407 | '@types/react': 408 | optional: true 409 | dependencies: 410 | '@babel/runtime': 7.23.9 411 | '@types/react': 18.2.55 412 | react: 18.2.0 413 | dev: false 414 | 415 | /@swc/helpers@0.5.2: 416 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 417 | dependencies: 418 | tslib: 2.6.2 419 | dev: false 420 | 421 | /@types/estree@1.0.5: 422 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 423 | dev: false 424 | 425 | /@types/ms@0.7.34: 426 | resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} 427 | dev: false 428 | 429 | /@types/node-fetch@2.6.11: 430 | resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} 431 | dependencies: 432 | '@types/node': 20.11.19 433 | form-data: 4.0.0 434 | dev: false 435 | 436 | /@types/node@18.19.17: 437 | resolution: {integrity: sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==} 438 | dependencies: 439 | undici-types: 5.26.5 440 | dev: false 441 | 442 | /@types/node@20.11.19: 443 | resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} 444 | dependencies: 445 | undici-types: 5.26.5 446 | 447 | /@types/prop-types@15.7.11: 448 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 449 | 450 | /@types/react-dom@18.2.19: 451 | resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} 452 | dependencies: 453 | '@types/react': 18.2.55 454 | 455 | /@types/react@18.2.55: 456 | resolution: {integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==} 457 | dependencies: 458 | '@types/prop-types': 15.7.11 459 | '@types/scheduler': 0.16.8 460 | csstype: 3.1.3 461 | 462 | /@types/scheduler@0.16.8: 463 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 464 | 465 | /@vue/compiler-core@3.4.19: 466 | resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} 467 | dependencies: 468 | '@babel/parser': 7.23.9 469 | '@vue/shared': 3.4.19 470 | entities: 4.5.0 471 | estree-walker: 2.0.2 472 | source-map-js: 1.0.2 473 | dev: false 474 | 475 | /@vue/compiler-dom@3.4.19: 476 | resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==} 477 | dependencies: 478 | '@vue/compiler-core': 3.4.19 479 | '@vue/shared': 3.4.19 480 | dev: false 481 | 482 | /@vue/compiler-sfc@3.4.19: 483 | resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==} 484 | dependencies: 485 | '@babel/parser': 7.23.9 486 | '@vue/compiler-core': 3.4.19 487 | '@vue/compiler-dom': 3.4.19 488 | '@vue/compiler-ssr': 3.4.19 489 | '@vue/shared': 3.4.19 490 | estree-walker: 2.0.2 491 | magic-string: 0.30.7 492 | postcss: 8.4.35 493 | source-map-js: 1.0.2 494 | dev: false 495 | 496 | /@vue/compiler-ssr@3.4.19: 497 | resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==} 498 | dependencies: 499 | '@vue/compiler-dom': 3.4.19 500 | '@vue/shared': 3.4.19 501 | dev: false 502 | 503 | /@vue/reactivity@3.4.19: 504 | resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==} 505 | dependencies: 506 | '@vue/shared': 3.4.19 507 | dev: false 508 | 509 | /@vue/runtime-core@3.4.19: 510 | resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==} 511 | dependencies: 512 | '@vue/reactivity': 3.4.19 513 | '@vue/shared': 3.4.19 514 | dev: false 515 | 516 | /@vue/runtime-dom@3.4.19: 517 | resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==} 518 | dependencies: 519 | '@vue/runtime-core': 3.4.19 520 | '@vue/shared': 3.4.19 521 | csstype: 3.1.3 522 | dev: false 523 | 524 | /@vue/server-renderer@3.4.19(vue@3.4.19): 525 | resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==} 526 | peerDependencies: 527 | vue: 3.4.19 528 | dependencies: 529 | '@vue/compiler-ssr': 3.4.19 530 | '@vue/shared': 3.4.19 531 | vue: 3.4.19(typescript@5.3.3) 532 | dev: false 533 | 534 | /@vue/shared@3.4.19: 535 | resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==} 536 | dev: false 537 | 538 | /abort-controller@3.0.0: 539 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 540 | engines: {node: '>=6.5'} 541 | dependencies: 542 | event-target-shim: 5.0.1 543 | dev: false 544 | 545 | /acorn@8.11.3: 546 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 547 | engines: {node: '>=0.4.0'} 548 | hasBin: true 549 | dev: false 550 | 551 | /agentkeepalive@4.5.0: 552 | resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} 553 | engines: {node: '>= 8.0.0'} 554 | dependencies: 555 | humanize-ms: 1.2.1 556 | dev: false 557 | 558 | /ai@2.2.35(react@18.2.0)(solid-js@1.8.15)(svelte@4.2.11)(vue@3.4.19): 559 | resolution: {integrity: sha512-YzR56VAMjqvGIVzMUFwH7jjo7K+Z3Old4nXcigiWsuqXnWQeQi3iPR8p2/xOZzmuZyMTOC+6jjbIJ8hoEOhfcQ==} 560 | engines: {node: '>=14.6'} 561 | peerDependencies: 562 | react: ^18.2.0 563 | solid-js: ^1.7.7 564 | svelte: ^3.0.0 || ^4.0.0 565 | vue: ^3.3.4 566 | peerDependenciesMeta: 567 | react: 568 | optional: true 569 | solid-js: 570 | optional: true 571 | svelte: 572 | optional: true 573 | vue: 574 | optional: true 575 | dependencies: 576 | eventsource-parser: 1.0.0 577 | nanoid: 3.3.6 578 | react: 18.2.0 579 | solid-js: 1.8.15 580 | solid-swr-store: 0.10.7(solid-js@1.8.15)(swr-store@0.10.6) 581 | sswr: 2.0.0(svelte@4.2.11) 582 | svelte: 4.2.11 583 | swr: 2.2.0(react@18.2.0) 584 | swr-store: 0.10.6 585 | swrv: 1.0.4(vue@3.4.19) 586 | vue: 3.4.19(typescript@5.3.3) 587 | dev: false 588 | 589 | /ansi-regex@5.0.1: 590 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 591 | engines: {node: '>=8'} 592 | 593 | /ansi-regex@6.0.1: 594 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 595 | engines: {node: '>=12'} 596 | 597 | /ansi-styles@4.3.0: 598 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 599 | engines: {node: '>=8'} 600 | dependencies: 601 | color-convert: 2.0.1 602 | 603 | /ansi-styles@6.2.1: 604 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 605 | engines: {node: '>=12'} 606 | 607 | /any-promise@1.3.0: 608 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 609 | 610 | /anymatch@3.1.3: 611 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 612 | engines: {node: '>= 8'} 613 | dependencies: 614 | normalize-path: 3.0.0 615 | picomatch: 2.3.1 616 | 617 | /arg@5.0.2: 618 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 619 | 620 | /aria-query@5.3.0: 621 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 622 | dependencies: 623 | dequal: 2.0.3 624 | dev: false 625 | 626 | /asynckit@0.4.0: 627 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 628 | dev: false 629 | 630 | /autoprefixer@10.4.17(postcss@8.4.35): 631 | resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} 632 | engines: {node: ^10 || ^12 || >=14} 633 | hasBin: true 634 | peerDependencies: 635 | postcss: ^8.1.0 636 | dependencies: 637 | browserslist: 4.23.0 638 | caniuse-lite: 1.0.30001587 639 | fraction.js: 4.3.7 640 | normalize-range: 0.1.2 641 | picocolors: 1.0.0 642 | postcss: 8.4.35 643 | postcss-value-parser: 4.2.0 644 | dev: true 645 | 646 | /axobject-query@4.0.0: 647 | resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} 648 | dependencies: 649 | dequal: 2.0.3 650 | dev: false 651 | 652 | /balanced-match@1.0.2: 653 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 654 | 655 | /base-64@0.1.0: 656 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 657 | dev: false 658 | 659 | /binary-extensions@2.2.0: 660 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 661 | engines: {node: '>=8'} 662 | 663 | /brace-expansion@2.0.1: 664 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 665 | dependencies: 666 | balanced-match: 1.0.2 667 | 668 | /braces@3.0.2: 669 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 670 | engines: {node: '>=8'} 671 | dependencies: 672 | fill-range: 7.0.1 673 | 674 | /browserslist@4.23.0: 675 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 676 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 677 | hasBin: true 678 | dependencies: 679 | caniuse-lite: 1.0.30001587 680 | electron-to-chromium: 1.4.672 681 | node-releases: 2.0.14 682 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 683 | dev: true 684 | 685 | /busboy@1.6.0: 686 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 687 | engines: {node: '>=10.16.0'} 688 | dependencies: 689 | streamsearch: 1.1.0 690 | dev: false 691 | 692 | /camelcase-css@2.0.1: 693 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 694 | engines: {node: '>= 6'} 695 | 696 | /caniuse-lite@1.0.30001587: 697 | resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} 698 | 699 | /charenc@0.0.2: 700 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 701 | dev: false 702 | 703 | /chokidar@3.6.0: 704 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 705 | engines: {node: '>= 8.10.0'} 706 | dependencies: 707 | anymatch: 3.1.3 708 | braces: 3.0.2 709 | glob-parent: 5.1.2 710 | is-binary-path: 2.1.0 711 | is-glob: 4.0.3 712 | normalize-path: 3.0.0 713 | readdirp: 3.6.0 714 | optionalDependencies: 715 | fsevents: 2.3.3 716 | 717 | /class-variance-authority@0.7.0: 718 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 719 | dependencies: 720 | clsx: 2.0.0 721 | dev: false 722 | 723 | /client-only@0.0.1: 724 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 725 | dev: false 726 | 727 | /clsx@2.0.0: 728 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 729 | engines: {node: '>=6'} 730 | dev: false 731 | 732 | /clsx@2.1.0: 733 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 734 | engines: {node: '>=6'} 735 | dev: false 736 | 737 | /code-red@1.0.4: 738 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 739 | dependencies: 740 | '@jridgewell/sourcemap-codec': 1.4.15 741 | '@types/estree': 1.0.5 742 | acorn: 8.11.3 743 | estree-walker: 3.0.3 744 | periscopic: 3.1.0 745 | dev: false 746 | 747 | /color-convert@2.0.1: 748 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 749 | engines: {node: '>=7.0.0'} 750 | dependencies: 751 | color-name: 1.1.4 752 | 753 | /color-name@1.1.4: 754 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 755 | 756 | /combined-stream@1.0.8: 757 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 758 | engines: {node: '>= 0.8'} 759 | dependencies: 760 | delayed-stream: 1.0.0 761 | dev: false 762 | 763 | /commander@4.1.1: 764 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 765 | engines: {node: '>= 6'} 766 | 767 | /cross-spawn@7.0.3: 768 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 769 | engines: {node: '>= 8'} 770 | dependencies: 771 | path-key: 3.1.1 772 | shebang-command: 2.0.0 773 | which: 2.0.2 774 | 775 | /crypt@0.0.2: 776 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 777 | dev: false 778 | 779 | /css-tree@2.3.1: 780 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 781 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 782 | dependencies: 783 | mdn-data: 2.0.30 784 | source-map-js: 1.0.2 785 | dev: false 786 | 787 | /cssesc@3.0.0: 788 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 789 | engines: {node: '>=4'} 790 | hasBin: true 791 | 792 | /csstype@3.1.3: 793 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 794 | 795 | /delayed-stream@1.0.0: 796 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 797 | engines: {node: '>=0.4.0'} 798 | dev: false 799 | 800 | /dequal@2.0.3: 801 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 802 | engines: {node: '>=6'} 803 | dev: false 804 | 805 | /didyoumean@1.2.2: 806 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 807 | 808 | /digest-fetch@1.3.0: 809 | resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} 810 | dependencies: 811 | base-64: 0.1.0 812 | md5: 2.3.0 813 | dev: false 814 | 815 | /dlv@1.1.3: 816 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 817 | 818 | /eastasianwidth@0.2.0: 819 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 820 | 821 | /electron-to-chromium@1.4.672: 822 | resolution: {integrity: sha512-YYCy+goe3UqZqa3MOQCI5Mx/6HdBLzXL/mkbGCEWL3sP3Z1BP9zqAzeD3YEmLZlespYGFtyM8tRp5i2vfaUGCA==} 823 | dev: true 824 | 825 | /emoji-regex@8.0.0: 826 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 827 | 828 | /emoji-regex@9.2.2: 829 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 830 | 831 | /entities@4.5.0: 832 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 833 | engines: {node: '>=0.12'} 834 | dev: false 835 | 836 | /escalade@3.1.2: 837 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 838 | engines: {node: '>=6'} 839 | dev: true 840 | 841 | /estree-walker@2.0.2: 842 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 843 | dev: false 844 | 845 | /estree-walker@3.0.3: 846 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 847 | dependencies: 848 | '@types/estree': 1.0.5 849 | dev: false 850 | 851 | /event-target-shim@5.0.1: 852 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 853 | engines: {node: '>=6'} 854 | dev: false 855 | 856 | /eventsource-parser@1.0.0: 857 | resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==} 858 | engines: {node: '>=14.18'} 859 | dev: false 860 | 861 | /fast-glob@3.3.2: 862 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 863 | engines: {node: '>=8.6.0'} 864 | dependencies: 865 | '@nodelib/fs.stat': 2.0.5 866 | '@nodelib/fs.walk': 1.2.8 867 | glob-parent: 5.1.2 868 | merge2: 1.4.1 869 | micromatch: 4.0.5 870 | 871 | /fastq@1.17.1: 872 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 873 | dependencies: 874 | reusify: 1.0.4 875 | 876 | /fill-range@7.0.1: 877 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 878 | engines: {node: '>=8'} 879 | dependencies: 880 | to-regex-range: 5.0.1 881 | 882 | /foreground-child@3.1.1: 883 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 884 | engines: {node: '>=14'} 885 | dependencies: 886 | cross-spawn: 7.0.3 887 | signal-exit: 4.1.0 888 | 889 | /form-data-encoder@1.7.2: 890 | resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} 891 | dev: false 892 | 893 | /form-data@4.0.0: 894 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 895 | engines: {node: '>= 6'} 896 | dependencies: 897 | asynckit: 0.4.0 898 | combined-stream: 1.0.8 899 | mime-types: 2.1.35 900 | dev: false 901 | 902 | /formdata-node@4.4.1: 903 | resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} 904 | engines: {node: '>= 12.20'} 905 | dependencies: 906 | node-domexception: 1.0.0 907 | web-streams-polyfill: 4.0.0-beta.3 908 | dev: false 909 | 910 | /fraction.js@4.3.7: 911 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 912 | dev: true 913 | 914 | /fsevents@2.3.3: 915 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 916 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 917 | os: [darwin] 918 | requiresBuild: true 919 | optional: true 920 | 921 | /function-bind@1.1.2: 922 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 923 | 924 | /glob-parent@5.1.2: 925 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 926 | engines: {node: '>= 6'} 927 | dependencies: 928 | is-glob: 4.0.3 929 | 930 | /glob-parent@6.0.2: 931 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 932 | engines: {node: '>=10.13.0'} 933 | dependencies: 934 | is-glob: 4.0.3 935 | 936 | /glob@10.3.10: 937 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 938 | engines: {node: '>=16 || 14 >=14.17'} 939 | hasBin: true 940 | dependencies: 941 | foreground-child: 3.1.1 942 | jackspeak: 2.3.6 943 | minimatch: 9.0.3 944 | minipass: 7.0.4 945 | path-scurry: 1.10.1 946 | 947 | /graceful-fs@4.2.11: 948 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 949 | dev: false 950 | 951 | /hasown@2.0.1: 952 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} 953 | engines: {node: '>= 0.4'} 954 | dependencies: 955 | function-bind: 1.1.2 956 | 957 | /humanize-ms@1.2.1: 958 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 959 | dependencies: 960 | ms: 2.1.3 961 | dev: false 962 | 963 | /is-binary-path@2.1.0: 964 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 965 | engines: {node: '>=8'} 966 | dependencies: 967 | binary-extensions: 2.2.0 968 | 969 | /is-buffer@1.1.6: 970 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 971 | dev: false 972 | 973 | /is-core-module@2.13.1: 974 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 975 | dependencies: 976 | hasown: 2.0.1 977 | 978 | /is-extglob@2.1.1: 979 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 980 | engines: {node: '>=0.10.0'} 981 | 982 | /is-fullwidth-code-point@3.0.0: 983 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 984 | engines: {node: '>=8'} 985 | 986 | /is-glob@4.0.3: 987 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 988 | engines: {node: '>=0.10.0'} 989 | dependencies: 990 | is-extglob: 2.1.1 991 | 992 | /is-number@7.0.0: 993 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 994 | engines: {node: '>=0.12.0'} 995 | 996 | /is-reference@3.0.2: 997 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 998 | dependencies: 999 | '@types/estree': 1.0.5 1000 | dev: false 1001 | 1002 | /isexe@2.0.0: 1003 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1004 | 1005 | /jackspeak@2.3.6: 1006 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1007 | engines: {node: '>=14'} 1008 | dependencies: 1009 | '@isaacs/cliui': 8.0.2 1010 | optionalDependencies: 1011 | '@pkgjs/parseargs': 0.11.0 1012 | 1013 | /jiti@1.21.0: 1014 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1015 | hasBin: true 1016 | 1017 | /js-tokens@4.0.0: 1018 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1019 | dev: false 1020 | 1021 | /lilconfig@2.1.0: 1022 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1023 | engines: {node: '>=10'} 1024 | 1025 | /lilconfig@3.1.0: 1026 | resolution: {integrity: sha512-p3cz0JV5vw/XeouBU3Ldnp+ZkBjE+n8ydJ4mcwBrOiXXPqNlrzGBqWs9X4MWF7f+iKUBu794Y8Hh8yawiJbCjw==} 1027 | engines: {node: '>=14'} 1028 | 1029 | /lines-and-columns@1.2.4: 1030 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1031 | 1032 | /locate-character@3.0.0: 1033 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1034 | dev: false 1035 | 1036 | /loose-envify@1.4.0: 1037 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1038 | hasBin: true 1039 | dependencies: 1040 | js-tokens: 4.0.0 1041 | dev: false 1042 | 1043 | /lru-cache@10.2.0: 1044 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1045 | engines: {node: 14 || >=16.14} 1046 | 1047 | /lucide-react@0.331.0(react@18.2.0): 1048 | resolution: {integrity: sha512-CHFJ0ve9vaZ7bB2VRAl27SlX1ELh6pfNC0jS96qGpPEEzLkLDGq4pDBFU8RhOoRMqsjXqTzLm9U6bZ1OcIHq7Q==} 1049 | peerDependencies: 1050 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 1051 | dependencies: 1052 | react: 18.2.0 1053 | dev: false 1054 | 1055 | /magic-string@0.30.7: 1056 | resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} 1057 | engines: {node: '>=12'} 1058 | dependencies: 1059 | '@jridgewell/sourcemap-codec': 1.4.15 1060 | dev: false 1061 | 1062 | /md5@2.3.0: 1063 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1064 | dependencies: 1065 | charenc: 0.0.2 1066 | crypt: 0.0.2 1067 | is-buffer: 1.1.6 1068 | dev: false 1069 | 1070 | /mdn-data@2.0.30: 1071 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 1072 | dev: false 1073 | 1074 | /merge2@1.4.1: 1075 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1076 | engines: {node: '>= 8'} 1077 | 1078 | /micromatch@4.0.5: 1079 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1080 | engines: {node: '>=8.6'} 1081 | dependencies: 1082 | braces: 3.0.2 1083 | picomatch: 2.3.1 1084 | 1085 | /mime-db@1.52.0: 1086 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1087 | engines: {node: '>= 0.6'} 1088 | dev: false 1089 | 1090 | /mime-types@2.1.35: 1091 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1092 | engines: {node: '>= 0.6'} 1093 | dependencies: 1094 | mime-db: 1.52.0 1095 | dev: false 1096 | 1097 | /minimatch@9.0.3: 1098 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1099 | engines: {node: '>=16 || 14 >=14.17'} 1100 | dependencies: 1101 | brace-expansion: 2.0.1 1102 | 1103 | /minipass@7.0.4: 1104 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1105 | engines: {node: '>=16 || 14 >=14.17'} 1106 | 1107 | /ms@2.1.3: 1108 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1109 | dev: false 1110 | 1111 | /mz@2.7.0: 1112 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1113 | dependencies: 1114 | any-promise: 1.3.0 1115 | object-assign: 4.1.1 1116 | thenify-all: 1.6.0 1117 | 1118 | /nanoid@3.3.6: 1119 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1120 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1121 | hasBin: true 1122 | dev: false 1123 | 1124 | /nanoid@3.3.7: 1125 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1126 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1127 | hasBin: true 1128 | 1129 | /next@14.1.0(react-dom@18.2.0)(react@18.2.0): 1130 | resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} 1131 | engines: {node: '>=18.17.0'} 1132 | hasBin: true 1133 | peerDependencies: 1134 | '@opentelemetry/api': ^1.1.0 1135 | react: ^18.2.0 1136 | react-dom: ^18.2.0 1137 | sass: ^1.3.0 1138 | peerDependenciesMeta: 1139 | '@opentelemetry/api': 1140 | optional: true 1141 | sass: 1142 | optional: true 1143 | dependencies: 1144 | '@next/env': 14.1.0 1145 | '@swc/helpers': 0.5.2 1146 | busboy: 1.6.0 1147 | caniuse-lite: 1.0.30001587 1148 | graceful-fs: 4.2.11 1149 | postcss: 8.4.31 1150 | react: 18.2.0 1151 | react-dom: 18.2.0(react@18.2.0) 1152 | styled-jsx: 5.1.1(react@18.2.0) 1153 | optionalDependencies: 1154 | '@next/swc-darwin-arm64': 14.1.0 1155 | '@next/swc-darwin-x64': 14.1.0 1156 | '@next/swc-linux-arm64-gnu': 14.1.0 1157 | '@next/swc-linux-arm64-musl': 14.1.0 1158 | '@next/swc-linux-x64-gnu': 14.1.0 1159 | '@next/swc-linux-x64-musl': 14.1.0 1160 | '@next/swc-win32-arm64-msvc': 14.1.0 1161 | '@next/swc-win32-ia32-msvc': 14.1.0 1162 | '@next/swc-win32-x64-msvc': 14.1.0 1163 | transitivePeerDependencies: 1164 | - '@babel/core' 1165 | - babel-plugin-macros 1166 | dev: false 1167 | 1168 | /node-domexception@1.0.0: 1169 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1170 | engines: {node: '>=10.5.0'} 1171 | dev: false 1172 | 1173 | /node-fetch@2.7.0: 1174 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1175 | engines: {node: 4.x || >=6.0.0} 1176 | peerDependencies: 1177 | encoding: ^0.1.0 1178 | peerDependenciesMeta: 1179 | encoding: 1180 | optional: true 1181 | dependencies: 1182 | whatwg-url: 5.0.0 1183 | dev: false 1184 | 1185 | /node-releases@2.0.14: 1186 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1187 | dev: true 1188 | 1189 | /normalize-path@3.0.0: 1190 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1191 | engines: {node: '>=0.10.0'} 1192 | 1193 | /normalize-range@0.1.2: 1194 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1195 | engines: {node: '>=0.10.0'} 1196 | dev: true 1197 | 1198 | /object-assign@4.1.1: 1199 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1200 | engines: {node: '>=0.10.0'} 1201 | 1202 | /object-hash@3.0.0: 1203 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1204 | engines: {node: '>= 6'} 1205 | 1206 | /openai@4.28.0: 1207 | resolution: {integrity: sha512-JM8fhcpmpGN0vrUwGquYIzdcEQHtFuom6sRCbbCM6CfzZXNuRk33G7KfeRAIfnaCxSpzrP5iHtwJzIm6biUZ2Q==} 1208 | hasBin: true 1209 | dependencies: 1210 | '@types/node': 18.19.17 1211 | '@types/node-fetch': 2.6.11 1212 | abort-controller: 3.0.0 1213 | agentkeepalive: 4.5.0 1214 | digest-fetch: 1.3.0 1215 | form-data-encoder: 1.7.2 1216 | formdata-node: 4.4.1 1217 | node-fetch: 2.7.0 1218 | web-streams-polyfill: 3.3.2 1219 | transitivePeerDependencies: 1220 | - encoding 1221 | dev: false 1222 | 1223 | /path-key@3.1.1: 1224 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1225 | engines: {node: '>=8'} 1226 | 1227 | /path-parse@1.0.7: 1228 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1229 | 1230 | /path-scurry@1.10.1: 1231 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1232 | engines: {node: '>=16 || 14 >=14.17'} 1233 | dependencies: 1234 | lru-cache: 10.2.0 1235 | minipass: 7.0.4 1236 | 1237 | /periscopic@3.1.0: 1238 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 1239 | dependencies: 1240 | '@types/estree': 1.0.5 1241 | estree-walker: 3.0.3 1242 | is-reference: 3.0.2 1243 | dev: false 1244 | 1245 | /picocolors@1.0.0: 1246 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1247 | 1248 | /picomatch@2.3.1: 1249 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1250 | engines: {node: '>=8.6'} 1251 | 1252 | /pify@2.3.0: 1253 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1254 | engines: {node: '>=0.10.0'} 1255 | 1256 | /pirates@4.0.6: 1257 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1258 | engines: {node: '>= 6'} 1259 | 1260 | /postcss-import@15.1.0(postcss@8.4.35): 1261 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1262 | engines: {node: '>=14.0.0'} 1263 | peerDependencies: 1264 | postcss: ^8.0.0 1265 | dependencies: 1266 | postcss: 8.4.35 1267 | postcss-value-parser: 4.2.0 1268 | read-cache: 1.0.0 1269 | resolve: 1.22.8 1270 | 1271 | /postcss-js@4.0.1(postcss@8.4.35): 1272 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1273 | engines: {node: ^12 || ^14 || >= 16} 1274 | peerDependencies: 1275 | postcss: ^8.4.21 1276 | dependencies: 1277 | camelcase-css: 2.0.1 1278 | postcss: 8.4.35 1279 | 1280 | /postcss-load-config@4.0.2(postcss@8.4.35): 1281 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1282 | engines: {node: '>= 14'} 1283 | peerDependencies: 1284 | postcss: '>=8.0.9' 1285 | ts-node: '>=9.0.0' 1286 | peerDependenciesMeta: 1287 | postcss: 1288 | optional: true 1289 | ts-node: 1290 | optional: true 1291 | dependencies: 1292 | lilconfig: 3.1.0 1293 | postcss: 8.4.35 1294 | yaml: 2.3.4 1295 | 1296 | /postcss-nested@6.0.1(postcss@8.4.35): 1297 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1298 | engines: {node: '>=12.0'} 1299 | peerDependencies: 1300 | postcss: ^8.2.14 1301 | dependencies: 1302 | postcss: 8.4.35 1303 | postcss-selector-parser: 6.0.15 1304 | 1305 | /postcss-selector-parser@6.0.15: 1306 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1307 | engines: {node: '>=4'} 1308 | dependencies: 1309 | cssesc: 3.0.0 1310 | util-deprecate: 1.0.2 1311 | 1312 | /postcss-value-parser@4.2.0: 1313 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1314 | 1315 | /postcss@8.4.31: 1316 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1317 | engines: {node: ^10 || ^12 || >=14} 1318 | dependencies: 1319 | nanoid: 3.3.7 1320 | picocolors: 1.0.0 1321 | source-map-js: 1.0.2 1322 | dev: false 1323 | 1324 | /postcss@8.4.35: 1325 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 1326 | engines: {node: ^10 || ^12 || >=14} 1327 | dependencies: 1328 | nanoid: 3.3.7 1329 | picocolors: 1.0.0 1330 | source-map-js: 1.0.2 1331 | 1332 | /queue-microtask@1.2.3: 1333 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1334 | 1335 | /react-dom@18.2.0(react@18.2.0): 1336 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1337 | peerDependencies: 1338 | react: ^18.2.0 1339 | dependencies: 1340 | loose-envify: 1.4.0 1341 | react: 18.2.0 1342 | scheduler: 0.23.0 1343 | dev: false 1344 | 1345 | /react@18.2.0: 1346 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1347 | engines: {node: '>=0.10.0'} 1348 | dependencies: 1349 | loose-envify: 1.4.0 1350 | dev: false 1351 | 1352 | /read-cache@1.0.0: 1353 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1354 | dependencies: 1355 | pify: 2.3.0 1356 | 1357 | /readdirp@3.6.0: 1358 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1359 | engines: {node: '>=8.10.0'} 1360 | dependencies: 1361 | picomatch: 2.3.1 1362 | 1363 | /regenerator-runtime@0.14.1: 1364 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1365 | dev: false 1366 | 1367 | /resolve@1.22.8: 1368 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1369 | hasBin: true 1370 | dependencies: 1371 | is-core-module: 2.13.1 1372 | path-parse: 1.0.7 1373 | supports-preserve-symlinks-flag: 1.0.0 1374 | 1375 | /reusify@1.0.4: 1376 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1377 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1378 | 1379 | /run-parallel@1.2.0: 1380 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1381 | dependencies: 1382 | queue-microtask: 1.2.3 1383 | 1384 | /scheduler@0.23.0: 1385 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1386 | dependencies: 1387 | loose-envify: 1.4.0 1388 | dev: false 1389 | 1390 | /seroval-plugins@1.0.4(seroval@1.0.4): 1391 | resolution: {integrity: sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==} 1392 | engines: {node: '>=10'} 1393 | peerDependencies: 1394 | seroval: ^1.0 1395 | dependencies: 1396 | seroval: 1.0.4 1397 | dev: false 1398 | 1399 | /seroval@1.0.4: 1400 | resolution: {integrity: sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==} 1401 | engines: {node: '>=10'} 1402 | dev: false 1403 | 1404 | /shebang-command@2.0.0: 1405 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1406 | engines: {node: '>=8'} 1407 | dependencies: 1408 | shebang-regex: 3.0.0 1409 | 1410 | /shebang-regex@3.0.0: 1411 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1412 | engines: {node: '>=8'} 1413 | 1414 | /signal-exit@4.1.0: 1415 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1416 | engines: {node: '>=14'} 1417 | 1418 | /solid-js@1.8.15: 1419 | resolution: {integrity: sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==} 1420 | dependencies: 1421 | csstype: 3.1.3 1422 | seroval: 1.0.4 1423 | seroval-plugins: 1.0.4(seroval@1.0.4) 1424 | dev: false 1425 | 1426 | /solid-swr-store@0.10.7(solid-js@1.8.15)(swr-store@0.10.6): 1427 | resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==} 1428 | engines: {node: '>=10'} 1429 | peerDependencies: 1430 | solid-js: ^1.2 1431 | swr-store: ^0.10 1432 | dependencies: 1433 | solid-js: 1.8.15 1434 | swr-store: 0.10.6 1435 | dev: false 1436 | 1437 | /source-map-js@1.0.2: 1438 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1439 | engines: {node: '>=0.10.0'} 1440 | 1441 | /sswr@2.0.0(svelte@4.2.11): 1442 | resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} 1443 | peerDependencies: 1444 | svelte: ^4.0.0 1445 | dependencies: 1446 | svelte: 4.2.11 1447 | swrev: 4.0.0 1448 | dev: false 1449 | 1450 | /streamsearch@1.1.0: 1451 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1452 | engines: {node: '>=10.0.0'} 1453 | dev: false 1454 | 1455 | /string-width@4.2.3: 1456 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1457 | engines: {node: '>=8'} 1458 | dependencies: 1459 | emoji-regex: 8.0.0 1460 | is-fullwidth-code-point: 3.0.0 1461 | strip-ansi: 6.0.1 1462 | 1463 | /string-width@5.1.2: 1464 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1465 | engines: {node: '>=12'} 1466 | dependencies: 1467 | eastasianwidth: 0.2.0 1468 | emoji-regex: 9.2.2 1469 | strip-ansi: 7.1.0 1470 | 1471 | /strip-ansi@6.0.1: 1472 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1473 | engines: {node: '>=8'} 1474 | dependencies: 1475 | ansi-regex: 5.0.1 1476 | 1477 | /strip-ansi@7.1.0: 1478 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1479 | engines: {node: '>=12'} 1480 | dependencies: 1481 | ansi-regex: 6.0.1 1482 | 1483 | /styled-jsx@5.1.1(react@18.2.0): 1484 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 1485 | engines: {node: '>= 12.0.0'} 1486 | peerDependencies: 1487 | '@babel/core': '*' 1488 | babel-plugin-macros: '*' 1489 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 1490 | peerDependenciesMeta: 1491 | '@babel/core': 1492 | optional: true 1493 | babel-plugin-macros: 1494 | optional: true 1495 | dependencies: 1496 | client-only: 0.0.1 1497 | react: 18.2.0 1498 | dev: false 1499 | 1500 | /sucrase@3.35.0: 1501 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1502 | engines: {node: '>=16 || 14 >=14.17'} 1503 | hasBin: true 1504 | dependencies: 1505 | '@jridgewell/gen-mapping': 0.3.3 1506 | commander: 4.1.1 1507 | glob: 10.3.10 1508 | lines-and-columns: 1.2.4 1509 | mz: 2.7.0 1510 | pirates: 4.0.6 1511 | ts-interface-checker: 0.1.13 1512 | 1513 | /supports-preserve-symlinks-flag@1.0.0: 1514 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1515 | engines: {node: '>= 0.4'} 1516 | 1517 | /svelte@4.2.11: 1518 | resolution: {integrity: sha512-YIQk3J4X89wOLhjsqIW8tqY3JHPuBdtdOIkASP2PZeAMcSW9RsIjQzMesCrxOF3gdWYC0mKknlKF7OqmLM+Zqg==} 1519 | engines: {node: '>=16'} 1520 | dependencies: 1521 | '@ampproject/remapping': 2.2.1 1522 | '@jridgewell/sourcemap-codec': 1.4.15 1523 | '@jridgewell/trace-mapping': 0.3.22 1524 | '@types/estree': 1.0.5 1525 | acorn: 8.11.3 1526 | aria-query: 5.3.0 1527 | axobject-query: 4.0.0 1528 | code-red: 1.0.4 1529 | css-tree: 2.3.1 1530 | estree-walker: 3.0.3 1531 | is-reference: 3.0.2 1532 | locate-character: 3.0.0 1533 | magic-string: 0.30.7 1534 | periscopic: 3.1.0 1535 | dev: false 1536 | 1537 | /swr-store@0.10.6: 1538 | resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==} 1539 | engines: {node: '>=10'} 1540 | dependencies: 1541 | dequal: 2.0.3 1542 | dev: false 1543 | 1544 | /swr@2.2.0(react@18.2.0): 1545 | resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} 1546 | peerDependencies: 1547 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 1548 | dependencies: 1549 | react: 18.2.0 1550 | use-sync-external-store: 1.2.0(react@18.2.0) 1551 | dev: false 1552 | 1553 | /swrev@4.0.0: 1554 | resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} 1555 | dev: false 1556 | 1557 | /swrv@1.0.4(vue@3.4.19): 1558 | resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} 1559 | peerDependencies: 1560 | vue: '>=3.2.26 < 4' 1561 | dependencies: 1562 | vue: 3.4.19(typescript@5.3.3) 1563 | dev: false 1564 | 1565 | /tailwind-merge@2.2.1: 1566 | resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} 1567 | dependencies: 1568 | '@babel/runtime': 7.23.9 1569 | dev: false 1570 | 1571 | /tailwindcss-animate@1.0.7(tailwindcss@3.4.1): 1572 | resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} 1573 | peerDependencies: 1574 | tailwindcss: '>=3.0.0 || insiders' 1575 | dependencies: 1576 | tailwindcss: 3.4.1 1577 | dev: false 1578 | 1579 | /tailwindcss@3.4.1: 1580 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 1581 | engines: {node: '>=14.0.0'} 1582 | hasBin: true 1583 | dependencies: 1584 | '@alloc/quick-lru': 5.2.0 1585 | arg: 5.0.2 1586 | chokidar: 3.6.0 1587 | didyoumean: 1.2.2 1588 | dlv: 1.1.3 1589 | fast-glob: 3.3.2 1590 | glob-parent: 6.0.2 1591 | is-glob: 4.0.3 1592 | jiti: 1.21.0 1593 | lilconfig: 2.1.0 1594 | micromatch: 4.0.5 1595 | normalize-path: 3.0.0 1596 | object-hash: 3.0.0 1597 | picocolors: 1.0.0 1598 | postcss: 8.4.35 1599 | postcss-import: 15.1.0(postcss@8.4.35) 1600 | postcss-js: 4.0.1(postcss@8.4.35) 1601 | postcss-load-config: 4.0.2(postcss@8.4.35) 1602 | postcss-nested: 6.0.1(postcss@8.4.35) 1603 | postcss-selector-parser: 6.0.15 1604 | resolve: 1.22.8 1605 | sucrase: 3.35.0 1606 | transitivePeerDependencies: 1607 | - ts-node 1608 | 1609 | /thenify-all@1.6.0: 1610 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1611 | engines: {node: '>=0.8'} 1612 | dependencies: 1613 | thenify: 3.3.1 1614 | 1615 | /thenify@3.3.1: 1616 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1617 | dependencies: 1618 | any-promise: 1.3.0 1619 | 1620 | /to-fast-properties@2.0.0: 1621 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1622 | engines: {node: '>=4'} 1623 | dev: false 1624 | 1625 | /to-regex-range@5.0.1: 1626 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1627 | engines: {node: '>=8.0'} 1628 | dependencies: 1629 | is-number: 7.0.0 1630 | 1631 | /tr46@0.0.3: 1632 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1633 | dev: false 1634 | 1635 | /ts-interface-checker@0.1.13: 1636 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1637 | 1638 | /tslib@2.6.2: 1639 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1640 | dev: false 1641 | 1642 | /typescript@5.3.3: 1643 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 1644 | engines: {node: '>=14.17'} 1645 | hasBin: true 1646 | 1647 | /undici-types@5.26.5: 1648 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1649 | 1650 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 1651 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 1652 | hasBin: true 1653 | peerDependencies: 1654 | browserslist: '>= 4.21.0' 1655 | dependencies: 1656 | browserslist: 4.23.0 1657 | escalade: 3.1.2 1658 | picocolors: 1.0.0 1659 | dev: true 1660 | 1661 | /use-sync-external-store@1.2.0(react@18.2.0): 1662 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 1663 | peerDependencies: 1664 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1665 | dependencies: 1666 | react: 18.2.0 1667 | dev: false 1668 | 1669 | /util-deprecate@1.0.2: 1670 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1671 | 1672 | /vue@3.4.19(typescript@5.3.3): 1673 | resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==} 1674 | peerDependencies: 1675 | typescript: '*' 1676 | peerDependenciesMeta: 1677 | typescript: 1678 | optional: true 1679 | dependencies: 1680 | '@vue/compiler-dom': 3.4.19 1681 | '@vue/compiler-sfc': 3.4.19 1682 | '@vue/runtime-dom': 3.4.19 1683 | '@vue/server-renderer': 3.4.19(vue@3.4.19) 1684 | '@vue/shared': 3.4.19 1685 | typescript: 5.3.3 1686 | dev: false 1687 | 1688 | /web-streams-polyfill@3.3.2: 1689 | resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} 1690 | engines: {node: '>= 8'} 1691 | dev: false 1692 | 1693 | /web-streams-polyfill@4.0.0-beta.3: 1694 | resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} 1695 | engines: {node: '>= 14'} 1696 | dev: false 1697 | 1698 | /webidl-conversions@3.0.1: 1699 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1700 | dev: false 1701 | 1702 | /whatwg-url@5.0.0: 1703 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1704 | dependencies: 1705 | tr46: 0.0.3 1706 | webidl-conversions: 3.0.1 1707 | dev: false 1708 | 1709 | /which@2.0.2: 1710 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1711 | engines: {node: '>= 8'} 1712 | hasBin: true 1713 | dependencies: 1714 | isexe: 2.0.0 1715 | 1716 | /wrap-ansi@7.0.0: 1717 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1718 | engines: {node: '>=10'} 1719 | dependencies: 1720 | ansi-styles: 4.3.0 1721 | string-width: 4.2.3 1722 | strip-ansi: 6.0.1 1723 | 1724 | /wrap-ansi@8.1.0: 1725 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1726 | engines: {node: '>=12'} 1727 | dependencies: 1728 | ansi-styles: 6.2.1 1729 | string-width: 5.1.2 1730 | strip-ansi: 7.1.0 1731 | 1732 | /yaml@2.3.4: 1733 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 1734 | engines: {node: '>= 14'} 1735 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/placeholder-user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vercel/ai-review-summary/45813fac9579e3b24cd2268f3bc0d371d019ddfe/public/placeholder-user.jpg -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | backgroundImage: { 12 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 13 | "gradient-conic": 14 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 15 | }, 16 | }, 17 | }, 18 | plugins: [require("tailwindcss-animate")], 19 | }; 20 | export default config; 21 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------