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]>
This commit is contained in:
1 parent
b4eafbe433
commit
f74a08fa68
8 files changed
+367
-5
No files matched your search
@@ -27,6 +27,8 @@
|
||||
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 {
|
||||
@@ -37,6 +39,22 @@
|
||||
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 {
|
||||
@@ -164,6 +182,28 @@
|
||||
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;
|
||||
@@ -175,6 +215,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
Reference in new issue
Block a user