diff --git a/apps/website/app/contact/page.tsx b/apps/website/app/contact/page.tsx
index c37ed64..f821b43 100644
--- a/apps/website/app/contact/page.tsx
+++ b/apps/website/app/contact/page.tsx
@@ -1,147 +1,13 @@
"use client";
import { Container } from "@/components/Container";
-import { trackGAEvent } from "@/components/analitycs";
+import { ContactForm } from "@/components/ContactForm";
import AnimatedGridPattern from "@/components/ui/animated-grid-pattern";
-import { Button } from "@/components/ui/button";
-import { Input } from "@/components/ui/input";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
import { cn } from "@/lib/utils";
import { useState } from "react";
-interface ContactFormData {
- inquiryType: "" | "support" | "sales" | "other";
- deploymentType: "" | "cloud" | "self-hosted";
- firstName: string;
- lastName: string;
- email: string;
- company: string;
- message: string;
-}
-
export default function ContactPage() {
- const [isSubmitting, setIsSubmitting] = useState(false);
const [isSubmitted, setIsSubmitted] = useState(false);
- const [formData, setFormData] = useState({
- inquiryType: "",
- deploymentType: "",
- firstName: "",
- lastName: "",
- email: "",
- company: "",
- message: "",
- });
- const [errors, setErrors] = useState>({});
-
- const validateForm = (): boolean => {
- const newErrors: Record = {};
-
- if (!formData.inquiryType) {
- newErrors.inquiryType = "Please select what we can help you with";
- }
- if (formData.inquiryType === "support" && !formData.deploymentType) {
- newErrors.deploymentType = "Please select your deployment type";
- }
- if (!formData.firstName.trim()) {
- newErrors.firstName = "First name is required";
- }
- if (!formData.lastName.trim()) {
- newErrors.lastName = "Last name is required";
- }
- if (!formData.email.trim()) {
- newErrors.email = "Email is required";
- } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
- newErrors.email = "Please enter a valid email address";
- }
- if (!formData.company.trim()) {
- newErrors.company = "Company name is required";
- }
- if (!formData.message.trim()) {
- newErrors.message = "Message is required";
- }
-
- setErrors(newErrors);
- return Object.keys(newErrors).length === 0;
- };
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
-
- if (!validateForm()) {
- return;
- }
-
- // Prevent submission for self-hosted support requests
- if (
- formData.inquiryType === "support" &&
- formData.deploymentType === "self-hosted"
- ) {
- return;
- }
-
- setIsSubmitting(true);
-
- try {
- const response = await fetch("/api/contact", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(formData),
- });
-
- if (response.ok) {
- trackGAEvent({
- action: "Contact Form Submitted",
- category: "Contact",
- label: formData.inquiryType,
- });
-
- setFormData({
- inquiryType: "",
- deploymentType: "",
- firstName: "",
- lastName: "",
- email: "",
- company: "",
- message: "",
- });
- setErrors({});
- setIsSubmitted(true);
- } else {
- throw new Error("Failed to submit form");
- }
- } catch (error) {
- console.error("Error submitting form:", error);
- alert("There was an error sending your message. Please try again.");
- } finally {
- setIsSubmitting(false);
- }
- };
-
- const handleInputChange = (field: keyof ContactFormData, value: any) => {
- setFormData((prev) => {
- const updated = { ...prev, [field]: value };
- // Reset deploymentType when inquiryType changes and is not support
- if (field === "inquiryType" && value !== "support") {
- updated.deploymentType = "";
- }
- return updated;
- });
- if (errors[field]) {
- setErrors((prev) => {
- const newErrors = { ...prev };
- delete newErrors[field];
- return newErrors;
- });
- }
- };
if (isSubmitted) {
return (
@@ -156,9 +22,13 @@ export default function ContactPage() {
possible.
-
@@ -192,231 +62,9 @@ export default function ContactPage() {
-
+
+ setIsSubmitted(true)} />
+
diff --git a/apps/website/components/ContactForm.tsx b/apps/website/components/ContactForm.tsx
new file mode 100644
index 0000000..5348b0a
--- /dev/null
+++ b/apps/website/components/ContactForm.tsx
@@ -0,0 +1,421 @@
+"use client";
+
+import { trackGAEvent } from "@/components/analitycs";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { useState } from "react";
+
+interface ContactFormData {
+ inquiryType: "" | "support" | "sales" | "other";
+ deploymentType: "" | "cloud" | "self-hosted";
+ firstName: string;
+ lastName: string;
+ email: string;
+ company: string;
+ message: string;
+}
+
+interface ContactFormProps {
+ defaultInquiryType?: "" | "support" | "sales" | "other";
+ onSuccess?: () => void;
+ onCancel?: () => void;
+ showCancelButton?: boolean;
+ hideInquiryType?: boolean;
+}
+
+export function ContactForm({
+ defaultInquiryType = "",
+ onSuccess,
+ onCancel,
+ showCancelButton = false,
+ hideInquiryType = false,
+}: ContactFormProps) {
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [isSubmitted, setIsSubmitted] = useState(false);
+ const [formData, setFormData] = useState({
+ inquiryType: defaultInquiryType || "",
+ deploymentType: "",
+ firstName: "",
+ lastName: "",
+ email: "",
+ company: "",
+ message: "",
+ });
+ const [errors, setErrors] = useState>({});
+
+ const validateForm = (): boolean => {
+ const newErrors: Record = {};
+
+ if (!hideInquiryType && !formData.inquiryType) {
+ newErrors.inquiryType = "Please select what we can help you with";
+ }
+ if (formData.inquiryType === "support" && !formData.deploymentType) {
+ newErrors.deploymentType = "Please select your deployment type";
+ }
+ if (!formData.firstName.trim()) {
+ newErrors.firstName = "First name is required";
+ }
+ if (!formData.lastName.trim()) {
+ newErrors.lastName = "Last name is required";
+ }
+ if (!formData.email.trim()) {
+ newErrors.email = "Email is required";
+ } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
+ newErrors.email = "Please enter a valid email address";
+ }
+ if (!formData.company.trim()) {
+ newErrors.company = "Company name is required";
+ }
+ if (!formData.message.trim()) {
+ newErrors.message = "Message is required";
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!validateForm()) {
+ return;
+ }
+
+ // Prevent submission for self-hosted support requests
+ if (
+ formData.inquiryType === "support" &&
+ formData.deploymentType === "self-hosted"
+ ) {
+ return;
+ }
+
+ setIsSubmitting(true);
+
+ try {
+ const response = await fetch("/api/contact", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(formData),
+ });
+
+ if (response.ok) {
+ trackGAEvent({
+ action: "Contact Form Submitted",
+ category: "Contact",
+ label: formData.inquiryType,
+ });
+
+ setFormData({
+ inquiryType: defaultInquiryType || "",
+ deploymentType: "",
+ firstName: "",
+ lastName: "",
+ email: "",
+ company: "",
+ message: "",
+ });
+ setErrors({});
+ setIsSubmitted(true);
+ if (onSuccess) {
+ onSuccess();
+ }
+ } else {
+ throw new Error("Failed to submit form");
+ }
+ } catch (error) {
+ console.error("Error submitting form:", error);
+ alert("There was an error sending your message. Please try again.");
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ const handleInputChange = (field: keyof ContactFormData, value: any) => {
+ setFormData((prev) => {
+ const updated = { ...prev, [field]: value };
+ // Reset deploymentType when inquiryType changes and is not support
+ if (field === "inquiryType" && value !== "support") {
+ updated.deploymentType = "";
+ }
+ return updated;
+ });
+ if (errors[field]) {
+ setErrors((prev) => {
+ const newErrors = { ...prev };
+ delete newErrors[field];
+ return newErrors;
+ });
+ }
+ };
+
+ if (isSubmitted) {
+ return (
+
+
+ Thank you for contacting us!
+
+
+ We've received your message and will get back to you as soon as
+ possible.
+
+ {onCancel && (
+
+
+ Close
+
+
+ )}
+
+ );
+ }
+
+ return (
+
+ );
+}
+
diff --git a/apps/website/components/ContactFormModal.tsx b/apps/website/components/ContactFormModal.tsx
new file mode 100644
index 0000000..ab5186d
--- /dev/null
+++ b/apps/website/components/ContactFormModal.tsx
@@ -0,0 +1,53 @@
+"use client";
+
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog";
+import { ContactForm } from "./ContactForm";
+
+interface ContactFormModalProps {
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+ defaultInquiryType?: "support" | "sales" | "other";
+}
+
+export function ContactFormModal({
+ open,
+ onOpenChange,
+ defaultInquiryType = "sales",
+}: ContactFormModalProps) {
+ const handleSuccess = () => {
+ // Close modal after a short delay to show success message
+ setTimeout(() => {
+ onOpenChange(false);
+ }, 2000);
+ };
+
+ return (
+
+ );
+}
+
diff --git a/apps/website/components/pricing.tsx b/apps/website/components/pricing.tsx
index def4bb1..7e77c61 100644
--- a/apps/website/components/pricing.tsx
+++ b/apps/website/components/pricing.tsx
@@ -15,7 +15,9 @@ import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { Container } from "./Container";
+import { ContactFormModal } from "./ContactFormModal";
import { Badge } from "./ui/badge";
+import AnimatedGradientText from "./ui/animated-gradient-text";
import { Button, buttonVariants } from "./ui/button";
import HeroVideoDialog from "./ui/hero-video-dialog";
import { NumberInput } from "./ui/input";
@@ -89,6 +91,7 @@ export function Pricing() {
const featured = true;
const [openVideo, setOpenVideo] = useState(false);
+ const [openContactModal, setOpenContactModal] = useState(false);
return (
Annual
-
-
+
+
+
Free
@@ -366,10 +370,61 @@ export function Pricing() {
+
+
+
+
+
+ Enterprise
+
+
+ Premium ✨
+
+
+
+
+ Enterprise Support & Services
+
+
+ Custom solutions and dedicated support for your organization.
+
+
+
+ {[
+ "SLA Guarantees / Priority Support",
+ "Aditional Security & Governance",
+ "Custom Solutions",
+ "Private Labeling",
+ ].map((feature) => (
+ -
+
+ {feature}
+
+ ))}
+
+
+ setOpenContactModal(true)}
+ className="w-full"
+ >
+ Get in touch
+
+
+
+
+
);
}
diff --git a/apps/website/package.json b/apps/website/package.json
index 8832ea9..d0ff38e 100644
--- a/apps/website/package.json
+++ b/apps/website/package.json
@@ -26,6 +26,7 @@
"@radix-ui/react-tooltip": "^1.1.3",
"@tabler/icons-react": "3.21.0",
"@tryghost/content-api": "^1.11.21",
+ "@radix-ui/react-dialog":"1.1.15",
"@types/node": "20.4.6",
"@types/turndown": "^5.0.5",
"autoprefixer": "^10.4.12",
diff --git a/apps/website/tsconfig.json b/apps/website/tsconfig.json
index 52ff47d..ad63ce6 100644
--- a/apps/website/tsconfig.json
+++ b/apps/website/tsconfig.json
@@ -1,28 +1,42 @@
{
- "compilerOptions": {
- "target": "es6",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": ["./*"]
- }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
+ "compilerOptions": {
+ "target": "es6",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ }
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4d62eb4..2c7fd81 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -121,6 +121,9 @@ importers:
'@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-dialog':
+ specifier: 1.1.15
+ version: 1.1.15(@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)
@@ -5321,6 +5324,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.5)(react@19.2.1)':
dependencies:
react: 19.2.1
@@ -5339,12 +5348,40 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-context@1.1.2(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-context@1.1.2(@types/react@18.3.5)(react@19.2.1)':
dependencies:
react: 19.2.1
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-dialog@1.1.15(@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/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@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-focus-guards': 1.1.3(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.1.7(@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-id': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-portal': 1.1.9(@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-presence': 1.1.5(@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.1.3(@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-slot': 1.2.3(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.5)(react@18.2.0)
+ aria-hidden: 1.2.4
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.7.2(@types/react@18.3.5)(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.5
+ '@types/react-dom': 18.3.0
+
'@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -5405,6 +5442,19 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-dismissable-layer@1.1.11(@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/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.1.3(@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.1(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@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-dismissable-layer@1.1.11(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -5439,6 +5489,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.5)(react@19.2.1)':
dependencies:
react: 19.2.1
@@ -5456,6 +5512,17 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-focus-scope@1.1.7(@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-compose-refs': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.1.3(@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.1(@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-focus-scope@1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.2.1)
@@ -5474,6 +5541,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-id@1.1.1(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-id@1.1.1(@types/react@18.3.5)(react@19.2.1)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@19.2.1)
@@ -5608,6 +5682,16 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-portal@1.1.9(@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-primitive': 2.1.3(@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-layout-effect': 1.1.1(@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-portal@1.1.9(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@@ -5628,6 +5712,16 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-presence@1.1.5(@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-compose-refs': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@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-presence@1.1.5(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.2.1)
@@ -5647,6 +5741,15 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-primitive@2.1.3(@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-slot': 1.2.3(@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-primitive@2.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)':
dependencies:
'@radix-ui/react-slot': 1.2.3(@types/react@18.3.5)(react@19.2.1)
@@ -5789,6 +5892,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-slot@1.2.3(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-slot@1.2.3(@types/react@18.3.5)(react@19.2.1)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.2.1)
@@ -5876,6 +5986,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.5)(react@19.2.1)':
dependencies:
react: 19.2.1
@@ -5889,6 +6005,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.5)(react@19.2.1)':
dependencies:
'@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.5)(react@19.2.1)
@@ -5897,6 +6021,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.5)(react@19.2.1)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@19.2.1)
@@ -5911,6 +6042,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.5)(react@19.2.1)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.5)(react@19.2.1)
@@ -5924,6 +6062,12 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.5)(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+ optionalDependencies:
+ '@types/react': 18.3.5
+
'@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.5)(react@19.2.1)':
dependencies:
react: 19.2.1
@@ -8228,6 +8372,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ react-remove-scroll-bar@2.3.8(@types/react@18.3.5)(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ react-style-singleton: 2.2.3(@types/react@18.3.5)(react@18.2.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.5
+
react-remove-scroll-bar@2.3.8(@types/react@18.3.5)(react@19.2.1):
dependencies:
react: 19.2.1
@@ -8247,6 +8399,17 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ react-remove-scroll@2.7.2(@types/react@18.3.5)(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ react-remove-scroll-bar: 2.3.8(@types/react@18.3.5)(react@18.2.0)
+ react-style-singleton: 2.2.3(@types/react@18.3.5)(react@18.2.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@18.3.5)(react@18.2.0)
+ use-sidecar: 1.1.3(@types/react@18.3.5)(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.5
+
react-remove-scroll@2.7.2(@types/react@18.3.5)(react@19.2.1):
dependencies:
react: 19.2.1
@@ -8267,6 +8430,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ react-style-singleton@2.2.3(@types/react@18.3.5)(react@18.2.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 18.2.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.5
+
react-style-singleton@2.2.3(@types/react@18.3.5)(react@19.2.1):
dependencies:
get-nonce: 1.0.1
@@ -8827,6 +8998,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ use-callback-ref@1.3.3(@types/react@18.3.5)(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.5
+
use-callback-ref@1.3.3(@types/react@18.3.5)(react@19.2.1):
dependencies:
react: 19.2.1
@@ -8842,6 +9020,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.5
+ use-sidecar@1.1.3(@types/react@18.3.5)(react@18.2.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 18.2.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.5
+
use-sidecar@1.1.3(@types/react@18.3.5)(react@19.2.1):
dependencies:
detect-node-es: 1.1.0