Files
landingpage-haus-schleusingen/css/haus-schleusingen.css
greggy c2f2709790
All checks were successful
Deploy Feature Branch to Test / deploy (push) Successful in 24s
feat(contact): server-side PHP mail handler for contact form
Fix #34: E-Mail-Versand via PHP

- PHP POST handler with server-side validation (name, email, message)
- mail() with From/Reply-To set to form email address
- Recipient: mki@kies-media.de
- Honeypot spam protection (hidden field)
- Minimum submit time check (3 seconds)
- Session-based rate limiting (60s between submissions)
- Header injection protection
- Error messages displayed above form
- Success message after successful send
- Form values preserved on validation errors
- Removed client-side mailto: JavaScript logic
- Added CSS for error display and honeypot hiding
2026-05-14 19:12:43 +00:00

1269 lines
21 KiB
CSS
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.

:root {
--cream: #f5f0e8;
--warm: #e8dfd0;
--stone: #9e9485;
--dark: #1c1a17;
--charcoal: #2e2b26;
--accent: #8b6914;
--accent-light: #c49a2a;
--white: #fdfcfa;
}
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
body {
font-family: "DM Sans", sans-serif;
background: var(--white);
color: var(--dark);
overflow-x: hidden;
}
/* NAV */
nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.25rem 3rem;
background: transparent;
transition:
background 0.4s,
padding 0.4s;
}
nav.scrolled {
background: rgb(253 252 250 / 96%);
backdrop-filter: blur(12px);
padding: 0.85rem 3rem;
border-bottom: 1px solid rgb(158 148 133 / 20%);
}
.nav-logo {
font-family: "Cormorant Garamond", serif;
font-size: 1.15rem;
font-weight: 600;
letter-spacing: 0.04em;
color: var(--white);
transition: color 0.4s;
}
nav.scrolled .nav-logo {
color: var(--dark);
}
.nav-links {
display: flex;
gap: 2.5rem;
list-style: none;
}
.nav-links a {
font-size: 0.8rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
text-decoration: none;
color: rgb(255 255 255 / 85%);
transition: color 0.3s;
}
nav.scrolled .nav-links a {
color: var(--stone);
}
.nav-links a:hover,
nav.scrolled .nav-links a:hover {
color: var(--accent);
}
.nav-cta {
font-family: "DM Sans", sans-serif;
font-size: 0.82rem;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
background: var(--accent);
color: var(--white);
border: none;
padding: 0.8rem 2rem;
cursor: pointer;
border-radius: 2px;
box-shadow: 0 2px 12px rgb(139 105 20 / 35%);
transition:
background 0.3s,
transform 0.2s,
box-shadow 0.3s;
}
.nav-cta:hover {
background: var(--accent-light);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgb(139 105 20 / 50%);
}
/* HAMBURGER */
.nav-hamburger {
display: none;
width: 44px;
height: 44px;
background: none;
border: none;
cursor: pointer;
position: relative;
z-index: 110;
align-items: center;
justify-content: center;
padding: 0;
}
.nav-hamburger span,
.nav-hamburger span::before,
.nav-hamburger span::after {
display: block;
width: 22px;
height: 2px;
background: var(--white);
border-radius: 1px;
transition:
transform 0.3s ease,
opacity 0.3s ease,
background 0.4s;
position: absolute;
}
.nav-hamburger span::before,
.nav-hamburger span::after {
content: "";
}
.nav-hamburger span::before {
transform: translateY(-7px);
}
.nav-hamburger span::after {
transform: translateY(7px);
}
nav.scrolled .nav-hamburger span,
nav.scrolled .nav-hamburger span::before,
nav.scrolled .nav-hamburger span::after {
background: var(--dark);
}
.nav-hamburger.active span {
background: transparent;
}
.nav-hamburger.active span::before {
transform: rotate(45deg);
background: var(--dark);
}
.nav-hamburger.active span::after {
transform: rotate(-45deg);
background: var(--dark);
}
.nav-mobile-overlay {
display: none;
position: fixed;
inset: 0;
background: rgb(28 26 23 / 50%);
z-index: 90;
opacity: 0;
transition: opacity 0.3s ease;
}
.nav-mobile-overlay.active {
display: block;
opacity: 1;
}
/* HERO */
.hero {
position: relative;
height: 100vh;
min-height: 650px;
display: flex;
align-items: flex-end;
overflow: hidden;
}
.hero-bg {
position: absolute;
inset: 0;
background-size: cover;
background-position: center 20%;
transform: scale(1.05);
transition: transform 8s ease-out;
}
.hero-bg.loaded {
transform: scale(1);
}
.hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(
to top,
rgb(28 26 23 / 85%) 0%,
rgb(28 26 23 / 30%) 50%,
rgb(28 26 23 / 10%) 100%
);
}
.hero-content {
position: relative;
z-index: 2;
padding: 0 3rem 5rem;
max-width: 900px;
opacity: 0;
transform: translateY(30px);
transition:
opacity 0.9s ease,
transform 0.9s ease;
}
.hero-content.visible {
opacity: 1;
transform: translateY(0);
}
.hero-tag {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--accent-light);
margin-bottom: 1.25rem;
}
.hero-tag::before {
content: "";
width: 28px;
height: 1px;
background: var(--accent-light);
}
.hero h1 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2.8rem, 6vw, 5rem);
font-weight: 300;
line-height: 1.08;
color: var(--white);
letter-spacing: -0.01em;
margin-bottom: 1.5rem;
}
.hero h1 em {
font-style: italic;
color: var(--accent-light);
}
.hero-meta {
display: flex;
gap: 2.5rem;
align-items: center;
font-size: 0.82rem;
color: rgb(255 255 255 / 60%);
letter-spacing: 0.05em;
}
.hero-meta strong {
color: var(--white);
}
.hero-scroll {
position: absolute;
bottom: 2rem;
right: 3rem;
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
font-size: 0.68rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: rgb(255 255 255 / 50%);
cursor: pointer;
}
.scroll-line {
width: 1px;
height: 40px;
background: rgb(255 255 255 / 30%);
animation: scroll-anim 2s infinite;
}
@keyframes scroll-anim {
0%,
100% {
transform: scaleY(1);
opacity: 0.3;
}
50% {
transform: scaleY(0.5);
opacity: 0.8;
}
}
/* FACTS STRIP */
.facts-strip {
display: grid;
grid-template-columns: repeat(4, 1fr);
background: var(--dark);
}
.fact {
padding: 2.25rem 2rem;
border-right: 1px solid rgb(255 255 255 / 7%);
text-align: center;
opacity: 0;
transform: translateY(20px);
transition:
opacity 0.6s ease,
transform 0.6s ease;
}
.fact:last-child {
border-right: none;
}
.fact.visible {
opacity: 1;
transform: translateY(0);
}
.fact-val {
font-family: "Cormorant Garamond", serif;
font-size: 2.2rem;
font-weight: 600;
color: var(--accent-light);
line-height: 1;
margin-bottom: 0.4rem;
}
.fact-label {
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--stone);
}
/* INTRO */
.intro {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
padding: 6rem 3rem;
max-width: 1200px;
margin: 0 auto;
align-items: center;
}
.intro-text {
padding-right: 4rem;
}
.section-eyebrow {
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 1rem;
}
.intro-text h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3.5vw, 3rem);
font-weight: 300;
line-height: 1.2;
margin-bottom: 1.5rem;
color: var(--charcoal);
}
.intro-text p {
font-size: 0.95rem;
line-height: 1.85;
color: var(--stone);
margin-bottom: 1rem;
}
.intro-stats {
display: flex;
gap: 2rem;
margin-top: 2rem;
padding-top: 2rem;
border-top: 1px solid var(--warm);
}
.istat-val {
font-family: "Cormorant Garamond", serif;
font-size: 1.8rem;
font-weight: 600;
color: var(--accent);
line-height: 1;
}
.istat-label {
font-size: 0.72rem;
letter-spacing: 0.08em;
color: var(--stone);
margin-top: 4px;
}
.intro-img {
position: relative;
height: 480px;
overflow: hidden;
}
.intro-img img {
width: 100%;
height: 100%;
object-fit: cover;
}
.intro-img-badge {
position: absolute;
bottom: -1px;
left: -1px;
background: var(--accent);
color: var(--white);
padding: 1rem 1.5rem;
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
}
/* GALLERY — CSS Columns Masonry */
.gallery-section {
padding: 0 0 6rem;
background: var(--cream);
}
.gallery-header {
padding: 5rem 3rem 3rem;
max-width: 1400px;
margin: 0 auto;
}
.gallery-header h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3vw, 2.8rem);
font-weight: 300;
color: var(--charcoal);
}
.masonry-grid {
max-width: 1400px;
margin: 0 auto;
padding: 0 1.5rem;
column-count: 4;
column-gap: 8px;
}
/* Hide the sizer not needed for CSS columns */
.grid-sizer {
display: none;
}
.grid-item {
break-inside: avoid;
margin-bottom: 8px;
overflow: hidden;
cursor: pointer;
position: relative;
border-radius: 3px;
}
.grid-item img {
width: 100%;
display: block;
border-radius: 3px;
transition:
transform 0.7s cubic-bezier(0.25, 0.46, 0.45, 0.94),
filter 0.5s ease;
}
.grid-item:hover img {
transform: scale(1.04);
filter: brightness(0.9);
}
.grid-item-label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 2rem 1rem 0.85rem;
background: linear-gradient(transparent, rgb(28 26 23 / 75%));
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: rgb(255 255 255 / 90%);
border-radius: 0 0 3px 3px;
transform: translateY(6px);
opacity: 0;
transition:
transform 0.35s ease,
opacity 0.35s ease;
pointer-events: none;
}
.grid-item:hover .grid-item-label {
transform: translateY(0);
opacity: 1;
}
@media (width <= 1100px) {
.masonry-grid {
column-count: 3;
}
}
@media (width <= 768px) {
.masonry-grid {
column-count: 2;
column-gap: 6px;
padding: 0 1rem;
}
.grid-item {
margin-bottom: 6px;
}
.gallery-header {
padding: 3rem 1.5rem 2rem;
}
}
@media (width <= 480px) {
.masonry-grid {
column-count: 1;
padding: 0 1.5rem;
}
}
/* FLOORS */
.floors-section {
padding: 6rem 3rem;
max-width: 1200px;
margin: 0 auto;
}
.floors-section h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3vw, 2.8rem);
font-weight: 300;
margin-bottom: 3rem;
color: var(--charcoal);
}
.floor-accordion {
border-top: 1px solid var(--warm);
}
.floor-item {
border-bottom: 1px solid var(--warm);
overflow: hidden;
}
.floor-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 0;
cursor: pointer;
transition: color 0.2s;
}
.floor-header:hover .floor-title {
color: var(--accent);
}
.floor-title {
font-family: "Cormorant Garamond", serif;
font-size: 1.35rem;
font-weight: 400;
transition: color 0.2s;
}
.floor-size {
font-size: 0.78rem;
letter-spacing: 0.1em;
color: var(--stone);
display: flex;
align-items: center;
gap: 1rem;
}
.floor-icon {
width: 24px;
height: 24px;
border: 1px solid var(--warm);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
color: var(--stone);
transition:
transform 0.3s,
border-color 0.3s;
}
.floor-item.open .floor-icon {
transform: rotate(45deg);
border-color: var(--accent);
color: var(--accent);
}
.floor-body {
display: none;
padding: 0 0 1.5rem;
max-width: 100%;
overflow: hidden;
}
.floor-rooms-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 8px;
}
.room-chip {
background: var(--cream);
padding: 0.75rem 1rem;
font-size: 0.82rem;
color: var(--charcoal);
display: flex;
justify-content: space-between;
align-items: center;
}
.room-chip-area {
font-size: 0.72rem;
color: var(--stone);
}
.floor-plan {
margin-top: 1.5rem;
border: 1px solid var(--warm);
background: var(--white);
overflow: hidden;
max-width: 100%;
}
.floor-plan img {
width: 100%;
max-width: 100%;
height: auto;
display: block;
object-fit: contain;
}
.floor-plan-multi {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--warm);
}
.floor-plan-multi img {
width: 100%;
max-width: 100%;
height: auto;
display: block;
object-fit: contain;
background: var(--white);
}
@media (width <= 768px) {
.floor-plan-multi {
grid-template-columns: 1fr;
}
}
/* PRICING */
.pricing-section {
background: var(--dark);
padding: 6rem 3rem;
}
.pricing-inner {
max-width: 1200px;
margin: 0 auto;
}
.pricing-section .section-eyebrow {
color: var(--accent-light);
}
.pricing-section h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3vw, 2.8rem);
font-weight: 300;
color: var(--white);
margin-bottom: 3rem;
}
.price-cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1px;
background: rgb(255 255 255 / 7%);
}
.price-card {
background: var(--charcoal);
padding: 2.5rem 2rem;
transition: background 0.3s;
}
.price-card:hover {
background: #383530;
}
.price-card.highlight {
background: var(--accent);
}
.price-card.highlight:hover {
background: var(--accent-light);
}
.pc-label {
font-size: 0.72rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--stone);
margin-bottom: 1rem;
}
.price-card.highlight .pc-label {
color: rgb(255 255 255 / 70%);
}
.pc-val {
font-family: "Cormorant Garamond", serif;
font-size: 2.8rem;
font-weight: 600;
line-height: 1;
color: var(--white);
margin-bottom: 0.3rem;
}
.pc-sub {
font-size: 0.78rem;
color: var(--stone);
}
.price-card.highlight .pc-sub {
color: rgb(255 255 255 / 70%);
}
.price-note {
margin-top: 2.5rem;
padding-top: 2.5rem;
border-top: 1px solid rgb(255 255 255 / 7%);
display: flex;
gap: 3rem;
}
.pn-item {
font-size: 0.85rem;
color: var(--stone);
line-height: 1.7;
}
.pn-item strong {
color: var(--white);
display: block;
font-weight: 500;
margin-bottom: 2px;
}
/* LAGE */
.lage-section {
padding: 6rem 3rem;
max-width: 1200px;
margin: 0 auto;
}
.lage-section h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3vw, 2.8rem);
font-weight: 300;
margin-bottom: 3rem;
color: var(--charcoal);
}
.lage-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1px;
background: var(--warm);
}
.lage-item {
background: var(--white);
padding: 2rem;
display: flex;
gap: 1.25rem;
align-items: flex-start;
transition: background 0.3s;
}
.lage-item:hover {
background: var(--cream);
}
.lage-icon {
width: 40px;
height: 40px;
flex-shrink: 0;
background: var(--cream);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
color: var(--accent);
}
.lage-title {
font-size: 0.9rem;
font-weight: 500;
margin-bottom: 4px;
}
.lage-desc {
font-size: 0.82rem;
color: var(--stone);
line-height: 1.6;
}
.lage-map-wrapper {
margin-top: 3rem;
border: 1px solid var(--warm);
overflow: hidden;
}
.lage-map-wrapper iframe {
display: block;
width: 100%;
height: 450px;
filter: grayscale(30%) contrast(1.05);
transition: filter 0.4s ease;
}
.lage-map-wrapper:hover iframe {
filter: grayscale(0%) contrast(1);
}
@media (width <= 900px) {
.lage-map-wrapper iframe {
height: 320px;
}
}
/* CONTACT */
.contact-section {
background: var(--cream);
padding: 6rem 3rem;
}
.contact-inner {
max-width: 700px;
margin: 0 auto;
text-align: center;
}
.contact-inner h2 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2.2rem, 4vw, 3.5rem);
font-weight: 300;
line-height: 1.15;
color: var(--charcoal);
margin-bottom: 1rem;
}
.contact-inner h2 em {
font-style: italic;
color: var(--accent);
}
.contact-inner p {
font-size: 0.9rem;
color: var(--stone);
line-height: 1.8;
margin-bottom: 2.5rem;
}
.contact-form {
text-align: left;
}
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-bottom: 1rem;
}
.form-field {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.form-field label {
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--stone);
}
.form-field input,
.form-field textarea,
.form-field select {
font-family: "DM Sans", sans-serif;
font-size: 0.88rem;
background: var(--white);
border: 1px solid var(--warm);
padding: 0.75rem 1rem;
color: var(--dark);
outline: none;
transition: border-color 0.2s;
resize: none;
}
.form-field input:focus,
.form-field textarea:focus,
.form-field select:focus {
border-color: var(--accent);
}
.form-field.full {
grid-column: span 2;
}
.btn-submit {
font-family: "DM Sans", sans-serif;
font-size: 0.78rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
background: var(--accent);
color: var(--white);
border: none;
width: 100%;
padding: 1.1rem;
cursor: pointer;
margin-top: 0.5rem;
transition:
background 0.3s,
transform 0.2s;
}
.btn-submit:hover {
background: var(--accent-light);
transform: translateY(-1px);
}
.form-errors {
background: #fdf2f2;
border: 1px solid #e8a0a0;
padding: 1rem 1.2rem;
margin-bottom: 1.2rem;
}
.form-errors ul {
margin: 0;
padding: 0 0 0 1.2rem;
list-style: disc;
}
.form-errors li {
font-size: 0.85rem;
color: #9e2c2c;
line-height: 1.6;
}
.hp-field {
position: absolute;
left: -9999px;
top: -9999px;
width: 0;
height: 0;
overflow: hidden;
opacity: 0;
pointer-events: none;
}
.form-success {
display: none;
text-align: center;
padding: 3rem;
background: var(--white);
border: 1px solid var(--warm);
}
.form-success p {
font-family: "Cormorant Garamond", serif;
font-size: 1.5rem;
color: var(--charcoal);
}
.form-success small {
font-size: 0.82rem;
color: var(--stone);
}
.contact-details {
text-align: center;
margin-top: 2rem;
padding-top: 1.5rem;
border-top: 1px solid var(--warm);
}
.contact-details p {
font-size: 0.95rem;
color: var(--stone);
}
.contact-details a {
color: var(--accent);
text-decoration: none;
font-weight: 600;
transition: color 0.2s;
}
.contact-details a:hover {
color: var(--accent-light);
}
/* FOOTER */
footer {
background: var(--dark);
padding: 2.5rem 3rem;
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1px solid rgb(255 255 255 / 6%);
}
.footer-logo {
font-family: "Cormorant Garamond", serif;
font-size: 1rem;
font-weight: 600;
color: var(--white);
letter-spacing: 0.04em;
}
.footer-links {
display: flex;
gap: 2rem;
}
.footer-links a {
font-size: 0.72rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--stone);
text-decoration: none;
transition: color 0.2s;
}
.footer-links a:hover {
color: var(--accent-light);
}
/* LIGHTBOX */
.lightbox {
display: none;
position: fixed;
inset: 0;
z-index: 1000;
background: rgb(28 26 23 / 96%);
align-items: center;
justify-content: center;
}
.lightbox.open {
display: flex;
}
.lightbox img {
max-width: 90vw;
max-height: 85vh;
object-fit: contain;
}
.lightbox-close {
position: absolute;
top: 1.5rem;
right: 2rem;
font-size: 1.5rem;
color: var(--white);
cursor: pointer;
background: none;
border: none;
transition: color 0.2s;
}
.lightbox-close:hover {
color: var(--accent-light);
}
/* RESPONSIVE */
@media (width <= 900px) {
nav {
padding: 1rem 1.5rem;
}
nav.scrolled {
padding: 0.75rem 1.5rem;
}
.nav-links {
display: none;
}
.nav-hamburger {
display: flex;
}
/* Mobile slide-down nav */
nav.mobile-open .nav-links {
display: flex;
flex-direction: column;
position: fixed;
top: 0;
left: 0;
right: 0;
background: rgb(253 252 250 / 98%);
backdrop-filter: blur(12px);
padding: 5rem 1.5rem 2rem;
gap: 0;
z-index: 95;
border-bottom: 1px solid var(--warm);
animation: slideDown 0.3s ease;
}
nav.mobile-open .nav-links a {
color: var(--charcoal);
font-size: 1rem;
padding: 1rem 0;
border-bottom: 1px solid var(--warm);
display: flex;
align-items: center;
min-height: 44px;
}
nav.mobile-open .nav-hamburger span,
nav.mobile-open .nav-hamburger span::before,
nav.mobile-open .nav-hamburger span::after {
background: var(--dark);
}
nav.mobile-open .nav-hamburger.active span {
background: transparent;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.hero-content {
padding: 0 1.5rem 4rem;
}
.facts-strip {
grid-template-columns: repeat(2, 1fr);
}
.fact {
border-right: none;
border-bottom: 1px solid rgb(255 255 255 / 7%);
}
.intro {
grid-template-columns: 1fr;
padding: 3rem 1.5rem;
}
.intro-text {
padding-right: 0;
margin-bottom: 2rem;
}
.masonry-grid {
column-count: 2;
}
.gallery-header {
padding: 3rem 1.5rem 2rem;
}
.price-cards {
grid-template-columns: 1fr;
}
.price-note {
flex-direction: column;
gap: 1.5rem;
}
.lage-grid {
grid-template-columns: 1fr;
}
.form-row {
grid-template-columns: 1fr;
}
.form-field.full {
grid-column: span 1;
}
.floors-section,
.lage-section,
.contact-section {
padding: 4rem 1.5rem;
}
footer {
flex-direction: column;
gap: 1.5rem;
text-align: center;
}
}