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.
- PushButton/Button forward native button props (...rest) and compose their
own event handlers with consumer/Radix-injected ones, so a Button works as
a Radix `asChild` trigger (dropdowns/tooltips/popovers). Prop types now
extend React.ButtonHTMLAttributes.
- Meter gains opt-in metering: `ballistics` (PPM attack/decay), `peakDecay`
(peak-hold fall tail), `scale="db"` (feed amplitude → dBFS with reference
lines; min/max default -60/0), and `integrated` (windowed LUFS-ish loudness
readout + marker). New rAF engine in meterEngine.ts with ampToDb/dbToAmp
helpers; default behavior unchanged.
- New `PanKnob` — bipolar stereo pan: fills from center, center detent,
L<n>/C/R<n> readout, -50..50 default.
- Docs: ApiDocs rows + recipes (dBFS meter, pan strip, Button-as-trigger),
gallery cards (dBFS meter, Pan) + a Regenerate Button in the panel.
CHANGELOG 1.1.3; version 1.1.3; install URLs bumped.
Library + docs typecheck and build; 46 tests pass.
- Meter dBFS readout: muted-grey unit labels (LUFS matched to dB), value-first
layout in an aligned 2-column grid so peak/loudness decimals line up, and
ghost pad digits removed — the loudness row no longer looks like a stray tag.
- Action buttons (Button / PushButton mode="action") no longer show an LED
by default — an action has no state to indicate. led defaults to 'strip' for
toggle/momentary and false for action; led="dot"/"strip" opts back in.
- Meter dBFS readout: units (dB / LUFS) sit centered directly under each
value; grid alignment tidied and ghost pad digits removed. Docs: dBFS-meter
card moved next to the Meters card (same component) + a horizontal example.
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.
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.
- MIT license attributed to Dreamodus Software Inc. (root + package
LICENSE, package.json author, README and docs-site footer)
- Version 1.0.0; CHANGELOG.md summarizing the release
- Package files whitelist includes LICENSE/README/CHANGELOG; tarballs
gitignored
- Root README: instructions for consuming the unpublished package
(tarball, file dependency, or pnpm link)
Verified: 32 tests, both packages typecheck, production builds clean,
and a pnpm-pack tarball installed into a fresh project resolves all 50
exports via both ESM and CJS.
React + TypeScript knob/fader library with a headless interaction core
(rotary, relative-drag and track modes, wheel, keyboard, a11y), SVG
primitives, nine prebuilt skins, seven-segment display engine, and a
Vite showcase with gallery, live playground and API docs.