- Figtree als einzige Schrift, Logo mittig in fester Kopfzeile - Headerbild ueber volle Breite und Hoehe, ohne Preis, mit Terminleiste - "Was dich erwartet" stellt die Villa mit animierter Bilderfolge vor, darunter Tagesablauf als Karussell (Programm folgt als PDF) - Preis: regulaerer Preis durchgestrichen, kein Verkaufsstartdatum, Ueberschrift "Jetzt Platz sichern mit Early Bird" - Team als "Mit dabei", danach drei Reels im Hochformat - Logo, Headerbild, Portraets und Reels ueber feste Dateinamen im Medienverzeichnis (docs/MEDIEN.md), ohne Neustart austauschbar - Widerrufsbelehrung im Admin pflegbar, Seite /widerruf, Live-Verkauf ohne Freigabe gesperrt - Anreise: Abholung am Bahnhof Firenze Santa Maria Novella - Booking-Link entfernt, Gedankenstriche aus Kundentexten entfernt Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
299 lines
6.8 KiB
CSS
299 lines
6.8 KiB
CSS
@import "tailwindcss";
|
|
|
|
/*
|
|
* Gestaltung: Modemagazin trifft italienischen Sommer.
|
|
* Putz-Weiss (plaster) als Grund, Anthrazit (ink) fuer Schrift und dunkle
|
|
* Flaechen, Pompeji-Rot (rosso) als sparsam eingesetzter Akzent.
|
|
* Kontraste (gegen plaster): ink 14.6:1, stone 5.3:1, rosso 6.7:1.
|
|
*/
|
|
@theme {
|
|
--color-plaster: #f2ece3;
|
|
--color-paper: #faf7f1;
|
|
--color-ink: #23211f;
|
|
--color-stone: #676058;
|
|
--color-line: #d8cec0;
|
|
--color-rosso: #8e3b2b;
|
|
--color-rosso-deep: #6f2c20;
|
|
--color-sand: #c9b79c;
|
|
|
|
--font-display: var(--font-figtree), "Helvetica Neue", Arial, sans-serif;
|
|
--font-sans: var(--font-figtree), "Helvetica Neue", Arial, sans-serif;
|
|
|
|
--ease-editorial: cubic-bezier(0.22, 1, 0.36, 1);
|
|
}
|
|
|
|
@layer base {
|
|
html {
|
|
scroll-behavior: smooth;
|
|
scroll-padding-top: 5rem;
|
|
-webkit-text-size-adjust: 100%;
|
|
scrollbar-color: var(--color-stone) var(--color-plaster);
|
|
accent-color: var(--color-rosso);
|
|
}
|
|
|
|
body {
|
|
background: var(--color-plaster);
|
|
color: var(--color-ink);
|
|
font-family: var(--font-sans);
|
|
font-size: 1.0625rem;
|
|
line-height: 1.6;
|
|
text-rendering: optimizeLegibility;
|
|
-webkit-font-smoothing: antialiased;
|
|
caret-color: var(--color-rosso);
|
|
font-variant-numeric: lining-nums;
|
|
}
|
|
|
|
h1,
|
|
h2,
|
|
h3 {
|
|
text-wrap: balance;
|
|
}
|
|
p {
|
|
text-wrap: pretty;
|
|
}
|
|
|
|
a {
|
|
text-underline-offset: 0.22em;
|
|
text-decoration-thickness: 1px;
|
|
}
|
|
|
|
::selection {
|
|
background: var(--color-rosso);
|
|
color: var(--color-paper);
|
|
}
|
|
|
|
/* Sichtbarer Fokus fuer Tastaturbedienung, nie nur ueber Farbe. */
|
|
:focus-visible {
|
|
outline: 2px solid var(--color-rosso);
|
|
outline-offset: 3px;
|
|
}
|
|
|
|
.on-dark :focus-visible {
|
|
outline-color: var(--color-paper);
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
html {
|
|
scroll-behavior: auto;
|
|
}
|
|
*,
|
|
*::before,
|
|
*::after {
|
|
animation-duration: 0.01ms !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0.01ms !important;
|
|
}
|
|
}
|
|
}
|
|
|
|
@layer components {
|
|
.container-edge {
|
|
width: 100%;
|
|
max-width: 88rem;
|
|
margin-inline: auto;
|
|
padding-inline: 1rem;
|
|
}
|
|
@media (min-width: 48rem) {
|
|
.container-edge {
|
|
padding-inline: 2.5rem;
|
|
}
|
|
}
|
|
|
|
.display {
|
|
font-family: var(--font-display);
|
|
font-weight: 600;
|
|
letter-spacing: -0.02em;
|
|
line-height: 1.08;
|
|
}
|
|
|
|
.section-title {
|
|
font-family: var(--font-display);
|
|
font-weight: 700;
|
|
font-size: clamp(2.25rem, 1.4rem + 3.2vw, 3.75rem);
|
|
line-height: 1.05;
|
|
letter-spacing: -0.025em;
|
|
}
|
|
|
|
.prose-body {
|
|
max-width: 38rem;
|
|
}
|
|
.prose-body p + p {
|
|
margin-top: 1em;
|
|
}
|
|
|
|
.btn {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 0.5rem;
|
|
min-height: 3rem;
|
|
padding: 0.75rem 1.5rem;
|
|
font-weight: 600;
|
|
font-size: 1rem;
|
|
border-radius: 999px;
|
|
transition:
|
|
background-color 180ms var(--ease-editorial),
|
|
color 180ms var(--ease-editorial),
|
|
transform 180ms var(--ease-editorial);
|
|
}
|
|
.btn:active {
|
|
transform: scale(0.98);
|
|
}
|
|
.btn-primary {
|
|
background: var(--color-rosso);
|
|
color: var(--color-paper);
|
|
}
|
|
.btn-primary:hover {
|
|
background: var(--color-rosso-deep);
|
|
}
|
|
.btn-primary:disabled {
|
|
background: var(--color-stone);
|
|
cursor: not-allowed;
|
|
}
|
|
.btn-quiet {
|
|
border: 1px solid currentColor;
|
|
}
|
|
.btn-quiet:hover {
|
|
background: var(--color-ink);
|
|
color: var(--color-paper);
|
|
border-color: var(--color-ink);
|
|
}
|
|
|
|
.field-label {
|
|
display: block;
|
|
font-size: 0.9375rem;
|
|
font-weight: 600;
|
|
margin-bottom: 0.375rem;
|
|
}
|
|
.field {
|
|
width: 100%;
|
|
min-height: 3rem;
|
|
padding: 0.625rem 0.875rem;
|
|
background: var(--color-paper);
|
|
border: 1px solid #b3a794;
|
|
border-radius: 0.5rem;
|
|
font-size: 1rem;
|
|
}
|
|
.field:focus-visible {
|
|
outline-offset: 0;
|
|
border-color: var(--color-ink);
|
|
}
|
|
.field[aria-invalid="true"] {
|
|
border-color: var(--color-rosso);
|
|
}
|
|
|
|
/* Textlinks: ruhig unterstrichen, beim Zeigen kraeftiger. */
|
|
.link-quiet {
|
|
text-decoration-line: underline;
|
|
text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
|
|
text-underline-offset: 0.22em;
|
|
text-decoration-thickness: 1px;
|
|
transition: text-decoration-color 160ms var(--ease-editorial);
|
|
}
|
|
.link-quiet:hover {
|
|
text-decoration-color: currentColor;
|
|
}
|
|
.link-strong {
|
|
text-decoration-line: underline;
|
|
text-decoration-color: var(--color-rosso);
|
|
text-underline-offset: 0.3em;
|
|
text-decoration-thickness: 2px;
|
|
transition: color 160ms var(--ease-editorial);
|
|
}
|
|
.link-strong:hover {
|
|
color: var(--color-rosso);
|
|
}
|
|
|
|
.draft-flag {
|
|
display: inline-block;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
padding: 0.125rem 0.5rem;
|
|
border-radius: 999px;
|
|
background: #efe0b8;
|
|
color: #5c4712;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Papierstruktur der Platzhalter-Tafeln (inline SVG als data-URI, CSP:
|
|
* img-src data: ist erlaubt). Statisch, keine Animation.
|
|
*/
|
|
.placeholder-plate::before {
|
|
content: "";
|
|
position: absolute;
|
|
inset: 0;
|
|
z-index: -1;
|
|
opacity: 0.35;
|
|
mix-blend-mode: multiply;
|
|
background-image: url("data:image/svg+xml;utf8,<svg xmlns=%27http://www.w3.org/2000/svg%27 width=%27160%27 height=%27160%27><filter id=%27n%27><feTurbulence type=%27fractalNoise%27 baseFrequency=%270.9%27 numOctaves=%272%27 stitchTiles=%27stitch%27/><feColorMatrix values=%270 0 0 0 0.45 0 0 0 0 0.4 0 0 0 0 0.35 0 0 0 0.22 0%27/></filter><rect width=%27100%25%27 height=%27100%25%27 filter=%27url(%23n)%27/></svg>");
|
|
}
|
|
|
|
/*
|
|
* Eroeffnung: Headerbild zoomt langsam heran, Titel, Text und Buttons
|
|
* blenden nacheinander ein. Reines CSS; bei reduzierter Bewegung greift
|
|
* die Regel in @layer base, das Headervideo wird dann ausgeblendet.
|
|
*/
|
|
@keyframes hero-zoom {
|
|
from {
|
|
transform: scale(1.12);
|
|
}
|
|
to {
|
|
transform: scale(1);
|
|
}
|
|
}
|
|
@keyframes hero-fade {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(14px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: none;
|
|
}
|
|
}
|
|
@keyframes hero-bounce {
|
|
0%,
|
|
100% {
|
|
transform: translateY(0);
|
|
}
|
|
50% {
|
|
transform: translateY(6px);
|
|
}
|
|
}
|
|
.hero-zoom {
|
|
animation: hero-zoom 9s cubic-bezier(0.2, 0.6, 0.3, 1) both;
|
|
}
|
|
.hero-fade {
|
|
animation: hero-fade 0.9s var(--ease-editorial) 0.2s both;
|
|
}
|
|
.hero-fade-late {
|
|
animation-delay: 0.4s;
|
|
}
|
|
.hero-fade-later {
|
|
animation-delay: 0.6s;
|
|
}
|
|
.hero-bounce {
|
|
animation: hero-bounce 2.4s ease-in-out 1.5s infinite;
|
|
}
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.hero-video {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* Mobile Buchungsleiste: Inhalt am Seitenende nie verdecken. */
|
|
body:has(.mobile-book-bar[data-visible="true"]) footer {
|
|
padding-bottom: 6rem;
|
|
}
|
|
@media (min-width: 64rem) {
|
|
body:has(.mobile-book-bar[data-visible="true"]) footer {
|
|
padding-bottom: 0;
|
|
}
|
|
}
|
|
|
|
dialog.booking-dialog::backdrop {
|
|
background: rgb(35 33 31 / 0.55);
|
|
backdrop-filter: blur(2px);
|
|
}
|