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).
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.
Vector knobs: colour/opacity re-style the overlay (VectorLayer.setStyle re-adds with a merged neutral style — no provider setVectorStyle in the contract); hover is interaction-only.