Bugs from real-product integration: - Meter/LEDFader clamp geometry below breadth 14 (no negative SVG rects) - mixColors falls back to CSS color-mix() so theme tokens can be var()/oklch() - type-in editing fires a real edit gesture (Start/onChange/End, source 'edit') - ScrubField Enter/Escape no longer double-commit or commit-on-revert via blur - disabled dims the whole control uniformly, data-disabled on the wrapper New capabilities: - commitMode 'release': drags preview, emit once on pointer-up, Esc discards - Meter accepts value=[l, r, ...]; theme zoneGood/zoneWarn/zoneHot defaults - XYPad per-axis invert + detents; Fader valuePosition top|end|none - LED skins: unit labels, uncapped displayDecimals, aria-valuetext defaults New components: IndicatorLamp, SegmentSwitch, ScrubField, MeterBridge, PushButton led='dot'. Docs: change-contract table, recipes, gallery cards.
4 KiB
4 KiB
Changelog
1.1.0 — 2026-07-13
Integration-feedback release — everything in here came from wiring dreamknob into a real product.
New components
IndicatorLamp— pressable LED lamp (role="switch"), toggle/momentary,blink(reduced-motion aware),readOnlystatus-light modeSegmentSwitch— hardware-styled segmented selector (radiogroup, roving focus, arrow/Home/End keys, LED tick)ScrubField— After-Effects-style numeric field: label scrubbing (Shift = fine), draft typing (Enter commits, Esc reverts), arrow steps, wheel;role="spinbutton"MeterBridge— labeled multi-strip meter block with per-channel peak-hold textPushButtongainsled="dot"— corner-dot LED that scales down for small icon-only toggles (lednowboolean | 'strip' | 'dot')
New capabilities
commitMode="release"— drags preview visually but emit a singleonChangeon pointer-up; Esc discards the preview (expensive parameters)Meteracceptsvalue={[l, r, ...]}for multi-channel bars with a shared clip LED- Theme gains
zoneGood/zoneWarn/zoneHot;Meter,MeterBridgeandLEDFaderdefault their zones from the theme XYPadaxes acceptinvertand per-axisdetents; arrow keys follow the visual direction on inverted axesFadergainsvaluePosition: 'top' | 'end' | 'none'—'end'renders one-line inspector rows with a stable readout widthLEDKnob/LEDFader/Metergainunit;displayDecimalsis no longer capped- Skins without visible readouts now default
aria-valuetextfromformat/unit(SteppedKnobannounces position names)
Fixes
Meterclamps geometry belowbreadth14 — no negative-dimension SVG rects on thin stripsmixColorsfalls back to CSScolor-mix()for non-hex inputs, so theme tokens can bevar(--x)/oklch()without breaking gradients and glows- Type-in editing now fires a proper edit gesture:
onChangeStart→onChange→onChangeEndwithsource: 'edit'(was a bare'api'set with no gesture events) - The
ChangeMeta.sourcecontract is documented (docs +types.ts): every user gesture brackets exactly one Start/End pair;'api'fires neither - Disabled controls set
data-disabledon the wrapper (including labels/readouts) and dim uniformly
1.0.0 — 2026-07-12
Initial release.
Controls
- Rotary knob skins:
FlatKnob,MetalKnob,RubberKnob,VintageKnob,LEDKnob,NeonKnob,SteppedKnob,ImageKnob(film-strip sprites) - Linear:
Fader(custom cap color/length),LEDFader(meter-zone segments) - Displays:
Meter(peak hold + latching clip LED withclipValuepeak detection),SegmentDisplay(7-seg incl. letters/hex),AlphaDisplay(14-seg alphanumeric) XYPad(two-parameter pad),PushButton(toggle/momentary with LED)- Composable
<Knob>+ primitives (Arcwith gradients,Pointer,Ticks,TickLabels,Face,KnobValue,KnobLabel,GlowFilter) and fully headlessuseKnob
Interaction core
- Rotary (absolute / relative / pickup), relative vertical/horizontal, absolute track
modes; drag acceleration; cursor hiding; magnetic detents; endless
wrapmode - Wheel with trackpad delta accumulation,
wheelStep, focus-gated capture - Full keyboard support, Escape drag-cancel, double-click reset, type-in editing
(
editable,"1.2k"parsing), Shift fine control - Value model: any range, decimal steps with float-safe rounding, discrete
values, detentsteps, linear/log/pow/custom tapers, bipolarorigin onChange/onChangeStart/onChangeEndwith gesturemeta.source; gesture-scoped undo friendlyanimateChangestween for programmatic changes (reduced-motion aware),valueBubble
Integration
- Theming via
DreamknobProvider(dark/light bases, per-instance override) - Keyboard-only focus rings,
role="slider"/role="meter"semantics,aria-orientation,data-*state attributes,data-partCSS hooks forwardRefon all interactive components, hidden form inputs vianame, touch via pointer capture (mobile verified), SSR-safe rendering