diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4345656 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,48 @@ +FROM node:20-alpine AS base + +# 1. Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat + +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# 2. Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +COPY next.config.mjs next.config.mjs +COPY .env.development .env +RUN export NODE_OPTIONS=--max_old_space_size=3072 && yarn build + +# 3. Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=development + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static +EXPOSE 3005 + +ENV PORT 3005 +# set hostname to localhost +ENV HOSTNAME "0.0.0.0" + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD ["node", "server.js"] diff --git a/app/api/resend/route.ts b/app/api/resend/route.ts deleted file mode 100644 index ea1fe8a..0000000 --- a/app/api/resend/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { EmailTemplate } from "@/components/EmailTemplate"; -import { Resend } from "resend"; -import { NextRequest, NextResponse } from "next/server"; - -const resend = new Resend(process.env.NEXT_PUBLIC_RESEND_API_KEY); -const fromEmail = process.env.NEXT_PUBLIC_FROM_EMAIL; -const siteName = process.env.NEXT_PUBLIC_SITE_NAME; -const audienceId = process.env.NEXT_PUBLIC_AUDIENCE_ID; -const siteUrl = process.env.NEXT_PUBLIC_DOMAIN; -const unsubscribeUrl = `${siteUrl}/unsubscribe`; -const subject = `You’re on the waitlist for ${siteName}`; - -export async function POST(req: NextRequest) { - const body = await req.json(); - try { - const sendEmail = await resend.emails.send({ - from: fromEmail as string, - to: [body.email], - subject: subject, - react: EmailTemplate(), - headers: { - "List-Unsubscribe": unsubscribeUrl, - "List-Unsubscribe-Post": "List-Unsubscribe=One-Click", - }, - }); - - const addContact = await resend.contacts.create({ - email: body.email, - firstName: body.firstName, - lastName: body.lastName, - unsubscribed: false, - audienceId: audienceId as string, - }); - - return NextResponse.json({ - sendEmail, - addContact, - }); - } catch (error) { - return NextResponse.json({ error }); - } -} diff --git a/app/globals.css b/app/globals.css index 000e9a8..7984e39 100644 --- a/app/globals.css +++ b/app/globals.css @@ -61,6 +61,22 @@ @apply border-border; } body { - @apply bg-background text-foreground; + @apply bg-background text-foreground bg-no-repeat bg-cover; + background-image: url("/laptop.jpg"); + } +} + +@layer utilities { + .neon { + color: #fff; + text-shadow: + 0 0 7px #fff, + 0 0 10px #fff, + 0 0 21px #fff, + 0 0 42px #0051ff, + 0 0 82px #0051ff, + 0 0 92px #0051ff, + 0 0 102px #0051ff, + 0 0 151px #0051ff; } } diff --git a/app/layout.tsx b/app/layout.tsx index db4b9ed..b28a9a5 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,14 +1,12 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; +import { Inter, Montserrat } from "next/font/google"; import "./globals.css"; import { Toaster } from "react-hot-toast"; -const inter = Inter({ subsets: ["latin"] }); +const montserrat = Montserrat({subsets: ["latin"]}); -const siteName = process.env.NEXT_PUBLIC_SITE_NAME ?? "Quick Waitlist"; -const siteDescription = - process.env.NEXT_PUBLIC_SITE_DESCRIPTION ?? - "Quick Waitlist and coming soon page for your SAAS and website."; +const siteName = "Quick Waitlist"; +const siteDescription = "Quick Waitlist and coming soon page for your SAAS and website."; export const metadata: Metadata = { title: siteName, @@ -22,7 +20,7 @@ export default function RootLayout({ }>) { return ( - +
{children}
diff --git a/app/page.tsx b/app/page.tsx index 4ee1ebf..383a0ad 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,56 +1,34 @@ -import Card from "@/components/Card"; -import CardHeader from "@/components/Offer"; import EmailForm from "@/components/EmailForm"; +import {Tag} from "lucide-react"; -export default function Home() { - const siteLogo = - process.env.NEXT_PUBLIC_LOGO || - "https://res.cloudinary.com/dyv1yduua/image/upload/v1733392810/speaker_oiuezn.svg"; - // Data from env - const features = - process.env.NEXT_PUBLIC_FEATURES || - "Sectoral templates, Sectoral templates, Sectoral templates"; - const price = process.env.NEXT_PUBLIC_CURRENT_PRICE || ""; - const discountPrice = process.env.NEXT_PUBLIC_DISCOUNT_PRICE || ""; - const date = process.env.NEXT_PUBLIC_LAUNCH_DATE || "2026-01-01"; - const title = - process.env.NEXT_PUBLIC_TITLE || - "Join the waitlist for the SAAS code library."; - const description = - process.env.NEXT_PUBLIC_OFFER_TITLE || "Add offer title from env"; - console.log(price); +export default function Home() { return ( -
- {/* eslint-disable-next-line @next/next/no-img-element */} - logo - -
-
- -
-
- -
-
+
+
+
+ +
+

+ Coming Soon +

+
- {/* */} +
+

Join Our Waitlist

+

Signup to be the first to know when we launch.
We will let you know + once we are ready to go on production.

+ +
- {/* element */} - - - - -
); } diff --git a/app/privacy-policy/page.tsx b/app/privacy-policy/page.tsx deleted file mode 100644 index 650994f..0000000 --- a/app/privacy-policy/page.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import Link from "next/link"; -import React from "react"; -import { Button } from "@/components/ui/button"; -import { ChevronLeft } from "lucide-react"; - -const PrivacyPolicyPage = () => { - const siteLogo = - process.env.NEXT_PUBLIC_LOGO || - "https://res.cloudinary.com/dyv1yduua/image/upload/v1733392810/speaker_oiuezn.svg"; - - return ( -
- {/* eslint-disable-next-line @next/next/no-img-element */} - logo -
-
-
-

- Privacy Policy -

-
-

- {process.env.NEXT_PUBLIC_PRIVACY || "Add Privacy Policy From ENV"} -

- - - -
- {/* element */} - - - - -
-
- ); -}; - -export default PrivacyPolicyPage; diff --git a/app/unsubscribe/page.tsx b/app/unsubscribe/page.tsx deleted file mode 100644 index b40d248..0000000 --- a/app/unsubscribe/page.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import React, { useTransition } from "react"; - -const UnsubscribePage = () => { - const [isPending, startTransaction] = useTransition(); - - const handleSubmit = () => { - startTransaction(async () => { - try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_DOMAIN}/api/resend`, - { - method: "POST", - body: JSON.stringify(""), - headers: { "Content-Type": "application/json" }, - } - ); - - if (res.ok) { - const result = await res.json(); - console.log(result); - } else { - console.error("Error:", res.status, res.statusText); - } - } catch (error) { - console.error("Fetch error:", error); - } - }); - }; - return ( -
-
-
-
-

- Sorry to see you go! -

-
- - {/* form to unsubscribe */} - - -
- {/* element */} - - - - -
-
- ); -}; - -export default UnsubscribePage; diff --git a/components/Card.tsx b/components/Card.tsx deleted file mode 100644 index f888a4f..0000000 --- a/components/Card.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from "react"; - -const Card = ({ - children, - className, -}: { - children: React.ReactNode; - className?: string; -}) => { - return ( -
- {children} -
- ); -}; - -export default Card; diff --git a/components/EmailForm.tsx b/components/EmailForm.tsx index 4a7a109..697be98 100644 --- a/components/EmailForm.tsx +++ b/components/EmailForm.tsx @@ -1,137 +1,62 @@ "use client"; -import React, { useTransition } from "react"; +import {SyntheticEvent, useState} from "react"; +import {sendMail} from "@/lib/send-mail"; import toast from "react-hot-toast"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; import { Hourglass, LoaderCircle, Mail, User } from "lucide-react"; -import { useState } from "react"; -const EmailForm = ({ date, title }: { date: string; title: string }) => { - const [isPending, startTransaction] = useTransition(); +const EmailForm = () => { + const [loading, setLoading] = useState(false); - const [isLoading, setIsLoading] = useState(false); - - const handleClick = () => { - setIsLoading(true); - // Simulate an async operation - setTimeout(() => { - setIsLoading(false); - }, 1000); // Reset after 1 second - }; - - function getDaysLeft(): number { - const endDate = new Date(date); // Set your target date here - const today = new Date(); - const diffTime = endDate.getTime() - today.getTime(); - const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); - return Math.max(0, diffDays); - } - - const handleSubmit = async (event: React.SyntheticEvent) => { + const handleSubmit = async (event: SyntheticEvent) => { event.preventDefault(); const target = event.target as HTMLFormElement; const form = new FormData(target); - const email = form.get("email"); - const fullName = form.get("name") as string; - - if (!email || !fullName) { - return null; + const email = form.get("email") as string; + try { + setLoading(true); + await sendMail({ + sendTo: email, + subject: "You’re on the waitlist for", + }); + target.reset(); + toast.success("Thank you for subscribing 🎉"); + } catch (error) { + console.error("Error:", error); + toast.error("Something went wrong"); + } finally { + setLoading(false); } - - // Split full name into first and last name - const [firstName, ...lastNameParts] = fullName.trim().split(" "); - const lastName = lastNameParts.join(" ") || ""; // Join remaining parts or empty string - - startTransaction(async () => { - try { - const res = await fetch("/api/resend", { - method: "POST", - body: JSON.stringify({ email, firstName, lastName }), - headers: { "Content-Type": "application/json" }, - }); - - if (res.ok) { - target.reset(); - toast.success("Thank you for subscribing 🎉"); - } else { - console.error("Error:", res.status, res.statusText); - toast.error("Something went wrong"); - } - } catch (error) { - console.error("Fetch error:", error); - } - }); }; - return ( -
-
- {/*
Limited Time Offer
*/} - - -

- {title} -

-
-
handleSubmit(e)} className="space-y-5"> -
- -
- + handleSubmit(e)} className="space-y-5"> +
+ +
-
-
- -
- -
-
-
-
+ } + Join Waitlist + +
+
- - -
- ); +
; }; -export default EmailForm; + +export default EmailForm; \ No newline at end of file diff --git a/components/EmailTemplate.tsx b/components/EmailTemplate.tsx deleted file mode 100644 index 1ba0221..0000000 --- a/components/EmailTemplate.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Text, -} from "@react-email/components"; - -export const EmailTemplate = () => { - const siteLogo = process.env.NEXT_PUBLIC_DOMAIN + "/speaker.svg"; - return ( - - - {`You’re on the waitlist for ${process.env.NEXT_PUBLIC_SITE_NAME}`} - - - Logo -
- {`Big welcome and thanks for subscribing ${process.env.NEXT_PUBLIC_SITE_NAME}`} - - 🚀 The mission is to send out a stylish and simple newsletter that - help busy creatives to stay updated without cluttering their - inbox. - - - 🛳 All new AI resources and tools are carefully curated, with only - a handful of the best being shipped. - - Expect a new shipment every Tuesday! -
-
- - - ); -}; - -const main = { - backgroundColor: "#f6f9fc", - padding: "10px 0", -}; - -const container = { - backgroundColor: "#ffffff", - border: "1px solid #f0f0f0", - padding: "45px", -}; - -const img = { - paddingTop: "40px", - margin: "0 auto", -}; - -const text = { - fontSize: "16px", - fontFamily: - "'Open Sans', 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif", - fontWeight: "400", - color: "#404040", - lineHeight: "26px", - // padding: "0 40px", -}; - -const anchor = { - textDecoration: "underline", -}; diff --git a/components/Footer.tsx b/components/Footer.tsx deleted file mode 100644 index 6839c04..0000000 --- a/components/Footer.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Github, Linkedin, X } from "lucide-react"; -import Link from "next/link"; -const LinkedinLink = - process.env.NEXT_PUBLIC_LINKEDIN || "https://www.linkedin.com/"; -const TwitterLink = process.env.NEXT_PUBLIC_TWITTER || "https://www.x.com/"; -const GithubLink = process.env.NEXT_PUBLIC_GITHUB || "https://www.github.com/"; - -const CardFooter = () => { - return ( -
-
- we care about your data in our{" "} - - privacy policy - -
- {/* Social Media */} -
- - - - - - - - - -
-
- ); -}; - -export default CardFooter; diff --git a/components/Offer.tsx b/components/Offer.tsx deleted file mode 100644 index baa582f..0000000 --- a/components/Offer.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Cog } from "lucide-react"; -import CardFooter from "./Footer"; - -const CardHeader = ({ - title, - features, - price, - discount, -}: { - title: string; - features: string; - price: string; - discount: string; -}) => { - return ( -
-
-
- {price && discount && ( -
- Limited Time Offer -
- )} -

{title}

-
- - {price && discount && ( -
- ${discount}{" "} - instead of ${price} -
- )} -
-
- {features.split(",").map((feature, index) => ( -
- - {feature.trim()} -
- ))} -
-
- -
- ); -}; - -export default CardHeader; diff --git a/components/ui/button.tsx b/components/ui/button.tsx deleted file mode 100644 index 36496a2..0000000 --- a/components/ui/button.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: - "border border-input bg-background hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-10 px-4 py-2", - sm: "h-9 rounded-md px-3", - lg: "h-11 rounded-md px-8", - icon: "h-10 w-10", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -) - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button" - return ( - - ) - } -) -Button.displayName = "Button" - -export { Button, buttonVariants } diff --git a/components/ui/input.tsx b/components/ui/input.tsx deleted file mode 100644 index 68551b9..0000000 --- a/components/ui/input.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from "react" - -import { cn } from "@/lib/utils" - -const Input = React.forwardRef>( - ({ className, type, ...props }, ref) => { - return ( - - ) - } -) -Input.displayName = "Input" - -export { Input } diff --git a/components/ui/label.tsx b/components/ui/label.tsx deleted file mode 100644 index 5341821..0000000 --- a/components/ui/label.tsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client" - -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" -) - -const Label = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & - VariantProps ->(({ className, ...props }, ref) => ( - -)) -Label.displayName = LabelPrimitive.Root.displayName - -export { Label } diff --git a/docker-compose.certbot.yml b/docker-compose.certbot.yml new file mode 100644 index 0000000..a2f0cc7 --- /dev/null +++ b/docker-compose.certbot.yml @@ -0,0 +1,8 @@ +services: + + waitlist.certbot: + image: certbot/certbot + volumes: + - ./certbot/conf:/etc/letsencrypt + - ./certbot/www:/var/www/certbot + command: certonly --webroot -w /var/www/certbot --force-renewal --email work@wesendemail.online -d wesendemail.online --agree-tos \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9be2931 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' + +services: + waitlist.fe: + build: + context: . + dockerfile: Dockerfile + ports: + - 3005:3005 + deploy: + resources: + limits: + memory: 3584M \ No newline at end of file diff --git a/lib/send-mail.ts b/lib/send-mail.ts new file mode 100644 index 0000000..1e9f9bc --- /dev/null +++ b/lib/send-mail.ts @@ -0,0 +1,49 @@ +"use server"; +import nodemailer from "nodemailer"; +import fs from "fs"; +import path from "path"; +import handlebars from "handlebars"; + +const SMTP_SERVER_HOST = process.env.NEXT_PUBLIC_SMTP_SERVER_HOST; +const SMTP_SERVER_SERVICE = process.env.NEXT_PUBLIC_SMTP_SERVER_SERVICE; +const SMTP_SERVER_USERNAME = process.env.NEXT_PUBLIC_AUDIENCE_ID; +const SMTP_SERVER_PASSWORD = process.env.NEXT_PUBLIC_SMTP_SERVER_PASSWORD; +const transporter = nodemailer.createTransport({ + service: SMTP_SERVER_SERVICE, + host: SMTP_SERVER_HOST, + port: 587, + secure: false, + auth: { + user: SMTP_SERVER_USERNAME, + pass: SMTP_SERVER_PASSWORD, + }, +}); + +const renderTemplate = () => { + const filePath = path.join(process.cwd(), "templates", `mail.hbs`); + const source = fs.readFileSync(filePath, "utf8"); + const template = handlebars.compile(source); + return template({}); +}; + +export async function sendMail({ + sendTo, + subject, + }: { + sendTo: string; + subject: string; +}) { + try { + const isVerified = await transporter.verify(); + } catch (error) { + console.error("Something Went Wrong", SMTP_SERVER_USERNAME, SMTP_SERVER_PASSWORD, error); + return; + } + const htmlContent = renderTemplate(); + return await transporter.sendMail({ + from: "support@wesendemail.online", + to: sendTo, + subject: subject, + html: htmlContent, + }); +} \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs index d1e8b47..e150855 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,6 +1,7 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: true, + reactStrictMode: false, + output: 'standalone', images: { domains: ["i.ibb.co"], }, diff --git a/package.json b/package.json index c90d82a..53408d7 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "comming-soon", + "name": "dns4", "version": "0.1.0", "private": true, "scripts": { @@ -14,8 +14,10 @@ "@react-email/components": "^0.0.19", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "handlebars": "^4.7.8", "lucide-react": "^0.465.0", "next": "^14.2.3", + "nodemailer": "^6.9.16", "react": "^18.3.1", "react-dom": "^18.3.1", "react-hot-toast": "^2.4.1", @@ -25,6 +27,7 @@ }, "devDependencies": { "@types/node": "^20.12.12", + "@types/nodemailer": "^6.4.17", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "autoprefixer": "^10.4.19", diff --git a/public/laptop.jpg b/public/laptop.jpg new file mode 100644 index 0000000..022dc19 Binary files /dev/null and b/public/laptop.jpg differ diff --git a/templates/mail.hbs b/templates/mail.hbs new file mode 100644 index 0000000..30882ff --- /dev/null +++ b/templates/mail.hbs @@ -0,0 +1,14 @@ + + + + + + Welcome + + +

Hi friend,

+

Welcome to our platform! We are excited to have you.

+

Regards,

+

The Team

+ + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 56f746c..042913a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -126,49 +126,9 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.3": - version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== - -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - "@next/swc-win32-x64-msvc@14.2.3": version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz" integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== "@nodelib/fs.scandir@2.1.5": @@ -179,7 +139,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -211,29 +171,29 @@ "@radix-ui/react-compose-refs@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz" integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== "@radix-ui/react-label@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.1.0.tgz#3aa2418d70bb242be37c51ff5e51a2adcbc372e3" + resolved "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz" integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw== dependencies: "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-primitive@2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz" integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== dependencies: "@radix-ui/react-slot" "1.1.0" -"@radix-ui/react-separator@^1.1.0": +"@radix-ui/react-slot@^1.1.0", "@radix-ui/react-slot@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" - integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== dependencies: - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-compose-refs" "1.1.0" "@radix-ui/react-slot@1.0.2": version "1.0.2" @@ -243,13 +203,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@react-email/body@0.0.8": version "0.0.8" resolved "https://registry.npmjs.org/@react-email/body/-/body-0.0.8.tgz" @@ -429,6 +382,13 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/node@*": + version "22.10.2" + resolved "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^20.12.12": version "20.12.12" resolved "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz" @@ -436,12 +396,19 @@ dependencies: undici-types "~5.26.4" +"@types/nodemailer@^6.4.17": + version "6.4.17" + resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz" + integrity sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww== + dependencies: + "@types/node" "*" + "@types/prop-types@*": version "15.7.11" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== -"@types/react-dom@^18.3.0": +"@types/react-dom@*", "@types/react-dom@^18.3.0": version "18.3.0" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -517,7 +484,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -736,7 +703,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.23.0: +browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -871,7 +838,7 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2: +csstype@^3.0.10, csstype@^3.0.2: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1176,7 +1143,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -1261,7 +1228,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0: version "8.56.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -1437,11 +1404,6 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -1501,7 +1463,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10, glob@^10.3.10, glob@^10.3.3: +glob@^10.3.10, glob@^10.3.3, glob@10.3.10: version "10.3.10" resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -1572,6 +1534,18 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +handlebars@^4.7.8: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" @@ -2024,7 +1998,7 @@ lru-cache@^6.0.0: lucide-react@^0.465.0: version "0.465.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.465.0.tgz#3f98d40f7b7ac5266c055aaf582c303b07f84de2" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.465.0.tgz" integrity sha512-uV7WEqbwaCcc+QjAxIhAvkAr3kgwkkYID3XptCHll72/F7NZlk6ONmJYpk+Xqx5Q0r/8wiOjz73H1BYbl8Z8iw== marked@7.0.4: @@ -2052,6 +2026,20 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz" @@ -2059,21 +2047,14 @@ minimatch@9.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@9.0.3, minimatch@^9.0.1: +minimatch@9.0.3: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -2083,16 +2064,16 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@^2.1.1: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" @@ -2112,6 +2093,11 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next@^14.2.3: version "14.2.3" resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" @@ -2140,6 +2126,11 @@ node-releases@^2.0.14: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +nodemailer@^6.9.16: + version "6.9.16" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz" + integrity sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ== + nopt@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz" @@ -2382,16 +2373,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.23: +postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: version "8.4.33" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== @@ -2400,7 +2382,7 @@ postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.38: +postcss@^8.1.0, postcss@^8.4.38: version "8.4.38" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -2409,6 +2391,15 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -2443,6 +2434,14 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +"react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react-dom@^18.2.0, react-dom@^18.3.1, react-dom@>=16: + version "18.3.1" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + react-dom@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" @@ -2451,14 +2450,6 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-dom@^18.2.0, react-dom@^18.3.1: - version "18.3.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - react-hot-toast@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz" @@ -2478,6 +2469,13 @@ react-promise-suspense@0.3.4: dependencies: fast-deep-equal "^2.0.1" +"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16, react@18.x: + version "18.3.1" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" @@ -2485,13 +2483,6 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" -react@^18.2.0, react@^18.3.1: - version "18.3.1" - resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - read-cache@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" @@ -2631,7 +2622,14 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4: +semver@^7.5.3: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -2699,13 +2697,26 @@ source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2765,8 +2776,14 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2832,7 +2849,7 @@ tailwindcss-animate@^1.0.7: resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^3.4.3: +tailwindcss@^3.4.3, "tailwindcss@>=3.0.0 || insiders": version "3.4.3" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz" integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== @@ -2967,11 +2984,16 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@^5.4.5: +typescript@^5.4.5, typescript@>=3.3.1, typescript@>=4.2.0: version "5.4.5" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" @@ -2987,6 +3009,11 @@ undici-types@~5.26.4: resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" @@ -3064,6 +3091,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"