Files
dotter/resources/js/components/my/Contact.svelte
T
salam e687b4437b
linter / quality (push) Canceled after 0s
tests / ci (8.3) (push) Canceled after 0s
tests / ci (8.4) (push) Canceled after 0s
tests / ci (8.5) (push) Canceled after 0s
first commit
2026-10-06 18:53:03 +02:00

198 lines
7.4 KiB
Svelte

<script lang="ts">
import { Button } from '@/components/ui/button';
import {
Card,
CardHeader,
CardContent,
CardFooter,
} from '@/components/ui/card';
import { Textarea } from '@/components/ui/textarea';
import { Label } from '@/components/ui/label';
import { Input } from '@/components/ui/input';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import { AlertCircle, Building2, Phone, Mail, Clock } from 'lucide-svelte';
import * as Select from '@/components/ui/select/index.js';
interface ContactFormProps {
firstName: string;
lastName: string;
email: string;
subject: string;
message: string;
}
let contactForm: ContactFormProps = {
firstName: '',
lastName: '',
email: '',
subject: 'Web Development',
message: '',
};
let invalidInputForm = false;
function handleSubmit(event: SubmitEvent) {
event.preventDefault();
const { firstName, lastName, email, subject, message } = contactForm;
console.log(contactForm);
const mailToLink = `mailto:leomirandadev@gmail.com?subject=${subject}&body=Hello I am ${firstName} ${lastName}, my Email is ${email}. %0D%0A${message}`;
window.location.href = mailToLink;
}
const subjects = [
{ value: 'Web Development', label: 'Web Development' },
{ value: 'Mobile Development', label: 'Mobile Development' },
{ value: 'Figma Design', label: 'Figma Design' },
{ value: 'REST API', label: 'REST API' },
{ value: 'FullStack Project', label: 'FullStack Project' },
];
$: triggerContent =
subjects.find((s) => s.value === contactForm.subject)?.label ??
'Select a subject';
</script>
<section id="contact" class="container py-24 sm:py-32">
<section class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<div class="mb-4">
<h2 class="text-lg text-primary mb-2 tracking-wider">
Contact
</h2>
<h2 class="text-3xl md:text-4xl font-bold">Connect With Us</h2>
</div>
<p class="mb-8 text-muted-foreground lg:w-5/6">
Lorem ipsum dolor sit amet consectetur adipisicing elit.
Voluptatum ipsam sint enim exercitationem ex autem corrupti quas
tenetur
</p>
<div class="flex flex-col gap-4">
<div>
<div class="flex gap-2 mb-1">
<Building2 />
<div class="font-bold">Find Us</div>
</div>
<div>742 Evergreen Terrace, Springfield, IL 62704</div>
</div>
<div>
<div class="flex gap-2 mb-1">
<Phone />
<div class="font-bold">Call Us</div>
</div>
<div>+1 (619) 123-4567</div>
</div>
<div>
<div class="flex gap-2 mb-1">
<Mail />
<div class="font-bold">Mail Us</div>
</div>
<div>leomirandadev@gmail.com</div>
</div>
<div>
<div class="flex gap-2 mb-1">
<Clock />
<div class="font-bold">Visit Us</div>
</div>
<div>
<div>Monday - Friday</div>
<div>8AM - 4PM</div>
</div>
</div>
</div>
</div>
<!-- Form -->
<Card class="bg-muted/60 dark:bg-card">
<CardHeader class="text-primary text-2xl" />
<CardContent>
<form on:submit={handleSubmit} class="grid gap-4">
<div class="flex flex-col md:flex-row gap-8">
<div class="flex flex-col w-full gap-1.5">
<Label for="firstName">First Name</Label>
<Input
id="firstName"
type="text"
placeholder="Leopoldo"
value={contactForm.firstName}
/>
</div>
<div class="flex flex-col w-full gap-1.5">
<Label for="lastName">Last Name</Label>
<Input
id="lastName"
type="text"
placeholder="Miranda"
value={contactForm.lastName}
/>
</div>
</div>
<div class="flex flex-col gap-1.5">
<Label for="contactEmail">Email</Label>
<Input
id="contactEmail"
type="email"
placeholder="leomirandadev@gmail.com"
value={contactForm.email}
/>
</div>
<div class="flex flex-col gap-1.5">
<Label for="contactSubject">Subject</Label>
<Select.Root
type="single"
bind:value={contactForm.subject}
>
<Select.Trigger id="contactSubject" class="w-full">
{triggerContent}
</Select.Trigger>
<Select.Content>
<Select.Group>
{#each subjects as subject}
<Select.Item
value={subject.value}
label={subject.label}
>
{subject.label}
</Select.Item>
{/each}
</Select.Group>
</Select.Content>
</Select.Root>
</div>
<div class="flex flex-col gap-1.5">
<Label for="contactMessage">Message</Label>
<Textarea
id="contactMessage"
placeholder="Your message..."
rows={5}
bind:value={contactForm.message}
/>
</div>
{#if invalidInputForm}
<Alert variant="destructive">
<AlertCircle class="w-4 h-4" />
<AlertTitle>Error</AlertTitle>
<AlertDescription>
There is an error in the form. Please check your
input.
</AlertDescription>
</Alert>
{/if}
<Button class="mt-4">Send message</Button>
</form>
</CardContent>
<CardFooter />
</Card>
</section>
</section>