diff --git a/apps/docs/src/sections/ApiDocs.tsx b/apps/docs/src/sections/ApiDocs.tsx
index fe2fb8a..32d5509 100644
--- a/apps/docs/src/sections/ApiDocs.tsx
+++ b/apps/docs/src/sections/ApiDocs.tsx
@@ -53,13 +53,19 @@ export const ApiDocs: React.FC = () => (
+
+
+
-
+
+
+
-
-
+
+
+
@@ -88,12 +94,19 @@ export const ApiDocs: React.FC = () => (
+
All skins also take label, showValue, unit,{' '}
- format, className, style plus every core prop
- above.
+ format, className, style, name{' '}
+ plus every core prop above, and forward a ref to their root element. Inside the
+ SVG, parts carry data-part attributes (arc,{' '}
+ track, pointer, ticks, face,{' '}
+ value, label) and the root exposes{' '}
+ data-dragging/data-disabled/data-focus-visible{' '}
+ — style any state or part with plain CSS. <Arc> additionally
+ accepts gradient (position-anchored color stops).
Theming
diff --git a/apps/docs/src/sections/Gallery.tsx b/apps/docs/src/sections/Gallery.tsx
index 27b144b..68977af 100644
--- a/apps/docs/src/sections/Gallery.tsx
+++ b/apps/docs/src/sections/Gallery.tsx
@@ -10,6 +10,7 @@ import {
LEDFader,
LEDKnob,
MetalKnob,
+ Meter,
NeonKnob,
Pointer,
RubberKnob,
@@ -57,6 +58,32 @@ const useGeneratedStrip = (frames = 31, fs = 120): string | null => {
return src;
};
+const MeterDemo: React.FC = () => {
+ const [levels, setLevels] = React.useState<[number, number]>([-18, -20]);
+ React.useEffect(() => {
+ let t = 0;
+ const id = setInterval(() => {
+ t += 0.09;
+ setLevels([
+ -13 + Math.sin(t) * 6 + Math.random() * 7,
+ -14 + Math.sin(t * 1.3 + 1) * 6 + Math.random() * 7,
+ ]);
+ }, 90);
+ return () => clearInterval(id);
+ }, []);
+ const zones = [
+ { upTo: 0.72, color: '#3df2ad' },
+ { upTo: 0.9, color: '#ffd23e' },
+ { upTo: 1, color: '#ff4d6b' },
+ ];
+ return (
+
+
+
+
+ );
+};
+
const ImageKnobDemo: React.FC = () => {
const src = useGeneratedStrip();
if (!src) return null;
@@ -136,8 +163,9 @@ export const Gallery: React.FC = () => (
-
+
+
@@ -269,6 +297,49 @@ export const Gallery: React.FC = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dreamknob/README.md b/packages/dreamknob/README.md
index 06b7710..bc7c94b 100644
--- a/packages/dreamknob/README.md
+++ b/packages/dreamknob/README.md
@@ -64,7 +64,15 @@ All knobs render `role="slider"` with `aria-valuemin/max/now/text`.
- `detents={[0]}` + `detentSize` — magnetic snap points while dragging.
- `editable` — double-click (knobs) or click the readout (faders) to type an exact
value; `parseValue` customizes parsing (`"1.2k"` → 1200 out of the box).
-- `onChange` / `onChangeStart` / `onChangeEnd` — gesture-aware callbacks.
+- `rotaryMode` — `'absolute'` (rc-knob feel), `'relative'` (no grab jump), or
+ `'pickup'` (MIDI-style: engages when the pointer sweeps past the value).
+- `dragAcceleration` — velocity gain for relative drags; `hideCursorOnDrag` hides
+ the cursor mid-gesture.
+- `wheelStep` / `wheelRequiresFocus` — tune wheel notches, or keep hover-scroll free.
+- `onChange` / `onChangeStart` / `onChangeEnd` — gesture-aware callbacks with
+ `meta.source` (`'drag' | 'wheel' | 'keyboard' | 'reset' | 'api'`).
+- `name` — hidden form input for plain `