DESIGN.md §4 — rotate ±90°/flip H/V of the view: a CSS transform on the
active .shoji-slide-media, non-destructive, resets to neutral on every
afterOpen/afterSlide (per-slide, not per-gallery — DESIGN.md's own
wording). Emits rotateFlipChange on every change so a host that wants
this to persist can store it themselves and re-apply later (e.g. by
feeding a starting orientation back in some other way) — this plugin
itself has no persistence of its own, matching "resets per slide".
Distinct from the (unbuilt) Editor plugin's own rotate/flip (§8), which
is destructive/persisted server-side via item.edits. Both share the
same composition math (normalizeRotateFlip, src/core/) rather than
each re-deriving flip+rotate's non-commutative composition — a real bug
class CLAUDE.md calls out by name.
DESIGN.md §4 — rotate ±90°/flip H/V of the view: a CSS transform on the active
.shoji-slide-media, non-destructive, resets to neutral on everyafterOpen/afterSlide(per-slide, not per-gallery — DESIGN.md's own wording). EmitsrotateFlipChangeon every change so a host that wants this to persist can store it themselves and re-apply later (e.g. by feeding a starting orientation back in some other way) — this plugin itself has no persistence of its own, matching "resets per slide".Distinct from the (unbuilt) Editor plugin's own rotate/flip (§8), which is destructive/persisted server-side via
item.edits. Both share the same composition math (normalizeRotateFlip,src/core/) rather than each re-deriving flip+rotate's non-commutative composition — a real bug class CLAUDE.md calls out by name.