Contact Modal 1
Contact ModalsText Align Center1 ColumnFormModal

Code
relume-contact-modal1.tsx
"use client";
import { useState } from "react";
import { useMediaQuery } from "@/hooks/use-media-query";
import { Button, type ButtonProps } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import { Sheet, SheetContent, SheetTrigger, SheetClose, SheetOverlay } from "@/components/ui/sheet";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
type Props = {
heading: string;
description: string;
button: ButtonProps;
};
export type ContactModal1Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const ContactModal1 = (props: ContactModal1Props) => {
const { heading, description, button } = {
...ContactModal1Defaults,
...props,
};
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [message, setMessage] = useState("");
const [acceptTerms, setAcceptTerms] = useState<boolean | "indeterminate">(false);
const isTablet = useMediaQuery("(max-width: 767px)");
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
console.log({ name, email, message, acceptTerms });
};
return (
<section className="px-[5%] py-16 md:py-24 lg:py-28">
<div className="container max-w-lg text-center">
<Sheet>
<SheetTrigger asChild>
<Button>Open modal</Button>
</SheetTrigger>
<SheetOverlay>{!isTablet && <SheetClose className="text-white" />}</SheetOverlay>
<SheetContent
side="bottom"
className="mx-auto h-screen w-full px-[5%] pt-16 pb-28 data-[state=closed]:slide-out-to-bottom-[120%] md:h-fit md:max-h-[80vh] md:w-[90%] md:px-12 md:pb-16 lg:w-full lg:max-w-lg lg:px-16"
>
{isTablet && <SheetClose />}
<div className="mb-8 text-center md:mb-10 lg:mb-12">
<h2 className="mb-3 text-h2 font-bold md:mb-4">{heading}</h2>
<p className="text-medium">{description}</p>
</div>
<form className="grid gap-6" onSubmit={handleSubmit}>
<div className="grid w-full grid-cols-1 items-center">
<Label htmlFor="name" className="mb-2">
Name
</Label>
<Input
type="text"
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
<div className="grid w-full grid-cols-1 items-center">
<Label htmlFor="email" className="mb-2">
Email
</Label>
<Input
type="email"
id="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="grid w-full grid-cols-1 items-center">
<Label htmlFor="message" className="mb-2">
Message
</Label>
<Textarea
id="message"
placeholder="Type your message..."
className="min-h-[11.25rem] overflow-auto"
value={message}
onChange={(e) => setMessage(e.target.value)}
/>
</div>
<div className="flex items-center">
<Checkbox
id="terms"
checked={acceptTerms}
onCheckedChange={setAcceptTerms}
className="mr-2"
/>
<Label htmlFor="terms" className="cursor-pointer gap-1 text-small">
I accept the
<a className="text-scheme-text underline" href="#">
Terms
</a>
</Label>
</div>
<div className="text-center">
<Button {...button}>{button.title}</Button>
</div>
</form>
</SheetContent>
</Sheet>
</div>
</section>
);
};
export const ContactModal1Defaults: Props = {
heading: "Contact us",
description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
button: { title: "Submit" },
};npm i @radix-ui/react-checkbox @radix-ui/react-dialog @radix-ui/react-label @radix-ui/react-radio-group @radix-ui/react-select @radix-ui/react-slot @radix-ui/react-switch class-variance-authority@0.7.1 clsx@^2.1.1 motion@^12.15.0 relume-icons@1.3.0 tailwind-merge@^2.2.2


