Files
Artista-Filmcamp/src/app/globals.css
T
Nick SzaunigandClaude Opus 5.5 f74a08fa68 feat: Google-Rezensionen als eigener Abschnitt auf der Onepage
- ReviewsSection (Server Component) mit Durchschnitt, zugaenglichen
  Sternen, Initialen statt Profilbildern, relativer Zeit, Links zur
  Rezension und zum Maps-Eintrag sowie Hinweis "Rezensionen von Google"
- lange Texte optisch gekuerzt, "Weiterlesen" mit aria-expanded
- ohne Daten ausgeblendet; in Entwicklung/Staging ein Einrichtungshinweis
- Laden parallel zu loadPublicPage, Fehler blenden nur den Abschnitt aus
- Links aus der API-Antwort nur zu HTTPS-Google-Hosts (safeGoogleUrl)
- Linkstile und Browser-Oberflaechen (Scrollbar, Caret, Unterstreichung)

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-28 17:46:19 +02:00

306 lines
7.0 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-bodoni), "Bodoni 72", "Didot", Georgia, serif;
--font-sans: var(--font-hanken), "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: 400;
letter-spacing: -0.01em;
line-height: 1.02;
}
.section-title {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(2.25rem, 1.4rem + 3.6vw, 4.25rem);
line-height: 1.02;
letter-spacing: -0.015em;
}
.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>");
}
/* Masthead: der eine laute Moment der Seite. */
.masthead {
font-family: var(--font-display);
font-weight: 500;
font-size: clamp(4.25rem, 21vw, 19rem);
line-height: 0.8;
letter-spacing: -0.035em;
font-variation-settings: "opsz" 96;
}
/*
* Einzige orchestrierte Eroeffnung: Masthead steigt auf, das Leitbild setzt
* sich, die Cover-Lines folgen. Reines CSS, kein JavaScript noetig; bei
* reduzierter Bewegung greift die Regel in @layer base.
*/
@keyframes hero-rise {
from {
opacity: 0;
transform: translateY(0.18em);
clip-path: inset(0 0 100% 0);
}
to {
opacity: 1;
transform: none;
clip-path: inset(0 0 0 0);
}
}
@keyframes hero-settle {
from {
opacity: 0;
transform: scale(1.035);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes hero-fade {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: none;
}
}
.hero-rise {
animation: hero-rise 1.1s var(--ease-editorial) both;
}
.hero-image {
overflow: hidden;
}
.hero-image > * {
animation: hero-settle 1.5s var(--ease-editorial) 0.15s both;
}
.hero-fade {
animation: hero-fade 0.9s var(--ease-editorial) 0.5s both;
}
/* 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);
}