/* pan-zoom.css — the camera channel's declaration.
 *
 * ── Why this file exists at all ──────────────────────────────────
 * Publishing the camera scale used to cost more than applying it.
 *
 * Measured 2026-07-26 on FIDO/subsystem-requirements (245 cards), per
 * wheel-sized zoom step, timed to a forced settle:
 *
 *     stage transform alone ..................... 0.1 ms
 *     + `--zoom` written on #root ............... 180 ms
 *     + a property name NOTHING references ...... 183 ms
 *     + `--zoom` non-inherited (this file) ....... 40 ms
 *
 * The third row is the one that settles the diagnosis.  A custom
 * property nothing reads costs exactly as much as one everything
 * reads, so the expense is not any card computing anything — it is
 * the write itself.  An inherited custom property is part of every
 * descendant's computed style, so setting one on an ancestor of the
 * whole scene invalidates all 245 cards, and the engine cannot skip
 * that work because it has no way to know in advance that no rule
 * below will ask for the value.
 *
 * The camera was never slow.  Announcing it was.
 *
 * ── What the registration changes ────────────────────────────────
 * `inherits: false` confines the value to the element it is set on.
 * #root still carries it, so every reader that samples
 * `getComputedStyle(scene.root)` — tile-render's body-hydrate gate,
 * drag's coordinate conversion, the LOD dashboard — is unaffected;
 * they all read it exactly where it is written.  What stops is the
 * propagation into the card subtree.
 *
 * ── What consumers do instead ────────────────────────────────────
 * A card's appearance depends on the card's own APPARENT SIZE, not on
 * the camera: cards differ in authored size, so the same camera puts
 * each at a different size on glass.  Cards therefore read
 * `--card-lod-zoom`, which pan-zoom writes on each card individually
 * and only when that card's quantised size level changes.
 *
 * A subtree that genuinely needs the continuous camera scale in CSS
 * marks itself `data-zoom-scope` and receives `--scope-zoom`, which
 * IS inherited but reaches only that subtree.  Edge rendering uses
 * this for its aggregate/companion crossfade.  Opting in is the point:
 * the cost is paid by the subtree that asked for it, and a scene with
 * no such subtree pays nothing.
 */

@property --zoom {
  syntax: "<number>";
  inherits: false;
  initial-value: 1;
}
