The controls whose chrome was hardcoded dark now adapt to a light base —
previously they rendered as dark chips/holes on light themes. (Flat knobs and
faders already adapted: their face is the `face` token.)
- `ledWell` theme token — the recessed screen behind LED segments (LEDKnob,
LEDFader, Meter) and the default well of SegmentDisplay / AlphaDisplay now
comes from the theme. Dark base keeps #0b0d0e; light base is `transparent`,
so LED controls and readouts render as clean flat rings / bars / digits on
the light panel. faceColor / background props still override.
- `scheme` theme token ('dark' | 'light', set by base) + a shared
panelButtonChrome() helper drive the raised gradient/border/shadow of
PushButton (and Button), TransportButton and SegmentSwitch — light raised
buttons on light themes instead of dark chips; unlit LED pips flip to a
faint dark so they still read.
- Docs: a "Light theme" gallery card showing the panel family under
base="light"; ledWell/scheme documented; install URLs bumped to v1.1.4.
Library + docs typecheck and build; 46 tests pass.
11 KiB
11 KiB
Changelog
1.1.4 — 2026-07-14
Light-theme support — the controls whose chrome was hardcoded dark now adapt.
Themeable LED well
ledWelltheme token — the recessed "screen" fill behind the LED segments ofLEDKnob,LEDFader,Meter, and the default well ofSegmentDisplay/AlphaDisplay, now comes from the theme instead of a hardcoded near-black. Dark base keeps the classic dark well (#0b0d0e); the light base istransparent, so LED controls and readouts render as clean flat segment rings / bar meters / digits on the light panel (still clearly "LED" from the lit segments) instead of dark blobs. ThefaceColor/backgroundprops still override per-instance.
Light-theme panel chrome
schemetheme token ('dark' | 'light', set by thebase) drives the raised gradient/border/shadow ofPushButton(andButton),TransportButtonandSegmentSwitch. On a light base they render as light raised buttons instead of dark chips; unlit LED pips flip to a faint dark so they still read. NewpanelButtonChrome(scheme, pressed)helper.- Fixes the whole panel-button/switch family looking like dark chips on light
themes; the flat knobs and faders already adapted (their face is the
facetoken).
1.1.3 — 2026-07-14
Fourth integration-feedback release — a composability fix for buttons, a much smarter meter, and the pan control the mixer was missing.
Buttons
- Action buttons no longer show an LED by default.
Button(andPushButton mode="action") are plain by default — an action has no state to indicate.leddefaults to'strip'fortoggle/momentary(which do have a state) and tofalseforaction; passled="dot"/led="strip"to opt a command button back in.
Buttons compose as Radix triggers
PushButton/Buttonnow forward unknown props (...rest) to the underlying<button>and compose their own event handlers with any the consumer (or a RadixasChildslot) injects. AButtoncan now be a dropdown / tooltip / popover trigger:onPointerDown,onKeyDown,data-state,aria-expandedetc. all reach the DOM and fire alongside the button's own press behavior. The prop types now extend the native button attributes.
Meter — ballistics, dBFS, loudness
ballistics— PPM-style attack/decay smoothing of the displayed level (true≈ 5 ms attack / 350 ms decay, or{ attack, decay }in ms).peakDecay— the peak-hold marker falls with a decay tail (normalized units/second) afterpeakHoldinstead of snapping back.scale="db"— feed linear amplitude (0..1) and the meter displays dBFS;min/maxdefault to -60 / 0 dB and faint reference gridlines are drawn (showScale/referenceTicksto tune). NewampToDb/dbToAmphelpers.integrated— a time-windowed loudness estimate (LUFS-ish on the dB scale — a windowed mean of channel power, not a full BS.1770 measurement), shown as a secondary readout and a marker line (integrationWindow,loudnessColor).- All of the above are opt-in; the default meter behaves exactly as before.
New component
PanKnob— a bipolar stereo-pan knob: fills from center, snaps to a center detent, reads outL<n>/C/R<n>. Defaults to a −50…50 range centered at 0.
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