Commits

Spreads that cross the spine and adjustments that follow the content

On Tuesday the two pending tickets from the previous day fell: graphics crossing the spine as reusable spreads —data contract, rendering and preflight— and continuation adjustments anchored to content. The library gains validated SVGs and the desk, editable facing pages.

The previous day had left two tickets pending — graphics crossing the spine and continuation adjustments — and on Tuesday neither survived: the data contract, the rendering, the integration and the preflight of spreads all fell within one day, and the small hours closed #37.

Morning: resources with their own frame and watched SVGs

The day began in the library. Images shared with, or local to, an Edition keep their originals and each instance stores its own frame: removing a resource checks current and recoverable references and breaks no existing composition. The contextual view, the PDF and the InDesign export all use that frame, and a real print proof correctly flagged a low-resolution image — precisely why preflight exists. At midday came the course decision: InDesign checks are deferred to the final review, once the editor is complete, so they can be tackled thoroughly in one pass.

SVGs entered the library with real content validation: well-formed XML, no scripts, handlers, foreignObject, DTD or external references, with declared dimensions. The rendering draws them with the in-house engine, the export carries the original file unconverted, and in the browser an upload of an SVG containing script is rejected with a clear notice.

The facing desk and the spread contract

In the afternoon the desk gained navigation across facing pages: the local compositions of each identifiable piece can be opened without turning Closed Material into editable pages, and the proofs of pages 2 and 3 matched pixel by pixel an independently generated PDF. With the view ready, #36 arrived in three stages. First the data contract: versioned design JSON, pieces with their own UUID identity, millimetres measured from the cut of the open spread (420×297, spine at x=210, bleed of 0 to 10 mm per side) and pair resolution by piece identity, never by folio: if the Number reflows, the application is marked broken with its reason and is never silently moved to another page.

Then the rendering: each spread design is materialised into the PDF as an underlay of the pair's two pages, painted with pikepdf.Page.add_underlay beneath the existing content, so text and crop marks stay intact and the graphic enters the CMYK circuit like any other image. Finally, the integration into the desk: a 420×297 canvas for placing images and SVGs across the spine, with fit, framing and per-side bleed, savable as a composition of the Edition or as a reusable global spread, with explicit promotion and shared resources required.

The integration uncovered three problems: the drawing's width and height were emitted in points without converting from millimetres, an SVG preview came out white (fixed with a half-pixel shift, no cause determined) and spreads were not part of the layout signature, so saving them did not invalidate the proofs. The review added the preflight: a background could hide an underlay, and rejections are now recorded in the PDF and flagged as errors in the print report. Restoring an Edition with a broken spread keeps the design without reassigning it to any reused identity.

In the small hours: adjustments that follow the content

#37 closed the day near midnight: long Articles accept continuation touch-ups anchored to content, not to the folio. A photo is identified by its SHA1 fingerprint and ordinal, a heading by the fingerprint of its text; if the target disappears or the match count changes, the adjustment is left pending with a reason, a notice in the layout and explicit resolution from the panel: never silently moved. The facing view gains hotspots over photos and the panel lists adjustments per row, with the lost-target one showing its orphan. Verified in the browser with a real Article —photo resized with caption, heading frame applied, orphan pending— and the full suite green.