{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "temperature-slider",
  "title": "AI Temperature Slider",
  "description": "Temperature slider with labeled presets for AI model tuning",
  "dependencies": [],
  "registryDependencies": [
    "slider"
  ],
  "files": [
    {
      "path": "registry/default/blocks/ai/ai-temperature-slider/components/elements/ai-temperature-slider.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nimport { Slider } from \"@/components/ui/slider\";\n\ninterface Preset {\n  value: number;\n  label: string;\n  description: string;\n}\n\nconst DEFAULT_PRESETS: Preset[] = [\n  { value: 0, label: \"Precise\", description: \"Deterministic, focused\" },\n  { value: 0.7, label: \"Balanced\", description: \"Default, versatile\" },\n  { value: 1.0, label: \"Creative\", description: \"More variety\" },\n  { value: 1.5, label: \"Wild\", description: \"Experimental\" },\n];\n\ninterface AiTemperatureSliderProps {\n  value?: number;\n  onValueChange?: (value: number) => void;\n  min?: number;\n  max?: number;\n  step?: number;\n  showPresets?: boolean;\n  presets?: Preset[];\n  className?: string;\n}\n\nexport function AiTemperatureSlider({\n  value,\n  onValueChange,\n  min = 0,\n  max = 2,\n  step = 0.1,\n  showPresets = true,\n  presets = DEFAULT_PRESETS,\n  className,\n}: AiTemperatureSliderProps) {\n  const [internalValue, setInternalValue] = React.useState(value ?? 0.7);\n  const currentValue = value !== undefined ? value : internalValue;\n\n  const handleChange = React.useCallback(\n    (newValue: number[]) => {\n      const val = newValue[0];\n      if (value === undefined) {\n        setInternalValue(val);\n      }\n      onValueChange?.(val);\n    },\n    [value, onValueChange],\n  );\n\n  const handlePresetClick = React.useCallback(\n    (presetValue: number) => {\n      if (value === undefined) {\n        setInternalValue(presetValue);\n      }\n      onValueChange?.(presetValue);\n    },\n    [value, onValueChange],\n  );\n\n  const currentPreset = React.useMemo(\n    () => presets.find((p) => Math.abs(p.value - currentValue) < 0.05),\n    [presets, currentValue],\n  );\n\n  return (\n    <div\n      data-slot=\"ai-temperature-slider\"\n      className={cn(\"w-full space-y-4\", className)}\n    >\n      <div className=\"flex items-center justify-between\">\n        <label className=\"text-sm font-medium\">Temperature</label>\n        <span className=\"font-mono text-sm tabular-nums text-muted-foreground\">\n          {currentValue.toFixed(1)}\n        </span>\n      </div>\n\n      <Slider\n        value={[currentValue]}\n        onValueChange={handleChange}\n        min={min}\n        max={max}\n        step={step}\n        className=\"w-full\"\n      />\n\n      {showPresets && (\n        <div\n          className=\"flex flex-wrap gap-2\"\n          role=\"group\"\n          aria-label=\"Temperature presets\"\n        >\n          {presets.map((preset) => {\n            const isActive = Math.abs(preset.value - currentValue) < 0.05;\n            return (\n              <button\n                key={preset.label}\n                type=\"button\"\n                onClick={() => handlePresetClick(preset.value)}\n                aria-pressed={isActive}\n                aria-label={`${preset.label}: ${preset.description}`}\n                className={cn(\n                  \"rounded-full border px-3 py-1 text-xs transition-colors\",\n                  isActive\n                    ? \"border-primary bg-primary text-primary-foreground\"\n                    : \"border-border hover:border-primary/50 hover:bg-muted\",\n                )}\n              >\n                {preset.label}\n              </button>\n            );\n          })}\n        </div>\n      )}\n\n      {currentPreset && (\n        <p className=\"text-xs text-muted-foreground\">\n          {currentPreset.description}\n        </p>\n      )}\n    </div>\n  );\n}\n\nexport type { AiTemperatureSliderProps, Preset };\n",
      "type": "registry:component"
    }
  ],
  "docs": "Range 0-2 with presets: Precise (0), Balanced (0.7), Creative (1.0), Wild (1.5).",
  "categories": [
    "ai"
  ],
  "type": "registry:ui"
}