import { useState } from 'react'
import type { Meta, StoryObj } from '@storybook/react-vite'
import { expect, userEvent, within } from 'storybook/test'
import { TextField } from './TextField'
const meta = {
title: 'Components/TextField',
component: TextField,
tags: ['autodocs'],
parameters: { layout: 'centered' },
decorators: [
(Story) => (
),
],
argTypes: {
labelPosition: { control: 'select', options: ['ABOVE', 'ADJACENT', 'COLLAPSED', 'JUSTIFIED'] },
align: { control: 'select', options: ['LEFT', 'CENTER', 'RIGHT'] },
},
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
args: {
label: 'Email Address',
placeholder: 'user@example.com',
required: true,
},
render: (args) => {
const [value, setValue] = useState(args.value ?? '')
return
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement)
const input = canvas.getByLabelText(/email address/i)
await expect(input).toBeVisible()
await userEvent.click(input)
await userEvent.type(input, 'test@example.com')
await expect(input).toHaveValue('test@example.com')
},
}
export const WithCharacterLimit: Story = {
args: {
label: 'Phone Number',
instructions: 'Include only dashes and numbers. For example, 555-456-7890.',
value: '555-456-7890-876',
characterLimit: 12,
showCharacterCount: true,
},
render: (args) => {
const [value, setValue] = useState(args.value ?? '')
return
},
}
export const Masked: Story = {
args: {
label: 'Password',
masked: true,
placeholder: 'Enter password',
required: true,
},
render: (args) => {
const [value, setValue] = useState(args.value ?? '')
return
},
}
export const ReadOnly: Story = {
args: {
label: 'Title',
value: 'Expenses could not be submitted',
readOnly: true,
},
}
export const AdjacentLabel: Story = {
args: {
label: 'First Name',
labelPosition: 'ADJACENT',
value: 'John',
},
render: (args) => {
const [value, setValue] = useState(args.value ?? '')
return
},
}
export const RightAligned: Story = {
args: {
label: 'Amount',
value: '$1,234.56',
align: 'RIGHT',
readOnly: true,
},
}
export const WithHelpTooltip: Story = {
args: {
label: 'Username',
instructions: 'Choose a unique username for your account',
helpTooltip:
'Your username must be 3-20 characters long and contain only letters, numbers, and underscores',
placeholder: 'username',
},
render: (args) => {
const [value, setValue] = useState(args.value ?? '')
return
},
}
export const WithValidationError: Story = {
args: {
label: 'Email Address',
placeholder: 'user@example.com',
value: 'invalid-email',
required: true,
},
render: (args) => {
const [email, setEmail] = useState(args.value ?? '')
const validations = email && !email.includes('@')
? ['Please enter a valid email address']
: []
return (
)
},
}