Merge version_19_1782161736578 into main #21
@@ -4,6 +4,62 @@ import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
|
||||
import { Outlet } from 'react-router-dom';
|
||||
import { StyleProvider } from "@/components/ui/StyleProvider";
|
||||
import Input from "@/components/ui/Input";
|
||||
import Label from "@/components/ui/Label";
|
||||
import Textarea from "@/components/ui/Textarea";
|
||||
|
||||
const ContactFormSection = () => (
|
||||
<section id="anfrage" className="py-20 bg-background">
|
||||
<div className="w-content-width mx-auto max-w-3xl">
|
||||
<div className="card p-8 md:p-12 rounded-lg">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-2">Angebot anfordern</h2>
|
||||
<p className="text-accent mb-8">Füllen Sie das Formular aus, um ein unverbindliches Angebot zu erhalten.</p>
|
||||
<form name="Anfrage" method="POST" data-webild-form="true" data-email="kontakt@rojtec.de" className="space-y-6">
|
||||
<input type="hidden" name="form-to" value="kontakt@rojtec.de" />
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="vorname">Vorname *</Label>
|
||||
<Input id="vorname" name="Vorname" required placeholder="Max" />
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="nachname">Nachname *</Label>
|
||||
<Input id="nachname" name="Nachname" required placeholder="Mustermann" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="email">E-Mail *</Label>
|
||||
<Input id="email" name="Email" type="email" required placeholder="max@beispiel.de" />
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="telefon">Telefonnummer *</Label>
|
||||
<Input id="telefon" name="Telefon" type="tel" required placeholder="+49 123 456789" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="adresse">Adresse</Label>
|
||||
<Input id="adresse" name="Adresse" placeholder="Musterstraße 1, 12345 Stadt" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="geraet">Gerätetyp / Handymodell</Label>
|
||||
<Input id="geraet" name="Geraetetyp" placeholder="z.B. iPhone 13 Pro" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="problem">Beschreibung des Problems / Fehler</Label>
|
||||
<Textarea id="problem" name="Problem" rows={4} placeholder="Bitte beschreiben Sie das Problem..." />
|
||||
</div>
|
||||
|
||||
<button type="submit" className="primary-button w-full py-3 rounded font-medium">Anfrage senden</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
export default function Layout() {
|
||||
const navItems = [
|
||||
@@ -47,12 +103,13 @@ export default function Layout() {
|
||||
logo="RojTec"
|
||||
ctaButton={{
|
||||
text: "Angebot anfordern",
|
||||
href: "#contact",
|
||||
href: "#anfrage",
|
||||
}}
|
||||
navItems={navItems} />
|
||||
</SectionErrorBoundary>
|
||||
<main className="flex-grow">
|
||||
<Outlet />
|
||||
<ContactFormSection />
|
||||
</main>
|
||||
<SectionErrorBoundary name="footer">
|
||||
<FooterSimpleMedia
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import FeaturesAlternatingSplit from "@/components/sections/features/FeaturesAlternatingSplit";
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
export default function VorOrtServicePage() {
|
||||
import React from 'react';
|
||||
import HeroSplitSection from './VorOrtServicePage/sections/HeroSplit';
|
||||
import FeaturesAlternatingSplitSection from './VorOrtServicePage/sections/FeaturesAlternatingSplit';
|
||||
import ContactCtaSection from './VorOrtServicePage/sections/ContactCta';
|
||||
|
||||
export default function VorOrtServicePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div data-webild-section="HeroSplit"><section aria-label="Hero section" className="relative flex items-center h-fit md:h-svh pt-25 pb-20 md:py-0"><HeroBackgroundSlot /><div className="flex flex-col md:flex-row items-center gap-12 md:gap-20 w-content-width mx-auto"><div className="w-full md:w-1/2"><div className="flex flex-col items-center md:items-start gap-3"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Vor-Ort-Service</p></div><TextAnimation text="Ihr Vor-Ort-Service für smarte Technik" variant="slide-up" gradientText={true} tag="h1" className="text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center md:text-left text-balance" /><TextAnimation text="Verlassen Sie sich auf deutsche Qualität und Expertise. Wir installieren, warten und reparieren Ihre Smart-Home-Systeme direkt bei Ihnen vor Ort." variant="slide-up" gradientText={false} tag="p" className="md:max-w-8/10 text-lg md:text-xl leading-snug text-center md:text-left text-balance" /><div className="flex flex-wrap max-md:justify-center gap-3 mt-2 md:mt-3"><Button text="Angebot anfordern" href="/kontakt" variant="primary" /><Button text="Mehr erfahren" href="#details" variant="secondary" animationDelay={0.1} /></div></div></div><ScrollReveal variant="fade-blur" delay={0.2} className="w-full md:w-1/2 h-100 md:h-[65vh] md:max-h-[75svh] p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden"><ImageOrVideo imageSrc="https://img.freepik.com/free-photo/electrician-builder-work-with-tools-cable-connection_169016-5381.jpg" /></ScrollReveal></div></section></div>
|
||||
<div data-webild-section="FeaturesAlternatingSplit"><FeaturesAlternatingSplit
|
||||
tag="Vor-Ort-Service"
|
||||
title="Professionelle Hilfe direkt bei Ihnen"
|
||||
description="Unsere Experten kommen zu Ihnen nach Hause oder ins Unternehmen, um technische Probleme schnell und zuverlässig zu lösen."
|
||||
primaryButton={{"text":"Angebot anfordern","href":"/kontakt"}}
|
||||
items={[{"title":"Smart Home Einrichtung","description":"Wir installieren und konfigurieren Ihre Smart-Home-Systeme fachgerecht, damit alles reibungslos funktioniert.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/smart-home-control-panel-tablet-screen_53876-124628.jpg"},{"title":"Netzwerk-Optimierung","description":"Schluss mit WLAN-Abbrüchen. Wir analysieren Ihr Netzwerk und sorgen für eine stabile Verbindung im ganzen Haus.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/close-up-man-holding-router_23-2148300262.jpg"},{"title":"Wartung & Reparatur","description":"Unsere Techniker beheben Störungen an Ihren technischen Geräten schnell und zuverlässig direkt bei Ihnen vor Ort.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/male-electrician-works-with-switchboard-electrical-connecting-wiring_169016-15088.jpg"}]}
|
||||
/></div>
|
||||
<div data-webild-section="ContactCta"><section aria-label="Contact section" className="py-20"><div className="w-content-width mx-auto"><ScrollReveal variant="fade-blur"><div className="flex flex-col items-center gap-8 md:gap-10 py-20 px-8 rounded card"><div className="flex flex-col items-center gap-2"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Kontakt</p></div><TextAnimation text="Benötigen Sie professionelle Unterstützung direkt bei Ihnen vor Ort? Fordern Sie jetzt ein unverbindliches Angebot an." variant="fade" gradientText={true} tag="h2" className="md:max-w-8/10 text-5xl 2xl:text-6xl leading-[1.15] font-semibold text-center text-balance" /><div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3"><Button text="Angebot anfordern" href="/kontakt" variant="primary" /><Button text="Rückruf vereinbaren" href="/kontakt#rueckruf" variant="secondary" animationDelay={0.1} /></div></div></div></ScrollReveal></div></section></div>
|
||||
<>
|
||||
<HeroSplitSection />
|
||||
<FeaturesAlternatingSplitSection />
|
||||
<ContactCtaSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
13
src/pages/VorOrtServicePage/sections/ContactCta.tsx
Normal file
13
src/pages/VorOrtServicePage/sections/ContactCta.tsx
Normal file
@@ -0,0 +1,13 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "ContactCta" section.
|
||||
|
||||
import React from 'react';
|
||||
import Button from "@/components/ui/Button";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
|
||||
export default function ContactCtaSection(): React.JSX.Element {
|
||||
return (
|
||||
<div data-webild-section="ContactCta"><section aria-label="Contact section" className="py-20"><div className="w-content-width mx-auto"><ScrollReveal variant="fade-blur"><div className="flex flex-col items-center gap-8 md:gap-10 py-20 px-8 rounded card"><div className="flex flex-col items-center gap-2"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Kontakt</p></div><TextAnimation text="Benötigen Sie professionelle Unterstützung direkt bei Ihnen vor Ort? Fordern Sie jetzt ein unverbindliches Angebot an." variant="fade" gradientText={true} tag="h2" className="md:max-w-8/10 text-5xl 2xl:text-6xl leading-[1.15] font-semibold text-center text-balance" /><div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3"><Button text="Angebot anfordern" href="#anfrage" variant="primary" /><Button text="Rückruf vereinbaren" href="/kontakt#rueckruf" variant="secondary" animationDelay={0.1} /></div></div></div></ScrollReveal></div></section></div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "FeaturesAlternatingSplit" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesAlternatingSplit from "@/components/sections/features/FeaturesAlternatingSplit";
|
||||
|
||||
export default function FeaturesAlternatingSplitSection(): React.JSX.Element {
|
||||
return (
|
||||
<div data-webild-section="FeaturesAlternatingSplit"><FeaturesAlternatingSplit
|
||||
tag="Vor-Ort-Service"
|
||||
title="Professionelle Hilfe direkt bei Ihnen"
|
||||
description="Unsere Experten kommen zu Ihnen nach Hause oder ins Unternehmen, um technische Probleme schnell und zuverlässig zu lösen."
|
||||
primaryButton={{"text":"Angebot anfordern","href":"/kontakt"}}
|
||||
items={[{"title":"Smart Home Einrichtung","description":"Wir installieren und konfigurieren Ihre Smart-Home-Systeme fachgerecht, damit alles reibungslos funktioniert.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/smart-home-control-panel-tablet-screen_53876-124628.jpg"},{"title":"Netzwerk-Optimierung","description":"Schluss mit WLAN-Abbrüchen. Wir analysieren Ihr Netzwerk und sorgen für eine stabile Verbindung im ganzen Haus.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/close-up-man-holding-router_23-2148300262.jpg"},{"title":"Wartung & Reparatur","description":"Unsere Techniker beheben Störungen an Ihren technischen Geräten schnell und zuverlässig direkt bei Ihnen vor Ort.","primaryButton":{"text":"Angebot anfordern","href":"/kontakt"},"imageSrc":"https://img.freepik.com/free-photo/male-electrician-works-with-switchboard-electrical-connecting-wiring_169016-15088.jpg"}]}
|
||||
/></div>
|
||||
);
|
||||
}
|
||||
15
src/pages/VorOrtServicePage/sections/HeroSplit.tsx
Normal file
15
src/pages/VorOrtServicePage/sections/HeroSplit.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "HeroSplit" section.
|
||||
|
||||
import React from 'react';
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
|
||||
export default function HeroSplitSection(): React.JSX.Element {
|
||||
return (
|
||||
<div data-webild-section="HeroSplit"><section aria-label="Hero section" className="relative flex items-center h-fit md:h-svh pt-25 pb-20 md:py-0"><HeroBackgroundSlot /><div className="flex flex-col md:flex-row items-center gap-12 md:gap-20 w-content-width mx-auto"><div className="w-full md:w-1/2"><div className="flex flex-col items-center md:items-start gap-3"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Vor-Ort-Service</p></div><TextAnimation text="Ihr Vor-Ort-Service für smarte Technik" variant="slide-up" gradientText={true} tag="h1" className="text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center md:text-left text-balance" /><TextAnimation text="Verlassen Sie sich auf deutsche Qualität und Expertise. Wir installieren, warten und reparieren Ihre Smart-Home-Systeme direkt bei Ihnen vor Ort." variant="slide-up" gradientText={false} tag="p" className="md:max-w-8/10 text-lg md:text-xl leading-snug text-center md:text-left text-balance" /><div className="flex flex-wrap max-md:justify-center gap-3 mt-2 md:mt-3"><Button text="Angebot anfordern" href="/kontakt" variant="primary" /><Button text="Mehr erfahren" href="#details" variant="secondary" animationDelay={0.1} /></div></div></div><ScrollReveal variant="fade-blur" delay={0.2} className="w-full md:w-1/2 h-100 md:h-[65vh] md:max-h-[75svh] p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden"><ImageOrVideo imageSrc="https://img.freepik.com/free-photo/electrician-builder-work-with-tools-cable-connection_169016-5381.jpg" /></ScrollReveal></div></section></div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user