├── .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 |
24 | {Object.keys(products).map((productId) => (
25 |
30 | {products[productId].name}
31 |
32 | ))}
33 |
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 |
36 | {timeAgo(date)}
37 |
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 |
--------------------------------------------------------------------------------