{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "slider",
  "title": "Ninaero slider",
  "dependencies": [
    "@base-ui/react@^1.9.0",
    "cn@^0.4.0"
  ],
  "registryDependencies": [
    "https://ninaero.pages.dev/r/theme.json",
    "https://ninaero.pages.dev/r/sound-provider.json"
  ],
  "files": [
    {
      "path": "registry/ninaero/ui/slider.tsx",
      "content": "\"use client\";\n\nimport { Slider as SliderPrimitive } from \"@base-ui/react/slider\";\nimport { cn } from \"cn\";\n\nimport { useControlSound, HoverSound } from \"./sound-feedback\";\nimport { getSoundPitch } from \"./sound-runtime\";\n\nfunction Slider({\n  className,\n  defaultValue,\n  value,\n  min = 0,\n  max = 100,\n  getAriaLabel,\n  getAriaValueText,\n  variant = \"default\",\n  sound = true,\n  onValueChange,\n  onValueCommitted,\n  ...props\n}: SliderPrimitive.Root.Props &\n  Pick<SliderPrimitive.Thumb.Props, \"getAriaLabel\" | \"getAriaValueText\"> & {\n    sound?: boolean;\n    variant?: \"default\" | \"simple\";\n  }) {\n  const { play } = useControlSound(sound);\n  const currentValue = value ?? defaultValue ?? min;\n  const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n\n  return (\n    <HoverSound sound={sound}>\n      <SliderPrimitive.Root\n        className={cn(\"ninaero-slider data-horizontal:w-full data-vertical:h-full\", className)}\n        data-slot=\"slider\"\n        data-variant={variant}\n        defaultValue={defaultValue}\n        value={value}\n        min={min}\n        max={max}\n        thumbAlignment=\"edge\"\n        {...props}\n        onValueChange={(next, details) => {\n          onValueChange?.(next, details);\n          const changed = typeof next === \"number\" ? next : next[details.activeThumbIndex];\n          if (!details.isCanceled && details.reason !== \"none\" && changed !== undefined) {\n            play(\"tick\", { pitch: getSoundPitch(changed, min, max) });\n          }\n        }}\n        onValueCommitted={(next, details) => {\n          onValueCommitted?.(next, details);\n          if (details.reason !== \"none\") play(\"tap\");\n        }}\n      >\n        <SliderPrimitive.Control className=\"ninaero-slider-control relative flex w-full touch-none items-center select-none data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col\">\n          <SliderPrimitive.Track\n            data-slot=\"slider-track\"\n            className={cn(\n              \"ninaero-slider-track relative grow overflow-hidden rounded-full select-none data-horizontal:w-full data-vertical:h-full\",\n              variant === \"simple\"\n                ? \"data-horizontal:h-1 data-vertical:w-1\"\n                : \"data-horizontal:h-2.5 data-vertical:w-2.5\",\n            )}\n          >\n            <SliderPrimitive.Indicator\n              data-slot=\"slider-range\"\n              className=\"ninaero-slider-range select-none data-horizontal:h-full data-vertical:w-full\"\n            />\n          </SliderPrimitive.Track>\n          {values.map((_, index) => (\n            <SliderPrimitive.Thumb\n              data-slot=\"slider-thumb\"\n              // biome-ignore lint/suspicious/noArrayIndexKey: Thumb identity is positional; value-based keys would remount controls while dragging.\n              key={index}\n              index={index}\n              aria-label={props[\"aria-label\"]}\n              aria-labelledby={getAriaLabel ? undefined : props[\"aria-labelledby\"]}\n              aria-describedby={props[\"aria-describedby\"]}\n              aria-invalid={props[\"aria-invalid\"]}\n              getAriaLabel={getAriaLabel}\n              getAriaValueText={getAriaValueText}\n              className={cn(\n                \"ninaero-slider-thumb relative block shrink-0 rounded-full border select-none after:absolute after:-inset-3\",\n                variant === \"simple\"\n                  ? \"size-3\"\n                  : \"h-5 w-8 before:absolute before:top-1/2 before:left-1/2 before:h-1.5 before:w-2.5 before:-translate-1/2\",\n              )}\n            />\n          ))}\n        </SliderPrimitive.Control>\n      </SliderPrimitive.Root>\n    </HoverSound>\n  );\n}\n\nexport { Slider };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}