DreamKnob/packages/dreamknob/CHANGELOG.md
Dreamodus a6348d5c46 v1.1.2: action button, responsive faders, label scaling
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.
2026-07-14 06:33:15 -07:00

149 lines
7.5 KiB
Markdown

# 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 of `PushButton`.
It's `PushButton` locked to the new `mode="action"`: never latches, shows a
press-down + a brief LED flash, calls `onClick`. `led="dot"` (default) gives
the corner-dot look; `led={false}` a plain button.
### Buttons
- `PushButton` gains **`mode="action"`** (alongside `toggle`/`momentary`) and
an `onClick` prop — the stateless command-button behavior `Button` wraps.
### Responsive faders
- **`fill`** on `LEDFader` (matching `Fader`) — the fader stretches along its
travel axis to fill the container instead of a fixed `length`, so faders in
resizable dock panels size themselves with no wrapper measurement.
### Label scaling
- **`labelSize`** on `IndicatorLamp` — the caption otherwise tracks `size` but
is floored at 10px; set this to shrink it with a small lamp (e.g. matching a
dense header row). Also on `LampRow` for 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.5` and `1:23:45` stay
readable at status-bar sizes
- `weight` prop on `SegmentDisplay`/`AlphaDisplay` thickens the segments (a font
weight); `gap` controls inter-cell spacing for crowded readouts like `18.1/24`
### Displays: theme + value colors
- `SegmentDisplay` defaults to `theme.ledGreen`, `AlphaDisplay` to
`theme.ledAmber` — theme your readouts once instead of prop-drilling `color`
- `valueColor: (v) => string` and value-space `zones` on `SegmentDisplay` — a
resource readout colors itself green/amber/red without app-side math
- Charset: `:` colon (both displays), `$` and `%` (14-seg)
- `disabled` + `data-disabled` on displays (uniform dimming like the controls)
### Knob captions
- `sublabel` — a second caption line (`SEED` over `world #7`)
- `labelSize` — caption size independent of the dial diameter
### New components
- `ToggleSwitch` — rocker/slider boolean (`role="switch"`), the knob slides
OFF↔ON; `showStateLabel`, ←/→ keys
- `Gauge` — read-only radial arc meter (the round sibling of `Meter`) for
CPU/RAM/load; zones or `valueColor`, needle, center readout
- `TransportButton` — play/pause/stop/record/rewind/forward/panic family styled
to match the controls beside it; `record` blinks (reduced-motion aware)
- `LampRow` — a row of indicator lamps with console-print captions
- `LabeledField` — label · control · unit in one aligned row (share `labelWidth`)
- `Rack` — channel-strip / rack container owning panel chrome + spacing
### Responsiveness & niceties
- `fill` on `Meter` and `Fader` — stretch to the container instead of fixed px
- `led="dot"` corner behavior plus a `leadingIcon` slot on `PushButton`
- Theme gains `ledGreen`, `ledAmber`, `panel` tokens
## 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), `readOnly` status-light mode
- `SegmentSwitch` — 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 text
- `PushButton` gains `led="dot"` — corner-dot LED that scales down for small
icon-only toggles (`led` now `boolean | 'strip' | 'dot'`)
### New capabilities
- `commitMode="release"` — drags preview visually but emit a single `onChange` on
pointer-up; Esc discards the preview (expensive parameters)
- `Meter` accepts `value={[l, r, ...]}` for multi-channel bars with a shared clip LED
- Theme gains `zoneGood` / `zoneWarn` / `zoneHot`; `Meter`, `MeterBridge` and
`LEDFader` default their zones from the theme
- `XYPad` axes accept `invert` and per-axis `detents`; arrow keys follow the visual
direction on inverted axes
- `Fader` gains `valuePosition: 'top' | 'end' | 'none'``'end'` renders one-line
inspector rows with a stable readout width
- `LEDKnob` / `LEDFader` / `Meter` gain `unit`; `displayDecimals` is no longer capped
- Skins without visible readouts now default `aria-valuetext` from `format`/`unit`
(`SteppedKnob` announces position names)
### Fixes
- `Meter` clamps geometry below `breadth` 14 — no negative-dimension SVG rects on
thin strips
- `mixColors` falls back to CSS `color-mix()` for non-hex inputs, so theme tokens can
be `var(--x)` / `oklch()` without breaking gradients and glows
- Type-in editing now fires a proper edit gesture: `onChangeStart``onChange`
`onChangeEnd` with `source: 'edit'` (was a bare `'api'` set with no gesture events)
- The `ChangeMeta.source` contract is documented (docs + `types.ts`): every user
gesture brackets exactly one Start/End pair; `'api'` fires neither
- Disabled controls set `data-disabled` on 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 with `clipValue` peak detection),
`SegmentDisplay` (7-seg incl. letters/hex), `AlphaDisplay` (14-seg alphanumeric)
- `XYPad` (two-parameter pad), `PushButton` (toggle/momentary with LED)
- Composable `<Knob>` + primitives (`Arc` with gradients, `Pointer`, `Ticks`,
`TickLabels`, `Face`, `KnobValue`, `KnobLabel`, `GlowFilter`) and fully headless
`useKnob`
### Interaction core
- Rotary (absolute / relative / pickup), relative vertical/horizontal, absolute track
modes; drag acceleration; cursor hiding; magnetic detents; endless `wrap` mode
- 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`,
detent `steps`, linear/log/pow/custom tapers, bipolar `origin`
- `onChange`/`onChangeStart`/`onChangeEnd` with gesture `meta.source`; gesture-scoped
undo friendly
- `animateChanges` tween 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-part` CSS hooks
- `forwardRef` on all interactive components, hidden form inputs via `name`,
touch via pointer capture (mobile verified), SSR-safe rendering