diff --git a/apps/website/app/[locale]/_changelog/page.tsx b/apps/website/app/[locale]/_changelog/page.tsx new file mode 100644 index 0000000..f6b1b6d --- /dev/null +++ b/apps/website/app/[locale]/_changelog/page.tsx @@ -0,0 +1,178 @@ +// import { ScrollArea } from "@/components/ui/scroll-area"; + +// Datos de ejemplo del changelog +const changelogEntries = [ + { + date: "2023-11-01", + title: "Versión 2.1.0", + changes: [ + "Añadido soporte para modo oscuro en todas las páginas", + "Mejorado el rendimiento para grandes conjuntos de datos", + "Corregido error en el flujo de autenticación de usuarios", + ], + image: + "https://g-ndmbkfuhw2w.vusercontent.net/placeholder.svg?height=200&width=400", + }, + { + date: "2023-10-15", + title: "Versión 2.0.1", + changes: [ + "Corrección urgente para vulnerabilidad crítica de seguridad", + "Actualizadas las dependencias a las últimas versiones", + ], + image: + "https://g-ndmbkfuhw2w.vusercontent.net/placeholder.svg?height=200&width=400", + }, + { + date: "2023-10-01", + title: "Versión 2.0.0", + changes: [ + "Rediseño completo de la UI para mejorar la experiencia de usuario", + "Introducidas nuevas características en el panel de control", + "Añadido soporte para temas personalizados", + "Mejorada la accesibilidad en toda la aplicación", + ], + image: + "https://g-ndmbkfuhw2w.vusercontent.net/placeholder.svg?height=200&width=400", + }, + { + date: "2023-09-15", + title: "Versión 1.9.5", + changes: [ + "Optimización de rendimiento en la carga inicial", + "Nuevas opciones de personalización para usuarios premium", + ], + image: + "https://g-ndmbkfuhw2w.vusercontent.net/placeholder.svg?height=200&width=400", + }, + { + date: "2023-08-01", + title: "Versión 1.9.0", + changes: [ + "Lanzamiento de la API pública para desarrolladores", + "Mejoras en la sincronización de datos entre dispositivos", + ], + image: + "https://g-ndmbkfuhw2w.vusercontent.net/placeholder.svg?height=200&width=400", + }, +]; + +const Comp = () => { + return ( +
+
+ + + + + + + + + + + + + + + +
+
+

Changelog

+
+ {changelogEntries.map((entry, index) => ( +
+
+ + {entry.date} + +

{entry.title}

+
+
+
+ {`Imagen +
+ +
    + {entry.changes.map((change, changeIndex) => ( +
  • + {change} +
  • + ))} +
+
+
+ ))} +
+
+
+ ); +}; + +// export default function Changelog() { +// return ( +//
+//
+// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +//
+//
+//

Changelog

+//
+// {changelogEntries.map((entry, index) => ( +//
+//
+// +// {entry.date} +// +//

{entry.title}

+//
+//
+//
+// {`Imagen +//
+ +//
    +// {entry.changes.map((change, changeIndex) => ( +//
  • +// {change} +//
  • +// ))} +//
+//
+//
+// ))} +//
+//
+//
+// ); +// } diff --git a/apps/website/app/[locale]/page.tsx b/apps/website/app/[locale]/page.tsx index 7f2dfb6..c3b5ce1 100644 --- a/apps/website/app/[locale]/page.tsx +++ b/apps/website/app/[locale]/page.tsx @@ -4,6 +4,8 @@ import { Hero } from "@/components/Hero"; import { PrimaryFeatures } from "@/components/PrimaryFeatures"; import { Testimonials } from "@/components/Testimonials"; import { FeaturesSectionDemo } from "@/components/features"; +import { Pricing } from "@/components/pricing"; +import { RippleDemo } from "@/components/sponsors"; export default function Home() { return ( @@ -13,7 +15,12 @@ export default function Home() { +
+ +
+ + diff --git a/apps/website/app/[locale]/pricing/page.tsx b/apps/website/app/[locale]/pricing/page.tsx deleted file mode 100644 index 8bd1177..0000000 --- a/apps/website/app/[locale]/pricing/page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Pricing } from "@/components/pricing"; - -export default function Home() { - return ( -
- -
- ); -} diff --git a/apps/website/components/Faqs.tsx b/apps/website/components/Faqs.tsx index d862683..dba71a4 100644 --- a/apps/website/components/Faqs.tsx +++ b/apps/website/components/Faqs.tsx @@ -12,6 +12,34 @@ const faqs = [ question: "faq.q1", answer: "faq.a1", }, + { + question: "faq.q11", + answer: "faq.a11", + }, + { + question: "faq.q12", + answer: "faq.a12", + }, + { + question: "faq.q13", + answer: "faq.a13", + }, + { + question: "faq.q14", + answer: "faq.a14", + }, + { + question: "faq.q15", + answer: "faq.a15", + }, + { + question: "faq.q17", + answer: "faq.a17", + }, + { + question: "faq.q18", + answer: "faq.a18", + }, { question: "faq.q2", answer: "faq.a2", @@ -36,6 +64,10 @@ const faqs = [ question: "faq.q8", answer: "faq.a8", }, + { + question: "faq.q16", + answer: "faq.a16", + }, { question: "faq.q9", answer: "faq.a9", @@ -74,7 +106,9 @@ export function Faqs() { > {faqs.map((column, columnIndex) => ( - {t(column.question)} + + {t(column.question)} + {t(column.answer)} ))} diff --git a/apps/website/components/Footer.tsx b/apps/website/components/Footer.tsx index b2d8e4c..d8c411d 100644 --- a/apps/website/components/Footer.tsx +++ b/apps/website/components/Footer.tsx @@ -67,10 +67,14 @@ export function Footer() { aria-label="Dokploy on Twitter" > - Pricing + Pricing {t("navigation.faqs")} {t("navigation.docs")} @@ -144,7 +145,7 @@ export function Header() {
- {t("navigation.pricing")} + {t("navigation.pricing")} {t("navigation.faqs")} {t("navigation.docs")} @@ -152,7 +153,20 @@ export function Header() {
- + + + + + + {/* - + */} +
diff --git a/apps/website/components/PrimaryFeatures.tsx b/apps/website/components/PrimaryFeatures.tsx index 4a0b4b3..8d63be6 100644 --- a/apps/website/components/PrimaryFeatures.tsx +++ b/apps/website/components/PrimaryFeatures.tsx @@ -158,7 +158,7 @@ export function PrimaryFeatures() { {features.map((feature, index) => (
-
+

{t(feature.description)}

@@ -174,7 +174,7 @@ export function PrimaryFeatures() { bounce: 0.2, duration: 0.8, }} - className="mt-10 h-[24rem] w-[45rem] overflow-hidden rounded-xl border shadow-xl sm:w-auto lg:mt-0 lg:h-[40rem] " + className="mt-10 h-[24rem] w-[45rem] overflow-hidden rounded-xl border-b shadow-xl sm:w-auto lg:mt-0 lg:h-[40rem] " >
-
-

+
+

Why Developers Love Dokploy

-

+

Think we’re bragging? Hear from the devs who once doubted too—until Dokploy made their lives (and deployments) surprisingly easier.

diff --git a/apps/website/components/features.tsx b/apps/website/components/features.tsx index 68be0cf..09f0850 100644 --- a/apps/website/components/features.tsx +++ b/apps/website/components/features.tsx @@ -98,7 +98,7 @@ export function FeaturesSectionDemo() { flexible database management—all with Dokploy’s developer-focused features.

-
+
{features.map((feature, index) => ( ))} diff --git a/apps/website/components/pricing.tsx b/apps/website/components/pricing.tsx index 366dfe0..cd2aa14 100644 --- a/apps/website/components/pricing.tsx +++ b/apps/website/components/pricing.tsx @@ -6,9 +6,8 @@ import { ArrowRight, MinusIcon, PlusIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { use, useState } from "react"; +import { useState } from "react"; import { Container } from "./Container"; -import { trackGAEvent } from "./analitycs"; import { Badge } from "./ui/badge"; import { Button, buttonVariants } from "./ui/button"; import { NumberInput } from "./ui/input"; @@ -68,94 +67,6 @@ export const calculatePrice = (count: number, isAnnual = false) => { if (count <= 1) return 4.5; return count * 3.5; }; -function Plan({ - name, - price, - description, - href, - features, - featured = false, - buttonText = "Get Started", -}: { - name: string; - price: string; - description: string; - href: string; - features: Array; - featured?: boolean; - buttonText?: string; -}) { - const router = useRouter(); - return ( -
-
- - - - - - - - - - - - - - - -
-
-

{name}

-

- {description} -

-

- {price} -

-
    - {features.map((feature) => ( -
  • - - {feature} -
  • - ))} -
- -
-
- ); -} export function Pricing() { const router = useRouter(); @@ -260,9 +171,6 @@ export function Pricing() { t("plan.free.features.f3"), t("plan.free.features.f4"), t("plan.free.features.f5"), - t("plan.free.features.f6"), - t("plan.free.features.f7"), - t("plan.free.features.f8"), ].map((feature) => (
  • @@ -342,9 +250,17 @@ export function Pricing() { {[ t("plan.cloud.features.f1"), t("plan.cloud.features.f2"), + t("plan.cloud.features.f2"), t("plan.cloud.features.f3"), - ].map((feature) => ( -
  • + t("plan.cloud.features.f4"), + t("plan.cloud.features.f5"), + t("plan.cloud.features.f6"), + t("plan.cloud.features.f7"), + ].map((feature, index) => ( +
  • {feature}
  • @@ -412,7 +328,7 @@ export function Pricing() {
    - + {/* */} ); } diff --git a/apps/website/components/sponsors.tsx b/apps/website/components/sponsors.tsx new file mode 100644 index 0000000..2d83582 --- /dev/null +++ b/apps/website/components/sponsors.tsx @@ -0,0 +1,29 @@ +import { PlusCircleIcon } from "lucide-react"; +import { useTranslations } from "next-intl"; +import { Button } from "./ui/button"; +import Ripple from "./ui/ripple"; + +export const RippleDemo = () => { + const t = useTranslations("HomePage"); + return ( +
    +
    +

    + {t("hero.sponsors.title")} +

    +

    + {t("hero.sponsors.description")} +

    +
    +
    +

    + + {/* */} +

    + +
    +
    + ); +}; diff --git a/apps/website/components/ui/avatar.tsx b/apps/website/components/ui/avatar.tsx new file mode 100644 index 0000000..d3b48e6 --- /dev/null +++ b/apps/website/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client"; + +import * as AvatarPrimitive from "@radix-ui/react-avatar"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/apps/website/components/ui/ripple.tsx b/apps/website/components/ui/ripple.tsx new file mode 100644 index 0000000..7898b2a --- /dev/null +++ b/apps/website/components/ui/ripple.tsx @@ -0,0 +1,172 @@ +"use client"; +import React, { type CSSProperties } from "react"; + +import { cn } from "@/lib/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "./avatar"; + +interface RippleProps { + mainCircleSize?: number; + mainCircleOpacity?: number; + numCircles?: number; + className?: string; +} + +const Ripple = React.memo(function Ripple({ + mainCircleSize = 210, + mainCircleOpacity = 0.24, + numCircles = 8, + className, +}: RippleProps) { + const avatarsFirstRing = [ + "https://github.com/shadcn.png", // URLs de los avatares del primer aro + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + ]; + const avatarsSecondRing = [ + "https://github.com/shadcn.png", // URLs de los avatares del segundo aro + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + ]; + + const avatarsThirdRing = [ + "https://github.com/shadcn.png", // URLs de los avatares del tercer aro + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + "https://github.com/shadcn.png", + ]; + + return ( +
    +
    + {Array.from({ length: numCircles }, (_, i) => { + const size = mainCircleSize + i * 70; + const opacity = mainCircleOpacity - i * 0.03; + const animationDelay = `${i * 0.06}s`; + const borderStyle = i === numCircles - 1 ? "dashed" : "solid"; + const borderOpacity = 5 + i * 5; + + return ( +
    + {i === 0 && ( +
    + {avatarsFirstRing.map((src, index) => { + const angle = (360 / avatarsFirstRing.length) * index; + const radius = mainCircleSize / 2; + const x = radius * Math.cos((angle * Math.PI) / 180); + const y = radius * Math.sin((angle * Math.PI) / 180); + + return ( +
    + + + CN + +
    + ); + })} +
    + )} + + {i === 1 && ( +
    + {avatarsSecondRing.map((src, index) => { + const angle = (360 / avatarsSecondRing.length) * index; + const radius = mainCircleSize / 2 + 70; // Radio mayor para el segundo aro + const x = radius * Math.cos((angle * Math.PI) / 180); + const y = radius * Math.sin((angle * Math.PI) / 180); + + return ( +
    + + + CN + +
    + ); + })} +
    + )} + + {i === 3 && ( +
    + {avatarsThirdRing.map((src, index) => { + const angle = (360 / avatarsThirdRing.length) * index; + const radius = mainCircleSize / 2 + 140; // Radio mayor para el tercer aro + const x = radius * Math.cos((angle * Math.PI) / 180); + const y = radius * Math.sin((angle * Math.PI) / 180); + + return ( +
    + + + CN + +
    + ); + })} +
    + )} +
    + ); + })} +
    +
    + ); +}); + +Ripple.displayName = "Ripple"; + +export default Ripple; diff --git a/apps/website/components/ui/scroll-area.tsx b/apps/website/components/ui/scroll-area.tsx new file mode 100644 index 0000000..d87d95b --- /dev/null +++ b/apps/website/components/ui/scroll-area.tsx @@ -0,0 +1,48 @@ +"use client"; + +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)); +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)); +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; + +export { ScrollArea, ScrollBar }; diff --git a/apps/website/locales/en.json b/apps/website/locales/en.json index 6751edb..a59f071 100644 --- a/apps/website/locales/en.json +++ b/apps/website/locales/en.json @@ -6,7 +6,7 @@ "docs": "Docs", "pricing": "Pricing", "support": "Support", - "dashboard": "Dashboard", + "dashboard": "Sign In", "discord": "Discord", "i18nButtonPlaceholder": "Language", "i18nEn": "English", @@ -91,7 +91,23 @@ "q9": "What types of applications can I deploy with Dokploy?", "a9": "You can deploy any application that can be Dockerized, with no limits. Dokploy supports builds from Git repositories, Dockerfiles, Nixpacks, and Buildpacks like Heroku and Paketo.", "q10": "How does Dokploy handle database management?", - "a10": "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management and backups directly from the dashboard." + "a10": "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management and backups directly from the dashboard.", + "q11": "How does Dokploy's Open Source plan work?", + "a11": "You can host Dokploy UI on your own infrastructure and you will be responsible for the maintenance and updates.", + "q12": "Do I need to provide my own server for the managed plan?", + "a12": "Yes, in the managed plan, you provide your own server eg(Hetzner, Hostinger, AWS, ETC.) VPS, and we manage the Dokploy UI infrastructure for you.", + "q13": "What happens if I need more than one server?", + "a13": "The first server costs $4.50/month, if you buy more than one it will be $3.50/month per server.", + "q14": "Is there a limit on the number of deployments?", + "a14": "No, there is no limit on the number of deployments in any of the plans.", + "q15": "What happens if I exceed my purchased server limit?", + "a15": "The most recently added servers will be deactivated. You won't be able to create services on inactive servers until they are reactivated.", + "q16": "Do you offer a refunds?", + "a16": "We do not offer refunds. However, you can cancel your subscription at any time. Feel free to try our open-source version for free before making a purchase.", + "q17": "What kind of support do you offer?", + "a17": "We offer community support for the open source version and priority support for paid plans (Via Discord or Email at support@dokploy.com).", + "q18": "What's the catch on the Paid Plan?", + "a18": "Nothing, you link your server(VPS) to your account and you can deploy unlimited applications, databases, and users and you get unlimited updates, deployments, backups and more." }, "footer": { "copyright": "Copyright © {year} Dokploy. All rights reserved." @@ -126,13 +142,10 @@ }, "features": { "f1": "Complete Flexibility: Install Dokploy UI on your own infrastructure", - "f2": "Unlimited Deployments", - "f3": "Self-hosted Infrastructure", - "f4": "Community Support", - "f5": "Access to Core Features", - "f6": "Dokploy Integration", - "f7": "Basic Backups", - "f8": "Access to All Updates", + "f2": "Self-hosted Infrastructure", + "f3": "Community Support", + "f4": "Access to Core Features", + "f5": "Access to All Updates", "f9": "Unlimited Servers" }, "go": "Installation" @@ -146,8 +159,12 @@ "servers": "{serverQuantity} Servers (You bring the servers)", "features": { "f1": "Managed Hosting: No need to manage your own servers", - "f2": "Priority Support", - "f3": "Future-Proof Features" + "f2": "Unlimited Deployments", + "f3": "Unlimited Databases", + "f4": "Unlimited Applications", + "f5": "Unlimited Users", + "f6": "Priority Support", + "f7": "New Updates" }, "go": "Subscribe" } diff --git a/apps/website/package.json b/apps/website/package.json index deebed1..d5d5f0f 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -15,6 +15,8 @@ "@headlessui/react": "^1.7.17", "@headlessui/tailwindcss": "^0.2.0", "@radix-ui/react-accordion": "^1.2.1", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", diff --git a/apps/website/tailwind.config.ts b/apps/website/tailwind.config.ts index 13e3362..c0fa2da 100644 --- a/apps/website/tailwind.config.ts +++ b/apps/website/tailwind.config.ts @@ -124,6 +124,14 @@ const config = { backgroundPosition: "var(--bg-size) 0", }, }, + ripple: { + "0%, 100%": { + transform: "translate(-50%, -50%) scale(1)", + }, + "50%": { + transform: "translate(-50%, -50%) scale(0.9)", + }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", @@ -132,6 +140,7 @@ const config = { marquee: "marquee var(--duration) linear infinite", "marquee-vertical": "marquee-vertical var(--duration) linear infinite", gradient: "gradient 8s linear infinite", + ripple: "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite", }, }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7e9334..83d6124 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,6 +91,12 @@ importers: '@radix-ui/react-accordion': specifier: ^1.2.1 version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-avatar': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-scroll-area': + specifier: ^1.2.0 + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -618,6 +624,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-avatar@1.1.1': + resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} + peerDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collapsible@1.1.0': resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} peerDependencies: @@ -968,6 +987,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-scroll-area@1.2.0': + resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} + peerDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-select@2.1.1': resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} peerDependencies: @@ -3461,6 +3493,18 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -3932,6 +3976,23 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/number': 1.1.0