# OINK 1.3.0 — Expo image albums

> Expo brings resource-backed image albums, three layouts and an original-image viewer to OINK, with more reliable navigation, dialogs and focus.

---

LLMS index: [llms.txt](/llms.txt)

---

OINK 1.3.0 adds **Expo** alongside Docs, Blog and Book. An album is one Hugo leaf bundle: an `index.md` and its images. Resource metadata supplies titles, captions, credits, ordering and stable image links. It does not need one page or one YAML file per image.

OINK 1.3.0 uses Hugo Extended **0.166.0** as its minimum and its single
development, CI, and release-test baseline. The module declares Go **1.27.0**.

## At a glance {#at-a-glance}

- Expo albums share OINK's sidebar, navigation and appearance controls.
- Wall, Cards and Seamless layouts, with saved layout and tile size.
- An original-image viewer with fit, bounded expansion, zoom, dragging and stable location links.
- GIF playback and pause controls, with reduced-motion support.
- Scoped explicit navigation, content-based active paths and more reliable modal focus.
- Reliable Landing code controls and RSS, and complete aggregate Print output.
- Consumer upgrade tooling for module, vendored and classic-theme sites.

## Create an album {#create-an-album}

```text
content/photos/
├── _index.md
└── field-notes/
    ├── index.md
    └── images/
        ├── fern.jpg
        └── river.gif
```

Set `type: expo` and `cascade: {type: expo}` on the section entry. Images appear automatically. Add Hugo `resources` metadata only when a picture needs a title, caption, credit, fixed order or an explicit ID. Originals may live beside the previews in the same bundle.

Read the [Expo authoring guide](/docs/write/expo/) and open the [example albums](/expo/). Use the [Gallery component](/docs/components/gallery/) for a small grid inside a text page.

## View and navigate {#view-and-navigate}

The viewer opens the original image at its natural size, capped to the viewport. Fit, expansion, zoom and dragging support closer inspection. Left/Right or Q/E move through the album; K/J zoom, R resets and F changes expansion. Touch readers can swipe and double-tap. Closing returns focus to the originating tile; opening another surface hands focus to that surface.

Expo keeps images and metadata in Print, Markdown, LLMSFULL and RSS outputs. With JavaScript unavailable, image links still open originals.

## Reading and interaction repairs {#repairs}

Explicit Docs and Book navigation selects branches by content identity, including custom URLs and nested roots. It no longer leaks into home-root navigation or other shells. Uncached sidebars identify the current page and expand its content ancestors.

Draw.io opens in a native modal host with a localized Close button, backdrop dismissal, listener cleanup and focus restoration. The host Close control remains reachable after entering a cross-origin editor. Edit participates in Safari's Tab order. Closed Appearance panels no longer take focus during a coordinated close.

Book heading indentation follows its owning navigation row. Wide outlines grow within bounded widths and follow resizing immediately, while preserving their collapse animation.

The release also fixes unnumbered mathematics with generic attributes,
missing-reference and empty-tab fallbacks, Expo metadata and preview transitions,
keyboard focus, and configuration schemas. The corrected behavior is specified
in the bilingual Design contracts.

## Landing and Print repairs {#landing-and-print}

Landing Markdown code blocks have independent IDs and the shared content styles.
Copy and expansion controls operate on the selected block, including repeated
sections. Configured RSS feeds produce a complete feed document. Stock 404 pages
do not advertise a reading drawer inherited from a root cascade.

Aggregate Print keeps encoded heading links within their own chapter, including
headings rendered inside Tabs. It namespaces generated tab IDs, resolves relative
links from their original pages, renders release section bodies in full, and
loads styles for mathematics in included descendants. Wide tables can be scrolled
with a keyboard in browser previews and expand for paper output.

Authored HTML IDs remain global by default. Add the boolean
`data-td-print-local` attribute to an authored element when its ID and local links
should receive the chapter namespace in aggregate Print. Ordinary pages and
single-page Print retain their existing anchors.

## Upgrade {#upgrade}

Existing Docs, Blog and Book content needs no bulk migration. Expo is opt-in through `type: expo`. Keep `params.ui.preset: paper` and the explicit `[paper, slate, ink, terminal]` reader menu if the site offers all four styles.

Update Hugo and workflow pins to Extended **0.166.0**, then select the exact
release. Disable local replacements and both workspaces when checking the
published module:

```sh
env -u HUGO_MODULE_REPLACEMENTS GOWORK=off HUGO_MODULE_WORKSPACE=off \
  hugo mod get github.com/pgsty/oink@v1.3.0
env -u HUGO_MODULE_REPLACEMENTS GOWORK=off HUGO_MODULE_WORKSPACE=off \
  hugo --environment production --minify --panicOnWarning
```

Refresh active vendor snapshots and classic `themes/oink` copies separately;
a `go.mod` update does not change either. Keep site-specific content and layout
overrides, then check navigation, reader menus, Print, and any custom home page.
The [upgrade guide](/docs/admin/upgrade/#preparing-1-3) covers the procedure.

## Validation {#validation}

The release work exercised 36 maintained consumers under `~/www` and `~/pgsty`
in development and production configurations. Strict builds, generated HTML
link and ID checks, browser interactions, and the documentation site regression
suite passed on the reviewed sources. Final Print fixes have focused tests in
Chromium, Firefox, and WebKit. Historical third-party static HTML is tracked
separately from OINK output. These checks establish the tested source behavior;
each consumer deployment still needs its own acceptance.
