Third integration-feedback release from building the streaming studio.
- New `Button` — a click-to-fire command button in the panel style, the
non-latching sibling of PushButton. Implemented as PushButton's new
`mode="action"` (never latches, press-down + brief LED flash, `onClick`);
led="dot" (default) matches the corner-dot look, led={false} is plain.
- `fill` on LEDFader (parity with Fader) — faders stretch to fill their
container in resizable panels instead of a fixed pixel length.
- `labelSize` on IndicatorLamp (and LampRow) — shrink the caption below its
10px floor to match dense header rows.
- Docs: a dedicated "Buttons & switches" section with a decision guide
(Button/PushButton/TransportButton/ToggleSwitch/SegmentSwitch) + live demos.
Library + docs typecheck and build; 38 tests pass.
7.5 KiB
7.5 KiB
Changelog
1.1.2 — 2026-07-14
Third integration-feedback release — a general action button, responsive faders everywhere, and the label-scaling gap, all surfaced building a resizable streaming studio.
New components
Button— a normal click-to-fire command button in the panel style (Regenerate, Add, Apply, Refresh), the non-latching sibling ofPushButton. It'sPushButtonlocked to the newmode="action": never latches, shows a press-down + a brief LED flash, callsonClick.led="dot"(default) gives the corner-dot look;led={false}a plain button.
Buttons
PushButtongainsmode="action"(alongsidetoggle/momentary) and anonClickprop — the stateless command-button behaviorButtonwraps.
Responsive faders
fillonLEDFader(matchingFader) — the fader stretches along its travel axis to fill the container instead of a fixedlength, so faders in resizable dock panels size themselves with no wrapper measurement.
Label scaling
labelSizeonIndicatorLamp— the caption otherwise trackssizebut is floored at 10px; set this to shrink it with a small lamp (e.g. matching a dense header row). Also onLampRowfor parity.
Docs
- A dedicated Buttons & switches section with a "which do I use?" guide (Button = action · PushButton = latch · TransportButton = transport · ToggleSwitch = boolean · SegmentSwitch = mode) and a live demo of each.
1.1.1 — 2026-07-13
Second integration-feedback release — the friction that showed up once the displays and switches went into dense, resizable, themed product panels.
Readout legibility
- Seven-segment decimal point and colon now render as bold cells with their
own width (not hairlines between digits), so
17.5and1:23:45stay readable at status-bar sizes weightprop onSegmentDisplay/AlphaDisplaythickens the segments (a font weight);gapcontrols inter-cell spacing for crowded readouts like18.1/24
Displays: theme + value colors
SegmentDisplaydefaults totheme.ledGreen,AlphaDisplaytotheme.ledAmber— theme your readouts once instead of prop-drillingcolorvalueColor: (v) => stringand value-spacezonesonSegmentDisplay— a resource readout colors itself green/amber/red without app-side math- Charset:
:colon (both displays),$and%(14-seg) disabled+data-disabledon displays (uniform dimming like the controls)
Knob captions
sublabel— a second caption line (SEEDoverworld #7)labelSize— caption size independent of the dial diameter
New components
ToggleSwitch— rocker/slider boolean (role="switch"), the knob slides OFF↔ON;showStateLabel, ←/→ keysGauge— read-only radial arc meter (the round sibling ofMeter) for CPU/RAM/load; zones orvalueColor, needle, center readoutTransportButton— play/pause/stop/record/rewind/forward/panic family styled to match the controls beside it;recordblinks (reduced-motion aware)LampRow— a row of indicator lamps with console-print captionsLabeledField— label · control · unit in one aligned row (sharelabelWidth)Rack— channel-strip / rack container owning panel chrome + spacing
Responsiveness & niceties
fillonMeterandFader— stretch to the container instead of fixed pxled="dot"corner behavior plus aleadingIconslot onPushButton- Theme gains
ledGreen,ledAmber,paneltokens
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