Files
landingpage-haus-schleusingen/public/css/haus-schleusingen.css
hermes 7913596836
All checks were successful
Deploy Feature Branch to Test (haus.test.kies-media.de) / Deploy to Test Environment (push) Successful in 45s
Lint / PHP Syntax Check (push) Successful in 1m0s
PHPUnit / PHP Unit Tests (push) Successful in 36s
Lint / PHP Syntax Check (pull_request) Successful in 27s
Lint / HTML Lint (htmlhint) (push) Successful in 1m40s
Lint / CSS Lint (stylelint) (push) Successful in 1m45s
PHPUnit / PHP Unit Tests (pull_request) Successful in 41s
Lint / CSS Lint (stylelint) (pull_request) Successful in 1m14s
Lint / HTML Lint (htmlhint) (pull_request) Successful in 1m15s
fix(ui): make vertical floor-plan tabs visually obvious as interactive controls
The floor-accordion was rendering as a stack of plain text rows separated
by 1px hairline dividers with no visual affordance indicating they were
clickable tabs. CSS for .floor-icon (a 24px circle with a '+' that
rotates 45° to '×' on open) already existed, but the corresponding
<span class="floor-icon"> element had never been added to the template
— the affordance was completely invisible.

Changes:

1. Template (app/views/home/index.php): add
   <span class="floor-icon" aria-hidden="true">+</span> inside the
   <summary>, enabling the existing rotation/size CSS to take effect.

2. CSS (public/css/haus-schleusingen.css):
   a. Restyle .floor-item from a thin divider to a real card
      (1px --warm border, 4px radius, --white background) with a
      0.75rem gap between items via flexbox column on .floors-accordion.
   b. .floor-header: hover background in --cream, focus-visible
      outline, list-style markers suppressed, padding tightened to
      1.25rem 1.5rem.
   c. .floor-icon: enlarged from 24px to 32px, thicker 1.5px border,
      font-size 1.15rem so the '+' is clearly legible, white
      background that goes cream on hover/open.
   d. .floor-item.open: --accent border, subtle box-shadow
      (0 4px 20px 6% black), and a 3px-wide ::before accent stripe on
      the left edge — the canonical 'active tab' indicator.
   e. .floor-icon rotation on open (45°) now also flips border-color
      and background to --accent / --cream, plus hover state for the
      closed icon.
   f. Renamed dead-code class .floor-size → .floor-area to match the
      template (refactor mismatch left over from the i18n work).
   g. Renamed dead-code class .floor-accordion → .floors-accordion to
      match the template.

Measured on 1265px viewport:
- 4 items, 4 icons (one per tab)
- Each item: 1104x74, white bg, 4px radius, --warm border
- Icon: 32x32 at x=1128 (right edge), white bg, '+' glyph
- Open state (item[1]): border → --accent, left 3px accent stripe,
  icon rotates 45° to '×', subtle box-shadow

Sweep targets for visual confirmation:
- Closed: white card + warm border + '+' icon, hover lifts background
  to cream and icon border to accent.
- Open: accent border + left stripe + '×' icon + soft shadow, body
  expands below to show the floor-plan image and room list.
- Switching tabs: clicking another header collapses the current
  open one (existing JS accordion behaviour).
2026-06-14 14:44:04 +00:00

1847 lines
32 KiB
CSS
Executable File
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.

/* SKIP LINK */
.skip-link {
position: absolute;
left: -9999px;
top: 0;
background: var(--accent);
color: var(--white);
padding: 0.75rem 1.5rem;
font-size: 0.85rem;
font-weight: 500;
z-index: 200;
text-decoration: none;
transition: none;
}
.skip-link:focus {
left: 0;
outline: 2px solid var(--white);
outline-offset: 2px;
}
/* FOCUS VISIBLE */
*:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.lightbox-close:focus-visible {
outline: 2px solid var(--white);
outline-offset: 2px;
}
button:focus-visible,
a:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.grid-item:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.floor-header:focus-visible {
outline: 2px solid var(--accent);
outline-offset: -2px;
}
:root {
--cream: #f5f0e8;
--warm: #e8dfd0;
--stone: #7a7062;
--stone-strong: #5a5043;
--dark: #1c1a17;
--charcoal: #2e2b26;
--accent: #8b6914;
--accent-light: #c49a2a;
--accent-strong: #5a450d;
--white: #fdfcfa;
/* Text variants — keep light text consistent across dark backgrounds */
--text-muted: #6e6557;
--text-muted-on-dark: rgb(245 240 232 / 82%);
--text-faint-on-dark: rgb(245 240 232 / 65%);
/* Nav: always visible, glass effect on top of hero */
--nav-bg: rgb(253 252 250 / 92%);
--nav-border: rgb(232 223 208 / 70%);
}
*,
*::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 — always visible, glass effect over hero */
nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.95rem 3rem;
background: var(--nav-bg);
backdrop-filter: saturate(180%) blur(14px);
border-bottom: 1px solid var(--nav-border);
transition:
padding 0.3s ease,
box-shadow 0.3s ease;
box-shadow: 0 1px 12px rgb(28 26 23 / 4%);
}
nav.scrolled {
padding: 0.65rem 3rem;
box-shadow: 0 2px 16px rgb(28 26 23 / 8%);
}
.nav-logo a {
display: inline-flex;
align-items: center;
gap: 0.5rem;
text-decoration: none;
color: var(--dark);
font-family: "Cormorant Garamond", serif;
font-size: 1.15rem;
font-weight: 600;
letter-spacing: 0.04em;
}
.nav-logo a:hover {
color: var(--accent);
}
.logo-icon {
font-size: 1.4rem;
line-height: 1;
}
/* Hide logo text everywhere — logo icon is the only brand mark */
.logo-text {
display: none !important;
}
.nav-links {
display: flex;
gap: 2.5rem;
list-style: none;
margin: 0;
padding: 0;
}
.nav-links a {
font-size: 0.8rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
text-decoration: none;
color: var(--stone-strong);
transition: color 0.3s;
}
.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;
text-decoration: none;
}
.nav-cta:hover {
background: var(--accent-light);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgb(139 105 20 / 50%);
color: var(--white);
}
/* 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;
color: var(--dark);
}
.nav-hamburger span,
.nav-hamburger span::before,
.nav-hamburger span::after {
display: block;
width: 22px;
height: 2px;
background: var(--dark);
border-radius: 1px;
transition:
transform 0.3s ease,
opacity 0.3s ease;
position: absolute;
left: 50%;
top: 50%;
}
.nav-hamburger span::before,
.nav-hamburger span::after {
content: "";
}
.nav-hamburger span::before {
transform: translate(-50%, calc(-50% - 7px));
}
.nav-hamburger span::after {
transform: translate(-50%, calc(-50% + 7px));
}
.nav-hamburger.active span {
background: transparent;
transform: translate(-50%, -50%);
}
.nav-hamburger.active span::before {
transform: translate(-50%, -50%) rotate(45deg);
background: var(--dark);
}
.nav-hamburger.active span::after {
transform: translate(-50%, -50%) 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;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center 20%;
transform: scale(1.05);
transition: transform 8s ease-out;
z-index: 0;
}
.hero-bg.loaded {
transform: scale(1);
}
.hero-overlay {
position: absolute;
inset: 0;
z-index: 1;
background: linear-gradient(
to top,
rgb(20 18 15 / 92%) 0%,
rgb(20 18 15 / 60%) 30%,
rgb(20 18 15 / 35%) 60%,
rgb(20 18 15 / 20%) 100%
);
pointer-events: none;
}
.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;
text-shadow: 0 1px 8px rgb(0 0 0 / 40%);
}
.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;
text-shadow:
0 2px 24px rgb(0 0 0 / 50%),
0 1px 3px rgb(0 0 0 / 30%);
}
.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: var(--text-muted-on-dark);
letter-spacing: 0.05em;
text-shadow: 0 1px 6px rgb(0 0 0 / 40%);
}
.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(--text-muted-on-dark);
}
/* 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: 600;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--accent-strong);
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-section .section-head {
max-width: 1400px;
margin: 0 auto;
padding: 5rem 1.5rem 2.5rem;
}
.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: var(--text-muted-on-dark);
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;
}
.gallery-section .section-head {
padding: 3rem 1rem 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);
}
.floors-accordion {
display: flex;
flex-direction: column;
gap: 0.75rem;
margin-top: -0.75rem;
}
.floor-item {
border: 1px solid var(--warm);
border-radius: 4px;
background: var(--white);
overflow: hidden;
position: relative;
transition:
border-color 0.25s ease,
box-shadow 0.25s ease;
}
.floor-item:hover {
border-color: var(--stone);
}
.floor-item.open {
border-color: var(--accent);
box-shadow: 0 4px 20px rgb(28 26 23 / 6%);
}
.floor-item.open::before {
content: "";
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: var(--accent);
}
.floor-header {
display: flex;
align-items: center;
gap: 1rem;
padding: 1.25rem 1.5rem;
cursor: pointer;
list-style: none;
transition: background 0.2s ease;
}
.floor-header::-webkit-details-marker {
display: none;
}
.floor-header::marker {
content: "";
}
.floor-header:hover {
background: var(--cream);
}
.floor-title {
font-family: "Cormorant Garamond", serif;
font-size: 1.35rem;
font-weight: 400;
transition: color 0.2s;
}
.floor-header:hover .floor-title {
color: var(--accent);
}
.floor-area {
margin-left: auto;
font-size: 0.78rem;
letter-spacing: 0.1em;
color: var(--stone);
display: flex;
align-items: center;
gap: 0.75rem;
}
.floor-icon {
width: 32px;
height: 32px;
border: 1.5px solid var(--warm);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.15rem;
font-weight: 300;
line-height: 1;
color: var(--stone);
background: var(--white);
flex-shrink: 0;
transition:
transform 0.3s ease,
border-color 0.25s ease,
color 0.25s ease,
background 0.25s ease;
}
.floor-header:hover .floor-icon {
border-color: var(--accent);
color: var(--accent);
}
.floor-item.open .floor-icon {
transform: rotate(45deg);
border-color: var(--accent);
color: var(--accent);
background: var(--cream);
}
.floor-body {
display: none;
padding: 0 1.5rem 1.5rem;
max-width: 100%;
overflow: hidden;
border-top: 1px solid var(--warm);
margin-top: -1px;
}
.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;
max-width: 1200px;
margin: 0 auto;
}
.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(--text-muted-on-dark);
margin-bottom: 1rem;
}
.price-card .price-label {
display: block;
font-size: 0.72rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--text-muted-on-dark);
margin-bottom: 0.8rem;
}
.price-card .price-value {
display: block;
font-family: "Cormorant Garamond", serif;
font-size: 2.8rem;
font-weight: 600;
line-height: 1;
color: var(--white);
margin-bottom: 0.3rem;
}
.price-card .price-unit {
display: block;
font-size: 0.78rem;
color: var(--text-muted-on-dark);
}
.price-card.highlight .price-label,
.price-card.highlight .price-unit {
color: var(--text-muted-on-dark);
}
.pricing-section .rent-notes {
margin-top: 2.5rem;
display: grid;
grid-template-columns: 12rem 1fr;
gap: 0.5rem 1.5rem;
}
.pricing-section .rent-notes dt {
font-size: 0.78rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--text-muted-on-dark);
}
.pricing-section .rent-notes dd {
margin: 0;
color: var(--white);
font-size: 0.95rem;
}
.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 0;
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(3, 1fr);
gap: 1.5rem;
margin-bottom: 4rem;
}
.lage-features {
list-style: none;
margin: 0;
padding: 0;
display: contents;
}
.lage-features > li {
background: var(--white);
padding: 2rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
border: 1px solid var(--warm);
border-radius: 2px;
transition:
background 0.3s,
transform 0.3s,
box-shadow 0.3s;
}
.lage-features > li::before {
content: "";
display: block;
width: 32px;
height: 32px;
background: var(--accent);
mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5a2.5 2.5 0 110-5 2.5 2.5 0 010 5z'/></svg>")
center/contain no-repeat;
margin-bottom: 0.5rem;
}
.lage-features > li:hover {
background: var(--cream);
transform: translateY(-2px);
box-shadow: 0 6px 24px rgb(28 26 23 / 8%);
}
.lage-feature-title {
font-size: 1rem;
font-weight: 600;
color: var(--dark);
letter-spacing: 0.01em;
}
.lage-feature-desc {
font-size: 0.88rem;
color: var(--text-muted);
line-height: 1.6;
}
.lage-map-wrapper {
position: relative;
left: 50%;
right: 50%;
width: 100vw;
margin: 0 -50vw;
border-top: 1px solid var(--warm);
border-bottom: 1px solid var(--warm);
background: var(--white);
overflow: hidden;
}
.lage-map-wrapper iframe {
display: block;
width: 100%;
height: 480px;
border: 0;
filter: grayscale(30%) contrast(1.05);
transition: filter 0.4s ease;
}
.lage-map-wrapper:hover iframe {
filter: grayscale(0%) contrast(1);
}
.lage-address {
max-width: 1200px;
margin: 0 auto;
padding: 1.5rem 3rem;
font-size: 0.9rem;
line-height: 1.6;
color: var(--text-muted);
text-align: center;
}
.lage-address strong {
color: var(--dark);
font-weight: 600;
}
@media (width <= 900px) {
.lage-grid {
grid-template-columns: 1fr;
gap: 1rem;
}
.lage-map-wrapper iframe {
height: 320px;
}
.lage-address {
padding: 1.25rem 1.5rem;
}
}
/* CONTACT */
.contact-section {
background: var(--cream);
padding: 6rem 3rem;
max-width: 1200px;
margin: 0 auto;
}
.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);
border-radius: 2px;
padding: 0.85rem 1rem;
color: var(--dark);
outline: none;
transition:
border-color 0.2s,
box-shadow 0.2s;
resize: none;
}
.form-field input:hover,
.form-field textarea:hover,
.form-field select:hover {
border-color: var(--stone);
}
.form-field input:focus,
.form-field textarea:focus,
.form-field select:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgb(139 105 20 / 12%);
}
.form-field select {
appearance: none;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' stroke='%237a7062' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>");
background-repeat: no-repeat;
background-position: right 1rem center;
padding-right: 2.5rem;
cursor: pointer;
}
.form-field.full {
grid-column: span 2;
}
.btn-submit,
.form-submit {
font-family: "DM Sans", sans-serif;
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.15em;
text-transform: uppercase;
background: var(--accent);
color: var(--white);
border: none;
border-radius: 2px;
width: 100%;
padding: 1.15rem;
cursor: pointer;
margin-top: 0.5rem;
box-shadow: 0 2px 12px rgb(139 105 20 / 25%);
transition:
background 0.3s,
transform 0.2s,
box-shadow 0.3s;
}
.btn-submit:hover,
.form-submit:hover {
background: var(--accent-light);
transform: translateY(-1px);
box-shadow: 0 4px 20px rgb(139 105 20 / 40%);
}
.btn-submit:active,
.form-submit:active {
transform: translateY(0);
}
.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-direct {
text-align: center;
margin-top: 1.5rem;
font-size: 0.85rem;
color: var(--text-muted);
}
.contact-direct a {
color: var(--accent);
text-decoration: none;
font-weight: 600;
transition: color 0.2s;
}
.contact-direct a:hover {
color: var(--accent-light);
text-decoration: underline;
}
.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,
nav.scrolled {
padding: 1rem 1.5rem;
}
.nav-cta {
display: none;
}
.nav-links {
display: none;
}
.nav-hamburger {
display: flex;
}
/* Logo: keep icon, hide text on small viewports */
.logo-text {
display: none;
}
/* 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: slide-down 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 slide-down {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.hero-content {
padding: 0 1.5rem 4rem;
max-width: 100%;
min-width: 0;
width: 100%;
}
.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-grid {
min-width: 0;
}
.intro-text {
padding-right: 0;
margin-bottom: 2rem;
}
.intro-stats {
flex-wrap: wrap;
gap: 1.5rem 2rem;
}
.intro-stats > .stat {
flex: 1 1 auto;
min-width: 0;
}
.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;
}
.pricing-section {
padding: 4rem 1.5rem;
}
.pricing-section .rent-notes {
grid-template-columns: 1fr;
gap: 0.25rem 0;
}
footer {
flex-direction: column;
gap: 1.5rem;
text-align: center;
}
}
/* LOCALE SWITCHER — single <details> dropdown, flag-sized trigger.
Design goals (after Martin-feedback round 3):
- The flag is the visual anchor of every row, not a tiny icon
drowning in padding.
- Trigger is a 44×44 touch target with the flag centred, no
artificial 1px outline (real flag-icons need no border).
- Menu rows are 40px+ tall with comfortable flag+label spacing.
- No FOUC on open: SVGs load eager (4 small files). */
.locale-switcher {
position: relative;
display: inline-block;
}
.locale-switcher__trigger {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px;
min-height: 44px;
border: none;
border-radius: 6px;
background: transparent;
cursor: pointer;
list-style: none;
color: var(--dark);
transition:
background 0.2s,
transform 0.15s;
}
.locale-switcher__trigger::-webkit-details-marker {
display: none;
}
.locale-switcher__trigger::marker {
content: "";
}
.locale-switcher__trigger:hover,
.locale-switcher__trigger:focus-visible {
background: rgb(0 0 0 / 6%);
outline: none;
}
.locale-switcher__current {
display: inline-flex;
align-items: center;
}
.locale-switcher__caret {
font-size: 0.7rem;
line-height: 1;
color: inherit;
transition: transform 0.2s ease;
}
.locale-switcher[open] .locale-switcher__caret {
transform: rotate(180deg);
}
.locale-switcher__menu,
.locale-switcher__menu li {
list-style: none;
}
.locale-switcher__menu {
position: absolute;
top: calc(100% + 6px);
right: 0;
min-width: 180px;
margin: 0;
padding: 6px;
background: var(--white);
border: 1px solid var(--warm);
border-radius: 10px;
box-shadow:
0 1px 2px rgb(0 0 0 / 6%),
0 8px 24px rgb(0 0 0 / 14%);
z-index: 60;
}
.locale-switcher__option {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border-radius: 6px;
text-decoration: none;
color: var(--dark);
font-size: 0.9rem;
font-weight: 500;
}
.locale-switcher__option.is-current {
background: var(--cream);
color: var(--accent-strong);
font-weight: 600;
}
.locale-switcher__option:hover,
.locale-switcher__option:focus-visible {
background: var(--warm);
outline: none;
}
/* Flag is the visual anchor: 32×24, no border, no rounded corners
(flags look better as crisp rectangles than as pills). */
.locale-switcher .flag {
width: 32px;
height: 24px;
flex: 0 0 32px;
display: block;
}
.locale-switcher__label {
white-space: nowrap;
}
/* Trigger on transparent nav (top-of-page): white caret on dark bg */
nav:not(.scrolled) .locale-switcher__trigger {
color: var(--white);
}
nav:not(.scrolled) .locale-switcher__trigger:hover,
nav:not(.scrolled) .locale-switcher__trigger:focus-visible {
background: rgb(255 255 255 / 12%);
}
/* Flag stays the same regardless of nav state — SVG defines its own colours */
/* VISUALLY HIDDEN (a11y) */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
/* FORM FIELD ERRORS (sub-Issue E) */
.form-field-error {
margin: 0.375rem 0 0;
font-size: 0.875rem;
color: #b91c1c;
line-height: 1.4;
}
.form-field input[aria-invalid="true"],
.form-field textarea[aria-invalid="true"] {
border-color: #b91c1c;
outline-color: #b91c1c;
}
.form-field input[aria-invalid="true"]:focus-visible,
.form-field textarea[aria-invalid="true"]:focus-visible {
outline: 2px solid #b91c1c;
outline-offset: 2px;
}
/* LEGAL PAGES (Impressum, Datenschutz) */
.legal-page {
max-width: 1200px;
margin: 0 auto;
padding: 6rem 3rem;
color: var(--dark);
}
.legal-page .section-eyebrow {
display: block;
margin-bottom: 1rem;
}
.legal-page h1 {
font-family: "Cormorant Garamond", serif;
font-size: clamp(2rem, 3.5vw, 3rem);
font-weight: 300;
line-height: 1.2;
margin-bottom: 2.5rem;
color: var(--charcoal);
}
.legal-page h2 {
font-family: "DM Sans", sans-serif;
font-size: 1.1rem;
font-weight: 600;
letter-spacing: 0.04em;
color: var(--charcoal);
margin: 2rem 0 0.75rem;
}
.legal-page h3 {
font-family: "DM Sans", sans-serif;
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--stone-strong);
margin: 1.5rem 0 0.5rem;
}
.legal-page p,
.legal-page address,
.legal-page li {
font-size: 0.95rem;
line-height: 1.85;
color: var(--stone-strong);
}
.legal-page address {
font-style: normal;
margin-bottom: 1rem;
}
.legal-page ul {
list-style: disc;
padding-left: 1.5rem;
margin: 0.5rem 0 1.25rem;
}
.legal-page ul li {
margin-bottom: 0.25rem;
}
.legal-page a {
color: var(--accent);
text-decoration: none;
border-bottom: 1px solid rgb(139 105 20 / 25%);
transition:
border-color 0.2s,
color 0.2s;
}
.legal-page a:hover {
color: var(--accent-strong);
border-bottom-color: var(--accent-strong);
}
.legal-divider {
border: none;
border-top: 1px solid var(--warm);
margin: 2.5rem 0;
}
.legal-back {
display: inline-block;
margin-top: 2.5rem;
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--accent);
border-bottom: 1px solid var(--accent);
padding-bottom: 2px;
transition:
color 0.2s,
border-color 0.2s;
}
.legal-back:hover {
color: var(--accent-strong);
border-bottom-color: var(--accent-strong);
}
@media (width <= 768px) {
.legal-page {
padding: 4rem 1.5rem;
}
}