TextArea
Data Input
여러 줄 텍스트를 입력받는 필드.
Usage
import
API Reference
예제
Usage
여러 줄 텍스트 입력(메모·사유·설명). 한 줄이면 Input
import
import
import { TextArea } from '@mildang/design-system/TextArea';예제를 복사해 쓸 때 필요한 준비
• @mildang/icons 를 따로 설치한다. DS 패키지에 아이콘 컴포넌트가 포함되지 않는다.
API Reference
TextArea Props
Prop
Type
Default
cacheMeasurements
boolean
지정 안 함
className
string
지정 안 함
endAdornment
ReactNode
지정 안 함
error
boolean
false
maxRows
number
지정 안 함
minRows
number
지정 안 함
onHeightChange
(height: number, meta: TextareaHeightChangeMeta) => void
지정 안 함
size
"sm" | "md" | "lg" | "xl"
md
success
boolean
false
textAreaContainerClassName
string
지정 안 함
warning
boolean
false
예제
기본 사용
minRows 로 최소 높이를 준 여러 줄 입력 — 내용이 늘면 높이가 따라 늘어납니다.
import type { ComponentProps } from 'react';
import { TextArea } from '@mildang/design-system/TextArea';
const STORY_DEFAULT_ARGS = { ...({}), ...({
placeholder: 'Enter description...',
size: 'md',
}) } as ComponentProps<typeof TextArea>;
const TextAreaDemoExampleRender = (args: ComponentProps<typeof TextArea>) => <TextArea {...args} />;
export default function TextAreaDemoExample(props: Partial<ComponentProps<typeof TextArea>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof TextArea>;
return TextAreaDemoExampleRender(mergedProps);
}
크기
sm·md·lg·xl 의 글자 크기와 여백을 비교합니다. minRows 는 크기와 별개로 줄 수를 정합니다.
import { Text } from '@mildang/design-system/Text';
import { TextArea } from '@mildang/design-system/TextArea';
const TextAreaSizesExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '400px' }}>
<div>
<Text variant="title-sm-medium" mb="8px">
sm
</Text>
<TextArea size="sm" placeholder="Small" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
md (default)
</Text>
<TextArea size="md" placeholder="Medium" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
lg
</Text>
<TextArea size="lg" placeholder="Large" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
xl
</Text>
<TextArea size="xl" placeholder="Extra Large" />
</div>
</div>
);
export default TextAreaSizesExample;
상태
기본·오류·비활성을 나란히 둡니다. 글자 수 제한처럼 사유가 필요한 오류는 HelpText 와 함께 씁니다.
import { Text } from '@mildang/design-system/Text';
import { TextArea } from '@mildang/design-system/TextArea';
const TextAreaDisabledWithStatusExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
<div>
<Text variant="title-sm-medium" mb="8px">
Disabled (default)
</Text>
<TextArea disabled placeholder="Placeholder" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Disabled (with value)
</Text>
<TextArea disabled defaultValue="입력된 텍스트" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Disabled + Error
</Text>
<TextArea disabled error defaultValue="에러 상태에서 비활성화" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Disabled + Warning
</Text>
<TextArea disabled warning defaultValue="경고 상태에서 비활성화" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Disabled + Success
</Text>
<TextArea disabled success defaultValue="성공 상태에서 비활성화" />
</div>
</div>
);
export default TextAreaDisabledWithStatusExample;
StatusGuide
import { Text } from '@mildang/design-system/Text';
import { TextArea } from '@mildang/design-system/TextArea';
const TextAreaStatusGuideExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
<div>
<Text variant="title-sm-medium" mb="8px">
Default
</Text>
<TextArea placeholder="Default state" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Error
</Text>
<TextArea error placeholder="Error state" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Warning
</Text>
<TextArea warning placeholder="Warning state" />
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
Success
</Text>
<TextArea success placeholder="Success state" />
</div>
</div>
);
export default TextAreaStatusGuideExample;
WidthGuide
import { Text } from '@mildang/design-system/Text';
import { TextArea } from '@mildang/design-system/TextArea';
const TextAreaWidthGuideExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: '24px' }}>
<div>
<Text variant="title-sm-medium" mb="8px">
부모에 minWidth/maxWidth 설정 (반응형)
</Text>
<div style={{ minWidth: '200px', maxWidth: '500px' }}>
<TextArea placeholder="반응형 너비 (200px ~ 500px)" />
</div>
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
부모에 width 고정 (320px)
</Text>
<div style={{ width: '320px' }}>
<TextArea placeholder="고정 너비 320px" />
</div>
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
기본 (부모 너비 100%)
</Text>
<TextArea placeholder="부모 너비를 100% 채움" />
</div>
</div>
);
export default TextAreaWidthGuideExample;
EndAdornmentSizes
import { Text } from '@mildang/design-system/Text';
import { TextArea } from '@mildang/design-system/TextArea';
import { IconButton } from '@mildang/design-system/IconButton';
import Calendar from '@mildang/icons/react/calendar';
const TextAreaEndAdornmentSizesExample = () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '400px' }}>
<div>
<Text variant="title-sm-medium" mb="8px">
sm
</Text>
<TextArea
size="sm"
placeholder="Small"
endAdornment={
<IconButton size="xs" aria-label="date">
<Calendar />
</IconButton>
}
/>
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
md (default)
</Text>
<TextArea
size="md"
placeholder="Medium"
endAdornment={
<IconButton size="sm" aria-label="date">
<Calendar />
</IconButton>
}
/>
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
lg
</Text>
<TextArea
size="lg"
placeholder="Large"
endAdornment={
<IconButton size="md" aria-label="date">
<Calendar />
</IconButton>
}
/>
</div>
<div>
<Text variant="title-sm-medium" mb="8px">
xl
</Text>
<TextArea
size="xl"
placeholder="Extra Large"
endAdornment={
<IconButton size="lg" aria-label="date">
<Calendar />
</IconButton>
}
/>
</div>
</div>
);
export default TextAreaEndAdornmentSizesExample;
MinMaxRows
import type { ComponentProps } from 'react';
import { TextArea } from '@mildang/design-system/TextArea';
const STORY_DEFAULT_ARGS = { ...({}), ...({
placeholder: 'Test min/max rows...',
maxRows: 5,
}) } as ComponentProps<typeof TextArea>;
const TextAreaMinMaxRowsExampleRender = (args: ComponentProps<typeof TextArea>) => <TextArea {...args} />;
export default function TextAreaMinMaxRowsExample(props: Partial<ComponentProps<typeof TextArea>>) {
const mergedProps = { ...STORY_DEFAULT_ARGS, ...props } as ComponentProps<typeof TextArea>;
return TextAreaMinMaxRowsExampleRender(mergedProps);
}