import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { type ChangeEvent, useCallback, useState } from 'react'; import { Input } from './input'; /** * Input - Storybook Meta */ export default { title: 'Atoms/Forms/Fields', component: Input, args: { isDisabled: false, isRequired: false, }, argTypes: { 'aria-labelledby': { control: { type: 'text', }, description: 'One or more ids that refers to the field name.', table: { category: 'Accessibility', }, type: { name: 'string', required: false, }, }, className: { control: { type: 'text', }, description: 'Add classnames to the field.', table: { category: 'Styles', }, type: { name: 'string', required: false, }, }, id: { control: { type: 'text', }, description: 'Input id.', type: { name: 'string', required: true, }, }, isDisabled: { control: { type: 'boolean', }, description: 'Input state: either enabled or disabled.', table: { category: 'Options', defaultValue: { summary: false }, }, type: { name: 'boolean', required: false, }, }, isRequired: { control: { type: 'boolean', }, description: 'Determine if the field is required.', table: { category: 'Options', defaultValue: { summary: false }, }, type: { name: 'boolean', required: false, }, }, max: { control: { type: 'number', }, description: 'Maximum value.', table: { category: 'Options', }, type: { name: 'number', required: false, }, }, min: { control: { type: 'number', }, description: 'Minimum value.', table: { category: 'Options', }, type: { name: 'number', required: false, }, }, name: { control: { type: 'text', }, description: 'Input name.', type: { name: 'string', required: true, }, }, placeholder: { control: { type: 'text', }, description: 'A placeholder value.', table: { category: 'Options', }, type: { name: 'string', required: false, }, }, step: { control: { type: 'number', }, description: 'Input incremental values that are valid.', table: { category: 'Options', }, type: { name: 'number', required: false, }, }, type: { control: { type: 'select', }, description: 'Input type: input type or textarea.', options: [ 'datetime-local', 'email', 'number', 'search', 'tel', 'text', 'textarea', 'time', 'url', ], type: { name: 'string', required: true, }, }, value: { control: { type: null, }, description: 'Input value.', type: { name: 'string', required: true, }, }, }, } as ComponentMeta; const Template: ComponentStory = ({ value: initialValue, onChange: _onChange, ...args }) => { const [value, setValue] = useState(initialValue); const updateValue = useCallback((e: ChangeEvent) => { setValue(e.target.value); }, []); return ; }; /** * Input Story - DateTimeField */ export const DateTimeField = Template.bind({}); DateTimeField.args = { id: 'field-storybook', name: 'field-storybook', type: 'datetime-local', }; /** * Input Story - EmailField */ export const EmailField = Template.bind({}); EmailField.args = { id: 'field-storybook', name: 'field-storybook', type: 'email', }; /** * Input Story - NumericField */ export const NumericField = Template.bind({}); NumericField.args = { id: 'field-storybook', name: 'field-storybook', type: 'number', }; /** * Input Story - TextField */ export const TextField = Template.bind({}); TextField.args = { id: 'field-storybook', name: 'field-storybook', type: 'text', }; /** * Input Story - TimeField */ export const TimeField = Template.bind({}); TimeField.args = { id: 'field-storybook', name: 'field-storybook', type: 'time', };