style: Platzhalter als typografische Tafeln statt Verlaufsflaechen
Beige Verlaeufe mit Bogen- und Silhouettenformen wirkten wie generische Fuellbilder. Jetzt: ruhiger Palettenton, feine Papierstruktur, Passepartout und ein angeschnittener Bodoni-Buchstabe aus "ARTISTA" (Cover: Jahreszahl), skaliert ueber Container-Einheiten. Eindeutig kein Foto, in Produktion ohne Label. Galerie etwas flacher. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
f74a08fa68
commit
00c7118c10
3 files changed
+32
-49
No files matched your search
@@ -34,7 +34,7 @@ export function Gallery({ images, showLabels }: { images: readonly Media[]; show
|
|||||||
// Grosses Bild links ueber zwei Reihen, rechts zwei Bilder, darunter ein Panorama.
|
// Grosses Bild links ueber zwei Reihen, rechts zwei Bilder, darunter ein Panorama.
|
||||||
const layout = ["md:col-span-7 md:row-span-2", "md:col-span-5", "md:col-span-5", "md:col-span-12"];
|
const layout = ["md:col-span-7 md:row-span-2", "md:col-span-5", "md:col-span-5", "md:col-span-12"];
|
||||||
const aspect = (index: number) =>
|
const aspect = (index: number) =>
|
||||||
index === 0 ? "aspect-[4/3] md:aspect-auto md:h-full" : index === 3 ? "aspect-[4/3] md:aspect-[21/8]" : "aspect-[4/3]";
|
index === 0 ? "aspect-[4/3] md:aspect-auto md:h-full" : index === 3 ? "aspect-[3/2] md:aspect-[3/1]" : "aspect-[3/2]";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -1,49 +1,25 @@
|
|||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import type { Media, PlaceholderTone } from "@/content/site";
|
import type { Media, PlaceholderTone } from "@/content/site";
|
||||||
|
|
||||||
const TONES: Record<PlaceholderTone, { background: string; shape: "arch" | "cypress" | "window" | "figure" }> = {
|
/*
|
||||||
villa: { background: "linear-gradient(172deg, #efe2cc 0%, #e0c7a2 52%, #c49a6c 100%)", shape: "arch" },
|
* Platzhalter als typografische Tafeln: ruhiger Farbton aus der Palette,
|
||||||
terrace: { background: "linear-gradient(185deg, #e9dcc6 0%, #d7c29d 60%, #9f8b62 100%)", shape: "cypress" },
|
* ein angeschnittener Bodoni-Buchstabe aus "ARTISTA" (bzw. die Jahreszahl
|
||||||
room: { background: "linear-gradient(160deg, #f3ebdf 0%, #e3d3bb 60%, #cdb592 100%)", shape: "window" },
|
* im Cover) und ein feines Passepartout. Sie wirken gestaltet, sind aber
|
||||||
garden: { background: "linear-gradient(190deg, #e6e0cc 0%, #c9c3a0 55%, #8c8a64 100%)", shape: "cypress" },
|
* eindeutig kein Foto und damit als Platzhalter erkennbar.
|
||||||
portrait: { background: "linear-gradient(170deg, #eadccb 0%, #d4b99c 60%, #a8805f 100%)", shape: "figure" },
|
*/
|
||||||
studio: { background: "linear-gradient(175deg, #e4ddd3 0%, #cabdac 60%, #8f8273 100%)", shape: "figure" },
|
type Plate = { background: string; glyph: string; italic?: boolean; style: React.CSSProperties };
|
||||||
};
|
|
||||||
|
|
||||||
function Shape({ shape }: { shape: (typeof TONES)[PlaceholderTone]["shape"] }) {
|
// Groessen und Lagen in Container-Einheiten (cqh/cqw): der Anschnitt sieht
|
||||||
const common = { fill: "currentColor", className: "absolute inset-0 h-full w-full text-ink/10" } as const;
|
// in jeder Tafelgroesse gleich aus.
|
||||||
switch (shape) {
|
const TONES: Record<PlaceholderTone, Plate> = {
|
||||||
case "arch":
|
cover: { background: "#ddd0bd", glyph: "27", italic: true, style: { fontSize: "92cqh", right: "-3cqw", bottom: "-20cqh" } },
|
||||||
return (
|
villa: { background: "#e2d6c4", glyph: "A", style: { fontSize: "105cqh", left: "5cqw", bottom: "-22cqh" } },
|
||||||
<svg viewBox="0 0 400 500" preserveAspectRatio="xMidYMax slice" aria-hidden {...common}>
|
terrace: { background: "#d6ccb8", glyph: "R", italic: true, style: { fontSize: "118cqh", right: "-4cqw", bottom: "-30cqh" } },
|
||||||
<path d="M120 500V250a80 80 0 0 1 160 0v250z" />
|
room: { background: "#e8dfd2", glyph: "T", style: { fontSize: "112cqh", left: "22cqw", top: "-34cqh" } },
|
||||||
<path d="M20 500V330a40 40 0 0 1 80 0v170zM300 500V330a40 40 0 0 1 80 0v170z" opacity=".6" />
|
garden: { background: "#cfcab6", glyph: "S", italic: true, style: { fontSize: "150cqh", right: "7cqw", bottom: "-58cqh" } },
|
||||||
</svg>
|
portrait: { background: "#dccfbe", glyph: "R", style: { fontSize: "92cqh", left: "-10cqw", bottom: "-14cqh" } },
|
||||||
);
|
studio: { background: "#d2c9bd", glyph: "A", italic: true, style: { fontSize: "96cqh", right: "-16cqw", bottom: "-16cqh" } },
|
||||||
case "cypress":
|
};
|
||||||
return (
|
|
||||||
<svg viewBox="0 0 400 500" preserveAspectRatio="xMidYMax slice" aria-hidden {...common}>
|
|
||||||
<path d="M90 500c-22-90-18-230 12-330 26 100 30 240 10 330z" />
|
|
||||||
<path d="M290 500c-18-70-15-180 10-260 21 80 24 190 8 260z" opacity=".7" />
|
|
||||||
<rect x="0" y="440" width="400" height="60" opacity=".5" />
|
|
||||||
</svg>
|
|
||||||
);
|
|
||||||
case "window":
|
|
||||||
return (
|
|
||||||
<svg viewBox="0 0 400 500" preserveAspectRatio="xMidYMid slice" aria-hidden {...common}>
|
|
||||||
<path d="M150 90h100v190H150z" opacity=".7" />
|
|
||||||
<rect x="60" y="360" width="280" height="70" rx="6" />
|
|
||||||
</svg>
|
|
||||||
);
|
|
||||||
case "figure":
|
|
||||||
return (
|
|
||||||
<svg viewBox="0 0 400 500" preserveAspectRatio="xMidYMax slice" aria-hidden {...common}>
|
|
||||||
<circle cx="200" cy="185" r="62" />
|
|
||||||
<path d="M80 500c0-120 54-200 120-200s120 80 120 200z" />
|
|
||||||
</svg>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
media: Media;
|
media: Media;
|
||||||
@@ -73,12 +49,19 @@ export function MediaFrame({ media, aspect, sizes, showLabel, priority, classNam
|
|||||||
<div
|
<div
|
||||||
role="img"
|
role="img"
|
||||||
aria-label={`Platzhalter: ${media.label}`}
|
aria-label={`Platzhalter: ${media.label}`}
|
||||||
className={`relative overflow-hidden ${aspect} ${className}`}
|
className={`placeholder-plate relative isolate overflow-hidden ${aspect} ${className}`}
|
||||||
style={{ background: tone.background }}
|
style={{ backgroundColor: tone.background, containerType: "size" }}
|
||||||
>
|
>
|
||||||
<Shape shape={tone.shape} />
|
<span
|
||||||
|
aria-hidden
|
||||||
|
className={`display pointer-events-none absolute select-none leading-none text-ink/[0.07] ${tone.italic ? "italic" : ""}`}
|
||||||
|
style={tone.style}
|
||||||
|
>
|
||||||
|
{tone.glyph}
|
||||||
|
</span>
|
||||||
|
<span aria-hidden className="pointer-events-none absolute inset-3 border border-ink/10 md:inset-4" />
|
||||||
{showLabel && (
|
{showLabel && (
|
||||||
<span className="absolute bottom-3 left-3 rounded-full bg-paper/85 px-3 py-1 text-xs font-semibold text-ink">
|
<span className="absolute bottom-6 left-6 bg-paper/90 px-2.5 py-1 text-xs font-semibold text-ink md:bottom-7 md:left-7">
|
||||||
Platzhalter: {media.label}
|
Platzhalter: {media.label}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+2
-2
@@ -18,7 +18,7 @@
|
|||||||
* Offene Punkte: docs/OFFENE-PUNKTE.md
|
* Offene Punkte: docs/OFFENE-PUNKTE.md
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export type PlaceholderTone = "villa" | "garden" | "room" | "terrace" | "portrait" | "studio";
|
export type PlaceholderTone = "cover" | "villa" | "garden" | "room" | "terrace" | "portrait" | "studio";
|
||||||
|
|
||||||
export type Media =
|
export type Media =
|
||||||
| { kind: "placeholder"; label: string; tone: PlaceholderTone }
|
| { kind: "placeholder"; label: string; tone: PlaceholderTone }
|
||||||
@@ -35,7 +35,7 @@ export const site = {
|
|||||||
headline: "Gemeinsam wachsen. In Italien.",
|
headline: "Gemeinsam wachsen. In Italien.",
|
||||||
subline:
|
subline:
|
||||||
"Das ARTISTA Modelcamp 2027 bringt Models an einem Ort in Italien zusammen – zum Lernen, Arbeiten und Wohnen unter einem Dach.",
|
"Das ARTISTA Modelcamp 2027 bringt Models an einem Ort in Italien zusammen – zum Lernen, Arbeiten und Wohnen unter einem Dach.",
|
||||||
media: placeholder("Leitmotiv: Bild oder Video folgt", "villa"),
|
media: placeholder("Leitmotiv: Bild oder Video folgt", "cover"),
|
||||||
},
|
},
|
||||||
|
|
||||||
camp: {
|
camp: {
|
||||||
|
|||||||
Reference in new issue
Block a user