Image gallery using data from .json files

The issue was, inter alia, due to my code parsing through a string, as pointed out by chrillek.

The solution, in case anyone encounters the same problem is as follows (and can be seen here):

1. css

.photos {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 1rem;
  align-items: stretch;
}
.photos img {
  object-fit: cover;
  height: $card-size;
  border-radius: $very-rounded;
  cursor: pointer;
}

2. data

2.1. tree

data
└── photos
    ├── archie_and_peggy
    │   ├── a-happy-pair.json
    │   ├── archie-at-home.json
    │   ├── archie-at-three-weeks.json
    │   ├── cat-tree-pair.json
    │   ├── emerging-from-a-nap.json
    │   ├── his-first-few-days.json
    │   ├── morning-affection.json
    │   ├── my-cat-peggy-aged-six-months.json
    │   ├── peggy-aged-one-month.json
    │   ├── peggy-jenkins.json
    │   ├── peggy-wanting-cuddles.json
    │   ├── pensive-burmese.json
    │   ├── playing-ball.json
    │   └── wise-beyond-his-years.json
    ├── black_and_white
    │   ├── a-boy-in-a-south-madagascar-village.json
    │   ├── abandoned-ship-at-moynak.json
    │   ├── duck-collection-in-new-york-apartment.json
    │   ├── manhattan-skyline-from-brooklyn.json
    │   ├── masai-mara-national-reserve.json
    │   ├── pastries-in-patisserie-valerie.json
    │   ├── st-stephen-s-cathedral-in-vienna.json
    │   ├── statue-of-hermes-at-the-villa-medicis.json
    │   ├── the-burggarten-in-vienna.json
    │   ├── the-cloister-at-quattro-santi-coronati-rome.json
    │   ├── the-cloisters-at-new-college-oxford.json
    │   ├── the-fountain-at-place-du-grand-mezel-in-geneva.json
    │   ├── the-statue-of-st.-praxedes.json
    │   └── traffic-at-tulear-madagascar.json
    ├── colour
    │   ├── a-village-in-south-madagascar.json
    │   ├── beduin-in-petra.json
    │   ├── bicycle-made-of-wire.json
    │   ├── children-in-south-madagascar-village.json
    │   ├── demonstration-for-animal-rights.json
    │   ├── driving-through-the-aral-sea.json
    │   ├── far-east-meets-near-east.json
    │   ├── kenyan-artifact.json
    │   ├── modelling-at-grand-palais.json
    │   ├── my-cat-peggy-aged-six-months.json
    │   ├── on-what-used-to-be-the-aral-sea.json
    │   ├── peggy-wanting-cuddles.json
    │   ├── soldiers-in-kiev.json
    │   ├── tents-in-the-karapakalstan-desert.json
    │   ├── the-chor-minor-at-bukhara.json
    │   ├── the-city-walls-at-khiva.json
    │   ├── the-new-building-at-magdalen-college.json
    │   └── village-children-in-madagascar.json
    ├── index
    │   ├── archie_and_peggy.json
    │   ├── black_and_white.json
    │   ├── colour.json
    │   ├── israel.json
    │   ├── me.json
    │   └── paris.json
    ├── israel
    │   ├── a-bar-mitzvah-at-zion-gate.json
    │   ├── an-ice-cream-parlour-in-west-jerusalem.json
    │   ├── arab-women-playing-at-the-beach-tel-aviv.json
    │   ├── boys-playing-in-the-jewish-quarter.json
    │   ├── jews-praying-at-temple-mount.json
    │   ├── mohammedans-in-jerusalem.json
    │   ├── the-ethiopian-quarter-at-holy-sepulchre-church.json
    │   ├── the-margosa-hotel-in-jaffa.json
    │   ├── the-native-bazaar-near-the-holy-sepulchre.json
    │   ├── the-promised-land.json
    │   └── two-worlds-collide-at-temple-mount.json
    ├── me
    │   ├── at-conference-olivaint.json
    │   ├── at-french-embassy-dakar.json
    │   ├── at-la-treille-in-geneva.json
    │   ├── at-the-beach-in-knokke-le-zoute.json
    │   ├── at-the-western-wall.json
    │   ├── donald-at-fiac.json
    │   ├── in-bedford-ny.json
    │   ├── m-a-degree-ceremony-at-the-sheldonian.json
    │   ├── passover-dinner-in-tel-aviv.json
    │   ├── photoshoot-by-mathieu-camille-collin.json
    │   ├── portrait-by-niels-ackermann.json
    │   └── with-archie.json
    └── paris
        ├── a-baker-in-rue-des-rosiers.json
        ├── a-marais-street-at-night.json
        ├── at-paris-photo-2017.json
        ├── eiffel-tower-from-mur-de-la-paix.json
        ├── french-tin-soldiers.json
        ├── gare-du-nord-paris-on-the-day-after-the-november-2015-shootings.json
        ├── montmartre-in-february.json
        ├── musee-du-jeu-de-paume.json
        ├── pont-alexandre-iii-paris-france.json
        ├── teddy-bear-in-a-paris-flat.json
        ├── the-anri-sala-exhibition-at-the-pompidou-centre.json
        ├── the-ile-de-la-cite-in-autumn.json
        ├── the-paris-zombie-march.json
        ├── the-paris-zombies.json
        ├── the-pompidou-centre-in-autumn.json
        ├── the-pompidou-centre-in-mid-winter.json
        ├── tricky-moment-in-rue-des-rosiers.json
        └── tuileries-gardens-in-late-winter.json

2.2. .json file content [a-boy-in-a-south-madagascar-village.json]

{
  "alt": "A boy in a South Madagascar villager",
  "caption": "Ampanihy is one of the poorest parts of Madagascar",
  "id": "dadc7948-0dcb-4ad7-b614-bde264f9cc00",
  "camera": "iPhone X back dual camera 4mm f/1.8",
  "flickr": "52909011237",
  "geolocation": {
    "latitude": "25.009123",
    "longitude": "44.126013"
  }
}

3. Layout

    <div id="black-and-white">
      <h2 class="title">{{ index .Site.Data.photos.index.black_and_white "title" | markdownify }}</h2>
      <p class="subtitle">{{ index .Site.Data.photos.index.black_and_white "description" | markdownify }}</p>
      <div class="photos">
        {{ range $.Site.Data.photos.black_and_white }}
        {{ partial "widgets/gallery-image.html" . }}
        {{ end }}
      </div>
    </div>

4. Partial

{{ $id := .id }}
{{ $alt := .alt }}
{{ $image_url := printf "%s%s" site.Params.cloudflare_images $id }}
  <img
  src="{{ $image_url }}/w=420,fit=cover,quality=60"
  alt="{{ $alt }}"
/>

I’m certain there’s a better way of doing this, so if anyone has any suggestions to simplify the workflow, I’d be interested.