{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "@pluginui",
  "homepage": "https://pluginui.com",
  "items": [
    {
      "name": "core-pitch-class-histogram",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Pitch Class Histogram",
      "description": "Shared editable pitch, chord character and chord size histograms, with a matching read-only pitch display. Used by Harmonizer and Hand Chord."
    },
    {
      "name": "core-barlow",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Barlow Indispensability",
      "description": "Clarence Barlow's stratified meter decomposition — assigns a metric weight to every rhythmic position in any time signature. Drives density control, humanization, syncopation measurement and onset probability weighting for generative sequencers."
    },
    {
      "name": "core-cc-binding-editor",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Binding Editor",
      "description": "Portable control-level MIDI CC menu and binding editor: assign a controller number and channel by right-clicking a control, then edit range, response curve, learn, or remove. The existing badge and drag-drop source strip remain optional paths through the same `midi` callbacks."
    },
    {
      "name": "core-context-menu-target",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Context Menu Target",
      "description": "Portable context-menu actions for module faces and controls on Base UI's ContextMenu (right-click and touch long-press) and the ContextMenu key or Shift+F10, plus ActionMenu: the same menu opened from a button, the ellipsis in a card header. Both run on one Base UI Menu engine and one row renderer (check column, label, a right-aligned hint such as a shortcut or a size, submenu arrow, optional separators, and non-interactive readout rows for a figure such as a code size). Fields keep the browser's own menu. Both portal into the fullscreen element while a face is in browser fullscreen and stack at the --uikit-z-overlay token."
    },
    {
      "name": "core-cc-control-chrome-core",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "CC Control Chrome Core",
      "description": "The scoped ownership ledger used by nested MIDI-aware control frames so exactly one wrapper registers a parameter target."
    },
    {
      "name": "core-cc-control-chrome",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Control Chrome",
      "description": "One reusable frame for custom controls: parameter-path resolution, drag target, activity state, editable badge, and the shared MIDI context menu."
    },
    {
      "name": "core-cc-dnd",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "CC Drag & Drop",
      "description": "Drag a MIDI CC source onto a control to bind it: a dependency-free pointer-capture drag protocol with rect hit-testing, an equivalent keyboard path (Enter to pick up, arrows to choose, Enter to drop), drop-target registration, the assignment badge and the drag ghost."
    },
    {
      "name": "core-cc-knob-strip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Knob Strip",
      "description": "A row of MIDI CC chips you can turn and reorder. Turning is the ordinary knob gesture; reordering starts from a separate grip handle and works with pointer or arrow keys."
    },
    {
      "name": "core-stable-reorder",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Stable ID Reorder",
      "description": "Controlled list reordering with stable identities, pointer and keyboard gestures, and cancellable previews."
    },
    {
      "name": "core-cc-source",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Source Strip",
      "description": "The MIDI CC chips you drag onto a control to bind it: the mod wheel first, then the expressive controllers, then a numeric picker for the other hundred-odd numbers. Each chip is draggable by pointer, assignable from the keyboard, and pulses when its controller sends traffic."
    },
    {
      "name": "core-cc-mapping-list",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Mapping List",
      "description": "Every MIDI CC mapping of a host as one grouped list: by module or rack instance, with a by-CC sort, search and filters. Rows show the CC, input and channel, target, range and live activity, with Learn, Pick control, enable and remove; opening a row gives CC, channel and range, and Advanced adds input, value mode, takeover, curve and invert. Import, export, reset and clear are callbacks; the list keeps only view state."
    },
    {
      "name": "core-cc-unmapped-notice",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "CC Unmapped Notice",
      "description": "The host's one toast for a hardware controller that moved but is not mapped: the source and channel, a live value, a chip you drag straight onto a control, Pick control (click or arrow keys and Enter) and Ignore. It never takes focus, fades after the control goes quiet, and guides any source-first pick. Every edit goes through the shared CC drag controller, so drops into sandboxed face frames work too."
    },
    {
      "name": "core-chladni-formulas",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Chladni Formulas",
      "description": "The maths of a vibrating plate as pure functions: the 2D standing-wave equation, a frequency-to-mode heuristic for a modelled steel plate, and the amplitude-weighted random walk that makes particles settle on the nodal lines. No canvas, no DOM — so the same physics drives a canvas, a WebGL renderer, or a Node test."
    },
    {
      "name": "core-chladni-plate",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Chladni Plate",
      "description": "Nodal patterns for a set of frequencies — the figure sand draws on a driven metal plate. Either a particle simulation finding the nodes over time or the standing wave as a field, on a square or circular plate. Parameter-driven, so it needs no audio source."
    },
    {
      "name": "core-chord-graph",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Chord Graph",
      "description": "How the chords in a progression connect, as a shared-pitch-class network: an edge between every pair sharing a note, weighted by how many. A chart tells you the order chords arrive in; this tells you why one slides into the next and another lands like a cut — so you can see which substitutions are available before trying them."
    },
    {
      "name": "core-chord-readout",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Chord Readout",
      "description": "Everything analysis can say about what is sounding, in one card: the chord symbol with its alternatives, note names and the raw set encoding, the Forte set class, the interval-vector chart inline, and a self-consonance meter. The symbol answers what you are playing; everything below answers why it sounds like that. Chord naming is dependency-free — a ranked search over a quality dictionary that reads inversions from the bass note."
    },
    {
      "name": "core-circle-of-fifths",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Circle of Fifths",
      "description": "A pitch-class histogram plotted on the wheel where neighbouring slots are a fifth apart, so the seven notes of any key form one unbroken arc and a modulation is a short slide round the rim. An optional needle points at the tonal centre, its length and opacity scaled by confidence so an ambiguous passage never gets a decisive-looking answer."
    },
    {
      "name": "core-computer-keyboard",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Computer Keyboard",
      "description": "The QWERTY keyboard as a MIDI controller. Keyed on physical key position (event.code) so the layout survives AZERTY and Dvorak, with a text-field guard, held-key sustain, spacebar panic and browser-shortcut passthrough."
    },
    {
      "name": "core-color-scale",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Colour Scales",
      "description": "The ramps every display paints magnitude with and the two wheels a harmony display paints pitch with, as pure functions. The ramps are the real multi-stop scientific colormaps from d3-scale-chromatic (viridis, magma, inferno, plasma, cividis, turbo), tabulated once into 256-entry lookups, plus grayscale and heat. The pitch wheels give each pitch class a hue by semitone or by circle-of-fifths position, measured from a tonic so a key keeps its colours when transposed; drawn on a pad layout, the wheel whose hues run smoothly across the pads is the relationship that layout makes visible."
    },
    {
      "name": "core-consonance",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Consonance",
      "description": "How well notes agree, as pure functions — two models side by side: a 12-TET interval table for the answer a musician would give, and Plomp-Levelt roughness plus harmonic coincidence for the answer a cochlea would give. On top sit the pieces a UI needs: interval-class vectors, voice-leading smoothness, chord self-consonance, fitting notes to a weighted pitch-class context, and the min-max luminance banding that turns clustered scores into a readable brightness ranking."
    },
    {
      "name": "core-consonance-matrix",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Consonance Matrix",
      "description": "Which of the twelve notes fit what is sounding now — a playing aid, not an analysis. Each pitch class is shaded by how well it agrees with a blend of the held chord and the tonal field the piece has established, so a note belonging to both glows brightest. The same maths the reference hardware lights its strum-bar LEDs with, including the min-max normalisation that turns narrowly-clustered consonance scores into a ranking you can actually read."
    },
    {
      "name": "core-control-format",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Control Format",
      "description": "Value formatters for parameter readouts — Hz with a k-suffix, dB with a silence floor, pan as L/C/R, percentages and choices."
    },
    {
      "name": "core-control-label",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Control Label",
      "description": "A shared caption/readout wrapper with optional bounded text fitting, narrow typography and ellipsis inside a designer-owned width."
    },
    {
      "name": "core-control-math",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Control Math",
      "description": "Clamping, normalisation and step quantisation shared by every control, plus the SVG arc helpers the knob draws with."
    },
    {
      "name": "core-control-skin",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Control Skin",
      "description": "The kit's shared visual vocabulary: the skins every control understands (default, flat, vintage, minimal, neon), the traits behind them, the helpers that turn a trait into a cap fill, an accent fill, a glow or a row of tick positions, and the provider that lets a panel declare its finish once for everything inside it."
    },
    {
      "name": "core-control-theme",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Control Theme",
      "description": "The CSS custom property contract every control reads, with rich defaults and a few ready-made skins."
    },
    {
      "name": "core-delay-tap-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Delay Tap Display",
      "description": "A delay's echo train on a time axis: a muted reference pip for the dry hit, then one pip per repeat at the moment it arrives and the height it arrives with, fading as well as shrinking so the tail stays readable. Two lanes turn it into a ping-pong view — left grows up from the midline, right grows down, and the first repeat's side comes from the shipped graph rather than from the display. Supply a tempo and it draws the beat grid the repeats are landing on, or missing."
    },
    {
      "name": "core-display-chrome",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Display Chrome",
      "description": "What makes a readout look like hardware instead of like text: nine panel skins (LED red/amber/green/blue, VFD, plasma, and the backlit and reflective LCDs) plus the pure string builders that draw them — a recessed pane with the bezel's overhang along its top edge and a vignette to the corners, a bloom radius that is zero on reflective screens because a halo round a dark LCD character is the giveaway of a fake one, ghosts derived from the ink so a colour override drags the unlit elements with it, and a spill shadow that washes the panel around the window in proportion to how much of the display is lit."
    },
    {
      "name": "core-dot-matrix-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Dot Matrix Display",
      "description": "The character screen bolted into the front of a rack unit — five columns by seven or eight rows per cell, several lines, and the unlit dots present the whole time. Square dark ink on a yellow-green backlit pane is the module every reverb and sampler shipped; round lit dots on black glass is the LED marquee, optionally scrolling on a clock that cannot drift. A bitmap prop drives the dots directly for meters, waveforms and logos, and a blinking block cursor marks the field being edited. The unlit grid is one tiled pattern and each line of ink is one path, so a 20x2 screen is a handful of nodes rather than 1,600."
    },
    {
      "name": "core-dot-matrix-font",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Dot Matrix Font",
      "description": "Text into a field of lit dots, the way the hardware has it: the classic 5x8 character-cell bitmap font as column masks, a flat run of columns per line, a window onto that run so scrolling is an offset rather than a transform, and every lit dot of a line as one SVG path (square or round). Plus the duty cycle a display's glow rides on and a marquee clock derived from elapsed time, so a dropped frame cannot make the scroll drift."
    },
    {
      "name": "core-drawbar-strip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Drawbar Strip",
      "description": "A tonewheel organ's registration control: N sliding bars with nine detents each, coloured in the classic brown/white/black families, and the registration printed underneath as the digit string players actually speak (\"888000000\"). The throw is inverted — out is loud, so the head travels down as the value rises — and the travel is detented rather than continuous, so a drag and a keypress cannot disagree about what \"6\" is. Press anywhere to jump a bar to that detent and keep dragging, wheel a notch at a time, or drive each bar from the keyboard. Layout, quantisation and key handling sit in a pure core beside it."
    },
    {
      "name": "core-drum-lane",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Drum Lane",
      "description": "The rhythm sibling of the piano roll: named lanes (Kick, Snare, Hat…) down the left, a beat grid across, and every hit drawn at its exact onset so timing and swing are legible — a round marker that visibly sits off the gridline when a hit is pushed or swung, over a sixteenth grid that stays countable while it plays. Velocity is the marker's size and opacity, accents wear a ring, and sustained hits grow a tail. It shares the piano roll's whole beat axis, host-driven playhead, active-hit highlight and --uikit-* theming through the same geometry core (createLaneLayout), changing only what a drum view needs: taller rows, text labels instead of a keyboard, and hits placed by lane instead of pitch. The playhead is a prop the host drives; null draws no cursor and no readout, so a stopped transport shows nothing pinned at zero."
    },
    {
      "name": "core-dual-band-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Dual Band Selector",
      "description": "The Logic-style \"Low Cut … High Cut\" band bar: two caps on one log or linear frequency track with the band between them lit. Press the band to move both caps at their current width, press the open track to jump the nearer one, Shift for a fine pass, wheel and arrows on the focused cap. The caps stop against each other at a minimum ratio (log) or difference (linear) instead of crossing, and the taper, the gap and the band drag are a pure core with its own tests."
    },
    {
      "name": "core-dynamics-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Dynamics Display",
      "description": "A compressor or gate's transfer curve — computed, so it is true before a single sample plays — with the knee shaded, the threshold marked, a gate's hysteresis band drawn as a band, and a live gain-reduction meter beside it. The curve says what the processor would do at any level; the meter says what it is doing to this one."
    },
    {
      "name": "core-dynamics-math",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Dynamics Math",
      "description": "The compressor/gate transfer function as pure maths: the standard soft-knee formulation the Web Audio DynamicsCompressorNode is specified against, a gate variant with an attenuation floor and a hysteresis band, a static gain-reduction-at-level solver, and a dB-in/dB-out axis with both forward and inverse mappings. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-echo-train",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Echo Train",
      "description": "Where a delay's repeats land and how loud they are, as pure maths: tap times and levels from time/feedback/mix, the L-R alternation of a cross-coupled ping-pong pair, an audibility floor and a tap cap, a 60 dB decay time, beat-grid ticks for a tempo, and a time/level axis with forward and inverse mappings. Derived from the shipped delay graphs and pinned against sample-accurate simulations of them. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-envelope-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Envelope Display",
      "description": "An ADSR envelope you can draw on: filled shape, draggable handles at the peak, knee and tail, and a square-root time axis that keeps millisecond attacks legible next to multi-second releases."
    },
    {
      "name": "core-envelope-editor",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Envelope Editor",
      "description": "The envelope display and four knobs, bidirectionally synced — drag a handle and the knobs follow, turn a knob and the shape follows. A worked example of composing the kit rather than a new control. An optional frame wraps it into a compact, self-contained panel — the little-black-box module look."
    },
    {
      "name": "core-eq-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "EQ Display",
      "description": "The magnitude response of a stack of filter bands, computed from RBJ biquad coefficients rather than measured — so the curve matches what the audio graph will actually do, with no analyser needed."
    },
    {
      "name": "core-eq-editor",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "EQ Editor",
      "description": "Hands on the EQ curve: N draggable band handles over the eq-display response, wheel for Q, full keyboard access per band, and two readings of the same band model — parametric (curve plus handles) or bars (columns standing at their own frequencies with the curve behind them). Controlled, with the band model, hit testing and step maths in a pure core beside it."
    },
    {
      "name": "core-producer-eq-panel",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Producer EQ Panel",
      "description": "Host-bound producer equalizer composite over EQEditor: numbered band overview, descriptor-bound precise editing, factory preset navigation, momentary audition and real pre/post scope analysis. Product adapters supply band contracts and recipes. Requires the SDK and UI-kit host-control package; ships its scoped layout stylesheet beside the component."
    },
    {
      "name": "core-fader",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Fader",
      "description": "A channel-strip slider in both orientations: recessed groove, lit fill, and a grippy cap that jumps to wherever you press and keeps dragging from there. Wheel support, Shift for a fine pass, optional dB-style tick marks."
    },
    {
      "name": "core-fader-headless",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Fader Headless",
      "description": "The unstyled track primitive a fader is built on: absolute pointer positioning, the Shift fine pass anchored where Shift went down, wheel and keyboard stepping, and the full role=\"slider\" contract. Renders no appearance — a render prop hands your face the drag state."
    },
    {
      "name": "core-fixed-velocity-control",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Fixed Velocity Control",
      "description": "A compact fixed-velocity override for playable instrument surfaces: switch between touch dynamics and a repeatable normalised strike value."
    },
    {
      "name": "core-fm-algorithm-diagram",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "FM Algorithm Diagram",
      "description": "A themed, selectable operator-routing diagram for FM synthesis. It draws carriers, modulators, fan-out, the audio bus and self-feedback from the shared pure geometry core while keeping the host in control of selection, colours and descriptive copy."
    },
    {
      "name": "core-fm-algorithm-layout",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "FM Algorithm Layout",
      "description": "An FM synthesiser's operator routing diagram, as pure maths: which row each operator sits in (its distance from the audio bus, which is the patch's real modulation depth), which column (packed from a spanning forest so the picture is stable as you step through algorithms), the elbow path of every modulation edge, the lead from every carrier down to the bus, the self-feedback loop, a validator that catches cycles and inaudible operators, and a square-root-scaled ADSR thumbnail sized to fit inside an operator box. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-fm-routing-matrix",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "FM Routing Matrix",
      "description": "A controlled, keyboard-accessible editor for directed operator modulation, self-feedback and independent audio outputs. Stable operator IDs and configurable ranges let instruments persist their own routing state."
    },
    {
      "name": "core-gain-reduction-meter",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Gain Reduction Meter",
      "description": "A compressor's metering surface: input and output level bars flanking a gain-reduction bar that fills from the top downward — the hardware convention, because it shows what is being taken away rather than what is there — with a peak-hold tick for the deepest recent bite. Wire it with dB values you already have, a per-frame callback (DynamicsCompressorNode.reduction slots straight in), or a pair of analysers."
    },
    {
      "name": "core-glow-button",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Glow Button",
      "description": "Lit momentary or latching buttons in four styles: large round and pill performance controls with an LED halo, plus compact console-round and console-square controls with a machined bezel and recessed face. The glow can idle, hit on the beat, or follow a host-provided audio level."
    },
    {
      "name": "core-goniometer",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Goniometer",
      "description": "The signal-side SHAPE of a stereo image: a phosphor trace of the channel pair rotated 45 degrees so mono runs straight up the middle, pure side lies flat across the horizontal, and a hard-left source draws on the left. Diamond graticule, an L-R baseline carrying the measured energy balance, a correlation meter whose lower half is tinted, and a CORR/WIDTH readout. Switchable between the mid/side diamond and a raw left/right split, which answers the per-channel question the diamond hides. Display auto-gain measured on the mono sum, so the scale never depends on which way the image leans, and the printed readings are always taken from the raw pair. Takes a live analyser pair or a getStereoData callback; with neither it draws its graticule and says it has no source rather than animating invented samples."
    },
    {
      "name": "core-interval-vector-chart",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Interval Vector Chart",
      "description": "The harmonic fingerprint of a pitch-class set as six bars — one per interval class, m2 through the tritone. Invariant under transposition and inversion, so it describes what a sonority sounds like rather than how it is spelled: every major triad in every key draws the same shape. Weight to the right is tension, weight in the middle is sweetness. Takes the six counts, or the notes to compute them from."
    },
    {
      "name": "core-keyboard-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Keyboard Geometry",
      "description": "Where the keys of a piano are and which one you hit, as pure maths: a key rectangle per MIDI note over any range in a unit coordinate box, black keys placed by the equal-white-tops derivation rather than the lumpy uniform approximation, hit-testing back from a point with black-over-white priority, white-key indexing both ways, and the press-height velocity a touch surface needs because a screen has no key bed. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-knobman-source",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "KnobMan Visual Source",
      "description": "Serializable KnobMan template identity, bounded retina sizing, value-to-frame mapping, and a host-injected renderer provider for keeping the knob interaction portable."
    },
    {
      "name": "core-eurorack",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Eurorack hardware and Mutable panel styling",
      "description": "Physical rack panels, round metal jacks and Mutable-style hardware knobs. MutableKnobDesign composes KnobHeadlessReadout: one printed caption swaps from label to formatted value on hover or edit, with shared typography and no tooltip. Hosts own actual patching and audio."
    },
    {
      "name": "core-knob",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Knob",
      "description": "Shared rotary control with dial, ring, studio and text variants. Dial default: label at rest, formatted value on hover or edit. showLabelOnHover=false keeps both visible; valueReveal=edit explicitly disables hover reveal. captionWidth, labelCompressible and labelNarrow control bounded fitting and ellipsis; textStyles and unitSize style the readout. variant/skin/size select appearance independently of indicator, ticks, arc geometry, bipolar and pizza feedback. interaction, dragDistance, wheelSensitivity and cursor tune shared gestures; keyboard, reset, ARIA and MIDI/CC stay shared. Use ParameterKnob for schema-bound module parameters and renderDesign for custom drawing; KnobHeadless remains available for custom interaction structure. The UI-kit Knob catalog documents the full prop table and copyable patterns."
    },
    {
      "name": "core-knob-core",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Knob Core",
      "description": "The framework-agnostic maths behind a potentiometer gesture: drag, wheel and keyboard arithmetic in normalised space, with pluggable linear and logarithmic response curves."
    },
    {
      "name": "core-knob-headless",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Knob Headless",
      "description": "The headless slider primitive a knob is built on: the full role=\"slider\" contract, drag, wheel and first-interaction reporting, plus a shared hover/edit readout slot that truncates labels and values inside its parent width. Its cursor defaults to ns-resize; bring your own body skin."
    },
    {
      "name": "core-level-meter",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Level Meter",
      "description": "Volume bars with peak hold: RMS for the bar, a decaying tick for the recent peak, in either orientation. Takes an analyser, a data callback, or levels you already computed."
    },
    {
      "name": "core-output-level-meter",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Output Level Meter",
      "description": "A module's output meter with its gain control on it: pixel-aligned LED bars, one per channel (L/R when the host measures them, one merged bar otherwise), hardware green/amber/red zones, a peak-hold segment and a latched clip light, with a triangle under the bars that sets the linear output gain on the meter's own dB scale. Levels paint straight to the DOM, so a 30 Hz meter feed never re-renders the bars."
    },
    {
      "name": "core-lfo-visualizer",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "LFO Visualizer",
      "description": "An LFO's waveform with a cursor riding the current phase. Drawn from the shape's closed form rather than measured off an analyser — which is the only sensible way to display a modulator running well below 20 Hz. Pass a phase to drive it from a real LFO, or let it run on its own clock."
    },
    {
      "name": "core-lissajous-scope",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Lissajous Scope",
      "description": "A circular vectorscope trace: one mono signal plotted against a phase-shifted copy of itself, so a single channel draws circles and rosettes. Phosphor persistence via a per-frame fade, and the geometry is a pure exported function you can test or render headlessly."
    },
    {
      "name": "core-midi-activity-table",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "MIDI Activity Table",
      "description": "A coalesced live view of MIDI controls — one row each, with an inline SVG sparkline of recent values, a level bar, held state and a message count. Built for diagnosing a controller without drowning in event spam."
    },
    {
      "name": "core-midi-message-decode",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "MIDI message decode",
      "description": "Decode raw MIDI bytes into a described message: notes (with names), CC (with common controller names), pitch bend, both aftertouch flavours, program change and system realtime. Pure and synchronous — no React, no Web MIDI."
    },
    {
      "name": "core-midi-monitor",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "MIDI Monitor",
      "description": "A diagnostic list of incoming MIDI messages, decoded and colour-coded by type. Controlled and presentational: the caller owns the buffer and supplies messages, so it drops into a lab page, a settings popover or a routing debugger without acquiring MIDI itself."
    },
    {
      "name": "core-module-navbar",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Module Navbar",
      "description": "A composition-first module faceplate navbar with brand, preset, action, preferences, status, and controlled power slots in a stable responsive order."
    },
    {
      "name": "core-module-power-button",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Module Power Button",
      "description": "Module bypass switch: ModulePowerHeadless for any skin, plus a discreet stock icon, a ToggleSwitch variant coloured by module CSS, and a labelled Live treatment."
    },
    {
      "name": "core-musical-time",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Musical Time",
      "description": "The arithmetic that turns a tempo into seconds and seconds back into a position you can say out loud: a typed table of note divisions from a whole note to a 1/32 in plain, dotted and triplet flavours, each carrying its length in beats, its seconds and its rate in Hz; MPC-convention swing offsets; a pure tap-tempo reducer with median averaging and a phrase-ending gap rule; grid quantising; and 1-based bar.beat.sixteenth formatting. Beat conversion is echo-train's, imported rather than restated, and the shipped conversions it unifies are pinned bit-identical against verbatim copies. No React, no DOM — testable in Node and safe to format with on the server; and formatDuration, seconds as m:ss."
    },
    {
      "name": "core-oscilloscope",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Oscilloscope",
      "description": "A time-domain waveform trace with min/max downsampling so transients survive, and optional zero-crossing trigger so a steady tone stands still instead of sliding."
    },
    {
      "name": "core-harmony-lattice",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Harmony Lattice",
      "description": "A twelve-bin field painted onto an isomorphic pad layout: two semitone steps on a square or hexagonal grid, the piano or a fretboard for comparison. Paints by value (the kit's colour ramps, or a tense/bright ramp) or by pitch identity (hue by semitone or by circle of fifths), and rings the notes a progression step adds and dashes the ones it releases, so a chord sequence can be animated on several layouts at once. Every cell is coloured by the value of the pitch class it sounds, so a chord's consonant neighbourhood, a song's note histogram or a scale mask can be drawn on several layouts side by side and read as regions or as scatter. Chord tones take the accent, tense values are tinted rather than merely dark, a tonic gets a ring and a tonal-centre marker can sit over the lattice. A display envelope and a live trail beside it keep played pads glowing and fading, so recent chords leave a decaying trail. The pure geometry beside it also scores a field's readability on a layout: roughness across neighbours and the number of connected regions."
    },
    {
      "name": "core-ring-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Ring Geometry",
      "description": "The pure core of the ring figures: circle points with any node at twelve o'clock, shared-note labels pushed off each edge, arrows trimmed to node rims, the line-of-thirds strip's extent, and the ring roll's column placement (by chord or by beats, with a label gutter at each re-cut phrase), lane positions and cell paint by mark. Also the structural view model a ring roll is drawn from, so a theory library's roll object can be passed as is."
    },
    {
      "name": "core-ring-circle",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Ring Circle",
      "description": "A key's ring of chords as a circle of clickable nodes in line-of-thirds order, where neighbours share all but one note and a move of k nodes shares all but k. Edges carry the notes neighbours share, moves are drawn as arrows across the circle with the active one bold, and the hinge gets a heavier rim. Nodes arrive with their name, quality icon, ring label and pitch classes already chosen, so the same figure draws a traditional I to VII ring or any cycle of chords."
    },
    {
      "name": "core-ring-strip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Ring Strip",
      "description": "The line of thirds laid flat: a key's roots in a row with the step between each pair (on Aura a major third is one pad right, a minor third one pad up) and every chord as a clickable bracket over the consecutive notes it stacks, one lap and a bit so each chord appears whole."
    },
    {
      "name": "core-ring-arc",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Ring Arc",
      "description": "A chord as a thick band over a ring of notes (a key's seven in line-of-thirds order, so stacked thirds are neighbours), with the chord before it as a ghost band on an outer track and the next on an inner one. Notes read in one colour language: shared notes solid and tied radially to the ghost track, arriving notes in the accent, leaving notes dashed, and the shared count in the centre. Editable: drag the band to move the chord, drag an end knob to widen or narrow it (triad, seventh, ninth), tap a note to toggle it, with keyboard equivalents. An optional outer ring of real note names with semitone ticks turns to transpose."
    },
    {
      "name": "core-ring-roll",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Ring Roll",
      "description": "A progression on the seven lanes of a ring, one per ring position from the cut: each chord a run of cells, filled for the ring's notes, ticked where a note is bent, dashed across a gap and hollow for a foreign chord. Common tones between neighbours are bridged into connected bands, the hinge lane is tinted, runs that straddle the cut are split with tie marks and a re-cut phrase gets its own lane labels. One column per chord or width by beats; columns are clickable."
    },
    {
      "name": "core-pad-grid",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Pad Grid",
      "description": "A drum machine's bank of velocity pads: rows of rubber squares, labelled and lit from the state you pass in. Velocity comes from where in the pad the press landed — the top edge is a full-force hit, the bottom edge the softest one — so a tap is something a player can aim rather than a single fixed level. Choke groups are drawn as well as obeyed: pads that cut each other wear a tie mark, from the same membership function an engine uses to decide what to silence. Includes a first-class look for a pad that is deliberately silent. Layout, hit testing and the velocity law sit in a pure core beside it."
    },
    {
      "name": "core-pc-histogram",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Pitch Class Histogram",
      "description": "Twelve bars on a common baseline showing how much each pitch class sounded — the plainest view of the data the circle-of-fifths wheel plots, and the one to reach for when you want to read the numbers rather than see the key. Peak-normalised, with a root marker and a live-chord highlight."
    },
    {
      "name": "core-pc-set-analysis",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "PC Set Analysis",
      "description": "The set-theory reading of a chord: normal form, prime form, the 12-bit chroma, and the matching Forte set class from the full 352-row table with its symmetry properties parsed out. Keyed on a computed prime form rather than the interval vector, so a major triad is identified as a major triad — an interval-vector lookup cannot separate a set from its inversion, which is why the usual implementation reports one as the other."
    },
    {
      "name": "core-piano-keyboard",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Piano Keyboard",
      "description": "A playable keyboard, one to ten octaves wide: press a key and it strikes with a velocity taken from how far down the key you landed, drag across it and it glissandos — previous note off, entered note on. Notes go out through onNoteOn/onNoteOff and never through a param channel, and what is lit comes back in as a held map shaped like the module contract's activeNotes, so a key that was struck but declined draws as struck-and-silent rather than as nothing at all. Scale membership and a root tint as controlled props, opt-in QWERTY input through lib/computer-keyboard, keys that are real buttons with note-name labels, and a read-only mode for drawing a voicing."
    },
    {
      "name": "core-sampler-keyboard",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Sampler Keyboard",
      "description": "The piano keyboard painted with a sampler instrument's own facts: exact mapped-key coverage with every unmapped key muted per key, per-group coverage in distinct zone colours for a kit-style mapping, authored key colour ranges as instrument formats write them, and a playable range that mutes what the instrument cannot sound. Strike velocity, glissando, the held map and computer-keyboard input are the piano keyboard's. The sampler module's face and the Studio sampler editor draw this one control."
    },
    {
      "name": "core-chord-map",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Chord Map",
      "description": "Controlled twelve-column chord map with a shared piano roll, palette bands, activity trail, tension indicators and per-column seed controls. Hosts own chord generation and playback."
    },
    {
      "name": "core-piano-roll-visualizer",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Piano Roll Visualizer",
      "description": "Controlled falling notes and a horizontal MIDI river with bounded indexed note windows and fading releases."
    },
    {
      "name": "core-midi-sonar",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "MIDI Sonar",
      "description": "Circular MIDI sonar and note orbits: held notes stay bright, released notes fade, and the host owns time."
    },
    {
      "name": "core-piano-roll",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Piano Roll",
      "description": "The pitch × beat note grid a melodic module needs: time left to right in beats, pitch bottom to top like a keyboard, every note a block drawn at its own beat and pitch, and the whole loop rendered at once — no virtualization, the deliberate choice for a short loop shown whole. A two-tone grid keeps bars, beats and sixteenths countable while it plays; row stripes read the octaves; the keyboard gutter names the naturals. The playhead is a prop the host drives from its own clock, and when it is null the cursor and its bar.beat.sixteenth readout are simply not drawn — a stopped transport shows no line pinned at zero. Notes are selectable and lit with the accent; an experimental edit mode lets a selected note move or stretch with optional snapping, behind a flag until a sequencer consumes it. Every colour is a --uikit-* token, so an embedded roll follows a host that repaints per mode with no prop passing."
    },
    {
      "name": "core-multi-voice-piano-roll",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Multi-Voice Piano Roll",
      "description": "A reusable short-loop piano-roll editor for independent voices: stable note and voice identity, color-coded overlapping notes, per-note pitch curves with linear interpolation, and keyboard-accessible curve handles. It composes the Piano Roll's tested note grid and leaves continuous pitch delivery to the host's future expression transport."
    },
    {
      "name": "core-piano-roll-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Piano Roll Geometry",
      "description": "Where a note sits in a pitch × beat plane, and which note a point lands on, as pure maths: a fixed coordinate box resolved from a pitch range and a bar count, note rectangles forward and hit-testing back, a keyboard gutter, and the 1-based bar.beat.sixteenth a transport prints — from a beat position, because a roll never needs the tempo to know where a bar line is. Plus white/black-key classification, default note naming and grid-snap rounding for edits. No React, no DOM, no canvas — testable in Node and safe to lay out on the server."
    },
    {
      "name": "core-multi-voice-piano-roll-model",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Multi-Voice Piano Roll Model",
      "description": "Pure pitch-expression model helpers for multi-voice piano rolls: stable voice/note records, bounded note-local pitch curves, deterministic sorting, linear interpolation and point updates. No React, DOM or audio transport."
    },
    {
      "name": "core-pitch-class-clock",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Pitch Class Clock",
      "description": "The twelve pitch classes round a dial with the sounding ones in the value fill, joined into a polygon, so a chord becomes a recognisable shape. Order the ring by semitone, fifth or whole tone. size is pixels or \"fill\" (scales to its container). With onToggle the dial becomes an input: twelve named checkboxes in one roving Tab stop (arrows walk the ring, Home and End), toggled by click, Enter or Space; labelOf respells node text; note names from music-theory."
    },
    {
      "name": "core-pluck-position",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Pluck Position",
      "description": "Which harmonics a pluck point kills, as pure maths: the comb response of the delay-and-subtract a Karplus-Strong exciter runs, the harmonics it silences exactly, the ideal plucked string's triangle shape and the spectrum that shape has, the integer-delay rounding a short loop actually realises, and laid-out SVG geometry for a string view and a comb plot. Pinned against a DFT of the shipped filter rather than against a restatement of its algebra. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-preset-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Preset Selector",
      "description": "A controlled preset dropdown with Quiet, Panel and Glass skins, previous/next stepping, favorites, search, and collision-aware menu placement. The shared headless hook supplies accessible prop getters for custom renderers. Options accept strings or common name/label/note shapes and normalize to stable ids. The popup portals into the fullscreen element while the face is in browser fullscreen, so it stays visible there."
    },
    {
      "name": "core-tag-browser",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Tag Browser",
      "description": "A controlled category/keyword chip browser in the style of a hardware preset browser: a column per category from 560 px and stacked, wrapping categories below (no horizontal scroll at 360 px), per-chip match counts, zero-count chips disabled in browse mode, single-select replacement, an up-to-n limit that refuses and announces, per-category and global clear, and an optional search filter. ARIA group/checkbox semantics with one roving tab stop; arrows move across columns and within them, Space/Enter toggle. Quiet, Panel and Glass skins over the same headless useTagBrowser hook, with the rules as a pure unit-tested model."
    },
    {
      "name": "core-preset-browser",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Preset Browser",
      "description": "The unified preset library views for a host-built AudioModuleFacePresetLibrary (factory, every sampler bank, user and community presets). usePresetLibrary is the one headless controller: search, a groups-column scope (All, Favorites, User, host groups), AND tag filters and favorites, with filtering, tag counts and previous/next over the CURRENT filtered list taken from the audio-contracts helpers; it persists nothing but an optional per-viewer scope. PresetLibrarySelector drives the compact PresetSelector from the library with a modified marker, Save and Browse (offered past 30 entries or when the host asks). PresetBrowser is an overlay sheet INSIDE the face (nearest [data-preset-overlay-container] or [data-module-face-surface]): groups column with counts, a windowed Name / group / secondary / tags list with favorite hearts, the reused TagBrowser as the tags column, and a Save / Delete / previous / next / close toolbar; arrows move, Enter selects and closes, Space selects, F favorites, / searches, Escape clears then closes; below 640 px the side columns become drawers with removable filter chips. PresetLibraryNavigator is the library as a sidebar beside the face that grows with its width: drilled down (a groups view as a list with thumbnails or picture cards from group.artwork, then the open group's presets) while narrow, groups beside presets once wide (half and half, with a draggable divider), and the tags as a third column when wider still and the face allows it; a whole-library search over names and tag labels (a magnifier button until opened, / to focus), a header slot for the face's own selector and an Expand/Collapse button; opening a group lands on its first preset (or keeps the active one). PresetSaveDialog names the sound, picks up to 8 vocabulary tags, offers Overwrite for the viewer's own preset, and shows the host's pending/error/success answer inline. Every action is a request the host fulfils."
    },
    {
      "name": "core-sample-view-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Sample View Geometry",
      "description": "The time axis behind SampleView as pure maths: a seconds domain with a capped, quantized extension past the take, take-normalized ↔ axis conversion, ordered start/end and loop handles with knob-style key steps, min/max peak reduction into the take's share of a canvas, and ruler ticks. No React, no DOM."
    },
    {
      "name": "core-sample-view-context",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Sample View Context",
      "description": "The time-axis contract a SampleView hands its overlays (axis and take seconds, the surface, client-x conversion and a gesture latch), kept apart from the view so an overlay does not pull the spectrogram renderer into a face bundle."
    },
    {
      "name": "core-sample-view",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Sample View",
      "description": "One take on a seconds axis from host-prepared data only: min/max peaks on a canvas, a PreparedSpectrogramData heatmap (magma, log frequency) or both, with a Wave / Spectrum / Both toggle. Draggable, keyboard-steppable start/end and loop handles report take-normalized positions; playheads; a dimmed extension past the take end; a seconds ruler; and an overlay slot whose children read the same geometry from context. The axis latches during an overlay drag. The canvas repaints only when its peaks, colour or size change."
    },
    {
      "name": "core-envelope-overlay",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Envelope Overlay",
      "description": "An editable AHDSR amplitude envelope on the SampleView's seconds axis (or any positioned box). Attack, hold, decay-and-sustain and release nodes drag and step as sliders; the sustain plateau drags vertically. Every value goes through the stage descriptor's taper, range and step exactly like the knob path (knob-core curves, pinned equal to audio-contracts normalize/denormalize), and arrow keys are the knob's keys. Segments past the take end are drawn dimmed; note-off is drawn at a host gate. Pure geometry exported and tested."
    },
    {
      "name": "core-take-switcher",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Take Switcher",
      "description": "Generated variations as controlled tiles (A, B, C…) with a mini waveform, a badge slot, progress while generating, an error with retry, and pin and regenerate buttons whose refusals disable with a reason. A radiogroup with one tab stop: arrows, [ and ] (inside the switcher or window-wide, never in text fields) and previous/next buttons cycle selectable takes. Tiles wrap to the width. The host owns generation, pinning and what selecting does."
    },
    {
      "name": "core-radial-pad-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Radial Pad Geometry",
      "description": "The polar layout of a hand-played disc as pure maths: a centre pad plus rings of wedge zones, with the same table driving the SVG paths, the hit test and the off-centre reading a press returns. No React, no DOM — so the ink and the touch targets cannot drift apart, and the whole thing is testable in Node."
    },
    {
      "name": "core-radial-pad-surface",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Radial Pad Surface",
      "description": "A playable disc: a centre pad ringed by wedge-shaped zones, labelled and lit from the state you pass in. Presses report how far from the zone's centre they landed, so a tap has a velocity. Includes a first-class look for a pad that is deliberately silent."
    },
    {
      "name": "core-rate-level-envelope-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Rate Level Envelope Display",
      "description": "A controlled plot for classic FM rate/level envelopes, where every stage has both a speed and a destination level. Supports any stage count, configurable ranges, a sustain-stage marker, stage labels and the shared UI-kit theme tokens."
    },
    {
      "name": "core-response-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Response Geometry",
      "description": "The log-frequency / dB plot as pure maths: an axis factory with both forward and inverse mappings, RBJ biquad magnitudes for all seven cookbook shapes, and cascaded curve/path builders. No React, no DOM — so a display and a drag overlay can share one scale, and the geometry can be tested in Node."
    },
    {
      "name": "core-rhythm-math",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Rhythm Math",
      "description": "Euclidean rhythms and the circle they are drawn on, as pure maths: Bjorklund's algorithm rotated onto its downbeat (E(3,8) is the tresillo, E(5,8) the cinquillo, E(7,12) the West African bell), the circular inter-onset intervals that name a pattern \"3-3-2\", rotation, a pulse record with velocity and accent that converts to and from a boolean mask, and the ring geometry — step angles, a fractional playhead's hand, and the vertices of the rhythm polygon. Maximal evenness is asserted exhaustively rather than assumed, and the ring convention is pinned bit-identical to pitch-class-clock's. No React, no DOM — testable in Node and safe to lay out on the server."
    },
    {
      "name": "core-rhythm-wheel",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Rhythm Wheel",
      "description": "A bar as a circle: N steps round a ring, the struck ones lit, joined into the polygon that IS the pattern — a lopsided triangle for the tresillo, a square for four on the floor, the same shape turned when you rotate it. Velocity is node size and brightness both, accent is its own outline ring, group ticks sit outside the ring and the downbeat carries a lit one. The playhead is a prop, fractional for a smooth sweep, because the host owns the clock. Read-only it draws a generated pattern; add onToggle and every node becomes a keyboard-reachable toggle that wraps round the ring the way the bar does."
    },
    {
      "name": "core-scale-remap-control",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Scale Remap Control",
      "description": "A headless controlled Scale/12-TET note-remap switch with compact and circle-of-fifths root-note selectors."
    },
    {
      "name": "core-segment-display",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Segment Display",
      "description": "The LED readout off the front of a rack unit — 7, 14 or 16 bars per cell, drawn as geometry rather than set in a font, because the thing that makes a real one unmistakable is the bars that are off: showing 1 still shows the ghost of 8. Around that: a recessed pane, a bloom on the lit bars, and light spilling onto the panel in proportion to how much of the display is lit. A plain value with a window of digits, or several captioned fields behind one piece of glass the way a multi-tap delay says what it is doing. Decimal points ride the cell before them, overflow truncates from the end the text is not aligned to, and the cells lean like every module in a rack does."
    },
    {
      "name": "core-segment-font",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Segment Font",
      "description": "The pure core of a segment display: David Madison's ASCII mask tables for 7, 14 and 16 segments, plus the polygons that draw them. Bars are built from four numbers (width, height, thickness, gap) as mitred hexagons that meet at a gutter, diagonals are the thinner quads real glass has, and the italic lean is sheared about the baseline so the geometry and its bounding box agree. Reading a string is where the small real behaviours live — a decimal point rides the cell before it, overflow eats the end the text is not aligned to — and litRatio reports the duty cycle the panel's glow spills in proportion to."
    },
    {
      "name": "core-prepared-spectrogram",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Prepared Spectrogram",
      "description": "Display-only time/frequency raster mapping for bounded host-prepared spectral frames, preserving explicit window-center timestamps and MIDI-aligned logarithmic frequency bounds."
    },
    {
      "name": "core-spectrogram",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Spectrogram",
      "description": "A time × frequency heatmap. Realtime scrolls an analyser; static analyses PCM; prepared renders bounded host-produced magnitudes at explicit timestamps without analyzing PCM in the face. Log frequency axis, six colour ramps, and the bin-to-pixel mapping is a pure exported function you can test or render headlessly."
    },
    {
      "name": "core-spectrum",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Spectrum",
      "description": "An FFT magnitude display as bars or a filled curve, on a logarithmic frequency axis — because a linear one spends half its width above 10 kHz and crushes the bass into nothing."
    },
    {
      "name": "core-step-division-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Step Division Selector",
      "description": "A compact controlled dropdown for rhythmic step divisions, styled by the UI kit theme variables."
    },
    {
      "name": "core-step-grid",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Step Grid",
      "description": "The sequencer grid: steps across, lanes down, a page at a time. Tap a cell to toggle it, drag across a row to paint a whole stroke on or off, drag up or down on a lit cell to ride its velocity — with velocity drawn as fill height and brightness both, gate as the fill's width, ghost cells for computed previews, beat-group tinting, page tabs past 16 steps, and a playhead column driven by the host's clock, never by a display timer. Read-only it becomes a mini piano-roll, which is how the arpeggiator draws its computed line through the same cells a sequencer edits."
    },
    {
      "name": "core-step-lane",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Step Lane",
      "description": "One row of a step sequencer, with three states rather than two: off, on and accent, because accent is a real louder hit and a two-state lane forces it into a second row the player has to keep in sync by hand. Press to cycle, or press and drag to paint the value the first step took across the row. The playhead takes a fractional position, so a face animating from the audio clock draws a line that travels instead of a light that arrives after the step has already sounded. Layout, the press/drag reading, the paint rule and the `.`/`x`/`X` pattern notation sit in a pure core beside it."
    },
    {
      "name": "core-step-pattern",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Step Pattern",
      "description": "The sequencer/arpeggiator pattern model and the grid it draws on, as pure maths: held notes walked up, down, up-down (endpoints unrepeated), in press order or by a seeded per-step hash — transcribed from the shipped arpeggiator and pinned bit-identical against it — plus octave stacking, pattern rotation, a sequence-to-lanes resolver for read-only piano-roll views, page arithmetic, an exact steps × lanes tiling with inverse hit-testing, and the tap/paint/velocity-drag gesture maths. No React, no DOM — testable in Node and safe to lay out on the server."
    },
    {
      "name": "core-step-timeline",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Step Timeline",
      "description": "Retained-resolution timeline math for step sequencers. Coarser divisions hide fine cells without deleting them."
    },
    {
      "name": "core-stereo-field",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Stereo Field",
      "description": "The parameter-side picture of a stereo image: an L-R field with a pan cursor the host can animate from an LFO phase, the width parameter drawn as a spread around it, mid/side balance bars, and a correlation meter whose lower half is tinted because correlation below zero is the mono-compatibility danger zone. Takes precomputed values, a live analyser pair, or a getStereoData callback. Pairs with lissajous-scope, which is the signal-side view of the same signal — this one is not a goniometer and does not try to be."
    },
    {
      "name": "core-stereo-math",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Stereo Math",
      "description": "What a stereo image is doing, as pure numbers: correlation at lag zero on the meter convention (no mean removal), mid/side energies and the width ratio they imply, an L-R energy balance, the constant-power pan law Web Audio specifies for a mono input, framerate-independent meter ballistics, and the field geometry a pan cursor and a width spread are drawn with. Every function has a defined answer for silence, empty buffers, mismatched lengths and non-finite samples, and returns a finite number for all of them. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-stft",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "STFT",
      "description": "The spectrogram's whole-buffer short-time Fourier transform, forwarded from @maruaudio/audio-sdk/analysis: the canonical radix-2 FFT, paired stereo transform, a Hann-windowed whole-buffer magnitude spectrogram in dB, and a planar-to-mono down-mix. Pure functions over typed arrays — no canvas, no DOM — so an entire clip's time × frequency grid can be computed and tested headlessly."
    },
    {
      "name": "core-svg-markers",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "SVG Markers",
      "description": "Shared screen-space sizes and round-cap paths for circular SVG markers in stretched plots."
    },
    {
      "name": "core-tine-array-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Tine Array Geometry",
      "description": "The layout of a plucked-tine board as pure maths: the kalimba's centre-out fan and the music box comb's monotonic run, tine lengths from the clamped-free bar's square-root law, and one slot table driving the SVG paths, the hit test and the tip-to-bridge strike reading. No React, no DOM — so the ink and the touch targets cannot drift apart, and the whole thing is testable in Node."
    },
    {
      "name": "core-toggle-headless",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Toggle Headless",
      "description": "The unstyled switch primitive a toggle is built on: controlled and uncontrolled state, the full role=\"switch\" contract, the click and keyboard paths, and the pressed flag every hardware-style face needs. Renders no appearance — a render prop hands your face the state."
    },
    {
      "name": "core-toggle-switch",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Toggle Switch",
      "description": "On-off in three looks: a sliding rocker, a round stomp footswitch with a status LED, or a vertical hardware lever in a recessed metal slot."
    },
    {
      "name": "core-tonal-center",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Tonal Center",
      "description": "Two tonic models as pure functions. Krumhansl-Schmuckler correlates a 12-bin pitch-class histogram against all 24 rotated major/minor profiles to name the key, then interpolates toward the runner-up so an ambiguous passage lands BETWEEN two keys on the circle of fifths rather than snapping to one. The consonance model instead scores each candidate root by how consonant the histogram sounds above it — mode-blind, but it needs no trained profile and works on material the KS profiles have nothing to say about."
    },
    {
      "name": "core-transfer-curve",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Transfer Curve",
      "description": "What a waveshaper does to a sample, drawn: input amplitude across, output up, and the gap to the identity diagonal is the distortion at true scale. A staircase treatment draws a quantiser's real decision boundaries rather than faking diagonals through them, an optional bar row names which harmonics a Chebyshev order produces, and a live overlay brightens the stretch of the curve the signal is currently exercising."
    },
    {
      "name": "core-transport-controls",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Transport Controls",
      "description": "The transport bar, composed rather than reinvented: play, stop, loop and an optional record built from glow-button's toggle and momentary modes, a monospace tempo readout you drag, wheel, arrow or double-click to reset, a tap-tempo key that keeps only timestamps, and a segmented note-division picker printing the current division's length and rate at the current tempo. The beat indicator pulses from a phase or beat prop and nothing else — the host owns the clock — and every control independently becomes a lamp when its callback is absent, so with no callbacks at all it is a status display. The tempo readout has a second face: `tempoDisplay=\"segment\"` puts the seven-segment display off a drum machine's front panel behind the same drag, wheel and arrow keys."
    },
    {
      "name": "core-triangle-pad",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Triangle Pad",
      "description": "A ternary control surface driven by two normalised inputs. The default apex/base formula uses Y for distance from A and X to balance B against C. An alternate formula maps 00, 01 and 10 to the corners and 0.5,0.5 to the equal blend. Both report the same post-computed three-corner weights."
    },
    {
      "name": "core-use-audio-input-devices",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useAudioInputDevices",
      "description": "Audio device permission, enumeration, selection and capture in one controller. `enable()` is the whole flow in one call — ask permission, enumerate, resolve the device, open the stream — so a microphone can be one tap anywhere. Permission is modelled explicitly (unknown / prompt / granted / denied / unavailable) instead of inferred from failure, output sinks are feature-detected, and the remembered choice is restored without ever prompting on load."
    },
    {
      "name": "core-use-audio-source",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useAudioSource",
      "description": "The input contract every audio-fed display shares — an AnalyserNode or a getData callback — plus a HiDPI canvas draw loop that pauses when the tab is hidden and re-measures rather than trusting the first frame's geometry."
    },
    {
      "name": "core-use-control",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useControl",
      "description": "The interaction core: controlled/uncontrolled value state, pointer-capture dragging, and keyboard stepping with fine and coarse passes."
    },
    {
      "name": "core-use-first-interaction",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useFirstInteraction",
      "description": "Reports the first user gesture on a control, synchronously inside the event — the hook for resuming a suspended AudioContext, which browsers only allow from a user-activated handler."
    },
    {
      "name": "core-use-knob-keyboard",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useKnobKeyboardControls",
      "description": "Arrow, Page and Home/End handling for a knob, with step sizes induced from the range so any control is ~100 presses end to end, and Shift for a fine pass."
    },
    {
      "name": "core-use-midi-access",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useMidiAccess",
      "description": "The Web MIDI permission gate: request access from a user gesture, then track connected input and output ports through hotplug. Reports serialisable port descriptions rather than live MIDIPort objects."
    },
    {
      "name": "core-use-midi-activity",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useMidiActivity",
      "description": "Coalesce a MIDI stream into one row per control instead of one row per message: a CC sweep updates a single row with a value history, and a note-on/note-off pair becomes one row that toggles held. Rows publish on an interval so a controller cannot outrun React."
    },
    {
      "name": "core-use-midi-inputs",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useMidiInputs",
      "description": "Subscribe to several MIDI inputs at once and merge them into one message stream. Messages dispatch immediately; per-device activity is batch-flushed so a CC sweep can drive an indicator without re-rendering on every message."
    },
    {
      "name": "core-use-note-swipe-area",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useNoteSwipeArea",
      "description": "A reusable press-and-glide lifecycle for hit-tested note surfaces such as kalimbas and harps. The SDK owns the framework-free gesture state machine while this hook supplies browser pointer wiring and each instrument supplies its own zone geometry."
    },
    {
      "name": "core-use-note-trigger-area",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useNoteTriggerArea",
      "description": "A complete press-and-release lifecycle for playable pads, keys and drum zones. Pointer Events cover mouse, pen and touch; pointer capture, window fallbacks, cancellation, focus loss, visibility changes, disabling and unmount all converge on exactly one release, with matching Enter and Space keyboard behavior."
    },
    {
      "name": "core-use-surface-pointer",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useSurfacePointer",
      "description": "Absolute pointer tracking for surface controls: pressing anywhere on a track jumps the head there and keeps dragging from that spot, with pointer capture and window-level release fallbacks."
    },
    {
      "name": "core-use-wheel",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useWheel",
      "description": "Wheel support that actually stops the page scrolling — a non-passive listener — plus the transient \"is the user scrolling right now\" flag that drives fade-in styling."
    },
    {
      "name": "core-vocoder-panel",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Vocoder Panel",
      "description": "A controlled channel-vocoder panel with paired analysis and carrier filter banks, logarithmic frequency guides, grouped range, envelope and output controls, and optional live spectra. Includes a pure band-map model for tests and server rendering."
    },
    {
      "name": "core-waveform-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Waveform Selector",
      "description": "A compact waveform readout that opens a visual, keyboard-navigable popover instead of spending panel width on segmented facets. Includes a hook for integer DSP enum params."
    },
    {
      "name": "core-waveforms",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Waveforms",
      "description": "Canonical oscillator and LFO waveform ids, aliases, enum adapters, and deterministic periodic-wave maths."
    },
    {
      "name": "core-waveshaper-math",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Waveshaper Math",
      "description": "The transfer functions distortion stages actually run, as pure maths: the soft-clip saturator, both shipped bitcrush grids, the Chebyshev polynomial recurrence, an electric-piano pickup curve whose distance and alignment set how hard it bends and which harmonics it makes, a harmonic-weight solver measured off the curve itself, an exact staircase sampler for quantisers, and a linear in/out amplitude axis with forward and inverse mappings. No React, no DOM — testable in Node and safe to draw with on the server."
    },
    {
      "name": "core-xy-pad",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "XY Pad",
      "description": "A two-dimensional drag surface with a grid, crosshair and a glowing dot that leaves a short trail. Two independent value outputs, each with its own range."
    },
    {
      "name": "core-xy-pad-headless",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "XY Pad Headless",
      "description": "The unstyled plane primitive an XY pad is built on: absolute pointer positioning on both axes, the y-axis inversion screen coordinates make easy to get backwards, and keyboard stepping where the plain arrow is coarse and Shift is fine. Renders no appearance — a render prop hands your face the drag state."
    },
    {
      "name": "core-plane-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Plane Geometry",
      "description": "The conventions every two-dimensional surface shares, as pure maths: pointer to plane fractions with y read bottom-up, the keyboard step where the plain arrow is coarse and Shift is fine, clamping to a point's own limits and snapping to the axis step, directions in degrees (0 along +x, counter-clockwise) that wrap on a full turn, first-order polar patterns from omni to figure-8, nearest-point picking within a radius, and grid lines by spacing or divisions. XYPadHeadless and PlanPad both read it, so one point and N points cannot disagree."
    },
    {
      "name": "core-plan-pad",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Plan Pad",
      "description": "N labelled points on a scaled top-down plane: a source and microphones in a room, speakers round a listener. The plane keeps the caller's width × depth aspect, each point is bound to two values with optional height (on an elevation strip) and heading (a polar glyph with a rotate handle), and values are clamped to per-point limits and snapped to the axis step. Pointer capture, grab without a jump, nearest-point picking for near misses; every point, handle and elevation marker is a keyboard slider on the XY pad's coarse/fine convention. Edits arrive as per-field patches bracketed by one end per gesture, which planPadParamHandlers binds to parameter paths for a module face. Underlay and overlay slots draw in world units for walls, image sources or anything else."
    },
    {
      "name": "core-use-diagnostic-session",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useDiagnosticSession",
      "description": "React bindings for the SDK's DiagnosticSession: useSyncExternalStore over the session's own snapshot/subscribe pair, ownership tied to the component's lifetime, and scope readers that adapt session.readScope to the getData contract the kit's scopes already take. Scope frames deliberately never enter the snapshot — a 512-sample buffer per tap per frame is exactly the allocation a UI must not diff — so they are read into caller-owned buffers inside the draw loop instead."
    },
    {
      "name": "core-diagnostic-panel",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Diagnostic Panel",
      "description": "The eleven-tab developer view of a running plugin: Overview, Host, Transport/Clock, MIDI, Audio, Parameters, Presets/State, Events, Stimulus, Performance and Package. Controlled and presentational — it takes a DiagnosticSession and its snapshot and renders them, owning no bridge and opening no feed, so it embeds equally in a drawer, a dev-runner pane or a docs page. Its one editorial rule is that every value either comes from the snapshot or renders as an explicit Unreported cell: there is no `?? 0` anywhere, because a host that never reported its latency is not a host with zero latency, and a meter frame that never arrived is not silence. The stereo verdict consults per-channel RMS before correlation for the same reason — a silent pair correlates at exactly 1.0, and would otherwise be reported as perfect mono. The Overview leads with a status strip whose health verdict overrides a host's own claim when the feeds it promised have gone silent, because a dead feed is a broken host bridge however healthy the DSP says it is; Copy report puts a ten-line plain-text summary on the clipboard ahead of the JSON, because that is what gets pasted into chat. Nothing costs a frame while the panel is closed: the four canvas viewers share one animation frame that is never scheduled unless the Audio tab is visible, each tab is memoised over the slice of the snapshot it reads, and tables past 200 rows render only the band you can see."
    },
    {
      "name": "core-diagnostic-overlay",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Diagnostic Overlay",
      "description": "How a developer actually reaches the diagnostic panel: right-click the face, or press Ctrl/Cmd+Shift+D. It owns everything the panel deliberately does not — whether the panel may be shown at all, the context menu (Open diagnostics / Copy runtime report / Reset counters), the resizable drawer docked right or bottom, the per-viewer tab and placement preferences, and the session's open/close lifecycle, so a closed panel costs nothing on the audio thread. The drawer is portalled into the face surface and absolutely positioned, so opening it never reflows the face. Right-clicks on text-editing islands, on module-owned [data-context-menu=\"browser\"] targets and inside nested module context menus keep their own menu."
    },
    {
      "name": "core-beat-clock",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useBeatClock",
      "description": "Where a tempo-synced face's playhead is, and — just as important — whose clock that position came from. A host transport that is PLAYING drives the phase from its ppqPosition, so the window tiles from the project start and the same musical position always draws at the same x; anything else free-runs from a bpm on a requestAnimationFrame loop, and `running: false` parks at phase 0 rather than drifting. The returned `source` is \"host\" | \"free\" | \"stopped\" precisely so a caption can say which, instead of implying a sync the face does not have. The phase mappings, the source rule and the tempo fallback are pure exported functions, pinned in Node; the hook is only the loop around them, and nothing touches requestAnimationFrame outside an effect, so the first render is phase 0 on the server."
    },
    {
      "name": "core-beat-grid-geometry",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Beat Grid Geometry",
      "description": "The layout for a bars-across, dB-DOWN plot, as pure maths: beat and seconds-at-a-tempo mappings across the time axis, bar/beat/subdivision tick enumerations, a one-sided dB axis with 0 dB pinned at the top and reduction drawn downward, gutter labels that print the axis floor as -∞ rather than a number, and a clamped ceiling line for a hard budget. The x axis is piano-roll-geometry's — built on the same createLaneLayout and pinned against it in the tests — so a beat grid, a drum lane and a piano roll place beat 3 at the same fraction of their plot. The dB axis is restated rather than reused because response-geometry's is a symmetric ±range around a centred zero, which is the right shape for a filter curve and the wrong one for gain reduction. No React, no DOM — testable in Node and safe to lay out on the server."
    },
    {
      "name": "core-beat-grid-scope",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Beat Grid Scope",
      "description": "A dynamics scope's chrome: a bars-across grid with bar lines heavier than beats and an optional sixteenth grid, a dB gutter reading downward from 0, a dashed hard-ceiling line with its own label (dashed because a budget is a limit, not a measurement), a playhead, and beneath the plot a strip of event lanes drawn as onset ticks at their exact beat — so a swung event visibly sits off its gridline — sharing the plot's own xForBeat, with the playhead continuing through them. It draws no signal itself: `children` is a render function handed the resolved layout, so a prediction envelope, a measured overlay and a waveform all live in the SAME coordinate space as the grid and cannot disagree about where a beat is. The playhead is either given as a phase (null draws none, which is the right picture for a stopped transport) or derived from a host transport through useBeatClock, whose source is reported back so the caption can distinguish host-locked from free-running. SVG, no measurement, renders on the server."
    },
    {
      "name": "core-status-chip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Status Chip",
      "description": "The LED-style chip a face uses to say what a facility is doing — AUDITION lit, HOST SYNC off, LIVE — in five states that stay tellable apart. The distinction it exists for is off (present, not engaged: label fully readable, lamp dark) versus dim (not available in this host at all: the whole chip recedes), because drawing \"no telemetry from this host\" the same as \"telemetry switched off\" tells the user something false about their session. warn is the second accent — on, but not the state you asked for — and live is the only one that pulses. Presentational and stateless: the host decides which state is true. data-status-chip and data-state let a face's render test assert on the state without matching on copy."
    },
    {
      "name": "core-value-readout",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Value Readout",
      "description": "A caption over a big tabular-monospace number, with its unit beside it and an optional qualifier underneath — the REDUCTION / −14.0 dB element every meter-bearing face grows, made once. Tabular figures so a live value does not reflow as its digits change; the unit as a separate muted element so the eye reads the magnitude first; and, crucially, a missing value prints an em dash rather than a zero, because a meter with no source showing 0.0 dB claims a measurement it never received. A real zero still prints as zero — that negative case is pinned. The note line is where \"predicted\", \"reference pattern\" or \"no tap from this host\" goes, and an accent recolours the value alone, never a placeholder."
    },
    {
      "name": "core-note-range-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Note Range Selector",
      "description": "A bounded piano range with named notes, gesture commits and an optional instrument-default reset."
    },
    {
      "name": "core-range-slider",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Range Slider",
      "description": "Two thumbs on one track for a span such as a note range, on Base UI's Slider. Controlled and told which thumb moved; labels point outward from their thumbs so they cannot collide, and the same formatter feeds aria-valuetext. Thumb hit areas are at least the sm control height (24px, 44 on touch). With keyboard the 24px piano strip is the track: one equal column per note, bar thumbs drawn on it, labels inline beside them, the range tinted with the value fill, pressing a key moves the nearer thumb, Shift+arrow jumps an octave."
    },
    {
      "name": "core-weight-bars",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Weight Bars",
      "description": "An editable bar chart, such as a pitch-class histogram: twelve bars labelled C to B over a row coloured like piano keys, with the scale's notes highlighted and the tonic accented. Each bar is a vertical Base UI slider, so it is a native range input named by its label with arrows, Page Up/Down, Home and End. The pointer paints across bars: press to set the bar under it, drag sideways to set every bar crossed along a straight line, so a fast stroke leaves no gaps. Values draw clamped to the bar but an edit only rewrites the bars it touched, and a stroke commits once for one undo step. The pointer reading, the stroke and the colouring sit in a pure core beside it."
    },
    {
      "name": "core-console-styles",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Console Styles",
      "description": "The interaction states of the compact console controls as one small stylesheet, rendered through ConsoleStyles, which React 19 hoists into the document head and dedupes: hover washes, focus rings, pressed segments with a 3:1 edge, seed-slot actions revealed on hover or focus (always on touch), the mode menu rows, the active tab, with every transition behind prefers-reduced-motion. Also the control heights (sm 24, md 28, lg 32) read through --uikit-control-h-sm|md|lg via consoleHeight(), the value fill token (--uikit-value) and a visually-hidden style."
    },
    {
      "name": "core-overlay-container",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Overlay Container",
      "description": "Where a menu or popover opened from a control should be portaled: the fullscreen element while the control is inside browser fullscreen, and its own document's body otherwise. A popup appended to the body is invisible while another element is fullscreen, so every kit overlay picks its container through this one helper as it opens."
    },
    {
      "name": "core-segmented-control",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Segmented Control",
      "description": "One choice out of a few as a pill track of pressed-or-not buttons on Base UI's ToggleGroup and Toggle (roving arrow keys, aria-pressed). Selection never empties; pressing the pressed option reports onReselect. The pressed option has a fill and an edge at least 3:1 against the track. sm/md/lg heights (md 28px by default) through the control-height variables, per-option tooltips and names, and a wrapping layout."
    },
    {
      "name": "core-number-field",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Number Field",
      "description": "A compact numeric input on Base UI's NumberField with optional steppers and an optional Base UI Slider sharing its draft. One onValueCommitted per gesture (Enter, Cmd/Ctrl+Enter committed before any enclosing shortcut sees the key, blur, a stepper, a slider release, an arrow key), clamped or null when cleared; Escape reverts a pending draft and stops there. layout=\"row\" is one 28px inspector line (flexible slider, 44px value); ghostValue draws a default as a tick where an unset thumb parks. Heights through the control-height variables. The draft and commit rules sit in a pure core beside it."
    },
    {
      "name": "core-seed-slots",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Seed Slots",
      "description": "A list of random seeds as content-sized chips: a number field, a die and a remove button that show on hover or focus (always on touch). Stable keys across removes and adds (or the consumer's keys), focus to the previous slot after a remove, renamable labels (slot, die, remove, randomize all), refusals that disable with a reason, and the add and Randomize all actions either inline or as a SeedSlotsActions part of 24px icon buttons for a row header. The consumer owns the randomness."
    },
    {
      "name": "core-rhythm-step-grid",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Rhythm Step Grid",
      "description": "One cycle of a rhythm as a row of steps (a note's first step in the value fill, held steps tinted, rests with an edge at least 3:1 against the card), each note one bar, a stronger edge on every beat. Click a step to add or remove a note, drag a note to set its end (committed on release, a lost pointer capture or a release outside), or Shift+arrow on it; a roving Tab stop moves with the arrows, Home and End. One commit per edit; a refused edit is announced in a status line. The row maths sit in a pure core beside it."
    },
    {
      "name": "core-scale-picker",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Scale Picker",
      "description": "A key as a tonic and a mode: twelve tonic buttons coloured like piano keys on a Base UI ToggleGroup (arrow keys, aria-pressed, never cleared by a second press, at least 24px square, the tonic filled with the value colour), and a Base UI Select of grouped modes named by its visible label and read with its value, portaled fullscreen-safe with the face's theme. Refused tonics are disabled with their reason; both values may be unset with a placeholder; renamable labels; one row of twelve or two of six."
    },
    {
      "name": "core-panel-tabs",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Panel Tabs",
      "description": "Compact underline tabs for a side panel on Base UI's Tabs, generic over the tab values: a root, a list built from tab items and the panels, with tablist roles, aria-selected and arrow, Home and End navigation. sm/md/lg heights (24px default), a sliding indicator (instant under reduced motion), a badge dot read as \"Label (new)\", and onTabClick on the root or a list that hears every click, the selected tab's included."
    },
    {
      "name": "core-resize-handle",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Resize Handle",
      "description": "The splitter between two stacked or side-by-side panes, controlling one pane's size in pixels as a focusable separator with aria-valuenow. Drag with pointer capture (live onValueChange, one onValueCommitted on release or a lost capture), step it with the arrow keys, Shift or Page Up/Down for a large step, Home and End for the bounds, and collapse or restore the pane with Enter or a double-click. The key and drag maths sit in a pure core beside it."
    },
    {
      "name": "core-use-element-size",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useElementSize",
      "description": "An element's layout size, kept current while it is mounted, through a callback ref. It reads layout sizes (offsetWidth before the first paint, then the ResizeObserver's borderBoxSize), never getBoundingClientRect, so a face inside a zoomed canvas does not flip layouts as the canvas zooms; it observes and disconnects symmetrically with the element, so an effect replay cannot leave it unobserved."
    },
    {
      "name": "core-use-persistent-state",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "usePersistentState",
      "description": "A viewer preference in localStorage, read synchronously through useSyncExternalStore so the first paint already uses it, written in the setter rather than inside a React updater, shared by every instance using the same key (in-document listeners and the storage event), and kept in memory when storage throws. The consumer's parse owns validation."
    },
    {
      "name": "core-use-fullscreen",
      "meta": {
        "collection": "core"
      },
      "type": "registry:hook",
      "title": "useFullscreen",
      "description": "Whether an element can go full screen, whether it is, and a toggle: reads the element's own document (a face may run in a frame), follows fullscreenchange so Escape is reflected, and swallows a denied request's rejection. Server-safe."
    },
    {
      "name": "core-playback-clock",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Playback Clock",
      "description": "Where a playing timeline is now, as a tiny external store outside React: playbackPositionAt for the maths, createPlaybackClock advancing on requestAnimationFrame only while subscribed and the document is visible (and stopping at the end of a timeline that does not loop), usePlaybackClock to keep one clock per timeline, and usePlaybackPosition for the one leaf that draws a playhead. Code that writes to a non-React view subscribes directly, so playback never re-renders a face."
    },
    {
      "name": "core-scene-shell",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Scene Shell",
      "description": "The reusable part of an interactive three.js face scene: a WebGL renderer with an unavailable path, resize and on-screen tracking, a 30 fps draw loop that pauses when hidden, tap-to-pick versus drag over named objects, context-loss handling and full disposal, plus DOM label placement over world positions. The scene owns its content and parameters; sound stays with the host's Processor."
    },
    {
      "name": "core-console-icons",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Console Icons",
      "description": "The small stroked glyphs the console controls and module faces share (transport, disclosure, add and remove, dice, menus, help, mute and solo) as one ConsoleIcon component on a 16-unit grid, drawn in currentColor and aria-hidden, so a die in a seed slot and a die in a face header are the same die."
    },
    {
      "name": "core-timeline-roll",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Timeline Roll",
      "description": "A read-only multitrack piano roll of a prepared timeline: ruler with cycle numbers, a section strip, pitched rows and a compact drum strip with General MIDI names. Sized by CSS (SVG paths stretched with preserveAspectRatio none, HTML labels in percent, no height prop); fit view samples to a note cap, detail view scrolls at 72px per cycle, culls to the viewport and follows the playhead unless the reader just scrolled or prefers reduced motion. The playhead is a leaf on a PlaybackClock moved by transform, so playback never re-renders the notes. Stale state dims it and says 'previous'. TimelineRollLegend adds swatches, mute/solo toggles (aria-pressed, 24px, Alt-click solo), channel numbers below 480px and an actions slot. Track colours are --uikit-track-1..8, starting at blue. Pure core beside it."
    },
    {
      "name": "core-console-button",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Console Button",
      "description": "The plain buttons of a console face on Base UI's Button and Toggle: ConsoleButton (text with an optional console icon), ConsoleIconButton (a square icon-only button named by its label, which is also its tooltip) and ConsoleToggle (aria-pressed on/off with an accent border when pressed). Three heights read from the face's --uikit-control-h-sm|md|lg variables (24, 28, 32px by default, 44px on a touch face), four variants (ghost, outline, primary, subtle), an optional ConsoleTooltip with a shortcut, and focusableWhenDisabled so a busy or refused button keeps focus with aria-disabled. Hover, focus and pressed colours come from its own hoisted stylesheet, with transitions only under prefers-reduced-motion: no-preference."
    },
    {
      "name": "core-console-tooltip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Console Tooltip",
      "description": "A short visual label for a console control on Base UI's Tooltip, opening after a short hover delay and at once on keyboard focus, closing on Escape, blur or pointer leave. The child element itself is the trigger through Base UI's render prop, so it wraps any button without an extra element. The popup portals into the fullscreen element while a face is in browser fullscreen, carries the face's theme variables and an optional shortcut, stacks at --uikit-z-overlay, and fades only when motion is allowed."
    },
    {
      "name": "core-info-tip",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Info Tip",
      "description": "An (i) console icon button that opens help on Base UI's Popover, so touch, keyboard and screen-reader users can reach it: a click, a tap, Enter or Space opens a dialog named by the label and described by the help, focus moves in, and Escape or an outside press closes it and returns focus to the button. The button sits at the console control height, the popup portals into the fullscreen element in browser fullscreen, and InfoTipContent spaces rich help (paragraphs, lists, code, keys)."
    },
    {
      "name": "core-console-switch",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Console Switch",
      "description": "An on/off switch sized for a console row on Base UI's Switch (role switch, aria-checked, a hidden form input, Space and Enter toggle it): a control-height hit area around a 28 by 16px track, outlined and muted when off, filled with the accent when on, with no true/false text. focusableWhenDisabled keeps a refused switch in the tab order with aria-disabled. Colours from its own hoisted stylesheet, motion only under prefers-reduced-motion: no-preference."
    },
    {
      "name": "core-toggle-lane",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Toggle Lane",
      "description": "A row of on/off cells for choosing several values from a range, such as the notes of a chord on a keyboard strip or the semitones of a set, on Base UI's ToggleGroup with multiple selection: one Tab stop, arrow keys, Home and End to move, Space or Enter to toggle, aria-pressed and a label on every cell. Cells are at least 24px wide and as wide as the face's small control height (44px on a touch face), black keys follow the accidental pitch classes unless told otherwise, markers under cells start groups, on cells use the neutral --uikit-value colour, and the lane scrolls sideways when it overflows. The selection maths sits in a pure core beside it."
    },
    {
      "name": "core-audio-clip-waveform",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Audio clip waveform geometry",
      "description": "Pure peak decoding and waveform geometry."
    },
    {
      "name": "core-audio-clip-player",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Audio Clip Player",
      "description": "Host-controlled play/pause, seekable waveform and time display."
    },
    {
      "name": "core-midi-playback",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "MIDI Playback",
      "description": "Shared MIDI playback panel extracted from Code Sequencer: timeline, stable colored tracks, host mute/solo callbacks, fit or following scroll view, export and drag actions. The host owns scheduling and MIDI file encoding."
    },
    {
      "name": "core-use-midi-file-export",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "MIDI File Export",
      "description": "Reusable click/drag lifecycle with injected MIDI encoder and platform download/drag adapters. Cleans up drag resources on replacement and unmount."
    },
    {
      "name": "core-music-theory-pitch-class",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Pitch Class",
      "description": "Canonical pitch names and MIDI pitch helpers, delivered from the music-theory owner for standalone UI controls."
    },
    {
      "name": "example-signal-synth",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Signal Synth",
      "description": "Complete Tailwind instrument face: mixed-size knobs, rank faders, switches, LCD, editable filter, envelope and modulation window. Silent UI assembly."
    },
    {
      "name": "example-pressure-compressor",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Pressure Compressor",
      "description": "Tailwind dynamics face with a linked transfer curve and output fader. Silent UI assembly."
    },
    {
      "name": "core-dropdown-menu",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Dropdown and Ellipsis Menu",
      "description": "Portable shadcn/Base UI dropdown menu primitives and a standard EllipsisMenu trigger. Shares selector popup styling, keyboard navigation, focus return, collision bounds and document/fullscreen-aware portals. Compose radio, checkbox, action and submenu items; use ActionMenu for data-driven action lists."
    },
    {
      "name": "core-popover",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Popover",
      "description": "Portable Base UI popovers with overridable collision avoidance, available-space sizing and document/fullscreen-aware portals."
    },
    {
      "name": "core-shadcn-utils",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Shadcn Utils",
      "description": "Shared class composition for portable shadcn controls."
    },
    {
      "name": "core-staff-notation-layout",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Staff Notation Layout",
      "description": "Pure measure-preserving score row layout for responsive staff notation."
    },
    {
      "name": "core-staff-notation",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Staff Notation",
      "description": "Portable SVG music engraving with spelled notes, rests, chords, beams, dots, triplets, ties and producer-supplied playback colors."
    },
    {
      "name": "core-portable-styles",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Portable Styles",
      "description": "Canonical stylesheet for stylesheet-isolated module controls."
    },
    {
      "name": "core-music-theory-pitch-class-profile",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Pitch Class Profile",
      "description": "Canonical pitch-class profile normalization, delivered from music-theory for standalone tonal analysis."
    },
    {
      "name": "core-microphone-patterns",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Microphone Patterns",
      "description": "First-order microphone pattern IDs, numeric enum adapters and unit polar diagram geometry."
    },
    {
      "name": "core-microphone-pattern-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Microphone Pattern Selector",
      "description": "A compact polar-pattern readout opening five visual cards with responsive grid navigation and portable theme inheritance."
    },
    {
      "name": "core-microphone-arrangement-selector",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Microphone Arrangement Selector",
      "description": "Mono, spaced pair, XY and ORTF diagrams in a compact visual card selector, sharing microphone pattern grid behavior."
    },
    {
      "name": "gallery-knob-gallery-core",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Knob Gallery Core",
      "description": "Shared Knob presets, pure artwork exports and scoped motion CSS for custom knob designs."
    },
    {
      "name": "gallery-knob-gallery-machined",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Machined Knob Kit",
      "description": "Eight custom Canvas knob surfaces with a shared analytic lighting renderer."
    },
    {
      "name": "gallery-knob-gallery-playful",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Playful Knob Kit",
      "description": "Eight authored SVG knob surfaces: pearl, candy, glass, jelly and playful geometry."
    },
    {
      "name": "gallery-knob-gallery-graphic",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Graphic Knob Kit",
      "description": "Eight authored vector knob designs with distinct marker, scale and body geometry."
    },
    {
      "name": "gallery-knob-gallery-focused",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Material Study Knob Kit",
      "description": "Eighteen white-plastic, pearl and porcelain profiles using the shared machined renderer."
    },
    {
      "name": "gallery-knob-gallery",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Complete Knob Gallery",
      "description": "All authored custom knob studies and their shared headless wrapper. Silent visual source, with no product DSP or assets."
    },
    {
      "name": "gallery-machined-pearl-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedPearlKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-alloy-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedAlloyKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-fluted-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedFlutedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-rubber-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedRubberKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-porcelain-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedPorcelainKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-brass-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedBrassKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-chrome-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedChromeKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-machined-stepped-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "MachinedSteppedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-candy-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulCandyKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-pearl-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulPearlKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-flower-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulFlowerKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-jelly-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulJellyKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-lens-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulLensKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-dent-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulDentKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-spark-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulSparkKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-playful-acrylic-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PlayfulAcrylicKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-encoder-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicEncoderKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-orbit-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicOrbitKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-engraved-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicEngravedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-faceted-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicFacetedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-ceramic-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicCeramicKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-radar-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicRadarKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-number-wheel-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicNumberWheelKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-graphic-recessed-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GraphicRecessedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-milk-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripMilkKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-marshmallow-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripMarshmallowKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-frost-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripFrostKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-ivory-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripIvoryKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-ribbed-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripRibbedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-grip-quiet-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "GripQuietKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-cloud-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlCloudKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-glaze-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlGlazeKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-opal-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlOpalKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-thumb-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlThumbKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-lens-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlLensKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-pearl-balloon-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "PearlBalloonKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-chalk-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerChalkKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-glazed-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerGlazedKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-rolled-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerRolledKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-thumb-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerThumbKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-low-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerLowKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-saucer-ivory-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "SaucerIvoryKnob",
      "description": "A directly importable custom knob design using shared headless interaction and its authored artwork."
    },
    {
      "name": "gallery-knob-gallery-contrast",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Contrast Dial Kit",
      "description": "Two minimal monochrome SVG dials: a solid disc with a cut-in notch and an outlined circle with a matching inward pointer."
    },
    {
      "name": "gallery-contrast-filled-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Contrast filled dial",
      "description": "An independently importable minimal SVG dial using shared headless interaction and section-scoped accent colors."
    },
    {
      "name": "gallery-contrast-outline-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Contrast outline dial",
      "description": "An independently importable minimal SVG dial using shared headless interaction and section-scoped accent colors."
    },
    {
      "name": "example-rainbow-reverb",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Rainbow Reverb",
      "description": "A silent reverb template with two minimal dials and section-scoped colors following a slowly cycling master hue."
    },
    {
      "name": "gallery-sculpted-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Sculpted control styles",
      "description": "Scoped porcelain surfaces, opaque raised caps, inset rails and directional light shared by the Sculpted controls."
    },
    {
      "name": "gallery-sculpted-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Sculpted Knob",
      "description": "A porcelain dial with stationary directional shadows, inset rotating marker, dot scale and optional raised pedestal."
    },
    {
      "name": "gallery-sculpted-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Sculpted Fader",
      "description": "An opaque raised capsule cap over inset rails, with vertical and horizontal layouts and optional meter decoration."
    },
    {
      "name": "gallery-sculpted-toggle",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Sculpted Toggle",
      "description": "A tiny raised white switch cap with a recessed track and shared keyboard behavior."
    },
    {
      "name": "gallery-sculpted-selector",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Sculpted Selector",
      "description": "A dark luminous character display with custom icon slots, paging buttons and direct choice dots."
    },
    {
      "name": "example-sculpted-console",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Sculpted Console",
      "description": "A silent five-column sculpted console with porcelain knobs, raised faders, luminous character selectors and an illustrative response plot."
    },
    {
      "name": "gallery-spectral-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Spectral control styles",
      "description": "Scoped graphite material, recessed choices and colored spectral geometry."
    },
    {
      "name": "gallery-spectral-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Orbital graphite dial",
      "description": "Reusable controlled graphite knob with scoped material artwork."
    },
    {
      "name": "gallery-spectral-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Spectral band fader",
      "description": "Reusable controlled graphite fader with scoped material artwork."
    },
    {
      "name": "gallery-spectral-selector",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Spectral Selector",
      "description": "Reusable controlled graphite choice with scoped material artwork."
    },
    {
      "name": "gallery-spectral-toggle",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Spectral Toggle",
      "description": "Reusable controlled graphite button with scoped material artwork."
    },
    {
      "name": "example-planar-synth",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Planar Synth",
      "description": "A silent planar instrument interface with neutral knobs, four section accents, interactive filter and exponential ADSR plots, waveform choices and a light/dark switch."
    },
    {
      "name": "example-spectral-console",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Spectral Console",
      "description": "A silent graphite spectral console with four editable spectrum bands, inset characters, orbital master dial, dual meters and filter controls."
    },
    {
      "name": "gallery-console-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Console hardware styles",
      "description": "Shared scoped CSS for molded tempo controls."
    },
    {
      "name": "gallery-indexed-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Indexed Knob",
      "description": "Reusable molded artwork with controlled state and headless input."
    },
    {
      "name": "gallery-capsule-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Capsule Fader",
      "description": "Reusable molded artwork with controlled state and headless input."
    },
    {
      "name": "gallery-panel-toggle",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Panel Toggle",
      "description": "Reusable molded artwork with controlled state and headless input."
    },
    {
      "name": "example-tempo-console",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Tempo Console",
      "description": "A silent molded rhythm console with recessed volume fader, dimpled tempo dial, glossy levels, patterned lamps and power rocker."
    },
    {
      "name": "gallery-graphite-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Graphite material styles",
      "description": "Scoped brushed graphite and machined aluminum artwork."
    },
    {
      "name": "gallery-graphite-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Domed graphite dial",
      "description": "Reusable graphite artwork with controlled state and keyboard interaction."
    },
    {
      "name": "gallery-graphite-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Ridged graphite fader",
      "description": "Reusable graphite artwork with controlled state and keyboard interaction."
    },
    {
      "name": "gallery-graphite-selector",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Graphite Selector",
      "description": "Reusable graphite artwork with controlled state and keyboard interaction."
    },
    {
      "name": "gallery-graphite-toggle",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Machined class switch",
      "description": "Reusable graphite artwork with controlled state and keyboard interaction."
    },
    {
      "name": "example-graphite-compressor",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Graphite Compressor",
      "description": "A silent brushed graphite compressor face with ridged drive fader, domed gain dial, pixel LCD, raised character keys and machined switches."
    },
    {
      "name": "gallery-lavender-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Lavender control styles",
      "description": "Scoped pale porcelain materials."
    },
    {
      "name": "gallery-lavender-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Porcelain scale dial",
      "description": "Reusable pale lavender material with controlled state."
    },
    {
      "name": "gallery-lavender-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Twin pearl fader",
      "description": "Reusable pale lavender material with controlled state."
    },
    {
      "name": "gallery-lavender-button",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Porcelain key",
      "description": "Reusable pale lavender material with controlled state."
    },
    {
      "name": "example-lavender-space",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Lavender Space",
      "description": "A silent pale porcelain space interface with arc dials, pearl faders, local presets and bounded undo/redo."
    },
    {
      "name": "gallery-disc-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Disc control styles",
      "description": "Scoped frosted blue materials and procedural disc artwork."
    },
    {
      "name": "gallery-disc-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Porcelain drive dial",
      "description": "Portable controlled disc console artwork."
    },
    {
      "name": "gallery-disc-selector",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Disc Selector",
      "description": "Portable controlled disc console artwork."
    },
    {
      "name": "gallery-disc-button",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Ivory disc key",
      "description": "Portable controlled disc console artwork."
    },
    {
      "name": "gallery-disc-tray",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Frosted disc tray",
      "description": "Portable controlled disc console artwork."
    },
    {
      "name": "example-disc-drive",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Disc Drive",
      "description": "A silent three-band disc interface with frosted trays, porcelain dials, segmented choices and local presets."
    },
    {
      "name": "gallery-grain-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:component",
      "title": "Grain control styles",
      "description": "Scoped brushed charcoal ring dials and scan/bar rails."
    },
    {
      "name": "gallery-grain-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Compact luminous ring dial",
      "description": "Controlled compact grain artwork with shared gestures."
    },
    {
      "name": "gallery-grain-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Grain Fader",
      "description": "Controlled compact grain artwork with shared gestures."
    },
    {
      "name": "example-grain-console",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Grain Console",
      "description": "A silent brushed charcoal granular interface with editable sample scan, spectrum, ADSR and modulation banks."
    },
    {
      "name": "gallery-obsidian-control-styles",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:component",
      "title": "Obsidian control styles",
      "description": "Scoped concentric dial, rail and glyph key artwork."
    },
    {
      "name": "gallery-obsidian-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Obsidian concentric dial",
      "description": "Controlled portrait console artwork with shared input semantics."
    },
    {
      "name": "gallery-obsidian-fader",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Obsidian Fader",
      "description": "Controlled portrait console artwork with shared input semantics."
    },
    {
      "name": "gallery-obsidian-toggle",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Obsidian Toggle",
      "description": "Controlled portrait console artwork with shared input semantics."
    },
    {
      "name": "example-obsidian-rack",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Obsidian Rack",
      "description": "A silent portrait rack with concentric controls, compact drive banks and illustrative stereo traces."
    },
    {
      "name": "core-toggle",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Toggle",
      "description": "Toggle shared by module faces and application hosts."
    },
    {
      "name": "core-toggle-group",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Toggle Group",
      "description": "Toggle Group shared by module faces and application hosts."
    },
    {
      "name": "core-filter-menu",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Filter Menu",
      "description": "Filter Menu shared by module faces and application hosts."
    },
    {
      "name": "core-use-file-drag",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Prepared File Drag",
      "description": "Prepared File Drag shared by module faces and application hosts."
    },
    {
      "name": "core-file-drag-card",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Audio and MIDI File Drag Card",
      "description": "Audio and MIDI File Drag Card shared by module faces and application hosts."
    },
    {
      "name": "core-audio-clip-wave-layer",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Audio Clip Wave Layer",
      "description": "Audio Clip Wave Layer shared by module faces and application hosts."
    },
    {
      "name": "core-tag-suggestions",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Tag Suggestions",
      "description": "Tag Suggestions shared by module faces and application hosts."
    },
    {
      "name": "core-button",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Button",
      "description": "Canonical shadcn and Base UI button used by portable controls and website aliases."
    },
    {
      "name": "core-parameter-schema",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Parameter Schema",
      "description": "Canonical parameter descriptors, references, validation and taper functions shared by module and standalone controls."
    },
    {
      "name": "core-parameter-values",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Parameter Values",
      "description": "Canonical parameter defaults, resolution, reads and formatting without a host runtime."
    },
    {
      "name": "core-parameter-binding",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Parameter Binding",
      "description": "Typed schema handles, local prototype state and narrow host parameter bindings."
    },
    {
      "name": "core-parameter-controls",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Parameter Controls",
      "description": "Descriptor-bound knobs and faders sharing the standard controlled primitives."
    },
    {
      "name": "core-parameter-select",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Parameter Select",
      "description": "Schema-backed enum selection with Base UI and validated presentation groups."
    },
    {
      "name": "core-select-grid",
      "meta": {
        "collection": "core"
      },
      "type": "registry:lib",
      "title": "Select Grid",
      "description": "Responsive arrow navigation for domain Select grids; Base UI owns selection and other keys."
    },
    {
      "name": "gallery-fluted-knob",
      "meta": {
        "collection": "gallery"
      },
      "type": "registry:ui",
      "title": "Fluted dial",
      "description": "Cobalt or graphite ribbed rim, silver inset and stationary lighting on the shared Knob."
    },
    {
      "name": "example-meteora",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Meteora",
      "description": "A silent landscape echo console with cobalt fluted dials, procedural contour terrain, editable placement and an illustrative echo scope."
    },
    {
      "name": "example-phasecraft",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Phasecraft",
      "description": "A silent grey-panel wavetable reference study with ruby selectors, dual envelopes, harmonic bars and a violet waveform."
    },
    {
      "name": "example-emberwave",
      "meta": {
        "collection": "example"
      },
      "type": "registry:block",
      "title": "Emberwave",
      "description": "A silent early wavetable interface study with a coral waveform, modulation source rail, dual oscillator controls and functional section views."
    },
    {
      "name": "core-select",
      "meta": {
        "collection": "core"
      },
      "type": "registry:ui",
      "title": "Select",
      "description": "Canonical shadcn and Base UI select primitives with shared keyboard selection, focus return and document/fullscreen-aware portals."
    }
  ]
}
