StaticSCALE_Every knob that belongs to the attached ColorScale. Kept in one place so the group pass and the per-key fallback below can't drift apart.
Apply one knob and report its effect. Return null for an unknown knob (ignored), else
{ redraw, emit } — redraw:true to re-render in place, emit the effect event name (or null
when another mechanism already emits it, e.g. ColorScale.onChange for palette).
Coalesce all ColorScale-bound knobs into ONE colorScale.set(patch) — one onChange, one
'restyle', one repaint, no matter how many of them are in the patch.
Read one knob, or the whole state object (a copy) when called with no key.
Restore the reset defaults.
Batch write. Applies each known knob, re-renders if any change needs a redraw, then emits the distinct effect events (restyle/recomputed) once each plus a 'settings' summary.
SYNC AND CHAINABLE — returns the Layer, not a Promise.
Of every knob across Raster and Vector settings, exactly ONE (noData) triggers a redraw. When
it does, the render runs and the effect events fire AFTER it, so a subscriber never reads a
half-updated grid. To await that, use await layer.settled(), or subscribe to the
'recomputed'/'rendered' event. A render failure is reported via the layer's 'error' event.
PARTIAL, BEST-EFFORT: one key throwing (e.g. an invalid palette name failing ColorScale's
validation) does not abort the rest of the batch — every OTHER key still
gets applied, committed to _state, and its effect event still fires. Failures are collected and,
if any occurred, thrown together as ONE aggregate error at the end — after the successful keys
have already taken effect — naming every failed key with its own message, plus which keys DID
succeed. This is deliberate: a caller sees exactly what went wrong and what didn't, rather than
either silently swallowing errors or having one bad key block unrelated ones in the same call.
the layer, for chaining
Resolves once any redraw a set() kicked off has finished (and its effect events have fired).
Resolves immediately when nothing is pending — so await layer.settled() is always safe.
Raster knobs: palette/continuous route to the layer's ColorScale (style axis → 'restyle', which the ColorScale's own onChange emits + repaints); noData is the data axis (→ 'recomputed' + a redraw); opacity is placement (provider opacity, no redraw); hover is interaction-only (no map change).