import type { Meta, StoryObj } from '@storybook/nextjs-vite'
import { Textarea } from '../components/ui/textarea'
const meta = {
title: 'UI/Textarea',
component: Textarea,
parameters: {
layout: 'padded',
},
tags: ['autodocs'],
argTypes: {
placeholder: {
control: 'text',
description: 'Placeholder text',
},
disabled: {
control: 'boolean',
description: 'Disabled state',
},
invalid: {
control: 'boolean',
description: 'Invalid / error state',
},
rows: {
control: 'number',
description: 'Number of visible text rows',
},
},
decorators: [
(Story) => (
),
],
} satisfies Meta
export default meta
type Story = StoryObj
/**
* Default textarea with placeholder.
*/
export const Default: Story = {
args: {
placeholder: 'Enter description...',
},
}
/**
* Textarea with a pre-filled value.
*/
export const WithValue: Story = {
args: {
defaultValue: 'Comprehensive Linux system backup script supporting full, home, and system configuration backups with automated cleanup.',
},
}
/**
* Disabled textarea.
*/
export const Disabled: Story = {
args: {
placeholder: 'Cannot edit...',
disabled: true,
},
}
/**
* Disabled textarea with value.
*/
export const DisabledWithValue: Story = {
args: {
defaultValue: 'This content is read-only.',
disabled: true,
},
}
/**
* Textarea with custom row count.
*/
export const CustomRows: Story = {
args: {
placeholder: 'Write your notes here...',
rows: 8,
},
}
/**
* Textarea with resize disabled.
*/
export const NoResize: Story = {
args: {
placeholder: 'Fixed height textarea...',
className: '!resize-none',
},
}
/**
* Textarea in invalid/error state.
*/
export const Invalid: Story = {
args: {
placeholder: 'Enter description...',
invalid: true,
},
}
/**
* Textarea with label.
*/
export const WithLabel: Story = {
args: {
placeholder: 'Enter description...',
label: 'Description',
},
}
/**
* Textarea with label and error message.
*/
export const WithLabelAndError: Story = {
args: {
placeholder: 'Enter description...',
label: 'Description',
error: 'Description is required',
},
}
/**
* Textarea with label and value.
*/
export const WithLabelAndValue: Story = {
args: {
label: 'Notes',
defaultValue: 'Comprehensive Linux system backup script.',
},
}
/**
* Textarea with error only (no label).
*/
export const WithErrorOnly: Story = {
args: {
placeholder: 'Enter description...',
error: 'Field cannot be empty',
},
}
/**
* All textarea variants displayed together for comparison.
*/
export const AllVariants: Story = {
args: {
placeholder: 'Default',
},
render: () => (
),
}