Derive the layer's current live composable attributes from its UI state.
For layers whose user hasn't touched a control, these match the
authored zarr values — so composition stays a no-op for untouched
scenes. Pulled into a pure function so the data-flow from
(display range, gamma, opacity, blending) → ComposableAttrs is
test-isolated from the DOM panel.
blending_mode is emitted ONLY when explicit (authored in the composed
ancestry or user-chosen); a layer merely showing its per-type default emits
undefined, so composition falls through to each leaf's own per-type default
rather than the layer's placeholder (see #1272).
Derive the layer's current live composable attributes from its UI state.
For layers whose user hasn't touched a control, these match the authored zarr values — so composition stays a no-op for untouched scenes. Pulled into a pure function so the data-flow from (display range, gamma, opacity, blending) → ComposableAttrs is test-isolated from the DOM panel.
blending_modeis emitted ONLY when explicit (authored in the composed ancestry or user-chosen); a layer merely showing its per-type default emitsundefined, so composition falls through to each leaf's own per-type default rather than the layer's placeholder (see #1272).