import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import ParamItem from '.' type ParamConfig = { id: string name: string tip: string value: number min: number max: number step: number allowToggle?: boolean } const PARAMS: ParamConfig[] = [ { id: 'temperature', name: 'Temperature', tip: 'Controls randomness. Lower values make the model more deterministic, higher values encourage creativity.', value: 0.7, min: 0, max: 2, step: 0.1, allowToggle: true, }, { id: 'top_p', name: 'Top P', tip: 'Nucleus sampling keeps only the most probable tokens whose cumulative probability exceeds this threshold.', value: 0.9, min: 0, max: 1, step: 0.05, }, { id: 'frequency_penalty', name: 'Frequency Penalty', tip: 'Discourages repeating tokens. Increase to reduce repetition.', value: 0.2, min: 0, max: 1, step: 0.05, }, ] const ParamItemPlayground = () => { const [state, setState] = useState>(() => { return PARAMS.reduce((acc, item) => { acc[item.id] = { value: item.value, enabled: true } return acc }, {} as Record) }) const handleChange = (id: string, value: number) => { setState(prev => ({ ...prev, [id]: { ...prev[id], value: Number.parseFloat(value.toFixed(3)), }, })) } const handleToggle = (id: string, enabled: boolean) => { setState(prev => ({ ...prev, [id]: { ...prev[id], enabled, }, })) } return (
Generation parameters {JSON.stringify(state, null, 0)}
{PARAMS.map(param => ( ))}
) } const meta = { title: 'Base/Data Entry/ParamItem', component: ParamItemPlayground, parameters: { layout: 'centered', docs: { description: { component: 'Slider + numeric input pairing used for model parameter tuning. Supports optional enable toggles per parameter.', }, }, }, tags: ['autodocs'], } satisfies Meta export default meta type Story = StoryObj export const Playground: Story = {}