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}
+
+
+
+

+
+
+
+ {entry.changes.map((change, changeIndex) => (
+ -
+ {change}
+
+ ))}
+
+
+
+ ))}
+
+
+
+ );
+};
+
+// export default function Changelog() {
+// return (
+//
+//
+//
+//
+//
+//
Changelog
+//
+// {changelogEntries.map((entry, index) => (
+//
+//
+//
+// {entry.date}
+//
+//
{entry.title}
+//
+//
+//
+//

+//
+
+//
+// {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 (
+
+ );
+ })}
+
+ )}
+
+ {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 (
+
+ );
+ })}
+
+ )}
+
+ {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 (
+
+ );
+ })}
+
+ )}
+
+ );
+ })}
+
+
+ );
+});
+
+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