import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import Slider from '.' const meta = { title: 'Base/Data Entry/Slider', component: Slider, parameters: { layout: 'centered', docs: { description: { component: 'Slider component for selecting a numeric value within a range. Built on react-slider with customizable min/max/step values.', }, }, }, tags: ['autodocs'], argTypes: { value: { control: 'number', description: 'Current slider value', }, min: { control: 'number', description: 'Minimum value (default: 0)', }, max: { control: 'number', description: 'Maximum value (default: 100)', }, step: { control: 'number', description: 'Step increment (default: 1)', }, disabled: { control: 'boolean', description: 'Disabled state', }, }, args: { onChange: (value) => { console.log('Slider value:', value) }, }, } satisfies Meta export default meta type Story = StoryObj // Interactive demo wrapper const SliderDemo = (args: any) => { const [value, setValue] = useState(args.value || 50) return (
{ setValue(v) console.log('Slider value:', v) }} />
Value: {value}
) } // Default state export const Default: Story = { render: args => , args: { value: 50, min: 0, max: 100, step: 1, disabled: false, }, } // With custom range export const CustomRange: Story = { render: args => , args: { value: 25, min: 0, max: 50, step: 1, disabled: false, }, } // With step increment export const WithStepIncrement: Story = { render: args => , args: { value: 50, min: 0, max: 100, step: 10, disabled: false, }, } // Decimal values export const DecimalValues: Story = { render: args => , args: { value: 2.5, min: 0, max: 5, step: 0.5, disabled: false, }, } // Disabled state export const Disabled: Story = { render: args => , args: { value: 75, min: 0, max: 100, step: 1, disabled: true, }, } // Real-world example - Volume control const VolumeControlDemo = () => { const [volume, setVolume] = useState(70) const getVolumeIcon = (vol: number) => { if (vol === 0) return '🔇' if (vol < 33) return '🔈' if (vol < 66) return '🔉' return '🔊' } return (

Volume Control

{getVolumeIcon(volume)}
Mute {volume}% Max
) } export const VolumeControl: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Brightness control const BrightnessControlDemo = () => { const [brightness, setBrightness] = useState(80) return (

Screen Brightness

☀️
Preview at {brightness}% brightness
) } export const BrightnessControl: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Price range filter const PriceRangeFilterDemo = () => { const [maxPrice, setMaxPrice] = useState(500) const minPrice = 0 const products = [ { name: 'Product A', price: 150 }, { name: 'Product B', price: 350 }, { name: 'Product C', price: 600 }, { name: 'Product D', price: 250 }, { name: 'Product E', price: 450 }, ] const filteredProducts = products.filter(p => p.price >= minPrice && p.price <= maxPrice) return (

Filter by Price

Maximum Price ${maxPrice}
Showing {filteredProducts.length} of {products.length} products
{filteredProducts.map(product => (
{product.name} ${product.price}
))}
) } export const PriceRangeFilter: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Temperature selector const TemperatureSelectorDemo = () => { const [temperature, setTemperature] = useState(22) const fahrenheit = ((temperature * 9) / 5 + 32).toFixed(1) return (

Thermostat Control

Celsius
{temperature}°C
Fahrenheit
{fahrenheit}°F
{temperature < 18 && '🥶 Too cold'} {temperature >= 18 && temperature <= 24 && '😊 Comfortable'} {temperature > 24 && '🥵 Too warm'}
) } export const TemperatureSelector: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Progress/completion slider const ProgressSliderDemo = () => { const [progress, setProgress] = useState(65) return (

Project Completion

Progress {progress}%
= 25 ? '✅' : '⏳'}>Planning 25%
= 50 ? '✅' : '⏳'}>Development 50%
= 75 ? '✅' : '⏳'}>Testing 75%
= 100 ? '✅' : '⏳'}>Deployment 100%
) } export const ProgressSlider: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Zoom control const ZoomControlDemo = () => { const [zoom, setZoom] = useState(100) return (

Zoom Level

50% {zoom}% 200%
Preview content
) } export const ZoomControl: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - AI model parameters const AIModelParametersDemo = () => { const [temperature, setTemperature] = useState(0.7) const [maxTokens, setMaxTokens] = useState(2000) const [topP, setTopP] = useState(0.9) return (

Model Configuration

{temperature}

Controls randomness. Lower is more focused, higher is more creative.

{maxTokens}

Maximum length of generated response.

{topP}

Nucleus sampling threshold.

Temperature: {temperature}
Max Tokens: {maxTokens}
Top P: {topP}
) } export const AIModelParameters: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Real-world example - Image quality selector const ImageQualitySelectorDemo = () => { const [quality, setQuality] = useState(80) const getQualityLabel = (q: number) => { if (q < 50) return 'Low' if (q < 70) return 'Medium' if (q < 90) return 'High' return 'Maximum' } const estimatedSize = Math.round((quality / 100) * 5) return (

Image Export Quality

Quality
{getQualityLabel(quality)}
{quality}%
File Size
~{estimatedSize} MB
Estimated
) } export const ImageQualitySelector: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Multiple sliders const MultipleSlidersDemo = () => { const [red, setRed] = useState(128) const [green, setGreen] = useState(128) const [blue, setBlue] = useState(128) const rgbColor = `rgb(${red}, ${green}, ${blue})` return (

RGB Color Picker

{red}
{green}
{blue}
Color Value
{rgbColor}
#{red.toString(16).padStart(2, '0')} {green.toString(16).padStart(2, '0')} {blue.toString(16).padStart(2, '0')}
) } export const MultipleSliders: Story = { render: () => , parameters: { controls: { disable: true } }, } as unknown as Story // Interactive playground export const Playground: Story = { render: args => , args: { value: 50, min: 0, max: 100, step: 1, disabled: false, }, }