larpaso-website/src/pages/index.astro
Lara f000d64cca Design round: logo colours, own fonts, blob shapes, broken grid
Prototype for review, not deployed. Newsreader + Schibsted Grotesk
(served locally, italic included), palette from the logo (petrol, sage,
sand, rose) instead of gold, the logo blob as a recurring shape, petrol
bands with a wave edge, margin-note section labels and uneven columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:09:28 +02:00

1068 lines
26 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
import Layout from '../layouts/Layout.astro';
import Devices from '../components/Devices.astro';
import Zoom from '../components/Zoom.astro';
import Kicker from '../components/Kicker.astro';
import { site, rich } from '../lib/content';
const { hero, warum, preis, highlights, leistungen, mappe, ablauf, about, faq, kontakt } = site;
// Großansicht: zu jedem Bild die ganze Seite aus der Mappe suchen
type MappeItem = (typeof mappe.items)[number];
const zoomFor = (item?: MappeItem) =>
item && !item.nameHidden && (item.fullImage || item.fullMobileImage)
? { title: item.titel, desktop: item.fullImage, mobile: item.fullMobileImage }
: undefined;
const findItem = (src: string) =>
mappe.items.find((i) => src && (i.image === src || i.mobileImage === src));
---
<Layout title="Startseite">
<!-- Hero -->
<section class="section hero">
<div class="container hero-grid">
<div class="hero-copy">
<Kicker text={hero.eyebrow} />
<h1>{hero.titleBefore}<em>{hero.titleEmphasis}</em>{hero.titleAfter}</h1>
<p class="text-lead" set:html={rich(hero.lead)} />
<div class="hero-actions">
<a class="btn btn-primary" href="#kontakt">{hero.ctaLabel}</a>
{hero.secondaryLabel && (
<a class="btn btn-secondary" href="#arbeiten">{hero.secondaryLabel}</a>
)}
</div>
</div>
<div class="hero-visual">
<span class="hero-fleck" aria-hidden="true"></span>
{hero.visual.customImage ? (
<img class="hero-visual-image" src={hero.visual.customImage} alt="" loading="lazy" />
) : (
<Devices
screen={hero.visual.laptop}
phone={hero.visual.phone}
eager
screenZoom={zoomFor(findItem(hero.visual.laptop))}
phoneZoom={zoomFor(findItem(hero.visual.phone))}
/>
)}
</div>
</div>
</section>
<!-- Preis / Startangebot -->
<section id="preis" class="section-tight section-dark">
<div class="container price-grid">
<div class="price-main">
<Kicker text={preis.eyebrow} />
<h2>{preis.title}</h2>
<p class="price-tag"><span class="price-amount">{preis.amount}</span> {preis.amountNote}</p>
<p class="text-lead" set:html={rich(preis.lead)} />
<div class="price-progress" aria-hidden="true">
<span></span><span></span><span></span>
</div>
<p class="price-note">{preis.slotsNote}</p>
<ul class="price-list">
{preis.features.map((feature) => (
<li class={feature.excluded ? 'price-list-excluded' : undefined}>{feature.text}</li>
))}
</ul>
</div>
<aside class="price-aside card">
<h3>{preis.asideTitle}</h3>
<p set:html={rich(preis.asideParagraph1)} />
<p set:html={rich(preis.asideParagraph2)} />
<a class="btn btn-primary" href="#kontakt">{preis.ctaLabel}</a>
</aside>
</div>
</section>
<!-- Warum uns unterscheidet -->
<section id="warum" class="section section-warum">
<div class="container split">
<Kicker text={warum.eyebrow} />
<h2>{warum.title}</h2>
<p class="text-lead" set:html={rich(warum.lead)} />
<div class="grid grid-3 differentiators">
{highlights.map((item) => (
<div class="differentiator">
<span class="roman">{item.num}</span>
<h3>{item.title}</h3>
<p>{item.text}</p>
</div>
))}
</div>
<div class="readability">
<h3>{warum.readability.title}</h3>
<p class="text-lead" set:html={rich(warum.readability.lead)} />
{warum.readability.customImage ? (
<img class="readability-image" src={warum.readability.customImage} alt="" loading="lazy" />
) : (
<div class="readability-hours">
<div class="hours-card">
<h4>{warum.readability.hoursTitle}</h4>
{warum.readability.hoursRows.map((row) => (
<div class="hours-row">
<span>{row.day}</span><span>{row.time}</span>
</div>
))}
</div>
</div>
)}
</div>
</div>
</section>
<!-- Leistungen -->
<section id="leistungen" class="section section-leistungen tint-sand">
<div class="container split">
<Kicker text={leistungen.eyebrow} />
<h2>{leistungen.title}</h2>
<p class="text-lead" set:html={rich(leistungen.lead)} />
<ul class="leistungen-list">
{leistungen.items.map((item) => (
<li>
<span class="leistungen-num">{item.num}</span>
<div>
<h3>{item.title}</h3>
<p>{item.text}</p>
</div>
</li>
))}
</ul>
<div class="nicht-machen">
<h3>{leistungen.nichtMachenTitle}</h3>
<div class="grid grid-2">
{leistungen.nichtMachen.map((text) => (
<p class="nicht-machen-item">{text}</p>
))}
</div>
</div>
</div>
</section>
<!-- Mappe / Arbeiten -->
<section id="arbeiten" class="section section-arbeiten">
<div class="container split">
<Kicker text={mappe.eyebrow} />
<h2>{mappe.title}</h2>
<div class="mappe-grid">
{mappe.items.map((item) => (
<article class="mappe-item">
{item.image ? (
<div class="mappe-devices">
<Devices
screen={item.image}
video={item.video}
phone={item.mobileImage}
alt={item.titel || item.kategorie}
screenZoom={zoomFor(item)}
phoneZoom={zoomFor(item)}
/>
</div>
) : (
<div class="mappe-shot">
<span>Bildschirmfoto <span class="placeholder">einsetzen</span></span>
</div>
)}
<p class="mappe-kategorie">{item.kategorie}</p>
<h3>{item.nameHidden ? <span class="placeholder">[Studio — erst nach Freigabe zeigen]</span> : item.titel}</h3>
{item.aufgabe ? (
<dl class="mappe-fall">
<dt>Die Aufgabe</dt>
<dd>{item.aufgabe}</dd>
<dt>Unsere Lösung</dt>
<dd>{item.text}</dd>
</dl>
) : (
<p>{item.text}</p>
)}
</article>
))}
</div>
</div>
</section>
<!-- Ablauf -->
<section id="ablauf" class="section section-ablauf tint-salbei">
<div class="container split">
<Kicker text={ablauf.eyebrow} />
<h2>{ablauf.title}</h2>
<div class="ablauf-list">
{ablauf.steps.map((step) => (
<div class="ablauf-step">
<span class="ablauf-num">{step.num}</span>
<div class="ablauf-body">
<h3>{step.title}</h3>
<p>{step.text}</p>
</div>
{step.dauer && <span class="ablauf-dauer">{step.dauer}</span>}
</div>
))}
</div>
</div>
</section>
<!-- Über uns -->
<section class="section about section-about tint-rose">
<div class="container about-grid">
{about.photo ? (
<div class="about-photo about-photo-image">
<img src={about.photo} alt="Lara und Pascal" loading="lazy" />
</div>
) : (
<div class="about-photo">
<span>
Foto von Lara und Pascal <span class="placeholder">einsetzen</span><br />
<small>zusammen, hochkant, echtes Licht</small>
</span>
</div>
)}
<div class="about-copy">
<Kicker text={about.eyebrow} />
<h2>{about.title}</h2>
<blockquote class="about-quote"><p>{about.quote}</p></blockquote>
{about.paragraphs.map((paragraph) => (
<p set:html={rich(paragraph)} />
))}
</div>
</div>
</section>
<!-- FAQ -->
<section class="section faq">
<div class="container split">
<Kicker text={faq.eyebrow} />
<h2>{faq.title}</h2>
<div class="faq-list">
{faq.items.map((item) => (
<details class="faq-item" name="faq">
<summary>
{item.question}
<span class="faq-icon" aria-hidden="true">+</span>
</summary>
<p class={item.answer ? undefined : 'placeholder'}>
{item.answer || '[Antwort noch zu ergänzen]'}
</p>
</details>
))}
</div>
</div>
</section>
<!-- Kontakt -->
<section id="kontakt" class="section-tight section-dark contact">
<div class="container contact-grid">
<div class="contact-intro">
<Kicker text={kontakt.eyebrow} />
<h2>{kontakt.title}</h2>
<p class="text-lead" set:html={rich(kontakt.lead)} />
<div class="contact-detail">
<p class="contact-label">Lieber anrufen</p>
<p class={kontakt.phone ? 'contact-phone' : 'placeholder contact-phone'}>
{kontakt.phone || '[Telefonnummer eintragen]'}
</p>
<p class={kontakt.hours ? 'contact-hours' : 'placeholder contact-hours'}>
{kontakt.hours || '[Erreichbarkeit eintragen, z. B. Mo–Fr 9–18 Uhr]'}
</p>
</div>
<div class="contact-detail">
<p class="contact-label">Oder direkt schreiben</p>
<p class="contact-email"><a href={`mailto:${kontakt.email}`}>{kontakt.email}</a></p>
<p class="contact-hint">Antwort in der Regel am selben Tag.</p>
</div>
<div class="contact-detail">
<p class="contact-label">Wie wir arbeiten</p>
<p class={kontakt.howWeWork ? undefined : 'placeholder'}>
{kontakt.howWeWork || '[Wie wir arbeiten — noch zu ergänzen]'}
</p>
</div>
</div>
<form class="contact-form card" aria-label="Kontaktformular" id="contact-form">
<div class="form-field">
<label for="name">Ihr Name</label>
<input type="text" id="name" name="name" placeholder="Vor- und Nachname" required />
</div>
<div class="form-field">
<label for="betrieb">Betrieb</label>
<input type="text" id="betrieb" name="betrieb" placeholder="Wie heißt Ihr Laden?" />
</div>
<div class="form-field">
<label for="telefon">Telefon</label>
<input type="tel" id="telefon" name="telefon" placeholder="Für den Rückruf" />
</div>
<div class="form-field">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" placeholder="name@betrieb.de" required />
</div>
<div class="form-field">
<label for="message">Worum geht es?</label>
<textarea
id="message"
name="message"
rows="5"
placeholder="Zwei, drei Sätze reichen: Was machen Sie, und was stört Sie an Ihrer jetzigen Seite? Wenn Sie schon eine haben, gern die Adresse dazu."
></textarea>
</div>
<button type="submit" class="btn btn-primary form-submit">Anfrage abschicken</button>
<p class="form-note">
Das Formular öffnet Ihr E-Mail-Programm mit fertig ausgefülltem Text. Es geht nichts an
Dritte. Wie wir mit Ihren Angaben umgehen, steht in der{' '}
<a href="/datenschutz">Datenschutzerklärung</a>.
</p>
</form>
</div>
</section>
<script define:vars={{ contactEmail: kontakt.email }}>
const form = document.getElementById('contact-form');
form?.addEventListener('submit', (event) => {
event.preventDefault();
const data = new FormData(form);
const name = String(data.get('name') || '');
const betrieb = String(data.get('betrieb') || '');
const telefon = String(data.get('telefon') || '');
const email = String(data.get('email') || '');
const message = String(data.get('message') || '');
const bodyLines = [
`Name: ${name}`,
betrieb && `Betrieb: ${betrieb}`,
telefon && `Telefon: ${telefon}`,
email && `E-Mail: ${email}`,
'',
message,
].filter(Boolean);
const subject = encodeURIComponent(`Projektanfrage${betrieb ? ` – ${betrieb}` : ''}`);
const body = encodeURIComponent(bodyLines.join('\n'));
window.location.href = `mailto:${contactEmail}?subject=${subject}&body=${body}`;
});
</script>
<Zoom />
</Layout>
<style>
/* Hero */
.hero {
overflow: hidden;
}
.hero-grid {
position: relative;
isolation: isolate;
display: grid;
grid-template-columns: 1.15fr 0.85fr;
gap: var(--space-8);
align-items: center;
}
.hero-copy {
max-width: 38rem;
}
.hero h1 {
font-size: clamp(2.8rem, 6.2vw, 5.4rem);
line-height: 1.02;
letter-spacing: -0.035em;
font-weight: 400;
max-width: none;
}
.hero-visual {
position: relative;
}
/* Die Pille aus dem Logo, groß und schräg hinter den Geräten */
.hero-fleck {
position: absolute;
z-index: -1;
inset: -14% -30% -8% -12%;
background: url('/form/pille.svg') center / 100% 100% no-repeat;
transform: rotate(-8deg);
opacity: 0.85;
}
.hero h1 em {
color: var(--color-accent);
font-style: italic;
}
.hero-actions {
margin-top: var(--space-6);
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
}
.hero-visual-image {
width: 100%;
border-radius: var(--radius-md);
border: 1px solid var(--color-border);
}
/* Preis */
.price-grid {
display: grid;
grid-template-columns: 1.4fr 1fr;
gap: var(--space-8);
align-items: start;
}
.price-tag {
margin: var(--space-4) 0;
}
.price-tag {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 0 var(--space-4);
}
.price-amount {
font-family: var(--font-serif);
font-size: clamp(5rem, 13vw, 10rem);
line-height: 0.9;
letter-spacing: -0.05em;
color: var(--color-accent);
font-weight: 400;
font-style: italic;
}
.price-progress {
display: flex;
gap: var(--space-2);
margin: var(--space-5) 0 var(--space-3);
}
.price-progress span {
height: 5px;
width: 3rem;
background: var(--color-accent);
border-radius: 999px;
}
.price-note {
color: var(--color-text-muted);
font-size: var(--font-size-sm);
}
.price-list {
list-style: none;
margin-top: var(--space-5);
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.price-list li {
padding-left: var(--space-5);
position: relative;
font-size: var(--font-size-sm);
color: var(--color-text);
}
.price-list li::before {
content: '';
position: absolute;
left: 0;
top: 0.4em;
width: 11px;
height: 10px;
background: var(--color-accent);
-webkit-mask: url('/form/fleck-maske.svg') center / 100% 100% no-repeat;
mask: url('/form/fleck-maske.svg') center / 100% 100% no-repeat;
}
.price-list-excluded {
color: var(--color-text-muted);
}
.price-list-excluded::before {
background: var(--color-text-muted);
opacity: 0.45;
}
.price-aside {
position: sticky;
top: 6rem;
}
.price-aside p {
font-size: var(--font-size-sm);
}
/* Warum / Differentiators */
.section-warum .differentiators,
.section-warum .readability {
grid-column: 1 / -1;
}
.differentiators {
margin-top: var(--space-8);
grid-template-columns: 1.35fr 1fr 0.9fr;
gap: var(--space-7);
align-items: start;
}
.differentiator:nth-child(2) {
margin-top: var(--space-8);
}
.differentiator:nth-child(3) {
margin-top: calc(var(--space-8) * 2);
}
.differentiator:first-child h3 {
font-size: clamp(1.6rem, 2.4vw, 2.1rem);
}
.roman {
position: relative;
display: grid;
place-items: center;
width: 3.6rem;
height: 3.2rem;
font-family: var(--font-serif);
font-style: italic;
font-size: var(--font-size-xl);
color: #2c4a42;
margin-bottom: var(--space-4);
isolation: isolate;
}
.roman::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
background: url('/form/fleck.svg') center / 100% 100% no-repeat;
}
.differentiator:nth-child(2) .roman::before { transform: rotate(70deg) scaleX(-1); }
.differentiator:nth-child(3) .roman::before { transform: rotate(160deg); }
.readability {
margin-top: var(--space-9);
display: grid;
grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr);
gap: 0 var(--space-8);
align-items: center;
}
.readability h3 {
font-size: clamp(1.6rem, 2.6vw, 2.2rem);
grid-column: 1;
}
.readability .text-lead {
grid-column: 1;
}
.readability-hours {
grid-column: 2;
grid-row: 1 / span 2;
max-width: 26rem;
}
.readability-image {
width: 100%;
border-radius: var(--radius-md);
border: 1px solid var(--color-border);
margin-top: var(--space-6);
}
.hours-card {
background: var(--color-surface);
border: 1.5px solid #2c4a42;
border-radius: 28px 40px 30px 44px / 36px 28px 42px 30px;
padding: var(--space-6);
transform: rotate(-1.5deg);
}
.hours-card h4 {
margin-bottom: var(--space-3);
}
.hours-row {
display: flex;
justify-content: space-between;
padding-block: var(--space-2);
border-bottom: 1px solid var(--color-border);
font-size: var(--font-size-sm);
}
.hours-row:last-child {
border-bottom: none;
}
/* Leistungen */
.leistungen-list {
list-style: none;
margin-top: var(--space-7);
}
.leistungen-list li {
display: grid;
grid-template-columns: 3rem minmax(0, 1fr);
gap: var(--space-5);
padding-block: var(--space-6);
border-bottom: 1px solid var(--color-border);
}
.leistungen-list li > div {
display: grid;
grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
gap: var(--space-6);
align-items: baseline;
}
.leistungen-num {
font-family: var(--font-serif);
font-style: italic;
font-size: var(--font-size-lg);
color: var(--color-accent);
}
.leistungen-list h3 {
margin: 0;
font-size: clamp(1.3rem, 2vw, 1.6rem);
}
.leistungen-list p {
margin: 0;
}
.nicht-machen {
margin-top: var(--space-8);
padding-top: var(--space-7);
border-top: 1px solid var(--color-border);
}
.nicht-machen-item {
position: relative;
padding-left: 1.7rem;
color: var(--color-text);
}
.nicht-machen-item::before {
content: '';
position: absolute;
left: 0;
top: 0.2em;
width: 1.05rem;
height: 1rem;
background: url('/form/fleck.svg') center / 100% 100% no-repeat;
}
/* Mappe */
.mappe-grid {
grid-column: 1 / -1;
display: grid;
grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.75fr);
gap: var(--space-8);
margin-top: var(--space-8);
align-items: start;
}
.mappe-item:first-child {
grid-column: 1 / -1;
display: grid;
grid-template-columns: minmax(0, 1.6fr) minmax(0, 0.7fr);
gap: 0 var(--space-7);
align-items: end;
}
.mappe-item:first-child .mappe-devices {
grid-row: 1 / span 4;
margin: 0;
}
.mappe-item:nth-child(3) {
margin-top: calc(var(--space-9) * 1.5);
}
.mappe-item h3 {
font-size: clamp(1.5rem, 2.4vw, 2rem);
}
.mappe-shot {
aspect-ratio: 16 / 9;
background: var(--color-surface);
border: 1px dashed var(--color-border);
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
text-align: center;
color: var(--color-text-muted);
font-size: var(--font-size-sm);
margin-bottom: var(--space-4);
overflow: hidden;
}
.mappe-devices {
margin-bottom: var(--space-5);
}
.mappe-fall {
margin: 0;
}
.mappe-fall dt {
font-family: var(--font-serif);
font-style: italic;
font-size: var(--font-size-md);
color: var(--color-accent);
margin-top: var(--space-4);
}
.mappe-fall dd {
margin: var(--space-1) 0 0;
color: var(--color-text-muted);
}
.mappe-kategorie {
font-size: 0.75rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--color-text-muted);
margin-bottom: var(--space-2);
}
/* Ablauf */
.ablauf-list {
grid-column: 1 / -1;
position: relative;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--space-6);
margin-top: var(--space-8);
}
/* geschwungener Faden durch die vier Ziffern */
.ablauf-list::before {
content: '';
position: absolute;
left: 2rem;
right: 14%;
top: 1rem;
height: 3.5rem;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 40' preserveAspectRatio='none'%3E%3Cpath d='M0 20 C 120 2 220 38 340 20 S 560 4 670 20 S 880 36 1000 18' fill='none' stroke='%232C4A42' stroke-width='1.5' stroke-dasharray='5 7' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
}
.ablauf-step {
position: relative;
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.ablauf-step:nth-child(even) {
margin-top: var(--space-6);
}
.ablauf-num {
position: relative;
display: grid;
place-items: center;
width: 4.6rem;
height: 4rem;
font-family: var(--font-serif);
font-style: italic;
font-size: var(--font-size-xl);
color: #2c4a42;
isolation: isolate;
}
.ablauf-num::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
background: url('/form/fleck.svg') center / 100% 100% no-repeat;
}
.ablauf-step:nth-child(2) .ablauf-num::before { transform: rotate(80deg); }
.ablauf-step:nth-child(3) .ablauf-num::before { transform: scaleX(-1) rotate(20deg); }
.ablauf-step:nth-child(4) .ablauf-num::before { transform: rotate(200deg); }
.ablauf-body h3 {
margin-bottom: var(--space-2);
}
.ablauf-body p {
margin: 0;
}
.ablauf-dauer {
align-self: flex-start;
font-size: var(--font-size-sm);
color: var(--color-text);
white-space: nowrap;
padding: 0.15rem 0.7rem;
border: 1px solid #2c4a42;
border-radius: 999px;
}
/* About */
.about-grid {
display: grid;
grid-template-columns: 0.8fr 1.2fr;
gap: var(--space-8);
align-items: start;
}
.about-photo {
aspect-ratio: 4 / 5;
background: url('/form/fleck.svg') center / 100% 100% no-repeat;
border: 0;
color: #2c4a42;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: var(--space-5);
color: var(--color-text-muted);
font-size: var(--font-size-sm);
overflow: hidden;
}
.about-photo-image {
padding: 0;
-webkit-mask: url('/form/fleck-maske.svg') center / 100% 100% no-repeat;
mask: url('/form/fleck-maske.svg') center / 100% 100% no-repeat;
}
.about-photo-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.about-quote {
margin: 0 0 var(--space-6);
}
.about-quote p {
font-family: var(--font-serif);
font-style: italic;
color: var(--color-accent);
font-size: clamp(1.6rem, 3vw, 2.4rem);
line-height: 1.15;
letter-spacing: -0.02em;
margin: 0;
}
/* FAQ */
.faq-list {
margin-top: var(--space-7);
border-top: 1px solid var(--color-border);
}
.faq-item {
border-bottom: 1px solid var(--color-border);
padding-block: var(--space-5);
}
.faq-item summary {
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-5);
list-style: none;
font-family: var(--font-serif);
font-size: var(--font-size-lg);
color: var(--color-text);
}
.faq-item summary::-webkit-details-marker {
display: none;
}
.faq-icon {
display: grid;
place-items: center;
flex: none;
width: 2.2rem;
height: 2rem;
font-family: var(--font-sans);
color: #2c4a42;
font-size: var(--font-size-lg);
background: url('/form/fleck.svg') center / 100% 100% no-repeat;
transition: transform var(--transition-base);
}
.faq-item[open] .faq-icon {
transform: rotate(45deg);
}
.faq-item p {
margin-top: var(--space-4);
}
/* Kontakt */
.contact-grid {
display: grid;
grid-template-columns: 1fr 1.2fr;
gap: var(--space-8);
align-items: start;
}
.contact-detail {
margin-top: var(--space-6);
}
.contact-label {
font-size: 0.75rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--color-text-muted);
margin-bottom: var(--space-2);
}
.contact-phone {
font-family: var(--font-serif);
font-size: var(--font-size-xl);
}
.contact-email {
font-family: var(--font-serif);
font-size: var(--font-size-xl);
margin-bottom: var(--space-1);
}
.contact-hint {
font-size: var(--font-size-sm);
margin: 0;
}
.contact-form {
display: flex;
flex-direction: column;
gap: var(--space-5);
}
.form-field input,
.form-field textarea {
width: 100%;
padding: var(--space-3) var(--space-4);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: var(--color-bg);
color: var(--color-text);
}
.form-field input:focus,
.form-field textarea:focus {
outline: 2px solid var(--color-primary);
outline-offset: 1px;
}
.form-field textarea {
resize: vertical;
}
.form-submit {
align-self: flex-start;
}
.form-note {
font-size: var(--font-size-sm);
margin: 0;
}
@media (max-width: 900px) {
.hero-grid,
.price-grid,
.about-grid,
.contact-grid {
grid-template-columns: 1fr;
}
.price-aside {
position: static;
}
.mappe-grid,
.mappe-item:first-child {
grid-template-columns: minmax(0, 1fr);
}
.mappe-item:first-child {
grid-column: auto;
}
.mappe-item:first-child .mappe-devices {
grid-row: auto;
margin-bottom: var(--space-5);
}
.mappe-item:nth-child(3) {
margin-top: 0;
}
.differentiators {
grid-template-columns: minmax(0, 1fr);
}
.differentiator:nth-child(n) {
margin-top: 0;
}
.readability {
grid-template-columns: minmax(0, 1fr);
}
.readability-hours {
grid-column: 1;
grid-row: auto;
margin-top: var(--space-5);
}
.ablauf-list {
grid-template-columns: minmax(0, 1fr);
gap: var(--space-7);
}
.ablauf-list::before {
display: none;
}
.ablauf-step:nth-child(even) {
margin-top: 0;
}
.leistungen-list li > div {
grid-template-columns: minmax(0, 1fr);
gap: var(--space-2);
}
.hero-fleck {
inset: -6% -20% -4% -10%;
}
}
</style>