feat: expand portfolios, drop wedding crowd photos, offer studio on site

- 28 more of the operator's own public images (42 -> 67), alts from his captions
- remove group-feier, group-outdoor, group-posiert (wedding guests visible)
- studio section now offers Studio Neumuenster and Mobiles Studio
- deploy: --force-recreate on release and rollback, plus in-container content probe
- verify: DESFOTO_BASE dry-run, redirect, asset and privacy checks
- tests: 57 OK (3 new content guards, 2 deploy/verify regression guards)
This commit is contained in:
desfoto automation
2026-09-19 17:37:49 +02:00
parent 447b909d05
commit 8ffeea6731
141 changed files with 476 additions and 72 deletions

View File

@@ -145,17 +145,36 @@ SHOOTING_STEPS = [
},
]
# Das mobile Studio: der Betrieb kommt mit Licht und Hintergrund zum Termin.
# Zwei Orte für Shootings: das eigene Studio in Neumünster und das mobile Studio,
# das mit kompletter Ausrüstung zum Termin kommt.
STUDIO = {
"title": "Mobiles Studio",
"lead": "Das Studio kommt zu dir.",
"title": "Im Studio in Neumünster oder bei dir vor Ort",
"lead": (
"Projekte können im eigenen Studio in Neumünster fotografiert werden — oder"
" ich baue das mobile Studio inklusive autarker Blitzanlage dort auf, wo"
" deine Leute sind."
),
"ways": [
{
"title": "Studio Neumünster",
"text": (
"Ein eigenes Studio in Neumünster steht für Shootings bereit:"
" kontrolliertes Licht, ruhiger Hintergrund und Platz für"
" Konzeptarbeit. Gut für Portraits, Businessbilder und alles, was"
" eine wiederholbare Optik braucht — unabhängig vom Wetter."
),
},
{
"title": "Mobiles Studio",
"text": (
"Nicht jedes Team kann für ein Shooting den Betrieb verlassen. Deshalb"
" baue ich das Studio dort auf, wo deine Leute sowieso sind: im"
" Besprechungsraum, in der Werkstatt, im Vereinsheim oder draußen vor"
" der Halle."
),
},
],
"text": [
(
"Nicht jedes Team kann für ein Shooting den Betrieb verlassen. Deshalb"
" baue ich das Studio dort auf, wo deine Leute sowieso sind: im"
" Besprechungsraum, in der Werkstatt, im Vereinsheim oder draußen vor"
" der Halle."
),
(
"Dabei ist die komplette Ausrüstung dabei — Hintergründe, Blitze,"
" Lichtformer und Ersatztechnik. Die Blitzanlage ist autark, ich bin"
@@ -283,10 +302,11 @@ PHOTO_OVERVIEW = [
"image": "editorial-pose",
},
{
"title": "Mobiles Studio",
"title": "Studio & mobil",
"text": (
"Komplette Ausrüstung inklusive autarker Blitzanlage, Hintergründen und "
"Lichtformern — aufgebaut an deinem Ort, statt umgekehrt."
"Shootings im eigenen Studio in Neumünster oder mit dem mobilen Studio "
"inklusive autarker Blitzanlage, Hintergründen und Lichtformern — "
"aufgebaut an deinem Ort, statt umgekehrt."
),
"image": "business-portrait-sit",
},
@@ -296,18 +316,23 @@ PHOTO_OVERVIEW = [
"Feiern, Events, Vereinsleben und Premieren. Dokumentarisch begleitet, "
"ohne den Ablauf auszubremsen."
),
"image": "group-feier",
"image": "event-speaker",
},
]
WORK_GALLERY = [
("music-guitar-silhouette", "Gitarrist als Silhouette im Bühnennebel", "g-w3", "4x5", "50% 42%"),
("free-fjord", "Steile Felsnadeln vor dem Meer", "g-w3", "4x5", "50% 50%"),
("free-castle-lake", "Kleine Burg auf einer Insel in einem bewaldeten See", "g-w3", "4x5", "50% 50%"),
("music-strings", "Nahaufnahme einer Hand an den Saiten", "g-w2", "1x1", "50% 50%"),
("free-cat", "Nahaufnahme einer getigerten Katze", "g-w2", "1x1", "50% 42%"),
("business-hotel-orange", "Frauen im Bademantel halten Orangenscheiben vor ihre Gesichter", "g-w2", "1x1", "50% 50%"),
("business-portrait-dark", "Businessportrait im Studiolicht", "g-w2", "1x1", "50% 32%"),
("free-fog-forest", "Nebel über einem Nadelwald", "g-w3", "3x2", "50% 45%"),
("free-dog-husky", "Ein Hund auf einem sonnigen Waldweg", "g-w2", "1x1", "50% 45%"),
("editorial-colour", "Model-Shooting im Studio", "g-w3", "3x2", "50% 30%"),
("music-dreadlocks", "Musiker mit Dreadlocks vor einem Mikrofon", "g-w3", "3x2", "50% 35%"),
("couple-backlight-kiss", "Paar küsst sich im Gegenlicht", "g-w3", "4x5", "50% 45%"),
("free-fog-forest", "Nebel über einem Nadelwald", "g-w3", "3x2", "50% 45%"),
("free-cat", "Nahaufnahme einer getigerten Katze", "g-w2", "1x1", "50% 42%"),
("couple-sun-silhouette", "Silhouetten eines Paares vor der Sonne", "g-w3", "3x2", "50% 50%"),
]
PROCESS = [
@@ -344,8 +369,8 @@ PROCESS = [
FACTS = [
{
"title": "Mobiles Studio",
"text": "Komplette Ausrüstung mit autarker Blitzanlage, Hintergründen und Lichtformern — aufgebaut an deinem Ort.",
"title": "Studio & vor Ort",
"text": "Eigenes Studio in Neumünster oder mobiles Studio mit autarker Blitzanlage, Hintergründen und Lichtformern.",
},
{
"title": "Aus Neumünster",

View File

@@ -99,24 +99,6 @@
"alt": "Paar küsst sich vor hellem Hintergrund",
"focus": "50% 30%"
},
{
"slug": "group-feier",
"raw": "1777033639756_1f5a9dc4_dennyschulz_-03904.jpg",
"alt": "Feiergesellschaft bei einer Veranstaltung",
"focus": "50% 36%"
},
{
"slug": "group-outdoor",
"raw": "1784293233172_7a8a3ed9_dennyschulz_-08435.jpg",
"alt": "Gruppe posiert im Freien",
"focus": "50% 36%"
},
{
"slug": "group-posiert",
"raw": "1784293233955_033a5079_dennyschulz_-08456.jpg",
"alt": "Gruppe steht zusammen vor der Kamera",
"focus": "50% 38%"
},
{
"slug": "event-motion",
"raw": "1776670469051_dc2993ae_dennyschulz_-04663.jpg",
@@ -272,6 +254,202 @@
"raw": "dennyschulz_-03704.jpg",
"alt": "Blick durch einen steinernen Torbogen in einen Garten",
"focus": "50% 45%"
},
{
"slug": "music-dreadlocks",
"source": "legacy",
"raw": "_DES3044.jpg",
"alt": "Musiker mit Dreadlocks vor einem Mikrofon",
"focus": "50% 35%"
},
{
"slug": "music-drummer",
"source": "legacy",
"raw": "_DES3020.jpg",
"alt": "Schlagzeuger blickt hinter seinen Becken hervor",
"focus": "50% 45%"
},
{
"slug": "music-banner",
"source": "legacy",
"raw": "_DES3765.jpg",
"alt": "Gitarrist vor einem beleuchteten Bandbanner",
"focus": "50% 40%"
},
{
"slug": "music-neck",
"source": "legacy",
"raw": "_DES3679.jpg",
"alt": "Hand am Gitarrenhals im dunklen Bühnenlicht",
"focus": "50% 50%"
},
{
"slug": "music-horns",
"source": "legacy",
"raw": "dennyschulz23-3347.jpg",
"alt": "Zwei Musiker trinken aus Trinkhörnern",
"focus": "50% 35%"
},
{
"slug": "band-extinct-guitar",
"source": "legacy",
"raw": "dennyschulz_20231211-75.jpg",
"alt": "Zwei Bandmitglieder stehen Rücken an Rücken mit Gitarre",
"focus": "50% 30%"
},
{
"slug": "band-extinct-group",
"source": "legacy",
"raw": "_DS_7981-51ff6640.jpg",
"alt": "Vier Bandmitglieder hintereinander in Schwarzweiß",
"focus": "50% 40%"
},
{
"slug": "business-hotel-window",
"source": "legacy",
"raw": "dennyschulz23A-3958.jpg",
"alt": "Drei Frauen in Bademänteln und Handtuchturbanen am Fenster",
"focus": "50% 40%"
},
{
"slug": "business-hotel-orange",
"source": "legacy",
"raw": "dennyschulz23A-3821.jpg",
"alt": "Frauen im Bademantel halten Orangenscheiben vor ihre Gesichter",
"focus": "50% 50%"
},
{
"slug": "business-hotel-tea",
"source": "legacy",
"raw": "dennyschulz23-3732.jpg",
"alt": "Drei Frauen mit Teetassen und Handtuchturbanen",
"focus": "50% 45%"
},
{
"slug": "business-hotel-laugh",
"source": "legacy",
"raw": "dennyschulz23A-3829-2.jpg",
"alt": "Drei Frauen lachen mit Orangenscheiben in den Händen",
"focus": "50% 45%"
},
{
"slug": "editorial-studio-side",
"source": "legacy",
"raw": "dennyschulz_marta-02237.jpg",
"alt": "Marta im seitlichen Studiolicht vor dunklem Hintergrund",
"focus": "50% 30%"
},
{
"slug": "editorial-balance",
"source": "legacy",
"raw": "dennyschulz_marta-01897.jpg",
"alt": "Marta balanciert sitzend mit angehobenem Bein",
"focus": "50% 40%"
},
{
"slug": "editorial-leap",
"source": "legacy",
"raw": "dennyschulz_marta-01315-3132063d.jpg",
"alt": "Marta springt mit angewinkelten Beinen",
"focus": "50% 35%"
},
{
"slug": "couple-park",
"source": "legacy",
"raw": "dennyschulz-5142.jpg",
"alt": "Sara und Carlos stehen Arm in Arm im Grünen",
"focus": "50% 30%"
},
{
"slug": "couple-backlight-kiss",
"source": "legacy",
"raw": "dennyschulz-5191.jpg",
"alt": "Sara und Carlos küssen sich im Gegenlicht",
"focus": "50% 45%"
},
{
"slug": "couple-forest-walk",
"source": "legacy",
"raw": "dennyschulz-4415.jpg",
"alt": "Sara und Carlos gehen Hand in Hand durch den Wald",
"focus": "50% 35%"
},
{
"slug": "couple-sun-silhouette",
"source": "legacy",
"raw": "dennyschulz-2076.jpg",
"alt": "Die Silhouetten des Paars rahmen die tief stehende Sonne",
"focus": "50% 50%"
},
{
"slug": "couple-laugh-walk",
"source": "legacy",
"raw": "dennyschulz-0368.jpg",
"alt": "Tamara und Tobi lachen auf einem Waldweg",
"focus": "50% 35%"
},
{
"slug": "portrait-marina-snow",
"source": "legacy",
"raw": "dennyschulz_20240118-8156.jpg",
"alt": "Marina mit roten Zöpfen auf einem verschneiten Waldweg",
"focus": "50% 30%"
},
{
"slug": "portrait-marina-sunset",
"source": "legacy",
"raw": "dennyschulz_20240118-9806.jpg",
"alt": "Marinas Silhouette vor orangefarbenem Abendhimmel",
"focus": "50% 45%"
},
{
"slug": "free-dog-husky",
"source": "legacy",
"raw": "_DES9989.jpg",
"alt": "Ein Hund steht auf einem sonnigen Waldweg",
"focus": "50% 45%"
},
{
"slug": "free-dogs-forest",
"source": "legacy",
"raw": "_DSC3383.jpg",
"alt": "Zwei Hunde liegen auf einem Waldweg",
"focus": "50% 50%"
},
{
"slug": "free-cat-light",
"source": "legacy",
"raw": "_DES2313-2.jpg",
"alt": "Eine getigerte Katze schaut aus dem Fenster",
"focus": "50% 45%"
},
{
"slug": "free-cat-white",
"source": "legacy",
"raw": "dennyschulz-5639-2.jpg",
"alt": "Eine weiße Katze mit aufgerichtetem buschigem Schwanz",
"focus": "50% 40%"
},
{
"slug": "free-castle-lake",
"source": "legacy",
"raw": "20230830_dennyschulz-1039.jpg",
"alt": "Kleine Burg auf einer Insel in einem bewaldeten See",
"focus": "50% 50%"
},
{
"slug": "free-swans",
"source": "legacy",
"raw": "_DSC0658.jpg",
"alt": "Zwei Schwäne auf ruhigem Wasser",
"focus": "50% 45%"
},
{
"slug": "free-sparrow",
"source": "legacy",
"raw": "_DES1036.jpg",
"alt": "Ein Spatz sitzt auf einem Ast",
"focus": "50% 45%"
}
]
}

View File

@@ -192,11 +192,16 @@ def marquee(items: list[str]) -> str:
def studio_section(*, variant: str = "paper2", tight: bool = False) -> str:
"""The mobile studio: complete kit including a self-sufficient flash system."""
"""The studio in Neumünster and the mobile studio with its self-sufficient flash kit."""
features = "".join(
f'<div><h3>{e(feature["title"])}</h3><p>{e(feature["text"])}</p></div>'
for feature in STUDIO["features"]
)
ways = "".join(
f'<article class="card reveal"><h3>{e(way["title"])}</h3>'
f'<p class="card__text">{e(way["text"])}</p></article>'
for way in STUDIO["ways"]
)
paragraphs = "".join(f"<p>{e(paragraph)}</p>" for paragraph in STUDIO["text"])
content = (
'<div class="studio">'
@@ -212,14 +217,15 @@ def studio_section(*, variant: str = "paper2", tight: bool = False) -> str:
"<span>Hintergründe, Blitze, Lichtformer</span></span>"
"</div>"
'<div class="stack reveal reveal--right">'
f'<div class="grid grid--2" data-stagger="0.08">{ways}</div>'
+ paragraphs
+ f'<div class="studio__features" data-stagger="0.07">{features}</div>'
"</div></div>"
)
return section(
kicker="Mobiles Studio",
title="Das Studio kommt zu dir",
lead="Komplette Ausrüstung inklusive autarker Blitzanlage — aufgebaut dort, wo deine Leute sind.",
kicker="Studio",
title=STUDIO["title"],
lead=STUDIO["lead"],
content=content,
variant=variant,
tight=tight,
@@ -335,7 +341,7 @@ def home() -> str:
</div>
<div class="hero__facts">
<div class="hero__fact"><strong>Shootings</strong>Business, Portrait, Familie und Minishootings unter einem Dach.</div>
<div class="hero__fact"><strong>Mobiles Studio</strong>Komplette Ausrüstung inklusive autarker Blitzanlage vor Ort.</div>
<div class="hero__fact"><strong>Studio &amp; vor Ort</strong>Eigenes Studio in Neumünster oder mobiles Studio inklusive autarker Blitzanlage bei dir.</div>
<div class="hero__fact"><strong>Foto &amp; Video</strong>Beides aus einer Hand, damit Optik und Ton zusammenpassen.</div>
<div class="hero__fact"><strong>Musik &amp; Bühne</strong>Konzerte, Bands und Musikvideos aus eigener Erfahrung.</div>
</div>
@@ -520,8 +526,11 @@ def shootings() -> str:
("editorial-colour", "Fashion-Portrait in kräftigen Farben", "4x5", "50% 30%"),
("portrait-couple", "Paarportrait im Grünen", "4x5", "50% 30%"),
("business-portrait-stool", "Sitzendes Portrait im weichen Studiolicht", "3x2", "50% 35%"),
("group-feier", "Feiergesellschaft bei einer Veranstaltung", "3x2", "50% 36%"),
("business-hotel-window", "Drei Frauen in Bademänteln und Handtuchturbanen am Fenster", "3x2", "50% 40%"),
("portrait-natural", "Natürliches Portrait im Freien", "3x2", "50% 32%"),
("couple-backlight-kiss", "Sara und Carlos küssen sich im Gegenlicht", "1x1", "50% 45%"),
("editorial-leap", "Marta springt mit angewinkelten Beinen", "1x1", "50% 35%"),
("free-dog-husky", "Ein Hund steht auf einem sonnigen Waldweg", "1x1", "50% 45%"),
]
),
)
@@ -541,7 +550,7 @@ def shootings() -> str:
right=ticks(
[
"Tageslicht, Studiolicht und mobile Blitzanlage",
"Mobiles Studio direkt an deinem Ort",
"Im Studio in Neumünster oder mit dem mobilen Studio bei dir",
"Reportagestil bei Veranstaltungen",
"Lieferung per Downloadlink",
]
@@ -643,8 +652,12 @@ def businessfotografie() -> str:
[
("business-portrait-dark", "Portrait eines Mannes vor dunklem Hintergrund", "4x5", "50% 28%"),
("business-portrait-stool", "Sitzendes Portrait im weichen Studiolicht", "4x5", "50% 35%"),
("business-hotel-window", "Drei Frauen in Bademänteln und Handtuchturbanen am Fenster", "4x5", "50% 40%"),
("business-hotel-tea", "Drei Frauen mit Teetassen und Handtuchturbanen", "4x5", "50% 45%"),
("gear-cases", "Kamerakoffer und Objektive vor einem Studiorack", "3x2", "50% 50%"),
("studio-setup", "Studioequipment mit Logo von Denny Schulz Fotografie", "3x2", "50% 45%"),
("business-hotel-orange", "Frauen im Bademantel halten Orangenscheiben vor ihre Gesichter", "3x2", "50% 50%"),
("business-hotel-laugh", "Drei Frauen lachen mit Orangenscheiben in den Händen", "3x2", "50% 45%"),
],
columns="grid--2",
),
@@ -749,6 +762,9 @@ def portrait_und_model() -> str:
("editorial-back", "50% 40%"),
("editorial-black", "50% 28%"),
("editorial-earring", "45% 28%"),
("editorial-studio-side", "50% 30%"),
("editorial-balance", "50% 40%"),
("editorial-leap", "50% 35%"),
("portrait-natural", "50% 30%"),
("people-kiss", "50% 32%"),
]
@@ -837,9 +853,13 @@ def familien_und_paare() -> str:
("portrait-natural", "50% 30%"),
("people-kiss", "50% 32%"),
("portrait-couple", "50% 30%"),
("group-feier", "50% 36%"),
("group-outdoor", "50% 36%"),
("group-posiert", "50% 38%"),
("couple-park", "50% 30%"),
("couple-backlight-kiss", "50% 45%"),
("couple-forest-walk", "50% 35%"),
("couple-laugh-walk", "50% 35%"),
("couple-sun-silhouette", "50% 50%"),
("portrait-marina-snow", "50% 30%"),
("portrait-marina-sunset", "50% 45%"),
]
)
+ "</div>",
@@ -941,7 +961,9 @@ def minishootings() -> str:
("portrait-natural", "50% 28%"),
("business-portrait-studio", "50% 28%"),
("editorial-black", "50% 28%"),
("editorial-studio-side", "50% 30%"),
("free-modern-portrait", "50% 30%"),
("portrait-marina-snow", "50% 30%"),
]
)
+ "</div>",
@@ -1032,8 +1054,11 @@ def video() -> str:
[
("music-vocal-blue", "Sänger mit erhobenem Arm im blauen Bühnenlicht", "4x5", "50% 30%"),
("music-guitar-silhouette", "Gitarrist als Silhouette im Bühnennebel", "4x5", "50% 42%"),
("band-extinct-guitar", "Zwei Bandmitglieder stehen Rücken an Rücken mit Gitarre", "4x5", "50% 30%"),
("music-strings", "Nahaufnahme einer Hand an den Saiten einer E-Gitarre", "1x1", "50% 50%"),
("music-drums", "Schlagzeuger am Drumset in Schwarzweiß", "1x1", "50% 45%"),
("music-dreadlocks", "Musiker mit Dreadlocks vor einem Mikrofon", "1x1", "50% 35%"),
("music-drummer", "Schlagzeuger blickt hinter seinen Becken hervor", "1x1", "50% 45%"),
("music-mic", "Bärtiger Sänger am Mikrofon mit erhobener Hand", "3x2", "50% 35%"),
("band-sagenbringer", "Musiker in Fellkleidung im Wald, von unten fotografiert", "3x2", "50% 30%"),
]
@@ -1081,6 +1106,8 @@ def video() -> str:
("movement-light", "Lange Belichtung", "g-w2", "1x1", "50% 50%"),
("event-speaker", "Statement vor der Kamera", "g-w2", "1x1", "50% 30%"),
("event-venue", "Location vor dem Dreh", "g-w2", "1x1", "50% 45%"),
("music-neck", "Licht auf Instrument und Hände", "g-w2", "1x1", "50% 50%"),
("music-banner", "Bühne, Nebel und Gegenlicht", "g-w3", "3x2", "50% 40%"),
]
),
)
@@ -1190,6 +1217,9 @@ def social_media() -> str:
("event-motion", "50% 45%"),
("event-dance", "50% 36%"),
("event-speaker", "50% 30%"),
("business-hotel-tea", "50% 45%"),
("business-hotel-laugh", "50% 45%"),
("music-drummer", "50% 45%"),
]
)
+ "</div>",
@@ -1233,9 +1263,13 @@ def projekte() -> str:
[
("music-vocal-blue", "Sänger mit erhobenem Arm im blauen Bühnenlicht", "4x5", "50% 30%"),
("band-sagenbringer", "Musiker in Fellkleidung im Wald, von unten fotografiert", "4x5", "50% 30%"),
("music-dreadlocks", "Musiker mit Dreadlocks vor einem Mikrofon", "4x5", "50% 35%"),
("band-extinct-group", "Vier Bandmitglieder hintereinander in Schwarzweiß", "4x5", "50% 40%"),
("band-extinct", "Die Band Extinct steht hintereinander vor schwarzem Hintergrund", "3x2", "50% 45%"),
("music-mic", "Bärtiger Sänger am Mikrofon mit erhobener Hand", "1x1", "50% 35%"),
("music-drums", "Schlagzeuger am Drumset in Schwarzweiß", "1x1", "50% 45%"),
("music-drummer", "Schlagzeuger blickt hinter seinen Becken hervor", "1x1", "50% 45%"),
("music-horns", "Zwei Musiker trinken aus Trinkhörnern", "1x1", "50% 35%"),
("music-strings", "Nahaufnahme einer Hand an den Saiten einer E-Gitarre", "3x2", "50% 50%"),
]
)
@@ -1260,6 +1294,12 @@ def projekte() -> str:
("free-fox", "Nahaufnahme eines Rotfuchses", "1x1", "50% 45%"),
("free-cat", "Nahaufnahme einer getigerten Katze im Seitenlicht", "1x1", "50% 42%"),
("free-arch-garden", "Blick durch einen steinernen Torbogen in einen Garten", "1x1", "50% 45%"),
("free-castle-lake", "Kleine Burg auf einer Insel in einem bewaldeten See", "1x1", "50% 50%"),
("free-swans", "Zwei Schwäne auf ruhigem Wasser", "1x1", "50% 45%"),
("free-sparrow", "Ein Spatz sitzt auf einem Ast", "1x1", "50% 45%"),
("free-cat-light", "Eine getigerte Katze schaut aus dem Fenster", "1x1", "50% 45%"),
("free-cat-white", "Eine weiße Katze mit aufgerichtetem buschigem Schwanz", "1x1", "50% 40%"),
("free-dogs-forest", "Zwei Hunde liegen auf einem Waldweg", "1x1", "50% 50%"),
]
),
)
@@ -1270,6 +1310,8 @@ def projekte() -> str:
[
("free-portrait-light", "Frauenportrait im weichen Seitenlicht vor dunklem Hintergrund", "4x5", "50% 28%"),
("free-modern-portrait", "Portrait einer Frau mit Sonnenbrille", "4x5", "50% 30%"),
("portrait-marina-sunset", "Marinas Silhouette vor orangefarbenem Abendhimmel", "4x5", "50% 45%"),
("editorial-studio-side", "Marta im seitlichen Studiolicht vor dunklem Hintergrund", "4x5", "50% 30%"),
("movement-light", "Lichtspur aus einer langen Belichtung", "4x5", "50% 50%"),
]
),
@@ -1402,6 +1444,8 @@ def ueber() -> str:
[
("business-portrait-studio", "Mann im weißen Hemd vor dunklem Hintergrund, Softbox im Bild", "4x5", "50% 28%"),
("studio-setup", "Studioequipment mit Logo von Denny Schulz Fotografie", "4x5", "50% 45%"),
("business-hotel-window", "Drei Frauen in Bademänteln und Handtuchturbanen am Fenster", "4x5", "50% 40%"),
("couple-park", "Sara und Carlos stehen Arm in Arm im Grünen", "4x5", "50% 30%"),
("free-fox", "Nahaufnahme eines Rotfuchses", "1x1", "50% 45%"),
],
columns="grid--2",