chore(release): v0.10.0 (#400)
Photo Essay mode, client proofing, studio-modern preset, admin panel overhaul, watermark, cookieless analytics, subpage toggle, SEO title templates. Analytics API now admin-only, Trivy scan on publish. Album order mirrors the Immich timeline; map theme, admin status panel, lightbox counter and Docker health check fixed. See CHANGELOG.md for the full list and the health-check upgrade note.
BIN
docs/screenshots/admin-album-picker.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
docs/screenshots/admin-login.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
docs/screenshots/admin-page-builder.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/screenshots/admin-settings.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/screenshots/grid-editorial-flow.png
Normal file
|
After Width: | Height: | Size: 402 KiB |
BIN
docs/screenshots/grid-filmstrip.png
Normal file
|
After Width: | Height: | Size: 340 KiB |
BIN
docs/screenshots/grid-masonry.png
Normal file
|
After Width: | Height: | Size: 576 KiB |
BIN
docs/screenshots/grid-showcase.png
Normal file
|
After Width: | Height: | Size: 329 KiB |
BIN
docs/screenshots/grid-uniform.png
Normal file
|
After Width: | Height: | Size: 460 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 336 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 389 KiB |
|
Before Width: | Height: | Size: 924 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 316 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 20 KiB |
BIN
docs/screenshots/lightbox-exif.png
Normal file
|
After Width: | Height: | Size: 523 KiB |
BIN
docs/screenshots/page-about.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
docs/screenshots/page-collection.png
Normal file
|
After Width: | Height: | Size: 466 KiB |
BIN
docs/screenshots/page-map.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 596 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 539 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 651 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 513 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 606 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 600 KiB |
|
Before Width: | Height: | Size: 924 KiB After Width: | Height: | Size: 180 KiB |
BIN
docs/screenshots/theme-studio-modern-grid-light.png
Normal file
|
After Width: | Height: | Size: 569 KiB |
BIN
docs/screenshots/theme-studio-modern-grid.png
Normal file
|
After Width: | Height: | Size: 577 KiB |
BIN
docs/screenshots/theme-studio-modern-home-light.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
docs/screenshots/theme-studio-modern-home.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
103
docs/theming.md
@@ -14,23 +14,25 @@ That's it. Your entire gallery switches to the minimal theme.
|
||||
|
||||
## Built-in Presets
|
||||
|
||||
| Preset | Style | Accent | Fonts | Hero | Frame | Grain |
|
||||
| ------------- | ------------------------------ | ------------ | --------------------------------- | ----------- | ------------ | ----- |
|
||||
| **studio** | Leica-inspired, editorial | 🔴 `#e60012` | Playfair Display + DM Sans | Split | Passepartout | ✓ |
|
||||
| **minimal** | Swiss brutalist, high contrast | ⚫ `#000000` | Geist + IBM Plex Mono | Fullbleed | None | ✗ |
|
||||
| **editorial** | Cinematic magazine, warm tones | 🟤 `#8B2500` | Bodoni Moda + Newsreader | Split | Shadow | ✗ |
|
||||
| **classic** | Gilded gallery, warm luxury | 🟡 `#c49a3c` | Cinzel + Crimson Pro | Minimal | Passepartout | ✗ |
|
||||
| **noir** | Darkroom analog, film noir | 🟠 `#ff6b35` | Libre Baskerville + Source Sans 3 | Fullbleed | Passepartout | ✓ |
|
||||
| **monograph** | Typographic, book-like | ⬛ `#333333` | Instrument Serif + Inter | Typographic | None | ✗ |
|
||||
| Preset | Style | Accent | Fonts | Hero | Frame | Grain |
|
||||
| ----------------- | ------------------------------ | ------------ | --------------------------------- | ----------- | ------------ | ----- |
|
||||
| **studio** | Leica-inspired, editorial | 🔴 `#e60012` | Playfair Display + DM Sans | Split | Passepartout | ✓ |
|
||||
| **studio-modern** | Leica precision, grotesque | 🔴 `#e60012` | Archivo + IBM Plex Mono | Split | None | ✗ |
|
||||
| **minimal** | Swiss brutalist, high contrast | ⚫ `#000000` | Geist + IBM Plex Mono | Fullbleed | None | ✗ |
|
||||
| **editorial** | Cinematic magazine, warm tones | 🟤 `#8B2500` | Bodoni Moda + Newsreader | Split | Shadow | ✗ |
|
||||
| **classic** | Gilded gallery, warm luxury | 🟡 `#c49a3c` | Cinzel + Crimson Pro | Minimal | Passepartout | ✗ |
|
||||
| **noir** | Darkroom analog, film noir | 🟠 `#ff6b35` | Libre Baskerville + Source Sans 3 | Fullbleed | Passepartout | ✓ |
|
||||
| **monograph** | Typographic, book-like | ⬛ `#333333` | Instrument Serif + Inter | Typographic | None | ✗ |
|
||||
|
||||
Default is `studio` if no theme is specified.
|
||||
|
||||
### Theme Gallery
|
||||
|
||||
_From top to bottom: Studio, Minimal, Editorial, Classic, Noir, Monograph_
|
||||
_From left to right, top to bottom: Studio, Studio Modern, Minimal, Editorial, Classic, Noir, Monograph_
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/theme-studio-home.png" width="49%" alt="Studio theme" />
|
||||
<img src="screenshots/theme-studio-modern-home.png" width="49%" alt="Studio Modern theme" />
|
||||
<img src="screenshots/theme-minimal-home.png" width="49%" alt="Minimal theme" />
|
||||
<img src="screenshots/theme-editorial-home.png" width="49%" alt="Editorial theme" />
|
||||
<img src="screenshots/theme-classic-home.png" width="49%" alt="Classic theme" />
|
||||
@@ -40,8 +42,11 @@ _From top to bottom: Studio, Minimal, Editorial, Classic, Noir, Monograph_
|
||||
|
||||
### Grid View Examples
|
||||
|
||||
_Same order as above._
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/theme-studio-grid.png" width="49%" alt="Studio grid" />
|
||||
<img src="screenshots/theme-studio-modern-grid.png" width="49%" alt="Studio Modern grid" />
|
||||
<img src="screenshots/theme-minimal-grid.png" width="49%" alt="Minimal grid" />
|
||||
<img src="screenshots/theme-editorial-grid.png" width="49%" alt="Editorial grid" />
|
||||
<img src="screenshots/theme-classic-grid.png" width="49%" alt="Classic grid" />
|
||||
@@ -49,10 +54,23 @@ _From top to bottom: Studio, Minimal, Editorial, Classic, Noir, Monograph_
|
||||
<img src="screenshots/theme-monograph-grid.png" width="49%" alt="Monograph grid" />
|
||||
</p>
|
||||
|
||||
### Light Mode
|
||||
|
||||
Every preset ships with a light variant. Visitors switch with the toggle in the
|
||||
navigation bar; the choice is remembered in `localStorage`, and the presets keep
|
||||
their accent, fonts and framing in both modes.
|
||||
|
||||
<p align="center">
|
||||
<img src="screenshots/theme-studio-modern-home-light.png" width="49%" alt="Studio Modern in light mode" />
|
||||
<img src="screenshots/theme-studio-modern-grid-light.png" width="49%" alt="Studio Modern grid in light mode" />
|
||||
</p>
|
||||
|
||||
### What makes each theme unique
|
||||
|
||||
**Studio** (default) — Leica-inspired with a red nav dot, passepartout photo frames, film grain, and a split hero layout. Clean editorial feel with Playfair Display headings.
|
||||
|
||||
**Studio Modern** — The Leica language of `studio` rebuilt around the precision grotesque Archivo, with IBM Plex Mono for every piece of photographic metadata (EXIF chips, counters, indices). Hairline rules at 8% opacity, zero radius, an indexed hero nav with album counts, an always-visible caption bar under album covers, and a film-edge EXIF strip in the lightbox. Red is signal only — nav dot, active state, hover, indices, map markers.
|
||||
|
||||
**Minimal** — Swiss Brutalist aesthetic inspired by Müller-Brockmann and Dieter Rams. Fullbleed hero image, true black/white palette, zero-gap photo grid with no hover effects, ultra-tiny navigation text. Every pixel earns its place.
|
||||
|
||||
**Editorial** — Cinematic magazine feel inspired by Aperture and Magnum Photos. Oversized Bodoni Moda serif titles, warm charcoal backgrounds, generous grid spacing, slow cinematic transitions with desaturation-on-idle photos, and pull-quote section labels.
|
||||
@@ -166,6 +184,42 @@ Controls the photo grid layout on album pages:
|
||||
- **`filmstrip`** — horizontal scroll of tall vertical image strips with scroll snapping
|
||||
- **`editorial-flow`** — alternating full-width (21:9) and side-by-side (4:3) image pairs
|
||||
|
||||
Set it globally in `settings.yaml`, or per subpage in `gallery.yaml`:
|
||||
|
||||
```yaml
|
||||
grid:
|
||||
layout: showcase
|
||||
```
|
||||
|
||||
The same album in all five layouts (theme `studio-modern`):
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><strong>Masonry</strong> (default)</td>
|
||||
<td align="center"><strong>Uniform</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="screenshots/grid-masonry.png" width="420" alt="Masonry grid layout" /></td>
|
||||
<td><img src="screenshots/grid-uniform.png" width="420" alt="Uniform grid layout" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><strong>Showcase</strong></td>
|
||||
<td align="center"><strong>Filmstrip</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="screenshots/grid-showcase.png" width="420" alt="Showcase grid layout" /></td>
|
||||
<td><img src="screenshots/grid-filmstrip.png" width="420" alt="Filmstrip grid layout" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" colspan="2"><strong>Editorial Flow</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" align="center">
|
||||
<img src="screenshots/grid-editorial-flow.png" width="840" alt="Editorial flow grid layout" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Examples
|
||||
|
||||
### Minimal portfolio
|
||||
@@ -234,8 +288,37 @@ theme:
|
||||
|
||||
```yaml
|
||||
theme:
|
||||
preset: botanica
|
||||
preset: editorial
|
||||
heroStyle: mosaic
|
||||
grid:
|
||||
layout: editorial-flow
|
||||
```
|
||||
|
||||
## Upgrading & rolling back
|
||||
|
||||
Adding a preset never requires a migration. Presets are additive, the
|
||||
`gallery.yaml` / `settings.yaml` schema is unchanged, and existing presets keep
|
||||
rendering exactly as before — pull the new version and restart.
|
||||
|
||||
The one case that needs attention is a **rollback after switching presets**. The
|
||||
selected preset is stored in `content/settings.yaml`, so if you pick a preset
|
||||
that was added later and then downgrade to a version that predates it, config
|
||||
loading fails:
|
||||
|
||||
```
|
||||
Unknown theme preset "studio-modern". Valid presets: studio, minimal, editorial, classic, noir, monograph
|
||||
```
|
||||
|
||||
The message lists the presets the running version accepts. Set `theme.preset` to
|
||||
one of them:
|
||||
|
||||
```yaml
|
||||
theme:
|
||||
preset: studio # any preset the older version knows
|
||||
```
|
||||
|
||||
`/admin` stays reachable when this happens, so you can also fix it from the
|
||||
settings editor after the downgrade rather than beforehand.
|
||||
|
||||
The same error appears if you typo a preset name or copy an example for a preset
|
||||
that does not exist — it is not specific to downgrades.
|
||||
|
||||