,
},
{
header: 'Status',
accessorKey: 'status',
cell: ({ row }) => {
const status = row.getValue('status');
return (
{status.toUpperCase()}
);
},
filterFn: customFilterFn,
},
{
header: 'Role',
accessorKey: 'role',
filterFn: customFilterFn,
},
{
header: 'Last Active',
accessorKey: 'last-active',
},
],
[],
);
const [columnFilters, setColumnFilters] = useState([]);
const table = useReactTable({
data: datas,
columns,
state: { columnFilters },
enableRowSelection: true,
getCoreRowModel: getCoreRowModel(),
getFilteredRowModel: getFilteredRowModel(),
getPaginationRowModel: getPaginationRowModel(),
onColumnFiltersChange: setColumnFilters,
});
return (
출석부
table.getColumn('name')?.setFilterValue(value)
}
/>
{
table.getColumn('status')?.setFilterValue(value);
}}
content={
<>
ActiveInactive
>
}
/>
table.getColumn('role')?.setFilterValue(value)
}
content={
<>
DesignerDeveloper
>
}
/>
col.getIsVisible())
.map((col) => col.id)}
content={table
.getAllColumns()
.filter((column) => column.getCanHide())
.map((column) => (
column.toggleVisibility()}
>
{column.id}
))}
/>
{table.getHeaderGroups().map((headerGroup) => (
{headerGroup.headers.map((header) => (
{flexRender(
header.column.columnDef.header,
header.getContext(),
)}
))}
))}
{table.getRowModel().rows.length ? (
table.getRowModel().rows.map((row) => {
return (
{row.getVisibleCells().map((cell) => (
{flexRender(
cell.column.columnDef.cell,
cell.getContext(),
)}
))}
);
})
) : (
검색 결과가 없습니다.
)}
table.setPageIndex(page - 1)}
>
table.setPageSize(Number(value))}
>
{(value) => `${value}개씩 보기`}
{[5, 10, 20, 30, 40, 50].map((pageSize) => (
{pageSize}
))}
);
}
type Data = {
name: string;
status: 'active' | 'inactive';
role: string;
'last-active': string;
};
const datas: Data[] = [
{ name: 'Olivia Park', status: 'active', role: 'designer', 'last-active': '2 hours ago' },
{ name: 'Ethan Kim', status: 'active', role: 'developer', 'last-active': '3 days ago' },
{ name: 'Mia Choi', status: 'inactive', role: 'developer', 'last-active': '10 minutes ago' },
{ name: 'Noah Lee', status: 'active', role: 'designer', 'last-active': '1 day ago' },
{ name: 'Ava Jung', status: 'active', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Liam Han', status: 'inactive', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Emma Seo', status: 'active', role: 'designer', 'last-active': '7 days ago' },
{ name: 'Mason Yoo', status: 'active', role: 'designer', 'last-active': '30 minutes ago' },
{ name: 'Sophia Lim', status: 'inactive', role: 'designer', 'last-active': '4 hours ago' },
{ name: 'Lucas Park', status: 'active', role: 'developer', 'last-active': '1 hour ago' },
{ name: 'Olivia Park', status: 'active', role: 'designer', 'last-active': '2 hours ago' },
{ name: 'Ethan Kim', status: 'active', role: 'developer', 'last-active': '3 days ago' },
{ name: 'Mia Choi', status: 'inactive', role: 'developer', 'last-active': '10 minutes ago' },
{ name: 'Noah Lee', status: 'active', role: 'designer', 'last-active': '1 day ago' },
{ name: 'Ava Jung', status: 'active', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Liam Han', status: 'inactive', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Emma Seo', status: 'active', role: 'designer', 'last-active': '7 days ago' },
{ name: 'Mason Yoo', status: 'active', role: 'designer', 'last-active': '30 minutes ago' },
{ name: 'Sophia Lim', status: 'inactive', role: 'designer', 'last-active': '4 hours ago' },
{ name: 'Lucas Park', status: 'active', role: 'developer', 'last-active': '1 hour ago' },
];
const activeness: Record = {
active: 'success',
inactive: 'hint',
};
/* -----------------------------------------------------------------------------------------------*/
interface FilterSelectProps extends React.ComponentProps {
triggerLabel: string;
content: React.ReactNode;
}
const FilterSelect = ({ content, triggerLabel, ...props }: FilterSelectProps) => {
return (
}
style={{ width: 'unset' }}
>
{triggerLabel}
{content}
);
};
```
# Composition
URL: /docs/getting-started/composition
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/composition.mdx
기본 props로 해결되지 않을 때, Vapor UI 컴포넌트의 구조를 직접 제어하는 방법을 설명합니다.
***
title: Composition
description: 기본 props로 해결되지 않을 때, Vapor UI 컴포넌트의 구조를 직접 제어하는 방법을 설명합니다.
-----------------------------------------------------------------------
기본 props로 해결되지 않을 때 두 가지 방법으로 커스터마이징할 수 있습니다. Primitive는 Vapor UI 컴포넌트의 내부 구조를 이루는 최소 단위 컴포넌트입니다.
* **Primitive가 없는 컴포넌트** (`Button`, `Badge`, `TextInput` 등): `render` prop으로 커스터마이징합니다.
* **Primitive가 있는 컴포넌트** (`Dialog`, `Sheet`, `Tabs` 등): Primitive를 직접 조합해 내부 구조를 제어합니다.
컴포넌트에 Primitive가 있는지 확인하려면 각 컴포넌트 문서의 Props Table에서 `XxxPrimitive` 항목을 찾으세요.
## render prop으로 렌더링 제어하기
`render` prop은 두 가지 형태로 사용할 수 있습니다.
**ReactElement 형태** — HTML 태그나 외부 컴포넌트로 교체할 때 사용합니다.
```tsx
import { Button, Card, Dialog } from '@vapor-ui/core';
import Link from 'next/link';
// div → article로 교체
} />
// Next.js Link로 교체
}>홈으로
```
**함수 형태** — 컴포넌트의 내부 state에 따라 렌더링 내용을 동적으로 바꿀 때 사용합니다. 함수는 `(props, state)` 두 인자를 받습니다.
```tsx
import { Switch } from '@vapor-ui/core';
import { DarkIcon, LightIcon } from '@vapor-ui/icons';
export default function Example() {
return (
(
{state.checked ? : }
)}
/>
);
}
```
## Primitive 직접 조합하기
Primitive를 직접 조합하면 Portal 위치, Overlay 렌더링 순서 등 레이어 구조 전체를 제어할 수 있습니다.
```tsx
import { Button, Dialog } from '@vapor-ui/core';
export default function Example() {
return (
열기제목내용닫기} />
);
}
```
# Styling
URL: /docs/getting-started/styling
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/styling.mdx
Vapor UI 컴포넌트를 스타일링하고 커스터마이징하는 방법을 설명합니다.
***
title: Styling
description: Vapor UI 컴포넌트를 스타일링하고 커스터마이징하는 방법을 설명합니다.
------------------------------------------------------
Vapor UI는 단순한 스타일 오버라이드부터 컴포넌트 구조 변경까지 단계별 커스터마이징을 지원합니다.
## 1. 기본 스타일링 (className, style)
가장 익숙한 방식인 `className`과 `style`을 사용합니다. 빠른 스타일 수정이 필요하거나 기존 CSS 체계를 유지해야 할 때 적합합니다.
### className
외부 CSS 파일이나 CSS 모듈의 클래스를 적용합니다.
```tsx
import { Button } from '@vapor-ui/core';
export default function Example() {
return ;
}
```
### style
인라인 스타일을 통해 동적인 스타일을 직접 주입합니다.
```tsx
import { Button } from '@vapor-ui/core';
export default function Example() {
return (
);
}
```
## 2. `$css` 속성
Vapor UI가 권장하는 기본 방식입니다. 별도의 CSS 파일 없이 컴포넌트에서 직접 스타일을 제어할 수 있습니다.
### 기본 CSS 속성 수정
CSS 속성을 객체 형태로 전달하여 스타일을 수정합니다.
```tsx
import { Button } from '@vapor-ui/core';
export default function Example() {
return (
);
}
```
### 토큰 기반 스타일링
디자인 토큰을 사용해 일관된 스타일을 유지하세요. 타입 지원을 통해 오타를 방지할 수 있습니다.
```tsx
import { Button } from '@vapor-ui/core';
export default function Example() {
return (
);
}
```
### 반응형 및 가상 선택자
반응형 조건(breakpoints)과 가상 선택자(`_hover` 등)를 `$css` 안에서 한 번에 정의할 수 있습니다.
```tsx
import { Button } from '@vapor-ui/core';
export default function Example() {
return (
);
}
```
## 3. 상태 기반 스타일링
컴포넌트의 상태(checked, invalid 등)에 따라 스타일을 유연하게 변경할 수 있습니다.
### 함수형 className, style
`className`과 `style`에 함수를 전달하여 현재 상태에 맞는 스타일을 동적으로 반환합니다.
```tsx
import { Checkbox } from '@vapor-ui/core';
export default function Example() {
return (
(state.checked ? 'checkbox-checked' : 'checkbox-unchecked')}
style={(state) => ({
backgroundColor: state.invalid
? 'color-mix(in srgb, red 12%, transparent)'
: undefined,
})}
/>
);
}
```
### Data Attributes
컴포넌트 상태는 `data-*` 속성으로 노출됩니다. 상태별 스타일 로직을 CSS 파일로 분리할 때 유용합니다.
```css
/* 데이터 속성을 활용한 스타일 정의 */
.checkbox[data-checked] {
background-color: var(--vapor-color-background-primary-200);
}
.checkbox[data-invalid] {
border-color: var(--vapor-color-border-danger);
}
```
### 함수형 render
`render` prop을 사용하면 렌더링되는 엘리먼트 자체와 클래스 구성을 직접 제어할 수 있습니다.
```tsx
import { NavigationMenu } from '@vapor-ui/core';
export default function Example() {
return (
(
)}
/>
);
}
```
# Tailwind CSS v4
URL: /docs/getting-started/tailwindcss-v4
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/tailwindcss-v4.mdx
Vapor UI와 함께 Tailwind CSS v4를 사용하세요.
***
title: Tailwind CSS v4
description: Vapor UI와 함께 Tailwind CSS v4를 사용하세요.
-------------------------------------------------
이 문서에서는 Vapor UI와 Tailwind CSS v4를 함께 설정하는 방법을 설명합니다. 설정을 완료하면 Vapor UI 컴포넌트와 Tailwind 유틸리티 클래스를 함께 사용할 수 있습니다.
## 설정
메인 CSS 파일(예: `global.css`)에 아래 코드를 추가합니다.
```css
/* global.css */
/* 1. 스타일 우선순위 정의 */
@layer tw-theme, vapor, tw-utilities;
@import '@vapor-ui/core/tailwind.css';
/* 2. Tailwind CSS 연결 */
@import 'tailwindcss/theme.css' layer(tw-theme);
@import 'tailwindcss/utilities.css' layer(tw-utilities);
```
설정이 완료되면 Vapor UI 컴포넌트와 Tailwind 유틸리티를 함께 사용할 수 있습니다.
## Vapor 유틸리티 클래스
`v-` 접두사가 붙은 Vapor 전용 유틸리티 클래스를 사용할 수 있습니다.
### 디자인 토큰 클래스
Vapor의 색상, 간격, 둥근 모서리를 Tailwind 문법으로 사용합니다. `v-` 접두사를 추가하여 Vapor 디자인 토큰을 적용합니다.
* **색상**: `bg-v-blue-500`, `text-v-red-300`, `border-v-gray-900`
* **간격**: `p-v-100`, `m-v-200`, `gap-v-400`, `w-v-400`
* **둥근 모서리**: `rounded-v-200`, `rounded-t-v-400`
* **폰트 굵기**: `font-v-400`, `font-v-700`
Tailwind의 모든 [유틸리티 클래스](https://tailwindcss.com/docs/theme#theme-variable-namespaces)와 조합할 수 있습니다.
### 시맨틱 유틸리티 클래스
의미 기반 색상 클래스를 제공합니다. Primary, Success, Warning 등의 역할에 맞는 색상을 적용합니다.
* **배경색**: `bg-v-primary`, `bg-v-secondary`, `bg-v-success`, `bg-v-warning`, `bg-v-danger`
* **텍스트색**: `text-v-primary`, `text-v-success`, `text-v-warning`, `text-v-danger`, `text-v-accent`
* **테두리색**: `border-v-primary`, `border-v-success`, `border-v-warning`, `border-v-danger`
## 스타일 우선순위
CSS `@layer` 규칙으로 스타일 우선순위 계층을 정의합니다.
1. Vapor 컴포넌트 기본 스타일
2. Vapor 유틸리티 클래스
3. Tailwind 유틸리티 (가장 높은 우선순위)
Tailwind 유틸리티가 가장 높은 우선순위를 가지므로 `className="bg-blue-500"`와 같은 클래스로 Vapor 컴포넌트를 커스터마이징할 수 있습니다.
## CSS Reset 설정
Vapor UI는 필요한 스타일 초기화를 포함합니다. Tailwind의 `preflight.css`는 사용하지 않는 것을 권장합니다.
`preflight.css`가 필요한 경우 레이어 순서를 다음과 같이 조정합니다.
```css
/* preflight를 사용해야 하는 경우 */
@layer tw-theme, vapor.theme, tw-base, vapor.reset, vapor.components, vapor.utilities, tw-utilities;
@import '@vapor-ui/core/tailwind.css';
@import 'tailwindcss/theme.css' layer(tw-theme);
@import 'tailwindcss/preflight.css' layer(tw-base);
@import 'tailwindcss/utilities.css' layer(tw-utilities);
```
> 이 설정은 스타일 충돌 가능성이 있으므로 필요한 경우에만 사용합니다.
# Theming
URL: /docs/getting-started/theming
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/theming.mdx
Vapor UI의 테마 시스템에 대해 설명합니다.
***
title: Theming
description: Vapor UI의 테마 시스템에 대해 설명합니다.
----------------------------------------
# Design Tokens
URL: /docs/getting-started/tokens
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/tokens.mdx
Vapor UI의 디자인 토큰에 대해 설명합니다.
***
title: Design Tokens
description: Vapor UI의 디자인 토큰에 대해 설명합니다.
----------------------------------------
# Installation
URL: /docs/getting-started/installation
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(overview)/installation.mdx
Vapor UI를 프로젝트에 설치하고 첫 컴포넌트를 사용해보세요.
***
title: Installation
description: Vapor UI를 프로젝트에 설치하고 첫 컴포넌트를 사용해보세요.
-------------------------------------------------
이 문서를 완료하면 Vapor UI 패키지를 설치하고, 첫 번째 컴포넌트를 화면에 렌더링할 수 있습니다.
## 사전 준비
다음 환경이 필요합니다.
| 요구사항 | 버전 |
| :------ | :---- |
| React | 17 이상 |
| Node.js | 16 이상 |
## 1단계: 패키지 설치
패키지 매니저를 사용하여 Vapor UI를 설치합니다.
```package-install
npm install @vapor-ui/core @vapor-ui/icons
```
## 2단계: Portal 설정
Vapor UI는 Dialog, Popover 같은 팝업 컴포넌트에 Portal을 사용합니다. Portal 컴포넌트가 항상 페이지 최상단에 표시되도록 애플리케이션 레이아웃 루트에 다음 스타일을 추가합니다.
```tsx title="layout.tsx"
{children}
```
```css title="styles.css"
.root {
isolation: isolate;
}
```
이 스타일은 `.root` 요소에 별도의 stacking context를 생성합니다. 이를 통해 팝업이 항상 페이지 콘텐츠 위에 표시되며, 다른 스타일의 `z-index` 속성과 충돌하지 않습니다.
## 3단계: 컴포넌트 사용
컴포넌트를 import하여 사용합니다.
```tsx
import { Card } from '@vapor-ui/core';
export default function AssembleComponent() {
return (
컴포넌트 구성하기
이것은 Vapor UI를 사용하여 컴포넌트를 구성하는 예시입니다.
);
}
```
## 다음 단계
* [테마 설정하기](/theme/theme-provider) - 라이트/다크 모드 및 커스텀 테마 설정 방법
* [컴포넌트 살펴보기](./overview#components) - 다양한 UI 컴포넌트 사용법
# Design Principles
URL: /docs/getting-started/principles
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(overview)/principles.mdx
Vapor UI의 컴포넌트 아키텍처와 개발 철학을 이끄는 핵심 디자인 원칙
***
title: Design Principles
description: Vapor UI의 컴포넌트 아키텍처와 개발 철학을 이끄는 핵심 디자인 원칙
------------------------------------------------------
이 문서에서는 Vapor UI의 설계 철학과 6가지 핵심 원칙을 설명합니다. 이 원칙들을 이해하면 컴포넌트를 더 효과적으로 활용할 수 있습니다.
## 1. Preset 기반의 컴파운드 패턴
Vapor UI는 합성 컴포넌트 패턴을 채택하여 편의성과 유연성을 함께 제공합니다. 빠른 구현이 필요할 때는 Preset 컴포넌트를, 세밀한 제어가 필요할 때는 Primitive 컴포넌트를 사용합니다.
```tsx
// Preset 패턴 (빠르고 간편)
TriggerContents
// Primitive 패턴 (완전한 제어)
TriggerContents
```
이 접근법의 장점은 다음과 같습니다.
* **빠른 시작**: Preset 컴포넌트로 즉시 구현할 수 있습니다.
* **세밀한 제어**: Primitive 컴포넌트로 커스텀 동작을 구현할 수 있습니다.
* **혼합 사용**: 같은 애플리케이션에서 두 패턴을 함께 사용할 수 있습니다.
## 2. 접근성
Vapor UI는 [Base UI](https://base-ui.com/react/overview/quick-start)를 기반으로 [WCAG 2.2](https://www.w3.org/TR/WCAG22/) AA를 준수합니다. [키보드 네비게이션](https://www.w3.org/TR/WCAG22/#keyboard-accessible)과 [포커스 표시](https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance)를 기본으로 지원합니다.
### 접근성 기능
* **Base UI 통합**: ARIA 속성, 키보드 내비게이션, 스크린 리더를 자동으로 지원합니다.
* **색상 대비 준수**: 자체 개발한 Color Generator가 WCAG AA/AAA 대비 비율을 보장합니다.
* **수학적 디자인 토큰**: 일관된 시각적 위계를 위해 수학적 비율로 생성된 토큰을 사용합니다.
```tsx
// 적절한 ARIA 속성과 키보드 처리가 자동으로 포함됨
설정 열기
{/* 포커스 관리와 ESC 키 처리가 내장됨 */}
```
### Color Generator 시스템
Color Generator는 지각적 색상 모델을 사용하여 접근성을 충족하는 색상 팔레트를 생성합니다.
```tsx
// 색상이 자동으로 대비 요구사항을 충족함
PrimarySuccessWarning
```
## 3. 일관된 네이밍 규칙
모든 컴포넌트는 일관된 네이밍 규칙을 따릅니다. 이 규칙을 통해 컴포넌트 사용법을 예측할 수 있습니다.
* **독립 컴포넌트**: 단일 이름을 사용합니다.
* **합성 컴포넌트**: Dot Notation 표기법을 사용합니다.
```tsx
// 단일 컴포넌트
상태
// 합성 컴포넌트
프로젝트 상태현재 개발 진행상황섹션 1섹션 2섹션 3
```
## 4. 예측 가능한 속성 명명
컴포넌트 속성은 시각적 옵션과 논리적 상태를 기반으로 체계적인 규칙을 따릅니다.
### 시각적 옵션
```tsx
// 크기 변형은 일관된 스케일을 따름
// 작음
// 보통 (기본값)
// 큼
// 색상 팔레트는 의미론적 명명 사용
```
### 논리적 상태 (동작 기반)
```tsx
// 상태 속성은 일관된 명명 사용
// 비활성화 상태
// 변형명은 의미론적 의도를 반영
// 선택 상태
// 비활성 상태
// 필수 상태
// 읽기 전용 상태
```
## 5. TypeScript 통합
모든 컴포넌트는 TypeScript를 완벽하게 지원합니다. 타입 안전성, IntelliSense 자동 완성, 컴파일 타임 오류 검출을 활용할 수 있습니다.
```tsx
import { Button } from '@vapor-ui/core';
// 완전히 타입화된 컴포넌트 속성
// - colorPalette 자동완성: 'primary' | 'secondary' | 'danger'
// - size 자동완성: 'sm' | 'md' | 'lg'
const CustomButton = ({ colorPalette, size, ...props }: Button.Props) => {
return ;
};
// 타입 안전 이벤트 핸들러
} />
);
}
```
## Property
***
### Size
Dialog의 크기를 설정합니다.
```tsx
import { Button, Dialog, HStack, Text, VStack } from '@vapor-ui/core';
export default function DialogSize() {
return (
md
Medium Dialog} />
Medium SizeMedium 크기의 다이얼로그입니다.취소} />
확인} />
lg
Large Dialog} />
Large SizeLarge 크기의 다이얼로그입니다.취소} />
확인} />
xl
Extra Large Dialog} />
Extra Large Size
Extra Large 크기의 다이얼로그입니다.
취소} />
확인} />
);
}
```
### Modal Behavior
Dialog의 모달 동작을 설정합니다.
```tsx
import { Button, Dialog, HStack, Text, VStack } from '@vapor-ui/core';
export default function DialogModal() {
return (
modal
Modal Dialog} />
Modal Dialog
포커스가 다이얼로그 내부에 제한됩니다.
확인} />
non-modal
Non-Modal Dialog} />
Non-Modal Dialog
배경의 다른 요소들과 상호작용할 수 있습니다.
확인} />
);
}
```
## Examples
***
### Custom Usage
Dialog 컴포넌트의 다양한 구성 패턴입니다.
```tsx
import { Button, Dialog } from '@vapor-ui/core';
export default function Flexible() {
return (
확인 다이얼로그} />
작업 확인
이 작업을 진행하시겠습니까? 이 작업은 되돌릴 수 없습니다.
취소} />
삭제} />
);
}
```
### Custom Overlay
`Dialog.PortalPrimitive`, `Dialog.OverlayPrimitive`, `Dialog.PopupPrimitive`를 직접 조합하면 오버레이 스타일 등 레이어 구조를 제어할 수 있습니다.
```tsx
import { Button, Dialog } from '@vapor-ui/core';
export default function DialogCustomOverlay() {
return (
열기} />
커스텀 오버레이
Primitive를 직접 조합해 오버레이의 스타일을 제어한 예시입니다.
닫기} />
);
}
```
## Props Table
***
### Dialog.Root
| Prop | Type | Default | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `open` | `false`, `true` | - | Dialog가 현재 열려 있는지 여부. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | Dialog가 처음에 열려 있는지 여부입니다.
제어되는 Dialog를 렌더링하려면 대신 `open` prop을 사용하세요. |
| `modal` | `false`, `true`, `trap-focus` | `true` | 대화 상자를 열었을 때 모드 상태로 전환되는지 여부를 결정합니다. - 'true': 사용자 상호작용은 대화 상자에만 제한됩니다: 포커스가 갇히고, 문서 페이지 스크롤이 잠기고, 외부 요소의 포인터 상호작용이 비활성화됩니다. - 'false': 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. - 'trap 포커스': 포커스는 대화 상자 안에 갇혀 있지만, 문서 페이지 스크롤은 잠겨 있지 않고 외부의 포인터 상호작용은 활성화된 상태로 유지됩니다. |
| `onOpenChange` | `(open: boolean, eventDetails: Dialog.Root.ChangeEventDetails) => void` | - | 대화 상자를 열거나 닫을 때 호출되는 이벤트 핸들러입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 대화 상자가 열리거나 닫힐 때 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. |
| `actionsRef` | `RefObject` | - | 명령적 행동에 대한 참조. - '언마운트': 지정하면 대화 상자를 닫았을 때 언마운트되지 않습니다. 대신, '언마운트' 기능을 호출하여 수동으로 대화 상자를 언마운트해야 합니다. 대화 상자의 애니메이션이 외부 라이브러리에 의해 제어될 때 유용합니다. |
| `size` | `md`, `lg`, `xl` | `md` | Dialog 크기 |
### Dialog.Popup
| Prop | Type | Default | Description |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 대화 상자를 열 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(첫 번째 탭 가능 요소 또는 팝업)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 대화 상자를 닫을 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(트리거 또는 이전에 집중된 요소)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `portalElement` | `ReactElement` | - | |
| `overlayElement` | `ReactElement` | - | |
#### Dialog.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 상위 요소입니다. |
| `keepMounted` | `false`, `true` | `false` | 포털이 숨겨져 있는 동안 DOM에 유지할지 여부입니다. |
#### Dialog.OverlayPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `forceRender` | `false`, `true` | `false` | 중첩되어 있을 때도 백드롭이 강제로 렌더링되는지 여부입니다. |
#### Dialog.PopupPrimitive
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 대화 상자를 열 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(첫 번째 탭 가능 요소 또는 팝업)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 대화 상자를 닫을 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(트리거 또는 이전에 집중된 요소)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
### Dialog.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | 컴포넌트가 `render` 속성을 통해 대체될 때 네이티브 `<button>` 요소를 렌더링할지 여부입니다. 렌더링된 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Dialog.Close
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | 컴포넌트가 `render` 속성을 통해 대체될 때 네이티브 `<button>` 요소를 렌더링할지 여부입니다. 렌더링된 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Dialog.Title
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Dialog.Description
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Dialog.Header
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Dialog.Body
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Dialog.Footer
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Field
URL: /docs/components/field
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/field.mdx
Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다.
***
title: Field
site\_name: Field - Vapor Core
description: Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다.
---------------------------------------------------------------------------
```tsx
'use client';
import { Field, TextInput } from '@vapor-ui/core';
export default function DefaultField() {
return (
Email
We'll never share your email.
);
}
```
## Examples
***
### With Description
Field에 대한 추가 설명을 표시합니다.
```tsx
'use client';
import { Field, TextInput, VStack } from '@vapor-ui/core';
export default function FieldDescription() {
return (
Username
Username
This will be your public display name.
);
}
```
### Error and Success
`Field.Error`와 `Field.Success`를 사용하여 유효성 검사 결과를 표시합니다.
```tsx
'use client';
import { Field, TextInput, VStack } from '@vapor-ui/core';
export default function FieldError() {
return (
Email
Please enter a valid email address.
Email
Email is valid.
);
}
```
### Required
필수 Field와 선택 Field를 구분하여 표시합니다.
```tsx
'use client';
import { Field, Text, TextInput, VStack } from '@vapor-ui/core';
export default function FieldRequired() {
return (
필수 입력 필드 *
이 필드는 반드시 입력해야 하는 필수 항목입니다.
이 필드는 필수 입력 항목입니다.입력이 완료되었습니다.
{/* Optional Field */}
선택 입력 필드{' '}
(선택사항)
이 필드는 선택적으로 입력할 수 있습니다.
);
}
```
### Disabled
disabled 속성을 사용하여 비활성화된 Field를 만들 수 있습니다.
```tsx
'use client';
import { Field, Text, TextInput, VStack } from '@vapor-ui/core';
export default function FieldDisabled() {
return (
enabled
Email
Enter your email address.
disabled
Email
Enter your email address.
);
}
```
### With RadioGroup
RadioGroup과 Field를 함께 사용합니다. `Field.Item`을 사용하여 각 Radio 옵션을 라벨과 함께 그룹화할 수 있습니다.
```tsx
'use client';
import { Field, Radio, RadioGroup, VStack } from '@vapor-ui/core';
export default function FieldRadioGroup() {
return (
성별남성여성기타개인정보 보호를 위해 선택사항입니다.
);
}
```
### With Form Elements
TextInput, Checkbox, Switch, Select 등 다양한 폼 요소와 함께 사용합니다.
```tsx
'use client';
import { Checkbox, Field, Select, Switch, TextInput, VStack } from '@vapor-ui/core';
export default function FieldWithInputs() {
return (
Email
Your primary contact email.
Subscribe to newsletter
Get the latest updates in your inbox.
Push notifications
Receive alerts on your device.
국가
{countries.map((country) => (
{country.label}
))}
Select your country of residence.
);
}
const countries = [
{ label: '대한민국', value: 'kr' },
{ label: '미국', value: 'us' },
{ label: '일본', value: 'jp' },
{ label: '중국', value: 'cn' },
];
```
## Property
***
### Validation
`validationMode`를 통해 유효성 검사 타이밍을 설정합니다. `match` prop으로 특정 에러 타입에 대한 메시지를 표시합니다.
```tsx
'use client';
import { Field, TextInput, VStack } from '@vapor-ui/core';
export default function FieldValidation() {
return (
Email
Validated when you leave the field.Email is required.Please enter a valid email.Email looks good.
Password
Validated as you type. Minimum 8 characters.Password is required.Password must be at least 8 characters.Password is strong.
);
}
```
### Disabled
Field의 비활성화 상태를 설정합니다.
```tsx
'use client';
import { Field, Text, TextInput, VStack } from '@vapor-ui/core';
export default function FieldDisabled() {
return (
enabled
Email
Enter your email address.
disabled
Email
Enter your email address.
);
}
```
## Props Table
***
### Field.Root
| Prop | Type | Default | Description |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `name` | `string` | - | 폼 제출 시 필드를 식별하는 이름 `<Field.Control>` 컴포넌트의 `name` prop보다 우선합니다. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 무시할지 여부 `<Field.Control>` 컴포넌트의 `disabled` prop보다 우선합니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `validate` | `(value: unknown, formValues: Record) => string \| string[] \| Promise \| null` | - | 커스텀 유효성 검사 함수 값이 유효하지 않으면 에러 메시지 문자열 또는 문자열 배열을 반환하고, 유효하면 `null`을 반환합니다. |
| `validationMode` | `onSubmit`, `onBlur`, `onChange` | `onSubmit` | 필드 유효성 검사 시점
- **onSubmit**: 폼 제출 시 검사 (기본값) - **onBlur**: 컨트롤이 포커스를 잃을 때 검사 - **onChange**: 컨트롤 값이 변경될 때마다 검사 |
| `validationDebounceTime` | `number` | `0` | `validationMode="onChange"` 사용 시 `validate` 콜백 사이의 대기 시간 (밀리초) |
| `invalid` | `false`, `true` | - | 필드를 강제로 유효하지 않은 상태로 표시할지 여부 |
### Field.Label
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Field.Description
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Field.Error
| Prop | Type | Default | Description |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `match` | `false`, `true`, `badInput`, `customError`, `patternMismatch`, `rangeOverflow`, `rangeUnderflow`, `stepMismatch`, `tooLong`, `tooShort`, `typeMismatch`, `valueMissing` | - | 특정 유효성 검사 상태에 대한 오류 메시지를 표시할지 여부
- **false**: 모든 오류 메시지를 표시 - **true**: 모든 오류 메시지를 숨김 - **기타 문자열**: 해당 유효성 검사 상태에 대한 오류 메시지만 표시 |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Field.Success
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `match` | `false`, `true`, `valid` | - | 성공 메시지를 표시할지 여부
- **false**: 모든 성공 메시지를 표시 - **true**: 모든 성공 메시지를 숨김 - **valid**: 필드가 유효한 상태일 때만 성공 메시지를 표시 |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Field.Item
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `children` | `ReactNode` | - | Field.Item 내부에 렌더링될 콘텐츠. 일반적으로 Checkbox, Radio, Switch와 Field.Label을 포함합니다. |
# FloatingBar
URL: /docs/components/floating-bar
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/floating-bar.mdx
FloatingBar는 하단에 고정되어 주요 액션을 포함하는 컴포넌트입니다.
***
title: 'FloatingBar'
site\_name: 'FloatingBar - Vapor Core'
description: 'FloatingBar는 하단에 고정되어 주요 액션을 포함하는 컴포넌트입니다.'
---------------------------------------------------------
```tsx
import { FloatingBar } from '@vapor-ui/core';
export default function DefaultFloatingBar() {
return (
Open Floating BarThis is the floating bar content.
);
}
```
## Examples
***
### Actions
FloatingBar는 다양한 액션 요소를 담을 수 있습니다.
```tsx
import { Box, Button, FloatingBar } from '@vapor-ui/core';
export default function FloatingBarWithActions() {
return (
}>Open FloatingBar
Select AllDelete
);
}
```
### Controlled
FloatingBar는 제어 형태로 사용되어, 여러 상태를 동시에 관리할 수 있습니다.
```tsx
import { useState } from 'react';
import {
Badge,
Box,
Button,
Checkbox,
Field,
FloatingBar,
IconButton,
Text,
VStack,
} from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
const options = [
{ id: 'item1', label: 'First Item', defaultChecked: false },
{ id: 'item2', label: 'Second Item', defaultChecked: false },
{ id: 'item3', label: 'Third Item', defaultChecked: false },
];
export default function FloatingBarControlled() {
const [selectedItems, setSelectedItems] = useState(() =>
Object.fromEntries(options.map((option) => [option.id, option.defaultChecked])),
);
const selectedCount = Object.values(selectedItems).filter(Boolean).length;
const [open, setOpen] = useState(selectedCount > 0);
const handleItemChange = (itemId: string, isChecked: boolean) => {
setSelectedItems((prev) => {
const newSelectedItems = { ...prev, [itemId]: isChecked };
const newSelectedCount = Object.values(newSelectedItems).filter(Boolean).length;
setOpen(newSelectedCount > 0);
return newSelectedItems;
});
};
const handleSelectAll = () => {
setSelectedItems(Object.fromEntries(options.map((option) => [option.id, true])));
setOpen(true);
};
const handleClearAll = () => {
setSelectedItems(Object.fromEntries(options.map((option) => [option.id, false])));
setOpen(false);
};
return (
<>
} $css={{ marginBottom: '$200' }}>
Select options below to see the FloatingBar.
{options.map((option) => (
handleItemChange(option.id, checked)}
/>
{option.label}
))}
{selectedCount} Selected
Select All
Delete
}
>
>
);
}
```
## Props Table
***
### FloatingBar.Root
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------ |
| `open` | `boolean` | `undefined` | FloatingBar의 열림 상태를 제어합니다. 이 prop이 제공되면 컴포넌트가 제어 모드로 동작합니다. |
| `defaultOpen` | `boolean` | `false` | FloatingBar의 초기 열림 상태를 설정합니다. 비제어 모드에서만 사용됩니다. |
| `onOpenChange` | `(open: boolean, event?: Event, reason?: string) => void` | `undefined` | FloatingBar의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. open 상태, 이벤트, 그리고 변경 이유를 인자로 받습니다. |
| `modal` | `boolean`, `{ trapFocus?: boolean }` | `true` | FloatingBar가 모달 형태로 동작할지 여부를 설정합니다. true일 때 배경을 클릭하면 FloatingBar가 닫히고 포커스 트랩이 적용됩니다. |
| `openOnHover` | `boolean` | `false` | 마우스 호버 시 FloatingBar를 열지 여부를 설정합니다. |
| `delay` | `number`, `{ open?: number; close?: number }` | `0` | FloatingBar 열기/닫기 지연 시간을 밀리초 단위로 설정합니다. |
### FloatingBar.Trigger
| Prop | Type | Default | Description |
| ---------- | ---------------------------------------------------------------------------------------- | ----------- | --------------------------------------------------------------- |
| `render` | `React.ReactElement`, `(props: TriggerProps, state: TriggerState) => React.ReactElement` | `undefined` | 트리거 요소를 렌더링하는 함수 또는 컴포넌트입니다. 함수로 제공될 경우 props와 state를 인자로 받습니다. |
| `disabled` | `boolean` | `false` | 트리거 요소를 비활성화할지 여부를 설정합니다. |
### FloatingBar.Close
| Prop | Type | Default | Description |
| -------- | ----------------------------------------------------------------- | ----------- | --------------------------- |
| `render` | `React.ReactElement`, `(props: CloseProps) => React.ReactElement` | `undefined` | 닫기 버튼을 렌더링하는 함수 또는 컴포넌트입니다. |
### FloatingBar.Popup
| Prop | Type | Default | Description |
| ------------------- | -------------------- | ----------- | ------------------------------------------------------------------------- |
| `portalElement` | `React.ReactElement` | `undefined` | Portal 컴포넌트에 전달될 React Element입니다. FloatingBar가 렌더링될 위치와 관련된 설정을 제어합니다. |
| `positionerElement` | `React.ReactElement` | `undefined` | Positioner 컴포넌트에 전달될 React Element입니다. FloatingBar의 위치와 정렬에 관한 설정을 제어합니다. |
| `className` | `string` | `undefined` | FloatingBar 컨텐츠에 적용할 CSS 클래스명입니다. |
### FloatingBar.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------ | --------------- | ---------------------------------------------------------------------- |
| `container` | `HTMLElement`, `() => HTMLElement`, `null` | `document.body` | FloatingBar가 렌더링될 컨테이너 요소를 지정합니다. null을 전달하면 포탈을 사용하지 않고 인라인으로 렌더링합니다. |
| `keepMounted` | `boolean` | `false` | FloatingBar가 닫혀있을 때도 DOM에 마운트된 상태를 유지할지 여부를 설정합니다. |
### FloatingBar.PositionerPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------ | ----------- | ---------------------------------------- |
| `className` | `string` | `undefined` | FloatingBar Positioner에 적용할 CSS 클래스명입니다. |
| `style` | `CSSProperties` | `undefined` | FloatingBar Positioner에 적용할 인라인 스타일입니다. |
| `render` | `React.ReactElement`, `(props: PopupProps, state: PopupState) => React.ReactElement` | `undefined` | Positioner 요소를 렌더링하는 함수 또는 컴포넌트입니다. |
### FloatingBar.PopupPrimitive
| Prop | Type | Default | Description |
| ------------------- | -------------------- | ----------- | ------------------------------------------------------------------------- |
| `portalElement` | `React.ReactElement` | `undefined` | Portal 컴포넌트에 전달될 React Element입니다. FloatingBar가 렌더링될 위치와 관련된 설정을 제어합니다. |
| `positionerElement` | `React.ReactElement` | `undefined` | Positioner 컴포넌트에 전달될 React Element입니다. FloatingBar의 위치와 정렬에 관한 설정을 제어합니다. |
| `className` | `string` | `undefined` | FloatingBar 컨텐츠에 적용할 CSS 클래스명입니다. |
# Form
URL: /docs/components/form
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/form.mdx
Form은 사용자 입력을 수집하고 유효성 검사를 수행하는 폼 컨테이너입니다.
***
title: 'Form'
site\_name: 'Form - Vapor Core'
description: 'Form은 사용자 입력을 수집하고 유효성 검사를 수행하는 폼 컨테이너입니다.'
---------------------------------------------------------
```tsx
'use client';
import { Button, Field, Form, TextInput, VStack } from '@vapor-ui/core';
export default function DefaultForm() {
return (
);
}
```
## Examples
***
### Validation
HTML5 기본 유효성 검사를 활용하여 폼 필드를 검증합니다.
```tsx
'use client';
import { Button, Field, Form, TextInput, VStack } from '@vapor-ui/core';
export default function FormValidation() {
return (
);
}
```
### With Field Components
다양한 입력 컴포넌트와 Field를 조합하여 완성된 폼을 구성합니다.
```tsx
'use client';
import { Button, Checkbox, Field, Form, HStack, Select, TextInput, VStack } from '@vapor-ui/core';
export default function FormWithField() {
return (
);
}
```
## Props Table
***
### Form
> ⚠️ Spec file not found: `form.json`
# IconButton
URL: /docs/components/icon-button
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/icon-button.mdx
IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다.
***
title: 'IconButton'
site\_name: 'IconButton - Vapor Core'
description: 'IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다.'
--------------------------------------------------------------------------
```tsx
import { IconButton } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function DefaultIconButton() {
return (
);
}
```
## Property
***
### Size
IconButton의 크기를 설정합니다.
```tsx
import { HStack, IconButton, Text, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function IconButtonSize() {
return (
sm
md
lg
xl
);
}
```
### ColorPalette
IconButton의 색상을 설정합니다.
```tsx
import { HStack, IconButton, Text, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function IconButtonColor() {
return (
primary
secondary
success
warning
danger
contrast
);
}
```
### Variant
IconButton의 시각적 변형을 설정합니다.
```tsx
import { HStack, IconButton, Text, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function IconButtonVariant() {
return (
fill
outline
ghost
);
}
```
### Shape
IconButton의 모양을 설정합니다.
```tsx
import { HStack, IconButton, Text, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function IconButtonShape() {
return (
square
circle
);
}
```
### Disabled
IconButton의 비활성화 상태를 설정합니다.
```tsx
import { HStack, IconButton, Text, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function IconButtonDisabled() {
return (
fill
outline
ghost
);
}
```
## Props Table
***
### IconButton
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------ | --------- | ---------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | 버튼 크기 |
| `shape` | `circle`, `square` | `square` | 버튼 모양 |
| **aria-label** | `string` | - | 현재 요소의 레이블을 정의하는 문자열 값 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `colorPalette` | `primary`, `secondary`, `success`, `warning`, `danger`, `contrast` | `primary` | 버튼 색상 |
| `variant` | `outline`, `fill`, `ghost` | `fill` | 버튼 스타일 (fill: 채움, outline: 테두리, ghost: 투명) |
# InputGroup
URL: /docs/components/input-group
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/input-group.mdx
InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다.
***
title: 'InputGroup'
site\_name: 'InputGroup - Vapor Core'
description: 'InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다.'
-----------------------------------------------------------------------------------------------
```tsx
'use client';
import { InputGroup, TextInput, VStack } from '@vapor-ui/core';
export default function DefaultInputGroup() {
return (
);
}
```
## Examples
***
### Custom Counter
커스텀 카운터 UI를 구현합니다.
```tsx
'use client';
import { InputGroup, Text, TextInput, VStack } from '@vapor-ui/core';
export default function InputGroupCustomCounter() {
return (
커스텀 카운터 예시 1
{({ count, maxLength }) => `${count} of ${maxLength} characters`}
커스텀 카운터 예시 2
{({ count, maxLength, value }) => (
maxLength * 0.8 ? 'danger-100' : 'hint-100'
}
>
{count}/{maxLength} {value.length > 50 && '(50자 초과)'}
)}
);
}
```
## Props Table
***
### InputGroup.Root
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### InputGroup.Counter
| Prop | Type | Default | Description |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal`, `(props: CounterRenderProps) => ReactNode` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Menu
URL: /docs/components/menu
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/menu.mdx
드롭다운 Menu와 컨텍스트 Menu를 제공하는 컴포넌트입니다
***
title: 'Menu'
site\_name: 'Menu - Vapor Core'
description: '드롭다운 Menu와 컨텍스트 Menu를 제공하는 컴포넌트입니다'
-------------------------------------------------
```tsx
'use client';
import { Button, Menu } from '@vapor-ui/core';
export default function DefaultMenu() {
return (
메뉴 열기} />
새 파일새 폴더복사붙여넣기삭제
);
}
```
## Property
***
### Disabled
Menu의 비활성화 상태를 설정합니다.
```tsx
'use client';
import { Button, HStack, Menu, Text, VStack } from '@vapor-ui/core';
export default function MenuDisabled() {
return (
disabled item
일반 메뉴} />
활성 아이템 1비활성 아이템활성 아이템 2비활성 아이템 2활성 아이템 3
disabled menu
비활성 메뉴} />
아이템 1아이템 2아이템 3
);
}
```
## Examples
***
### Positioning
Menu의 표시 위치를 설정합니다.
```tsx
'use client';
import { Button, HStack, Menu, Text, VStack } from '@vapor-ui/core';
export default function MenuPositioning() {
return (
top
상단 메뉴} />
상단 아이템 1상단 아이템 2상단 아이템 3
right
우측 메뉴} />
우측 아이템 1우측 아이템 2우측 아이템 3
bottom
하단 메뉴} />
하단 아이템 1하단 아이템 2하단 아이템 3
left
좌측 메뉴} />
좌측 아이템 1좌측 아이템 2좌측 아이템 3
);
}
```
### Groups
Menu 아이템을 그룹화합니다.
```tsx
'use client';
import { Button, Menu } from '@vapor-ui/core';
export default function MenuGroups() {
return (
그룹 메뉴} />
파일새 파일파일 열기파일 저장편집복사붙여넣기잘라내기도구설정도움말
);
}
```
### With Checkbox Items
Checkbox Item을 사용합니다.
```tsx
'use client';
import { useState } from 'react';
import { Button, Menu } from '@vapor-ui/core';
export default function MenuCheckbox() {
const [showToolbar, setShowToolbar] = useState(true);
const [showSidebar, setShowSidebar] = useState(false);
const [showStatusbar, setShowStatusbar] = useState(true);
return (
보기 설정} />
보기 옵션
툴바 표시
사이드바 표시
상태바 표시
);
}
```
### With Radio Items
Radio Item을 사용합니다.
```tsx
'use client';
import { useState } from 'react';
import { Button, Menu } from '@vapor-ui/core';
export default function MenuRadio() {
const [fontSize, setFontSize] = useState('medium');
return (
글꼴 크기} />
글꼴 크기 선택작게 (12px)보통 (14px)크게 (16px)매우 크게 (18px)
);
}
```
### With Submenu
Submenu를 구성할 수 있습니다.
```tsx
'use client';
import { Button, Menu } from '@vapor-ui/core';
export default function MenuSubmenu() {
return (
서브메뉴} />
새 파일파일 열기최근 파일document.txtpresentation.pptxspreadsheet.xlsx더 많은 파일...내보내기PDF로 내보내기이미지로 내보내기HTML로 내보내기종료
);
}
```
## Props Table
***
### Menu.Root
| Prop | Type | Default | Description |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `orientation` | `horizontal`, `vertical` | `vertical` | 메뉴의 시각적 방향입니다. 로빙 포커스가 위/아래 또는 왼쪽/오른쪽 화살표 키를 사용하는지 제어합니다. |
| **children** | `undefined`, `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `loop` | `false`, `true` | `true` | 키보드 포커스를 첫 번째 항목으로 다시 루프할지 여부 화살표 키를 사용할 때 목록 끝에 도달하면. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시해야 하는지 여부입니다. |
| `open` | `false`, `true` | - | 메뉴가 현재 열려 있는지 여부입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | 메뉴가 처음에 열려 있는지 여부입니다.
제어되는 메뉴를 렌더링하려면 대신 `open` 속성을 사용하세요. |
| `modal` | `false`, `true` | `true` | 메뉴가 열려 있을 때 모달 상태에 들어가는지 여부를 결정합니다. - `true`: 사용자 상호작용이 메뉴로 제한됩니다: 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 상호작용이 비활성화됩니다. - `false`: 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 메뉴가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 메뉴가 닫힐 때 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. |
| `closeParentOnEsc` | `false`, `true` | `true` | 하위 메뉴에 있을 때, Escape 키를 눌렀을 때 전체 메뉴를 닫을지 현재 하위 메뉴만 닫을지 결정합니다. |
| `actionsRef` | `RefObject` | - | 명령형 작업에 대한 ref입니다. - `unmount`: 지정된 경우, 메뉴가 닫힐 때 마운트 해제되지 않습니다. 대신, `unmount` 함수를 호출하여 메뉴를 수동으로 마운트 해제해야 합니다. 메뉴의 애니메이션이 외부 라이브러리에 의해 제어되는 경우에 유용합니다. |
### Menu.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 구성 요소가 사용자 상호작용을 무시해야 하는지 여부. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | 구성 요소가 교체할 때 네이티브 '\' 요소를 렌더링하는지 여부 'render' 소품을 통해. 렌더링된 요소가 버튼이 아닌 경우 'false'으로 설정합니다(예: '\
`openOnHover` prop이 필요합니다. |
### Menu.PositionerPrimitive
| Prop | Type | Default | Description |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 메뉴가 닫힐 때 집중할 요소를 결정합니다. - `false`: 초점을 움직이지 마세요. - `true`: 기본 동작(트리거 또는 이전에 집중된 요소)에 따라 초점을 이동합니다. - `RefObject`: 초점을 참조 요소로 이동합니다. - `기능`: 상호작용 유형(`마우스`, `터치`, `펜` 또는 `키보드`)으로 호출됩니다. 요소를 초점 맞추기 위해 `참`을, 기본 동작을 사용하기 위해 `참`을, 아무것도 하지 않기 위해 `거짓`/`정의되지 않음`을 반환합니다. |
| `portalElement` | `ReactElement` | - | |
| `positionerElement` | `ReactElement` | - | |
#### Menu.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 팝업이 숨겨진 상태에서 포털을 DOM에 마운트할지 여부. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링하기 위해 상위 요소입니다. |
#### Menu.PositionerPrimitive
| Prop | Type | Default | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 뷰포트에서 스크롤되어 사라진 후에도 팝업을 뷰포트 내에 유지할지 여부입니다. |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 위치시킬 요소입니다. 기본적으로 팝업은 트리거를 기준으로 위치합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 팝업을 지정된 측면에 상대적으로 정렬하는 방법입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 어떤 CSS `위치` 속성을 사용할지 결정합니다. |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `bottom` | Anchor 요소의 어느 쪽에 팝업을 정렬할지 결정합니다. 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리(픽셀 단위). 또한 앵커의 치수를 읽기 위해 거리를 반환하는 기능도 허용합니다 포지셔너 요소와 그 측면 및 정렬. 함수는 다음 속성을 가진 '데이터' 객체 매개변수를 가져옵니다: - 'data.anchor': '폭'과 '높이' 속성을 가진 앵커 요소의 치수. - 'data.positioner': '폭'과 '높이' 속성을 가진 위치 요소의 치수. - 'data.side': 포지셔너가 앵커 요소의 어느 쪽에 정렬되어 있는지를 나타냅니다. - 'data.align': 지정된 변에 대해 위치 지정자가 정렬되는 방식. |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따라 추가 오프셋(픽셀 단위). 또한 오프셋을 반환하여 앵커의 치수를 읽는 기능도 허용합니다 포지셔너 요소와 그 측면 및 정렬. 함수는 다음 속성을 가진 '데이터' 객체 매개변수를 가져옵니다: - 'data.anchor': '폭'과 '높이' 속성을 가진 앵커 요소의 치수. - 'data.positioner': '폭'과 '높이' 속성을 가진 위치 요소의 치수. - 'data.side': 포지셔너가 앵커 요소의 어느 쪽에 정렬되어 있는지를 나타냅니다. - 'data.align': 지정된 변에 대해 위치 지정자가 정렬되는 방식. |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 구분하는 요소 또는 사각형입니다. |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계의 가장자리에서 유지할 추가 공간입니다. |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이에 유지할 최소 거리입니다.
화살표 요소가 팝업의 둥근 모서리 밖으로 튀어나오는 것을 방지하는 데 사용합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 위치 지정 앵커의 레이아웃 이동을 추적하는지 여부입니다. |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업을 위치 지정할 때 충돌을 처리하는 방법을 결정합니다. |
#### Menu.PopupPrimitive
| Prop | Type | Default | Description |
| ------------ | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)을 기준으로 포커스를 이동합니다. - `RefObject`: 참조 요소로 포커스를 이동합니다. - `function`: 상호작용 유형(`mouse`, `touch`, `pen`, 또는 `keyboard`)과 함께 호출됩니다. 포커스를 이동할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. |
### Menu.CheckboxItemIndicatorPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중에 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `onClick` | `MouseEventHandler` | - | 메뉴 항목에 대한 클릭 핸들러입니다. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시해야 하는지 여부입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | 컴포넌트가 `render` 속성을 통해 대체될 때 네이티브 `<button>` 요소를 렌더링할지 여부입니다. 렌더링된 요소가 네이티브 버튼인 경우 `true`로 설정하세요. |
| `closeOnClick` | `false`, `true` | `true` | 항목이 클릭될 때 메뉴를 닫을지 여부입니다. |
### Menu.RadioItemIndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------------ | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `orientation` | `horizontal`, `vertical` | `horizontal` | 구분자의 방향입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Menu.Group
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | 컴포넌트의 내용입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Menu.GroupLabel
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Menu.SubmenuRoot
| Prop | Type | Default | Description |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `orientation` | `horizontal`, `vertical` | `vertical` | 메뉴의 시각적 방향. 회전 초점이 위쪽/아래쪽 화살표 키를 사용하는지 왼쪽/오른쪽 화살표 키를 사용하는지 제어합니다. |
| **children** | `undefined`, `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `loop` | `false`, `true` | `true` | 키보드 포커스를 화살표 키를 사용하여 목록 끝에 도달했을 때 첫 번째 항목으로 다시 루프할지 여부입니다. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시해야 하는지 여부입니다. |
| `open` | `false`, `true` | - | 메뉴가 현재 열려 있는지 여부입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | 메뉴가 처음에 열려 있는지 여부입니다.
제어되는 메뉴를 렌더링하려면 대신 `open` 속성을 사용하세요. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 메뉴가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 메뉴가 닫힐 때 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. |
| `delay` | `number` | `100` | 메뉴가 호버될 때 열리기 전에 대기하는 시간입니다. 밀리초 단위로 지정합니다.
`openOnHover` 속성이 필요합니다. |
| `closeDelay` | `number` | `0` | 메뉴가 호버되어 열렸을 때 닫히기 전에 대기하는 시간입니다. 밀리초 단위로 지정합니다.
`openOnHover` 속성이 필요합니다. |
| `openOnHover` | `false`, `true` | `true` | 서브메뉴가 트리거에 마우스를 올렸을 때 열릴지 여부입니다. |
| `actionsRef` | `RefObject` | - | 명령적 행동에 대한 참조. - `unmount`: 지정되면 메뉴를 닫았을 때 언마운트되지 않습니다. 대신 메뉴를 수동으로 마운트 해제하려면 'unmount' 기능을 호출해야 합니다. 메뉴의 애니메이션이 외부 라이브러리에 의해 제어될 때 유용합니다. - `close`: 지정하면 메뉴를 긴급하게 닫을 수 있습니다. |
### Menu.SubmenuTriggerItem
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `onClick` | `MouseEventHandler` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | 구성 요소가 교체할 때 네이티브 `<button>` 요소를 렌더링하는지 여부 `render` 소품을 통해. 렌더링된 요소가 네이티브 버튼인 경우 `true`로 설정합니다. |
### Menu.SubmenuPopup
| Prop | Type | Default | Description |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다 (트리거 또는 이전에 포커스된 요소). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, `true`를 반환하여 기본 동작을 사용하거나, `false`/`undefined`를 반환하여 아무 작업도 수행하지 않습니다. |
| `portalElement` | `ReactElement` | - | |
| `positionerElement` | `ReactElement` | - | |
#### Menu.SubmenuPopupPrimitive
| Prop | Type | Default | Description |
| ------------ | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 메뉴가 닫힐 때 포커스할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다(트리거 또는 이전에 포커스된 요소). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. |
### Menu.CheckboxItem
| Prop | Type | Default | Description |
| ----------------- | -------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `onClick` | `MouseEventHandler` | - | 메뉴 항목의 클릭 핸들러입니다. |
| `defaultChecked` | `false`, `true` | `false` | 체크박스 항목이 초기에 선택되어 있는지 여부입니다.
제어 컴포넌트로 렌더링하려면 `checked` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| `checked` | `false`, `true` | - | 체크박스 항목이 현재 선택되어 있는지 여부입니다.
비제어 컴포넌트로 렌더링하려면 `defaultChecked` prop을 대신 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | `render` prop을 통해 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소로 렌더링되는지 여부입니다. 렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정하세요. |
| `closeOnClick` | `false`, `true` | `false` | 항목을 클릭했을 때 메뉴를 닫을지 여부입니다. |
| `onCheckedChange` | `(checked: boolean, eventDetails: ChangeEventDetails) => void` | - | 체크박스 항목이 선택되거나 선택 해제될 때 호출되는 이벤트 핸들러입니다. |
#### Menu.CheckboxItemPrimitive
| Prop | Type | Default | Description |
| ----------------- | -------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `onClick` | `MouseEventHandler` | - | 메뉴 항목의 클릭 핸들러입니다. |
| `defaultChecked` | `false`, `true` | `false` | 체크박스 항목이 초기에 선택되어 있는지 여부입니다.
제어 컴포넌트로 렌더링하려면 `checked` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| `checked` | `false`, `true` | - | 체크박스 항목이 현재 선택되어 있는지 여부입니다.
비제어 컴포넌트로 렌더링하려면 `defaultChecked` prop을 대신 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | `render` prop을 통해 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소로 렌더링되는지 여부입니다. 렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정하세요. |
| `closeOnClick` | `false`, `true` | `false` | 항목을 클릭했을 때 메뉴를 닫을지 여부입니다. |
| `onCheckedChange` | `(checked: boolean, eventDetails: ChangeEventDetails) => void` | - | 체크박스 항목이 선택되거나 선택 해제될 때 호출되는 이벤트 핸들러입니다. |
#### Menu.CheckboxItemIndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 체크박스 항목이 선택되지 않았을 때 HTML 요소를 DOM에 유지할지 여부입니다. |
### Menu.RadioGroup
| Prop | Type | Default | Description |
| --------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | 컴포넌트의 콘텐츠입니다. |
| `defaultValue` | `any` | - | 초기에 선택되어야 하는 라디오 항목의 비제어 값입니다.
제어 컴포넌트로 렌더링하려면 `value` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| `value` | `any` | - | 현재 선택되어야 하는 라디오 항목의 제어 값입니다.
비제어 컴포넌트로 렌더링하려면 `defaultValue` prop을 대신 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `onValueChange` | `(value: any, eventDetails: ChangeEventDetails) => void` | - | 선택된 값이 변경될 때 호출되는 함수입니다. |
### Menu.RadioItem
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `onClick` | `MouseEventHandler` | - | 메뉴 항목의 클릭 핸들러입니다. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| **value** | `any` | - | 라디오 항목의 값입니다. 이 값은 항목이 선택될 때 MenuRadioGroup에 설정됩니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | `render` prop을 통해 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소로 렌더링되는지 여부입니다. 렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정하세요. |
| `closeOnClick` | `false`, `true` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부입니다. |
#### Menu.RadioItemPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 일치할 때 사용할 텍스트 레이블을 재정의합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `onClick` | `MouseEventHandler` | - | 메뉴 항목의 클릭 핸들러입니다. |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| **value** | `any` | - | 라디오 항목의 값입니다. 이 값은 항목이 선택될 때 MenuRadioGroup에 설정됩니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | `render` prop을 통해 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소로 렌더링되는지 여부입니다. 렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정하세요. |
| `closeOnClick` | `false`, `true` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부입니다. |
#### Menu.RadioItemIndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 라디오 항목이 비활성화되어 있을 때 HTML 요소를 DOM에 유지할지 여부입니다. |
# MultiSelect
URL: /docs/components/multi-select
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/multi-select.mdx
MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다.
***
title: 'MultiSelect'
site\_name: 'MultiSelect - Vapor Core'
description: 'MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다.'
-----------------------------------------------------------------------------------------------------------------------
```tsx
import { MultiSelect } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
export default function DefaultMultiSelect() {
return (
{fonts.map((font) => (
{font.label}
))}
);
}
```
## Property
***
### Size
MultiSelect의 크기를 설정합니다.
```tsx
import { HStack, MultiSelect, Text, VStack } from '@vapor-ui/core';
const options = [
{ label: '옵션 1', value: 'option1' },
{ label: '옵션 2', value: 'option2' },
{ label: '옵션 3', value: 'option3' },
];
export default function MultiSelectSize() {
return (
sm
md
lg
xl
);
}
const MultiSelectTemplate = (props: MultiSelect.Root.Props) => {
return (
{options.map((option) => (
{option.label}
))}
);
};
```
### Controlled State
MultiSelect의 선택 상태를 제어합니다.
```tsx
'use client';
import { useState } from 'react';
import { Button, HStack, MultiSelect, Text, VStack } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
export default function MultiSelectControlled() {
const [value, setValue] = useState([]);
const handleValueChange = (newValue: unknown) => {
setValue(newValue as string[]);
};
return (
{fonts.map((font) => (
{font.label}
))}
선택된 값:{' '}
{value.length > 0 ? value.join(', ') : '없음'}
setValue(['serif', 'mono'])}>
Serif, Mono 선택
setValue([])}>
모두 해제
);
}
```
### States
MultiSelect의 다양한 상태를 설정합니다.
```tsx
import { HStack, MultiSelect, Text, VStack } from '@vapor-ui/core';
const options = [
{ label: '옵션 1', value: 'option1' },
{ label: '옵션 2', value: 'option2' },
{ label: '옵션 3', value: 'option3' },
];
export default function MultiSelectStates() {
return (
default
disabled
readOnly
invalid
);
}
export const MultiSelectTemplate = (props: MultiSelect.Root.Props) => {
return (
{options.map((option) => (
{option.label}
))}
);
};
```
## Examples
***
### Items Configuration
다양한 형태의 아이템 데이터를 사용합니다.
```tsx
import { MultiSelect, Text, VStack } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
const languages = {
javascript: 'JavaScript',
typescript: 'TypeScript',
python: 'Python',
java: 'Java',
go: 'Go',
};
export default function MultiSelectItems() {
return (
배열 형태의 아이템
{fonts.map((font) => (
{font.label}
))}
객체 형태의 아이템
{Object.entries(languages).map(([value, label]) => (
{label}
))}
);
}
```
### Grouping Options
옵션을 그룹으로 묶어 구조화합니다.
```tsx
import { Box, MultiSelect } from '@vapor-ui/core';
export default function MultiSelectGrouping() {
return (
} $css={{ width: '400px' }} />
프론트엔드ReactVueAngularSvelte백엔드Node.jsPythonJavaGo데이터베이스MySQLPostgreSQLMongoDBRedis
);
}
```
### Custom Value Display
MultiSelect.Value에 함수형 children을 제공하여 선택된 값들의 표시 방법을 커스터마이징할 수 있습니다. 기본적으로는 배지 형태로 표시되지만, 문자열이나 커스텀 컴포넌트로 변경할 수 있습니다.
```tsx
import { Badge, Flex, HStack, MultiSelect, Text, VStack } from '@vapor-ui/core';
const languages = {
javascript: 'JavaScript',
typescript: 'TypeScript',
python: 'Python',
java: 'Java',
go: 'Go',
rust: 'Rust',
};
const renderRestValue = (value: string[]) => {
if (!value.length) {
return '언어 선택';
}
const displayValues = value.slice(0, 2);
const remainingCount = value.length - 2;
return (
{displayValues.map((val) => (
{languages[val as keyof typeof languages]}
))}
{remainingCount > 0 && (
+{remainingCount} more
)}
);
};
const renderStringValue = (value: string[]) => {
if (!value.length) {
return '언어 선택';
}
return value.map((v) => languages[v as keyof typeof languages]).join(', ');
};
export default function MultiSelectCustomValue() {
return (
커스텀 값 표시 (최대 2개 + 더보기)
{renderRestValue}
{Object.entries(languages).map(([value, label]) => (
{label}
))}
문자열 형태 표시
{renderStringValue}
{Object.entries(languages).map(([value, label]) => (
{label}
))}
);
}
```
## Props Table
***
### MultiSelect.Root
| Prop | Type | Default | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | `string` | - | 셀렉트 컴포넌트의 고유 식별자 |
| `name` | `string` | - | 폼 제출 시 필드를 식별하는 이름 |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `defaultValue` | `null`, `Value[]` | `null` | 컴포넌트가 처음 렌더링될 때의 비제어 값입니다.
제어 컴포넌트로 사용하려면 `value` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `Value[]` | - | 셀렉트의 현재 선택된 값 배열 |
| `open` | `false`, `true` | - | 셀렉트 팝업의 현재 열림 상태 |
| `readOnly` | `false`, `true` | `false` | 사용자가 셀렉트 팝업에서 다른 옵션을 선택할 수 없도록 할지 여부 |
| `required` | `false`, `true` | `false` | 폼 제출 전 값을 반드시 선택해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `onValueChange` | `(value: Value[], eventDetails: ChangeEventDetails) => void` | - | 셀렉트 값이 변경될 때 호출되는 콜백. 제어 컴포넌트에서 사용 |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 input 요소에 접근하기 위한 ref |
| `defaultOpen` | `false`, `true` | `false` | select 팝업의 초기 열림 상태 (비제어 컴포넌트)
제어 컴포넌트로 사용하려면 `open` prop을 사용하세요. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 셀렉트 팝업이 열리거나 닫힐 때 호출되는 이벤트 핸들러 |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 셀렉트 팝업이 열리거나 닫힌 후 애니메이션이 완료되면 호출되는 이벤트 핸들러 |
| `modal` | `false`, `true` | `true` | select 열림 시 모달 상태 진입 여부 - `true`: select로 상호작용이 제한됩니다. 문서 스크롤이 잠기고 외부 요소와의 포인터 상호작용이 비활성화됩니다. - `false`: 문서의 나머지 부분과 상호작용이 가능합니다. |
| `actionsRef` | `RefObject` | - | 명령형 동작을 위한 ref - `unmount`: 지정 시 select가 닫힐 때 언마운트되지 않습니다. 대신 수동으로 `unmount` 함수를 호출해야 합니다. 외부 라이브러리로 애니메이션을 제어할 때 유용합니다. |
| `items` | `Record`, `readonly { label: ReactNode; value: Value; }[]` | - | select 팝업에 렌더링되는 아이템 데이터 구조 지정 시 `<Select.Value>`가 원시 값 대신 선택된 아이템의 라벨을 렌더링합니다. |
| `itemToStringLabel` | `(itemValue: Value) => string` | - | 아이템 값이 객체인 경우(`<Select.Item value={object}>`) 트리거에 표시하기 위해 객체 값을 문자열로 변환하는 함수 객체 형태가 `{ value, label }`이면 이 prop 없이도 자동으로 라벨이 사용됩니다. |
| `itemToStringValue` | `(itemValue: Value) => string` | - | 아이템 값이 객체인 경우(`<Select.Item value={object}>`) 폼 제출을 위해 객체 값을 문자열로 변환하는 함수 객체 형태가 `{ value, label }`이면 이 prop 없이도 자동으로 값이 사용됩니다. |
| `isItemEqualToValue` | `(itemValue: Value, value: Value) => boolean` | - | select 아이템 값이 현재 선택된 값과 일치하는지 판단하는 커스텀 비교 로직 참조가 다른 객체 값을 사용할 때 유용합니다. 기본값은 `Object.is` 비교입니다. |
| `size` | `sm`, `md`, `lg`, `xl` | - | |
| `invalid` | `false`, `true` | - | |
### MultiSelect.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | 트리거 버튼 내부에 렌더링할 콘텐츠 |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### MultiSelect.TriggerPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | 트리거 버튼 내부에 렌더링할 콘텐츠 |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### MultiSelect.TriggerIconPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
#### MultiSelect.ValuePrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal`, `(value: any) => ReactNode` | - | 선택된 값의 포맷을 지정하는 `ReactNode`를 반환하는 함수를 받습니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
#### MultiSelect.PlaceholderPrimitive
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### MultiSelect.Popup
| Prop | Type | Default | Description |
| ------------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `portalElement` | `ReactElement` | - | 커스텀 포털 요소. 기본값은 PortalPrimitive입니다. |
| `positionerElement` | `ReactElement` | - | 커스텀 포지셔너 요소. 기본값은 PositionerPrimitive입니다. |
#### MultiSelect.PortalPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 부모 요소 |
#### MultiSelect.PositionerPrimitive
| Prop | Type | Default | Description |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 뷰포트에서 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부 |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 위치시킬 기준 요소 기본적으로 팝업은 트리거를 기준으로 위치합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 지정된 방향에 대한 팝업의 정렬 방법 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `alignItemWithTrigger` | `false`, `true` | `true` | 선택된 아이템의 텍스트가 트리거의 값 텍스트와 정렬되도록 포지셔너가 트리거를 덮을지 여부 마우스 입력에만 적용되며 공간이 부족하면 자동으로 비활성화됩니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 사용할 CSS `position` 속성을 결정 |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `bottom` | 앵커 요소의 어느 방향에 팝업을 정렬할지 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 거리를 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따른 추가 오프셋 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 오프셋을 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 정의하는 요소 또는 사각형 |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계 가장자리로부터 유지할 추가 여백 |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이의 최소 거리
팝업의 둥근 모서리에서 화살표가 튀어나오는 것을 방지합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 앵커의 레이아웃 변화를 추적할지 여부 |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업 위치 지정 시 충돌 처리 방법을 결정 |
#### MultiSelect.PopupPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### MultiSelect.Item
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `label` | `string` | - | 키보드 텍스트 탐색 시 항목을 매칭하는 데 사용할 텍스트 레이블을 지정합니다.
제공되지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `any` | `null` | 이 셀렉트 항목을 식별하는 고유 값 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### MultiSelect.ItemPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `label` | `string` | - | 키보드 텍스트 탐색 시 항목을 매칭하는 데 사용할 텍스트 레이블을 지정합니다.
제공되지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `any` | `null` | 이 셀렉트 항목을 식별하는 고유 값 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### MultiSelect.ItemIndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 항목이 선택되지 않았을 때도 HTML 요소를 DOM에 유지할지 여부 |
### MultiSelect.Separator
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------------ | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `orientation` | `horizontal`, `vertical` | `horizontal` | 구분선 방향 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### MultiSelect.Group
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### MultiSelect.GroupLabel
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# NavigationMenu
URL: /docs/components/navigation-menu
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/navigation-menu.mdx
여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다.
***
title: 'NavigationMenu'
site\_name: 'NavigationMenu - Vapor Core'
description: '여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다.'
-------------------------------------------------------------
```tsx
import { NavigationMenu } from '@vapor-ui/core';
export default function DefaultNavigationMenu() {
return (
Default Link
Current Link
Disabled Link
);
}
```
## Property
***
### Size
NavigationMenu의 크기를 설정합니다.
```tsx
import { HStack, NavigationMenu, Text, VStack } from '@vapor-ui/core';
export default function NavigationMenuSize() {
return (
sm
Home
About
md
Home
About
lg
Home
About
xl
Home
About
);
}
```
### Direction
NavigationMenu의 방향을 설정합니다.
```tsx
import { HStack, NavigationMenu, Text, VStack } from '@vapor-ui/core';
export default function NavigationMenuDirection() {
return (
horizontal
Home
About
Contact
vertical
Home
About
Contact
);
}
```
### Disabled
NavigationMenu의 비활성화 상태를 설정합니다.
```tsx
import { NavigationMenu } from '@vapor-ui/core';
export default function NavigationMenuDisabled() {
return (
기본 상태와 비활성화 상태
활성 링크
비활성화 링크
다른 활성 링크
현재 페이지와 비활성화 상태
홈
현재 페이지
비활성화 링크
연락처
);
}
```
### Current
NavigationMenu의 현재 페이지 상태를 설정합니다.
```tsx
import { NavigationMenu } from '@vapor-ui/core';
export default function NavigationMenuCurrent() {
return (
현재 페이지 표시
홈
제품 (현재 페이지)
서비스회사소개
);
}
```
## Examples
***
### With Icons
아이콘과 함께 사용합니다.
```tsx
import { NavigationMenu } from '@vapor-ui/core';
import { HomeIcon, SettingIcon, StarIcon, UserIcon } from '@vapor-ui/icons';
export default function NavigationMenuWithIcon() {
return (
아이콘과 텍스트 조합
홈
즐겨찾기
프로필
설정
아이콘만 사용
세로 방향에서의 아이콘
대시보드
즐겨찾기
사용자 관리
시스템 설정
);
}
```
### With Popup
팝오버 형태로 사용합니다.
```tsx
import { NavigationMenu, VStack } from '@vapor-ui/core';
export default function NavigationMenuSelected() {
return (
선택된 상태 표시
아이템 1
내용물 1
아이템 2
내용물 2
아이템 3
내용물 3
);
}
```
### Flexible Usage
NavigationMenu의 모든 프리셋 컴포넌트를 분리하여 사용합니다.
```tsx
import { NavigationMenu } from '@vapor-ui/core';
export default function NavigationMenuSelected() {
return (
홈
아이템
내용물
);
}
```
## Props Table
***
### NavigationMenu.Root
| Prop | Type | Default | Description |
| ---------------------- | -------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `direction` | `horizontal`, `vertical` | - | |
| `stretch` | `false`, `true` | - | |
| `size` | `sm`, `md`, `lg`, `xl` | - | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `orientation` | `horizontal`, `vertical` | `horizontal` | 네비게이션 메뉴의 방향을 지정합니다. |
| **aria-label** | `string` | - | 현재 요소를 설명하는 레이블 문자열을 정의합니다. 스크린 리더 사용자를 위한 접근성 속성입니다. |
| `defaultValue` | `any` | `null` | 초기에 선택되어야 하는 항목의 비제어 값입니다.
제어 방식의 네비게이션 메뉴를 렌더링하려면 `value` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | - | |
| `value` | `any` | `null` | 현재 열려있어야 하는 네비게이션 메뉴 항목의 제어 값입니다. 값이 null이 아닐 때 메뉴가 열리고, null일 때 메뉴가 닫힙니다.
비제어 방식의 네비게이션 메뉴를 렌더링하려면 `defaultValue` prop을 대신 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `actionsRef` | `RefObject` | - | 명령형 작업을 위한 ref입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 네비게이션 메뉴가 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. |
| `onValueChange` | `(value: any, eventDetails: ChangeEventDetails) => void` | - | 값이 변경될 때 호출되는 콜백 함수입니다. |
| `delay` | `number` | `50` | 네비게이션 메뉴를 열기 전에 대기하는 시간입니다. 밀리초 단위로 지정됩니다. |
| `closeDelay` | `number` | `50` | 네비게이션 메뉴를 닫기 전에 대기하는 시간입니다. 밀리초 단위로 지정됩니다. |
### NavigationMenu.List
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### NavigationMenu.Item
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `value` | `any` | - | 이 네비게이션 메뉴 항목을 식별하는 고유 값입니다. 값이 제공되지 않으면 고유 ID가 자동으로 생성됩니다. 프로그래밍 방식으로 네비게이션 메뉴를 제어할 때 사용합니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### NavigationMenu.Link
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `current` | `false`, `true` | - | 현재 페이지임을 나타냅니다. true일 경우 aria-current='page'가 설정됩니다. |
| `disabled` | `false`, `true` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `closeOnClick` | `false`, `true` | `false` | 링크를 클릭했을 때 네비게이션 메뉴를 닫을지 여부를 결정합니다. |
### NavigationMenu.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | Whether the component renders a native `<button>` element when replacing it via the `render` prop. Set to `false` if the rendered element is not a button (e.g. `<div>`). |
#### NavigationMenu.TriggerPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | `render` prop을 통해 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 결정합니다. 렌더링된 요소가 버튼이 아니면(예: `<div>`) `false`로 설정하세요. |
#### NavigationMenu.TriggerIndicatorPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### NavigationMenu.Content
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
#### NavigationMenu.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `container` | `null`, `HTMLElement`, `RefObject` | - | 포털 요소를 렌더링할 부모 요소입니다. |
| `keepMounted` | `false`, `true` | `false` | 팝업이 숨겨져 있는 동안 DOM에 포털을 마운트된 상태로 유지할지 여부를 결정합니다. |
#### NavigationMenu.PositionerPrimitive
| Prop | Type | Default | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 화면 밖으로 스크롤된 후에도 팝업을 뷰포트 내에 유지할지 여부를 결정합니다. |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 배치할 기준 요소입니다. 기본적으로 팝업은 트리거를 기준으로 배치됩니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 지정된 방향을 기준으로 팝업을 정렬하는 방법을 결정합니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 사용할 CSS `position` 속성을 결정합니다. |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `bottom` | 팝업을 앵커 요소의 어느 쪽에 정렬할지 결정합니다. 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리(픽셀)입니다. 또한 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 거리를 반환하는 함수도 허용합니다.
함수는 다음 속성을 가진 `data` 객체 매개변수를 받습니다: - `data.anchor`: `width`와 `height` 속성을 가진 앵커 요소의 크기 - `data.positioner`: `width`와 `height` 속성을 가진 포지셔너 요소의 크기 - `data.side`: 포지셔너가 앵커 요소의 어느 쪽에 정렬되어 있는지 - `data.align`: 지정된 방향을 기준으로 포지셔너가 어떻게 정렬되어 있는지 |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따라 추가되는 오프셋(픽셀)입니다. 또한 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 오프셋을 반환하는 함수도 허용합니다.
함수는 다음 속성을 가진 `data` 객체 매개변수를 받습니다: - `data.anchor`: `width`와 `height` 속성을 가진 앵커 요소의 크기 - `data.positioner`: `width`와 `height` 속성을 가진 포지셔너 요소의 크기 - `data.side`: 포지셔너가 앵커 요소의 어느 쪽에 정렬되어 있는지 - `data.align`: 지정된 방향을 기준으로 포지셔너가 어떻게 정렬되어 있는지 |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 구분하는 요소 또는 사각형입니다. |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계 가장자리로부터 유지할 추가 공간입니다. |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이에 유지할 최소 거리입니다.
화살표 요소가 팝업의 둥근 모서리 밖으로 나가는 것을 방지하는 데 사용합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 위치 지정 앵커의 레이아웃 변경을 추적할지 여부를 결정합니다. |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업 위치 지정 시 충돌을 처리하는 방법을 결정합니다. |
#### NavigationMenu.PopupPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### NavigationMenu.Viewport
| Prop | Type | Default | Description |
| ------------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `portalElement` | `ReactElement` | - | |
| `positionerElement` | `ReactElement` | - | |
| `popupElement` | `ReactElement` | - | |
#### NavigationMenu.ViewportPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Pagination
URL: /docs/components/pagination
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/pagination.mdx
Pagination은 콘텐츠를 페이지 단위로 탐색할 수 있도록 돕는 네비게이션 컴포넌트입니다.
***
title: 'Pagination'
site\_name: 'Pagination - Vapor Core'
description: 'Pagination은 콘텐츠를 페이지 단위로 탐색할 수 있도록 돕는 네비게이션 컴포넌트입니다.'
-------------------------------------------------------------------
```tsx
import { Pagination } from '@vapor-ui/core';
export default function DefaultPagination() {
return (
);
}
```
## Property
### Sibling Count
Pagination에서 현재 페이지 주변에 표시할 페이지 번호의 개수를 설정합니다.
```tsx
import { Pagination, Text, VStack } from '@vapor-ui/core';
export default function PaginationSiblingCount() {
return (
1 Sibling3 Sibling
);
}
```
### Boundary Count
Pagination의 시작과 끝에 항상 표시할 페이지 번호의 개수를 설정합니다.
```tsx
import { Pagination, Text, VStack } from '@vapor-ui/core';
export default function PaginationBoundaryCount() {
return (
1 Boundary3 Boundary
);
}
```
### Disabled
Pagination 버튼들의 비활성화 여부를 결정하는 옵션입니다.
```tsx
import { Pagination } from '@vapor-ui/core';
export default function PaginationDisabled() {
return (
);
}
```
### Size
Pagination의 크기를 설정합니다.
```tsx
import { HStack, Pagination, Text, VStack } from '@vapor-ui/core';
export default function PaginationSize() {
return (
sm
md
lg
xl
);
}
```
## Examples
### Controlled
Pagination 컴포넌트를 제어 컴포넌트로 사용하는 예시입니다.
```tsx
import { useState } from 'react';
import { Button, HStack, Pagination, Text, VStack } from '@vapor-ui/core';
export default function PaginationControlled() {
const [page, setPage] = useState(7);
return (
Current Page is, {page} setPage(7)}>
Move to Page 7
);
}
```
***
### Pagination.Root
| Prop | Type | Default | Description |
| --------------- | ---------------------- | ------- | ---------------------------------------------- |
| `defaultPage` | `number` | `1` | 초기 렌더링 시 활성화되어야 하는 페이지 번호입니다. |
| `page` | `number` | `-` | 활성화할 페이지의 제어된 값입니다. onPageChange와 함께 사용해야 합니다. |
| `onPageChange` | `function` | `-` | 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | Pagination의 높이·타이포그래피 크기 등을 제어합니다. |
| `disabled` | `boolean` | `false` | Pagination의 비활성화 여부를 설정합니다. |
| `totalPages` | `number` | `1` | 화면에 표시할 전체 페이지 수를 설정합니다. |
| `siblingCount` | `number` | `1` | 현재 페이지 양쪽에 표시할 페이지 번호의 개수를 설정합니다. |
| `boundaryCount` | `number` | `1` | 처음과 마지막에 표시할 페이지 번호의 개수를 설정합니다. |
| `children` | `ReactNode` | `-` | 네비게이션 메뉴의 자식 컴포넌트들입니다. |
# Popover
URL: /docs/components/popover
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/popover.mdx
Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.
***
title: 'Popover'
site\_name: 'Popover - Vapor Core'
description: 'Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.'
-------------------------------------------------------------------------------------------------------
```tsx
'use client';
import { Button, Popover } from '@vapor-ui/core';
export default function DefaultPopover() {
return (
}>팝오버 열기
알림새로운 메시지 3개와 알림 1개가 있습니다.
);
}
```
## Property
***
### PositionerProps
Popover가 나타날 위치와 정렬을 설정합니다.
```tsx
'use client';
import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core';
export default function PopoverPositioning() {
return (
Side
top
}>
상단 팝오버
상단 팝오버
트리거 위쪽에 표시되는 팝오버입니다.
right
}>
우측 팝오버
우측 팝오버
트리거 오른쪽에 표시되는 팝오버입니다.
bottom
}>
하단 팝오버
하단 팝오버
트리거 아래쪽에 표시되는 팝오버입니다.
left
}>
좌측 팝오버
좌측 팝오버
트리거 왼쪽에 표시되는 팝오버입니다.
Alignment
start
}>
시작점 정렬
시작점 정렬
트리거의 시작점에 정렬된 팝오버입니다.
center
}>
중앙 정렬
중앙 정렬
트리거의 중앙에 정렬된 팝오버입니다.
end
}>
끝점 정렬
끝점 정렬
트리거의 끝점에 정렬된 팝오버입니다.
);
}
```
### Offset
Popover와 트리거 간의 거리를 조정합니다.
```tsx
'use client';
import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core';
export default function PopoverOffset() {
return (
default
}>
기본 오프셋
기본 오프셋
기본 8px 오프셋이 적용된 팝오버입니다.
sideOffset 16
}>
사이드 오프셋 16px
사이드 오프셋 16px
트리거로부터 16px 떨어진 팝오버입니다.
alignOffset 100
}>
정렬 오프셋 100px
정렬 오프셋 100px
정렬 축에서 100px 이동한 팝오버입니다.
combined
}>
복합 오프셋
복합 오프셋
사이드 24px, 정렬 -100px 오프셋이 적용된 팝오버입니다.
);
}
```
## Examples
***
### Content Variations
간단한 텍스트부터 복잡한 상호작용 요소까지 다양한 콘텐츠를 표시합니다.
```tsx
'use client';
import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core';
export default function PopoverPopup() {
return (
text
}>
간단한 텍스트
간단한 팝오버 메시지입니다.
title + desc
}>
제목과 설명
알림
새로운 업데이트가 있습니다. 확인해보세요.
interactive
}>
상호작용 콘텐츠
설정원하는 설정을 선택하세요.
옵션 1
}
/>
옵션 2
}
/>
);
}
```
## Props Table
***
### Popover.Root
| Prop | Type | Default | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `open` | `false`, `true` | - | 팝오버의 현재 열림/닫힘 상태를 제어합니다.
제어되는 팝오버를 렌더링하려면 대신 `open` prop을 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | 팝오버가 처음에 열려 있는지 여부를 지정합니다.
제어되는 팝오버를 렌더링하려면 대신 `open` prop을 사용하세요. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 팝오버가 열리거나 닫힐 때 호출되는 이벤트 핸들러 |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 팝오버가 열리거나 닫힌 후 애니메이션이 완료되면 호출되는 이벤트 핸들러 |
| `actionsRef` | `RefObject` | - | 명령형 액션에 대한 ref입니다. - `unmount`: 지정된 경우, 팝오버가 닫힐 때 언마운트되지 않습니다. 대신 `unmount` 함수를 호출하여 팝오버를 수동으로 언마운트해야 합니다. 외부 라이브러리에서 팝오버의 애니메이션을 제어할 때 유용합니다. |
| `modal` | `false`, `true`, `trap-focus` | `false` | 팝오버가 열릴 때 모달 상태에 들어가는지 여부를 결정합니다. - `true`: 사용자 상호작용이 팝오버로 제한됩니다: 문서 페이지 스크롤이 잠기고, 외부 요소에 대한 포인터 상호작용이 비활성화됩니다. - `false`: 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. - `'trap-focus'`: 포커스가 팝오버 내부에 갇히지만, 문서 페이지 스크롤은 잠기지 않고 외부에 대한 포인터 상호작용은 계속 활성화됩니다. |
### Popover.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
| `openOnHover` | `false`, `true` | `false` | 트리거 요소에 마우스를 올렸을 때 팝오버가 열릴지 여부입니다. |
| `delay` | `number` | `300` | 트리거 요소에 마우스를 올렸을 때 팝오버가 열리기까지 대기하는 시간입니다. 밀리초 단위로 지정합니다.
`openOnHover` prop이 필요합니다. |
### Popover.Popup
| Prop | Type | Default | Description |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 팝오버가 열릴 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(첫 번째 탭 가능 요소 또는 팝업)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 팝오버가 닫혔을 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(트리거 또는 이전에 집중된 요소)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `portalElement` | `ReactElement` | - | |
| `positionerElement` | `ReactElement` | - | |
#### Popover.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 팝업이 숨겨진 동안 포탈을 DOM에 유지할지 여부 |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 부모 요소 |
#### Popover.PositionerPrimitive
| Prop | Type | Default | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 뷰포트에서 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부 |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 위치시킬 기준 요소 기본적으로 팝업은 트리거를 기준으로 위치합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 지정된 방향에 대한 팝업의 정렬 방법 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 사용할 CSS `position` 속성을 결정 |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `bottom` | 앵커 요소의 어느 방향에 팝업을 정렬할지 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 거리를 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따른 추가 오프셋 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 오프셋을 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 정의하는 요소 또는 사각형 |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계 가장자리로부터 유지할 추가 여백 |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이의 최소 거리
팝업의 둥근 모서리에서 화살표가 튀어나오는 것을 방지합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 앵커의 레이아웃 변화를 추적할지 여부 |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업 위치 지정 시 충돌 처리 방법을 결정 |
#### Popover.PopupPrimitive
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 팝오버가 열릴 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(첫 번째 탭 가능 요소 또는 팝업)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 팝오버가 닫혔을 때 집중할 요소를 결정합니다. - 'false': 초점을 움직이지 마세요. - 'true': 기본 동작(트리거 또는 이전에 집중된 요소)에 따라 초점을 이동합니다. - 'RefObject': 초점을 참조 요소로 이동합니다. - 'function': 상호작용 유형('마우스', '터치', '펜' 또는 '키보드')으로 호출됩니다. 요소를 초점 맞추기 위해 'true'을, 기본 동작을 사용하기 위해 'true'을, 아무것도 하지 않기 위해 'false'/'undefined'을 반환합니다. |
### Popover.Title
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Popover.Description
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Popover.Close
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
# RadioCard
URL: /docs/components/radio-card
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/radio-card.mdx
RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다.
***
title: 'RadioCard'
site\_name: 'RadioCard - Vapor Core'
description: 'RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다.'
-----------------------------------------------------------------------------------------------------------------
```tsx
import { HStack, RadioCard, RadioGroup } from '@vapor-ui/core';
export default function DefaultRadioCard() {
return (
Light ThemeDark Theme
System (Disabled)
);
}
```
## Property
***
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```tsx
import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioCardDisabled() {
return (
group disabled
Option 1Option 2Option 3
individual card disabled
Enabled Option
Disabled Option
Another Enabled Option
);
}
```
### Read Only
읽기 전용 상태로, 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다.
```tsx
import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioCardReadonly() {
return (
readOnly
Unselected OptionSelected Option (Read Only)Another Option
normal
Unselected OptionSelected Option (Editable)Another Option
);
}
```
## Examples
***
### Simple Usage
RadioGroup.Root와 함께 사용합니다.
```tsx
import { useState } from 'react';
import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioCardSimple() {
const [value, setValue] = useState('option1');
return (
Selected: {value}
setValue(newValue as string)}
>
First OptionSecond OptionThird Option
);
}
```
### Direction
VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치합니다.
```tsx
import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioCardDirection() {
return (
vertical
Option 1Option 2Option 3
horizontal
Option 1Option 2Option 3
);
}
```
### With Rich Content
RadioCard는 고정된 높이가 없어 다양한 콘텐츠를 포함할 수 있습니다. 텍스트, 아이콘, 가격 정보 등 복잡한 레이아웃을 자유롭게 구성할 수 있습니다.
```tsx
import { useState } from 'react';
import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioCardWithContent() {
const [value, setValue] = useState('basic');
return (
선택된 플랜: {value} setValue(newValue as string)}
>
Basic
$9/month
5 projects included
Pro
$29/month
Unlimited projects
Enterprise
Custom pricing
Advanced features
);
}
```
## Props Table
***
### RadioCard
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| **value** | `any` | - | 라디오 그룹 내에서 고유한 식별 값 |
| `readOnly` | `false`, `true` | `false` | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부 |
| `required` | `false`, `true` | `false` | 폼 제출 전 값을 반드시 선택해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 input 요소에 접근하기 위한 ref |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
| `invalid` | `false`, `true` | `false` | |
# Radio
URL: /docs/components/radio
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/radio.mdx
Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다.
***
title: 'Radio'
site\_name: 'Radio - Vapor Core'
description: 'Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다.'
-------------------------------------------------------------------------------------------------
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function DefaultRadioGroup() {
return (
} typography="body2">
Apple
} typography="body2">
Orange
} typography="body2">
Banana (Disabled)
);
}
```
## Property
***
### Size
RadioGroup의 크기를 설정합니다.
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioGroupSize() {
return (
md
} typography="body2">
Medium Option 1
} typography="body2">
Medium Option 2
lg
} typography="body2">
Large Option 1
} typography="body2">
Large Option 2
);
}
```
### Disabled
RadioGroup의 비활성화 상태를 설정합니다.
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioGroupDisabled() {
return (
individual item disabled
} typography="body2">
Option 1 (Default)
} typography="body2">
Option 2 (Default)
} typography="body2">
Option 3 (Disabled)
group disabled
} typography="body2">
Group 1
} typography="body2">
Group 2
} typography="body2">
Group 3
);
}
```
### Read Only
RadioGroup의 읽기 전용 상태입니다. 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다.
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioReadOnly() {
return (
} typography="body2">
Read Only (Selected)
} typography="body2">
Read Only (Unselected)
);
}
```
## Examples
***
### Direction
Radio 그룹의 방향을 조절할 수 있습니다. VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치할 수 있습니다.
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function RadioDirection() {
return (
vertical
} typography="body2">
Option 1
} typography="body2">
Option 2
} typography="body2">
Option 3
horizontal
} typography="body2">
Option 1
} typography="body2">
Option 2
} typography="body2">
Option 3
);
}
```
### Flexible
Radio의 유연한 사용예시입니다.
```tsx
import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core';
export default function Flexible() {
return (
Vertical} typography="body2">
Option 1
} typography="body2">
Option 2
} typography="body2">
Option 3
);
}
```
## Props Table
***
### RadioGroup.Root
| Prop | Type | Default | Description |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `size` | `md`, `lg` | - | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `name` | `string` | - | 폼 제출 시 필드를 식별하는 이름 |
| `defaultValue` | `unknown` | - | The uncontrolled value of the radio button that should be initially selected.
To render a controlled radio group, use the `value` prop instead. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `unknown` | - | The controlled value of the radio item that should be currently selected.
To render an uncontrolled radio group, use the `defaultValue` prop instead. |
| `readOnly` | `false`, `true` | `false` | Whether the user should be unable to select a different radio button in the group. |
| `required` | `false`, `true` | `false` | 폼 제출 전 값을 반드시 선택해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `onValueChange` | `(value: unknown, eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; }) => void` | - | 값이 변경될 때 호출되는 콜백 |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 input 요소에 접근하기 위한 ref |
| `invalid` | `false`, `true` | - | |
### RadioGroup.Label
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Radio.Root
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `size` | `md`, `lg` | - | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| **value** | `any` | - | 라디오 그룹 내에서 고유한 식별 값 |
| `readOnly` | `false`, `true` | `false` | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부 |
| `required` | `false`, `true` | `false` | 폼 제출 전 값을 반드시 선택해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 input 요소에 접근하기 위한 ref |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
| `invalid` | `false`, `true` | - | |
### Radio.IndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 라디오 버튼이 비활성화되었을 때 HTML 요소를 DOM에 유지할지 여부 |
# SegmentedControl
URL: /docs/components/segmented-control
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/segmented-control.mdx
같은 콘텐츠 영역 내에서 화면의 보기 방식이나 필터를 제어합니다.
***
title: 'SegmentedControl'
site\_name: 'SegmentedControl - Vapor Core'
description: '같은 콘텐츠 영역 내에서 화면의 보기 방식이나 필터를 제어합니다.'
---------------------------------------------------
```tsx
import { SegmentedControl } from '@vapor-ui/core';
export default function DefaultSegmentedControl() {
return (
전체
진행 중
완료예정
);
}
```
주의!
* `SegmentedControl.Root`의 `defaultValue`를 지정하지 않으면 첫 번째 아이템이 자동 선택됩니다.
* `SegmentedControl.Item`의 `value=""` 속성에는 **반드시 아이템의 역할을 설명할 수 있는 이름**을 사용하세요.
## Property
***
### Size
SegmentedControl의 크기를 설정합니다.
```tsx
import { SegmentedControl, VStack } from '@vapor-ui/core';
export default function SegmentedControlSize() {
return (
SMTestMDTestLGTest
);
}
```
### Controlled State
SegmentedControl의 선택 상태를 외부에서 제어합니다.
```tsx
import { useState } from 'react';
import { Button, HStack, SegmentedControl, VStack } from '@vapor-ui/core';
import { DarkIcon, LightIcon, PcIcon } from '@vapor-ui/icons';
export default function DefaultSegmentedControl() {
const [mode, setMode] = useState('light');
return (
현재 모드: {mode}
Light
Dark
System
setMode('light')}>라이트 모드 setMode('dark')}>다크 모드 setMode('system')}>시스템 모드
);
}
```
### Disabled
SegmentedControl의 비활성 상태를 설정합니다.
```tsx
import { SegmentedControl } from '@vapor-ui/core';
export default function DefaultSegmentedControl() {
return (
전체
진행 중
완료예정
);
}
```
## Examples
***
### Icon Item
`SegmentedControl.IconItem`을 이용하여 아이콘만 포함하는 아이템을 사용할 수 있습니다. 이 경우, 각 아이템에 `aria-label`로 접근 가능한 이름을 제공하거나, 툴팁으로 보조 설명을 추가하는 것을 권장합니다.
```tsx
import { SegmentedControl, Tooltip, VStack } from '@vapor-ui/core';
import { DarkIcon, LightIcon, PcIcon } from '@vapor-ui/icons';
export default function DefaultSegmentedControl() {
return (
}
/>
라이트 모드
}
/>
다크 모드
}
/>
시스템 모드
);
}
```
## Props Table
***
### SegmentedControl.Root
| Prop | Type | Default | Description |
| ------------------ | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `size` | `sm`, `md`, `lg` | - | |
| `defaultValue` | `string` | - | The default value of the SegmentedControl. This is used when you want the SegmentedControl to manage its own state. It should be the value of one of the SegmentedControl.Item components. |
| `onValueChange` | `(value: string, eventDetails: SegmentedControl.RootPrimitive.ChangeEventDetails) => void` | - | Callback fired when the value of the SegmentedControl changes. It receives the new value and the original change event details from the underlying RadioGroup component. This is useful for handling side effects when the user selects a different segment. |
| `value` | `string` | - | The controlled value of the SegmentedControl. This should be used in conjunction with `onValueChange` to update the value when the user interacts with the SegmentedControl. |
| `className` | `string \| ((state: SegmentedControl.Root.State) => (string \| undefined))` | - | |
| `indicatorElement` | `ReactElement>` | - | A Custom element for SegmentedControl.IndicatorPrimitive. If not provided, the default SegmentedControl.IndicatorPrimitive will be rendered. |
| `disabled` | `boolean` | - | Whether the component should ignore user interaction. |
| `form` | `string` | - | Identifies the form that owns the radio inputs. Useful when the radio group is rendered outside the form. |
| `inputRef` | `Ref` | - | A ref to access the hidden input element. |
| `name` | `string` | - | Identifies the field when a form is submitted. |
| `readOnly` | `boolean` | - | Whether the user should be unable to select a different radio button in the group. |
| `required` | `boolean` | - | Whether the user must choose a value before submitting a form. |
| `style` | `React.CSSProperties \| ((state: SegmentedControl.Root.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.Root.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
#### SegmentedControl.RootPrimitive
| Prop | Type | Default | Description |
| --------------- | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `size` | `sm`, `md`, `lg` | `md` | |
| `defaultValue` | `string` | - | The default value of the SegmentedControl. This is used when you want the SegmentedControl to manage its own state. It should be the value of one of the SegmentedControl.Item components. |
| `onValueChange` | `(value: string, eventDetails: SegmentedControl.RootPrimitive.ChangeEventDetails) => void` | - | Callback fired when the value of the SegmentedControl changes. It receives the new value and the original change event details from the underlying RadioGroup component. This is useful for handling side effects when the user selects a different segment. |
| `value` | `string` | - | The controlled value of the SegmentedControl. This should be used in conjunction with `onValueChange` to update the value when the user interacts with the SegmentedControl. |
| `className` | `string \| ((state: SegmentedControl.Root.State) => (string \| undefined))` | - | |
| `disabled` | `boolean` | - | Whether the component should ignore user interaction. |
| `form` | `string` | - | Identifies the form that owns the radio inputs. Useful when the radio group is rendered outside the form. |
| `inputRef` | `Ref` | - | A ref to access the hidden input element. |
| `name` | `string` | - | Identifies the field when a form is submitted. |
| `readOnly` | `boolean` | - | Whether the user should be unable to select a different radio button in the group. |
| `required` | `boolean` | - | Whether the user must choose a value before submitting a form. |
| `style` | `React.CSSProperties \| ((state: SegmentedControl.Root.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.Root.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
#### SegmentedControl.IndicatorPrimitive
| Prop | Type | Default | Description |
| ----------- | ---------------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string \| ((state: SegmentedControl.RootPrimitive.ChangeEventDetails) => (string \| undefined))` | - | |
| `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.RootPrimitive.ChangeEventDetails) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### SegmentedControl.Item
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **value** | `string` | - | The value of the item. This is used to determine which item is selected. It should be unique within the SegmentedControl. |
| `className` | `string \| ((state: SegmentedControl.IconItem.State) => (string \| undefined))` | - | |
| `disabled` | `boolean` | - | Whether the component should ignore user interaction. |
| `inputRef` | `Ref` | - | A ref to access the hidden input element. |
| `nativeButton` | `boolean` | - | Whether the component renders a native `<button>` element when replacing it via the `render` prop. Set to `true` if the rendered element is a native button. |
| `readOnly` | `boolean` | - | Whether the user should be unable to select the radio button. |
| `required` | `boolean` | - | Whether the user must choose a value before submitting a form. |
| `style` | `React.CSSProperties \| ((state: SegmentedControl.IconItem.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.IconItem.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### SegmentedControl.IconItem
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **value** | `string` | - | The value of the item. This is used to determine which item is selected. It should be unique within the SegmentedControl. |
| `className` | `string \| ((state: SegmentedControl.IconItem.State) => (string \| undefined))` | - | |
| `disabled` | `boolean` | - | Whether the component should ignore user interaction. |
| `inputRef` | `Ref` | - | A ref to access the hidden input element. |
| `nativeButton` | `boolean` | - | Whether the component renders a native `<button>` element when replacing it via the `render` prop. Set to `true` if the rendered element is a native button. |
| `readOnly` | `boolean` | - | Whether the user should be unable to select the radio button. |
| `required` | `boolean` | - | Whether the user must choose a value before submitting a form. |
| `style` | `React.CSSProperties \| ((state: SegmentedControl.IconItem.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.IconItem.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
# Select
URL: /docs/components/select
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/select.mdx
Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다.
***
title: 'Select'
site\_name: 'Select - Vapor Core'
description: 'Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다.'
----------------------------------------------------------------------------------------------------------------------
```tsx
import { Select } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans-serif' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
export default function DefaultSelect() {
return (
폰트
{fonts.map((font) => (
{font.label}
))}
);
}
```
## Property
***
### Size
Select의 크기를 설정합니다.
```tsx
import { HStack, Select, Text, VStack } from '@vapor-ui/core';
export default function SelectSize() {
return (
sm
md
lg
xl
);
}
const SelectTemplate = (props: Select.Root.Props) => {
return (
옵션 1옵션 2
);
};
```
### Positioning
Select 드롭다운이 나타날 위치를 설정합니다. 기본값은 'bottom'입니다.
```tsx
import { HStack, Select } from '@vapor-ui/core';
export default function SelectPositioning() {
return (
옵션 1옵션 2옵션 1옵션 2옵션 1옵션 2옵션 1옵션 2
);
}
```
### Controlled State
Select의 선택 상태를 외부에서 제어합니다.
```tsx
'use client';
import { useState } from 'react';
import { Button, HStack, Select, Text, VStack } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans-serif' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
export default function SelectControlled() {
const [value, setValue] = useState(fonts[0].value);
const handleValueChange = (newValue: unknown) => {
setValue(newValue as string);
};
return (
폰트
{fonts.map((font) => (
{font.label}
))}
선택된 값: {value || '없음'} setValue('serif')}>
Serif 선택
setValue('')} colorPalette="secondary">
선택 해제
);
}
```
### States
Select의 다양한 상태(비활성화, 읽기 전용, 오류)를 설정합니다.
```tsx
import { HStack, Select, Text, VStack } from '@vapor-ui/core';
export default function SelectStates() {
return (
default
disabled
readOnly
invalid
);
}
const SelectTemplate = (props: Select.Root.Props) => {
return (
옵션 1옵션 2
);
};
```
## Examples
***
### Items Configuration
배열 형태와 객체 형태의 아이템 데이터를 모두 지원합니다.
```tsx
import { Select, Text, VStack } from '@vapor-ui/core';
const fonts = [
{ label: 'Sans-serif', value: 'sans' },
{ label: 'Serif', value: 'serif' },
{ label: 'Monospace', value: 'mono' },
{ label: 'Cursive', value: 'cursive' },
];
const languages = {
javascript: 'JavaScript',
typescript: 'TypeScript',
python: 'Python',
java: 'Java',
go: 'Go',
};
export default function SelectItems() {
return (
배열 형태의 아이템
폰트
{fonts.map((font) => (
{font.label}
))}
객체 형태의 아이템
프로그래밍 언어
{Object.entries(languages).map(([value, label]) => (
{label}
))}
);
}
```
### Grouping Options
관련된 옵션들을 그룹으로 묶어 구조화할 수 있습니다. Group과 GroupLabel, Separator를 사용하여 명확한 구조를 만들 수 있습니다.
```tsx
import { Select, VStack } from '@vapor-ui/core';
export default function SelectGrouping() {
return (
프론트엔드ReactVueAngular백엔드Node.jsPythonJava데이터베이스MySQLPostgreSQLMongoDB
);
}
```
### Custom Value Display
Select.Value에 함수형 children을 제공하여 선택된 값을 커스터마이징할 수 있습니다.
```tsx
import { Select, Text, VStack } from '@vapor-ui/core';
const fonts = {
sans: 'Sans-serif',
serif: 'Serif',
mono: 'Monospace',
cursive: 'Cursive',
};
const renderValue = (value: string) => {
if (!value) return '선택된 폰트 없음';
return {fonts[value as keyof typeof fonts]};
};
export default function SelectCustomValue() {
return (
커스텀 값 표시
{renderValue}
{Object.entries(fonts).map(([value, label]) => (
{label}
))}
);
}
```
## Props Table
***
### Select.Root
| Prop | Type | Default | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | `string` | - | Select의 id |
| `name` | `string` | - | 폼 제출 시 필드를 식별하는 이름 |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `defaultValue` | `unknown` | `null` | 처음 렌더링될 때 select의 비제어 값입니다.
제어 컴포넌트로 렌더링하려면 `value` prop을 대신 사용하세요. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `unknown` | - | select의 현재 값 |
| `open` | `false`, `true` | - | select 팝업의 현재 열림 상태 |
| `readOnly` | `false`, `true` | `false` | 사용자가 select 팝업에서 다른 옵션을 선택할 수 없도록 할지 여부 |
| `required` | `false`, `true` | `false` | 폼 제출 전 값을 반드시 선택해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `onValueChange` | `(value: unknown, eventDetails: ChangeEventDetails) => void` | - | Select의 값이 변경될 때 호출되는 콜백입니다. 제어 컴포넌트에서 사용합니다. |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 input 요소에 접근하기 위한 ref |
| `defaultOpen` | `false`, `true` | `false` | Select 팝업의 초기 열림 상태입니다.
제어 컴포넌트로 렌더링하려면 `open` prop을 대신 사용하세요. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | Select 팝업이 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 셀렉트 팝업이 열리거나 닫힌 후 애니메이션이 완료되면 호출되는 이벤트 핸들러 |
| `modal` | `false`, `true` | `true` | Select가 열릴 때 모달 상태로 진입할지 결정합니다. - `true`: 사용자 상호작용이 Select로 제한됩니다. 문서 스크롤이 잠기고 외부 요소에 대한 포인터 상호작용이 비활성화됩니다. - `false`: 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. |
| `actionsRef` | `RefObject` | - | 명령형 액션을 위한 ref입니다. - `unmount`: 지정되면, Select가 닫힐 때 언마운트되지 않습니다. 대신 `unmount` 함수를 수동으로 호출해야 합니다. Select의 애니메이션이 외부 라이브러리에 의해 제어될 때 유용합니다. |
| `items` | `Record`, `readonly { label: ReactNode; value: unknown; }[]` | - | Select 팝업에 렌더링되는 아이템 데이터 구조입니다. 지정시 `<Select.Value>`가 원시 값 대신 선택된 아이템의 라벨을 렌더링합니다. |
| `itemToStringLabel` | `(itemValue: unknown) => string` | - | 아이템 값이 객체인 경우(`<Select.Item value={object}>`) 트리거에 표시하기 위해 객체 값을 문자열로 변환하는 함수입니다. 객체 형태가 `{ value, label }`이면 이 prop 없이도 자동으로 라벨이 사용됩니다. |
| `itemToStringValue` | `(itemValue: unknown) => string` | - | 아이템 값이 객체인 경우(`<Select.Item value={object}>`) 폼 제출을 위해 객체 값을 문자열로 변환하는 함수입니다. 객체 형태가 `{ value, label }`이면 이 prop 없이도 자동으로 값이 사용됩니다. |
| `isItemEqualToValue` | `(itemValue: unknown, value: unknown) => boolean` | - | Select 아이템 값이 현재 선택된 값과 일치하는지 판단하는 커스텀 비교 로직입니다. 참조가 다른 객체 값을 사용할 때 유용합니다. 기본값은 `Object.is` 비교입니다. |
| `size` | `sm`, `md`, `lg`, `xl` | - | Select의 크기 |
| `invalid` | `false`, `true` | - | Select가 유효하지 않은 상태인지 여부 |
### Select.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### Select.ValuePrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal`, `(value: any) => ReactNode` | - | 선택된 값의 포맷을 지정하는 `ReactNode`를 반환하는 함수를 받습니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
#### Select.PlaceholderPrimitive
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
#### Select.TriggerIconPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Select.Popup
| Prop | Type | Default | Description |
| ------------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `portalElement` | `ReactElement` | - | 사용자 정의 Portal 요소 |
| `positionerElement` | `ReactElement` | - | 사용자 정의 Positioner 요소 |
#### Select.PositionerPrimitive
| Prop | Type | Default | Description |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 뷰포트에서 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부 |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 위치시킬 기준 요소 기본적으로 팝업은 트리거를 기준으로 위치합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 지정된 방향에 대한 팝업의 정렬 방법 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `alignItemWithTrigger` | `false`, `true` | `true` | 선택된 아이템의 텍스트가 트리거의 값 텍스트와 정렬되도록 포지셔너가 트리거를 덮을지 여부 마우스 입력에만 적용되며 공간이 부족하면 자동으로 비활성화됩니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 사용할 CSS `position` 속성을 결정 |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `bottom` | 앵커 요소의 어느 방향에 팝업을 정렬할지 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 거리를 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따른 추가 오프셋 (픽셀) 앵커와 포지셔너 요소의 크기, 방향, 정렬을 읽어 오프셋을 반환하는 함수도 가능합니다.
함수는 다음 속성을 가진 `data` 객체를 받습니다: - `data.anchor`: 앵커 요소의 `width`와 `height` - `data.positioner`: 포지셔너 요소의 `width`와 `height` - `data.side`: 앵커 요소의 어느 방향에 정렬되어 있는지 - `data.align`: 지정된 방향에 대한 정렬 방법 |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 정의하는 요소 또는 사각형 |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계 가장자리로부터 유지할 추가 여백 |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이의 최소 거리
팝업의 둥근 모서리에서 화살표가 튀어나오는 것을 방지합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 앵커의 레이아웃 변화를 추적할지 여부 |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업 위치 지정 시 충돌 처리 방법을 결정 |
#### Select.PopupPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Select.Item
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `label` | `string` | - | 키보드 텍스트 네비게이션 중 항목이 매칭될 때 사용할 텍스트 라벨을 지정합니다.
제공되지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `any` | `null` | 이 셀렉트 항목을 식별하는 고유 값 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### Select.ItemPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------ |
| `label` | `string` | - | 키보드 텍스트 내비게이션 중 아이템이 일치할 때 사용할 텍스트 라벨을 지정합니다.
제공되지 않으면 아이템 텍스트 콘텐츠가 기본값으로 사용됩니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `value` | `any` | `null` | 이 셀렉트 항목을 식별하는 고유 값 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `false` | render prop으로 교체할 때 네이티브 `<button>` 엘리먼트를 렌더링할지 여부 렌더링되는 요소가 네이티브 버튼이면 `true`로 설정하세요. |
#### Select.ItemIndicatorPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 아이템이 선택되지 않았을 때 HTML 요소를 DOM에 유지할지 여부입니다. |
### Select.Group
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Select.GroupLabel
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Select.Separator
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------------ | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `orientation` | `horizontal`, `vertical` | `horizontal` | 구분선 방향 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Sheet
URL: /docs/components/sheet
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/sheet.mdx
Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.
***
title: 'Sheet'
site\_name: 'Sheet - Vapor Core'
description: 'Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.'
---------------------------------------------------------------------------------------------
```tsx
'use client';
import { Box, Button, Sheet } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
export default function DefaultSheet() {
return (
}>Open Sheet
알림
Sheet는 화면 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다.
추가 정보나 작업을 위한 공간을 제공합니다.
}>닫기
확인} />
);
}
```
## Property
***
### Side
Sheet가 나타날 위치를 설정합니다. 기본값은 'right'입니다.
```tsx
'use client';
import { Box, Button, HStack, Sheet, Text, VStack } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
export default function SheetSide() {
return (
right
}>Right
우측 Sheet
화면 우측에서 슬라이드됩니다. (기본값)
left
}>Left
좌측 Sheet
화면 좌측에서 슬라이드됩니다.
top
}>Top
상단 Sheet
화면 상단에서 슬라이드됩니다.
bottom
}>Bottom
하단 Sheet
화면 하단에서 슬라이드됩니다.
);
}
```
### Controlled State
Sheet의 열림/닫힘 상태를 외부에서 제어합니다.
```tsx
'use client';
import { useEffect, useState } from 'react';
import { Box, Button, Sheet, Text, VStack } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
export default function SheetControlled() {
const [isOpen, setIsOpen] = useState(false);
const [count, setCount] = useState(3);
useEffect(() => {
let timer: NodeJS.Timeout;
if (isOpen && count > 0) {
timer = setTimeout(() => {
setCount((prev) => prev - 1);
}, 1000);
} else if (isOpen && count === 0) {
setIsOpen(false);
setCount(3); // 초기화
}
return () => {
if (timer) clearTimeout(timer);
};
}, [count, isOpen]);
return (
setIsOpen(true)} colorPalette="primary">
Sheet 열기
현재 상태: {isOpen ? '열림' : '닫힘'}제어된 Sheet
외부에 의해{' '}
{count}
초 후 상태가 제어됩니다.
프로그래밍 방식으로 열림/닫힘을 관리할 수 있습니다.
}>닫기
);
}
```
### Keep Mounted
Sheet가 닫혀도 DOM에서 제거되지 않고 유지되도록 설정합니다.
```tsx
'use client';
import { Box, Button, HStack, Sheet, Text, TextInput, VStack } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
export default function SheetKeepMounted() {
return (
normal
}>일반 Sheet
일반 Sheet
이 Sheet는 닫힐 때 DOM에서 제거됩니다. 다시 열 때마다 내용이 새로
생성됩니다.
keepMounted
}>
유지 Sheet
유지되는 Sheet
이 Sheet는 닫혀도 DOM에 유지됩니다. 입력한 내용이 보존되는
것을 확인해보세요.
);
}
```
## Examples
***
### Custom Usage
유연하게 Sheet를 사용합니다.
```tsx
'use client';
import { Box, Button, Sheet } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
export default function Flexible() {
return (
}>유연한 Sheet
간단한 Sheet
이 Sheet는 Vapor UI의 Primitive 컴포넌트를 사용하여 유연하게
구성되었습니다.
);
}
```
### Resizable
Sheet의 크기를 자유자재로 조절하길 원한다면 ``을 사용하세요.
조절 가능 영역을 제한하고 싶다면 `` 컴포넌트에 `min/max-height`, `min/max-width` 속성을 적용하세요.
```tsx
'use client';
import type { CSSProperties } from 'react';
import { Box, Button, HStack, Sheet, Text, VStack } from '@vapor-ui/core';
import { CloseOutlineIcon } from '@vapor-ui/icons';
type Side = 'right' | 'left' | 'top' | 'bottom';
type Case = {
side: Side;
label: string;
description: string;
/** Resize bounds live in CSS: min/max of the resized axis on the Popup. */
bounds: CSSProperties;
};
const CASES: Case[] = [
{
side: 'right',
label: 'right',
description: '우측 Sheet입니다. 왼쪽 가장자리 핸들을 잡고 좌우로 끌어 너비를 조절하세요.',
bounds: { minWidth: 300, maxWidth: '80vw' },
},
{
side: 'left',
label: 'left',
description: '좌측 Sheet입니다. 오른쪽 가장자리 핸들을 잡고 좌우로 끌어 너비를 조절하세요.',
bounds: { minWidth: 300, maxWidth: '80vw' },
},
{
side: 'top',
label: 'top',
description:
'상단 Sheet입니다. 아래쪽 가장자리 핸들을 잡고 위아래로 끌어 높이를 조절하세요.',
bounds: { height: 360, minHeight: 200, maxHeight: '80svh' },
},
{
side: 'bottom',
label: 'bottom',
description: '하단 Sheet입니다. 위쪽 가장자리 핸들을 잡고 위아래로 끌어 높이를 조절하세요.',
bounds: { height: 360, minHeight: 200, maxHeight: '80svh' },
},
];
export default function ResizableSheet() {
return (
{CASES.map(({ side, label, description, bounds }) => (
{label}
}>{label}
크기 조절 가능한 Sheet ({label}){description}
))}
);
}
```
## Props Table
***
### Sheet.Root
| Prop | Type | Default | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `open` | `false`, `true` | - | 다이얼로그가 현재 열려 있는지 여부 |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | 다이얼로그의 초기 열림 상태입니다.
제어 컴포넌트로 렌더링하려면 `open` prop을 대신 사용하세요. |
| `modal` | `false`, `true`, `trap-focus` | `true` | 다이얼로그가 열릴 때 모달 상태로 전환할지 결정합니다. - `true`: 사용자 상호작용이 다이얼로그로 제한됩니다: 포커스가 트랩되고, 문서 페이지 스크롤이 잠기며, 외부 요소에 대한 포인터 상호작용이 비활성화됩니다. - `false`: 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. - `'trap-focus'`: 포커스는 다이얼로그 내부에 트랩되지만, 문서 페이지 스크롤은 잠기지 않고 외부 포인터 상호작용은 활성화됩니다. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 다이얼로그가 열리거나 닫힐 때 호출되는 이벤트 핸들러 |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 다이얼로그가 열리거나 닫힌 후 애니메이션이 완료되면 호출되는 이벤트 핸들러 |
| `actionsRef` | `RefObject` | - | 명령형 액션을 위한 ref입니다. - `unmount`: 지정되면, 다이얼로그가 닫혀도 언마운트되지 않습니다. 대신 `unmount` 함수를 호출하여 수동으로 다이얼로그를 언마운트해야 합니다. 다이얼로그의 애니메이션이 외부 라이브러리에 의해 제어될 때 유용합니다. |
| `closeOnClickOverlay` | `false`, `true` | - | 오버레이 클릭 시 닫기 여부 |
### Sheet.Trigger
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Sheet.Popup
| Prop | Type | Default | Description |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 다이얼로그가 열릴 때 포커스할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다 (첫 번째 탭 가능 요소 또는 팝업). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 상호작용 유형(`mouse`, `touch`, `pen` 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 다이얼로그가 닫힐 때 포커스할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다 (트리거 또는 이전에 포커스된 요소). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 상호작용 유형(`mouse`, `touch`, `pen` 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. |
| `portalElement` | `ReactElement` | - | 사용자 정의 Portal 요소 |
| `overlayElement` | `ReactElement` | - | 사용자 정의 Overlay 요소 |
| `positionerElement` | `ReactElement` | - | 사용자 정의 Positioner 요소 |
#### Sheet.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 컨테이너 요소입니다. |
| `keepMounted` | `false`, `true` | `false` | 팝업이 숨겨진 동안 포탈을 DOM에 유지할지 여부 |
#### Sheet.OverlayPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `forceRender` | `false`, `true` | `false` | 다이얼로그가 중첩되어 있어도 백드롭을 강제로 렌더링할지 여부입니다. |
#### Sheet.PopupPrimitive
| Prop | Type | Default | Description |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `initialFocus` | `false`, `true`, `RefObject`, `(openType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 다이얼로그가 열릴 때 포커스할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다 (첫 번째 탭 가능 요소 또는 팝업). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 상호작용 유형(`mouse`, `touch`, `pen` 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. |
| `finalFocus` | `false`, `true`, `RefObject`, `(closeType: InteractionType) => boolean \| void \| HTMLElement \| null` | - | 다이얼로그가 닫힐 때 포커스할 요소를 결정합니다.
- `false`: 포커스를 이동하지 않습니다. - `true`: 기본 동작에 따라 포커스를 이동합니다 (트리거 또는 이전에 포커스된 요소). - `RefObject`: ref 요소로 포커스를 이동합니다. - `function`: 상호작용 유형(`mouse`, `touch`, `pen` 또는 `keyboard`)과 함께 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. |
#### Sheet.PositionerPrimitive
| Prop | Type | Default | Description |
| -------- | -------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `side` | `bottom`, `left`, `right`, `top` | - | Sheet가 나타날 화면의 방향입니다. |
### Sheet.ResizeHandle
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `step` | `number` | `16` | 화살표 키를 누를 때마다 조절되는 크기(px)입니다. |
| `disabled` | `false`, `true` | `false` | 드래그와 키보드로 크기를 조절하지 못하게 막습니다. |
### Sheet.Header
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Sheet.Body
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Sheet.Footer
| Prop | Type | Default | Description |
| -------- | -------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Sheet.Title
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Sheet.Description
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Sheet.Close
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
# Skeleton
URL: /docs/components/skeleton
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/skeleton.mdx
콘텐츠가 로딩 중임을 나타내는 플레이스홀더 요소입니다.
***
title: 'Skeleton'
site\_name: 'Skeleton - Vapor Core'
description: '콘텐츠가 로딩 중임을 나타내는 플레이스홀더 요소입니다.'
---------------------------------------------
```tsx
import { Skeleton } from '@vapor-ui/core';
export default function DefaultSkeleton() {
return ;
}
```
## Property
***
### Shape
Skeleton의 모서리 둥글기를 설정합니다.
```tsx
import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core';
export default function SkeletonShape() {
return (
rounded
square
);
}
```
### Animation
Skeleton의 애니메이션 스타일을 설정합니다.
```tsx
import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core';
export default function SkeletonAnimation() {
return (
shimmer
pulse
none
);
}
```
### Size
Skeleton의 높이를 설정합니다.
```tsx
import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core';
export default function SkeletonSize() {
return (
sm
md
lg
xl
);
}
```
## Examples
***
### Profile Card
여러 Skeleton 요소를 조합하여 프로필 카드 플레이스홀더를 구성하는 예제입니다.
```tsx
import { Box, HStack, Skeleton, VStack } from '@vapor-ui/core';
export default function SkeletonComposition() {
return (
);
}
```
## Props Table
***
### Skeleton
| Prop | Type | Default | Description |
| ----------- | ---------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
| `animation` | `none`, `shimmer`, `pulse` | `shimmer` | skeleton의 애니메이션 스타일을 제어합니다.
- `shimmer`: 빛이 스치는 효과 - `pulse`: 깜빡이는 효과 - `none`: 애니메이션 비활성화 |
| `shape` | `square`, `rounded` | `rounded` | skeleton의 테두리 반경을 제어합니다. |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | skeleton의 높이를 제어합니다. |
| `render` | `ReactElement`, `(props: HTMLProps) => ReactElement` | - | component의 HTML element를 다른 태그로 교체하거나 다른 component와 조합할 수 있습니다.
ReactElement 또는 렌더링할 요소를 반환하는 함수를 받습니다. |
# Spinner
URL: /docs/components/spinner
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/spinner.mdx
콘텐츠나 데이터 로딩 시 대기 상태를 표시합니다.
***
title: 'Spinner'
site\_name: 'Spinner - Vapor Core'
description: '콘텐츠나 데이터 로딩 시 대기 상태를 표시합니다.'
------------------------------------------
```tsx
import { Spinner } from '@vapor-ui/core';
export default function DefaultSpinner() {
return ;
}
```
## Property
***
### Size
Spinner의 크기를 설정합니다.
```tsx
import { HStack, Spinner, VStack } from '@vapor-ui/core';
export default function SpinnerSize() {
return (
md
lg
xl
);
}
```
### Color Palette
Spinner의 색상을 설정합니다. 다른 요소와 함께 사용될 때, `inverse` 속성을 사용하여 요소의 글자색과 통일하세요.
```tsx
import { Button, HStack, Spinner } from '@vapor-ui/core';
export default function SpinnerColor() {
return (
로딩 중...
로딩 중...
로딩 중...
);
}
```
## Props Table
***
### Spinner
| Prop | Type | Default | Description |
| -------------- | ---------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------- |
| `colorPalette` | `primary`, `inverse` | - | 스피너의 색상을 제어합니다. 다른 요소 안에서 요소의 글자색과 색상을 일치시키려면 `inverse`를 사용하세요. |
| `size` | `md`, `lg`, `xl` | `md` | 스피너의 전체 크기를 제어합니다. |
| `className` | `string \| ((state: Spinner.State) => (string \| undefined))` | - | CSS 클래스를 요소에 적용하거나, 컴포넌트 상태에 따라 클래스를 반환하는 함수를 받습니다. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Spinner.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다.
`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 인수로 받습니다. |
# Switch
URL: /docs/components/switch
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/switch.mdx
Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다.
***
title: 'Switch'
site\_name: 'Switch - Vapor Core'
description: 'Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다.'
---------------------------------------------------------------
```tsx
import { Switch } from '@vapor-ui/core';
export default function DefaultSwitch() {
return ;
}
```
## Property
***
### Size
Switch의 크기를 설정합니다.
```tsx
import { HStack, Switch, Text, VStack } from '@vapor-ui/core';
export default function SwitchSize() {
return (
sm
md
lg
);
}
```
### Checked
Switch의 체크 상태를 설정합니다.
```tsx
import { HStack, Switch, Text, VStack } from '@vapor-ui/core';
export default function SwitchChecked() {
return (
unchecked
checked
);
}
```
### Disabled
Switch의 비활성화 상태를 설정합니다.
```tsx
import { HStack, Switch, Text, VStack } from '@vapor-ui/core';
export default function SwitchDisabled() {
return (
unchecked
checked
);
}
```
### Read Only
사용자는 스위치 상태를 변경할 수 없지만, 현재 상태를 확인할 수 있도록 허용하는 상태입니다.
```tsx
import { HStack, Switch, Text, VStack } from '@vapor-ui/core';
export default function SwitchReadOnly() {
return (
checked
unchecked
);
}
```
## Examples
***
### Controlled
제어되는 Switch 컴포넌트의 사용 예시입니다.
```tsx
'use client';
import { useState } from 'react';
import { HStack, Switch, Text, VStack } from '@vapor-ui/core';
export default function SwitchControlled() {
const [checked, setChecked] = useState(false);
return (
State: {checked ? 'On' : 'Off'}
);
}
```
### Custom Thumb
`children`으로 `Switch.ThumbPrimitive`를 전달하면 내부 파트를 직접 제어할 수 있습니다. 아이콘을 삽입하거나 다른 요소로 교체할 수 있습니다.
```tsx
import { Switch } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function SwitchCustomThumb() {
return (
);
}
```
## Props Table
***
### Switch.Root
| Prop | Type | Default | Description |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg` | - | Switch의 크기를 지정합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `id` | `string` | - | 스위치 요소의 id |
| `name` | `string` | - | 폼 제출 시 필드를 식별하는 이름 |
| `defaultChecked` | `false`, `true` | `false` | 스위치의 초기 활성화 상태
제어 컴포넌트로 사용하려면 `checked` prop을 사용하세요. |
| `disabled` | `false`, `true` | `false` | 사용자 상호작용을 비활성화할지 여부 |
| `checked` | `false`, `true` | - | 스위치의 현재 활성화 상태
비제어 컴포넌트로 사용하려면 `defaultChecked` prop을 사용하세요. |
| `readOnly` | `false`, `true` | `false` | 사용자가 스위치를 활성화하거나 비활성화할 수 없도록 할지 여부 |
| `required` | `false`, `true` | `false` | 폼 제출 전 스위치를 반드시 활성화해야 하는지 여부 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `inputRef` | `null`, `(instance: HTMLInputElement \| null) => void`, `RefObject` | - | 숨겨진 `<input>` 요소에 접근하기 위한 ref |
| `onCheckedChange` | `(checked: boolean, eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; }) => void` | - | 스위치가 활성화되거나 비활성화될 때 호출되는 이벤트 핸들러 |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
| `invalid` | `false`, `true` | - | Switch가 유효하지 않은 상태인지 여부입니다. |
#### Switch.ThumbPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Table
URL: /docs/components/table
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/table.mdx
Table는 데이터를 행과 열로 구성하여 구조화된 방식으로 표시하는 컴포넌트입니다.
***
title: 'Table'
site\_name: Table - Vapor Core
description: 'Table는 데이터를 행과 열로 구성하여 구조화된 방식으로 표시하는 컴포넌트입니다.'
-------------------------------------------------------------
Table 컴포넌트는 순수한 뷰(View) 역할에 집중하여 기본적인 구조와 스타일만을 제공합니다.
복잡한 상태 관리와 로직을 바탕으로 대량의 데이터를 다루는 Data Table을 구현하려면 [Table Block 문서](/docs/components/patterns/table)를 참고해주세요.
```tsx
import { Badge, Table } from '@vapor-ui/core';
const datas = [
{ name: 'Olivia Park', status: 'active', role: 'designer', 'last-active': '2 hours ago' },
{ name: 'Ethan Kim', status: 'active', role: 'developer', 'last-active': '3 days ago' },
{ name: 'Mia Choi', status: 'inactive', role: 'developer', 'last-active': '10 minutes ago' },
{ name: 'Noah Lee', status: 'active', role: 'designer', 'last-active': '1 day ago' },
{ name: 'Ava Jung', status: 'active', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Liam Han', status: 'inactive', role: 'developer', 'last-active': '5 days ago' },
{ name: 'Emma Seo', status: 'active', role: 'designer', 'last-active': '7 days ago' },
{ name: 'Mason Yoo', status: 'active', role: 'designer', 'last-active': '30 minutes ago' },
{ name: 'Sophia Lim', status: 'inactive', role: 'designer', 'last-active': '4 hours ago' },
{ name: 'Lucas Park', status: 'active', role: 'developer', 'last-active': '1 hour ago' },
];
const activeness: Record = {
active: 'success',
inactive: 'hint',
};
export default function Basic() {
return (
NameStatusRoleLast Active
{datas.map((data, index) => (
{data.name}
{data.status.toUpperCase()}
{data.role}{data['last-active']}
))}
);
}
```
## Props Table
***
### Table.Root
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `table` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Header
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `thead` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Body
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `tbody` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Footer
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `tfoot` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Row
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `tr` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Heading
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `th` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Cell
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `render` | `React.ReactElement` | `td` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.ColumnGroup
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `span` | `string`, `number` | `1` | 열 그룹이 차지하는 너비를 설정합니다. |
| `render` | `React.ReactElement` | `colgroup` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
### Table.Column
| Prop | Type | Default | Description |
| ----------- | -------------------- | ----------- | ------------------------------------------------- |
| `span` | `string`, `number` | `1` | 개별 열 그룹이 차지하는 너비를 설정합니다. |
| `render` | `React.ReactElement` | `col` | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 구성 요소와 조합할 수 있습니다. |
| `className` | `string` | `undefined` | 컴포넌트에 CSS 클래스명을 추가할 수 있습니다. |
| `children` | `React.ReactNode` | `undefined` | 컴포넌트에 자식 요소를 추가할 수 있습니다. |
# Tabs
URL: /docs/components/tabs
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/tabs.mdx
Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다.
***
title: 'Tabs'
site\_name: 'Tabs - Vapor Core'
description: 'Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다.'
---------------------------------------------------------------------------------------------------------
```tsx
import { Tabs } from '@vapor-ui/core';
import { AiSmartieIcon, AssignmentIcon, ListIcon } from '@vapor-ui/icons';
export default function DefaultTabs() {
return (
개요기능예시
);
}
```
## Property
***
### Size
Tabs의 크기를 지정합니다. `sm`, `md`, `lg`, `xl` 네 가지 크기를 제공합니다.
```tsx
import { HStack, Tabs, Text, VStack } from '@vapor-ui/core';
export default function TabsSize() {
return (
sm
Tab 1Tab 2Tab 3
md
Tab 1Tab 2Tab 3
lg
Tab 1Tab 2Tab 3
xl
Tab 1Tab 2Tab 3
);
}
```
### Variant
Tabs의 스타일 변형을 설정합니다. `line`과 `fill` 두 가지 스타일을 제공합니다.
```tsx
import { HStack, Tabs, Text, VStack } from '@vapor-ui/core';
export default function TabsVariant() {
return (
line
HomeAboutServices
fill
HomeAboutServices
);
}
```
### Orientation
수평(horizontal)과 수직(vertical) 방향을 설정합니다.
```tsx
import { HStack, Tabs, Text, VStack } from '@vapor-ui/core';
export default function TabsOrientation() {
return (
horizontal
Tab 1Tab 2Tab 3
vertical
Tab 1Tab 2Tab 3
);
}
```
### Controlled State
Tabs의 활성 상태를 외부에서 제어합니다.
```tsx
'use client';
import { useState } from 'react';
import { Button, Tabs, VStack } from '@vapor-ui/core';
export default function TabsControlled() {
const [activeTab, setActiveTab] = useState('profile');
return (
프로필계정보안알림
현재 선택된 탭: {activeTab}
setActiveTab('account')} className="">
계정 탭으로 이동
setActiveTab('security')}
className=""
>
보안 탭으로 이동
);
}
```
### States
개별 탭 또는 전체 탭 그룹을 비활성화할 수 있습니다.
```tsx
import { HStack, Tabs, Text, VStack } from '@vapor-ui/core';
export default function TabsStates() {
return (
tab disabled
Enabled
Disabled
Normal
group disabled
EnabledDisabledNormal
);
}
```
## Examples
***
### Keyboard Navigation
`activateOnFocus`와 `loopFocus` props를 사용하여 키보드 내비게이션 동작을 세밀하게 제어할 수 있습니다.
```tsx
import { Tabs, VStack } from '@vapor-ui/core';
export default function TabsKeyboard() {
return (
포커스 시 활성화 (activateOnFocus: true)
탭 1탭 2탭 3
엔터/스페이스로 활성화 (activateOnFocus: false)
탭 1탭 2탭 3
비순환 내비게이션 (loopFocus: false)
탭 1탭 2탭 3
);
}
```
### Custom Indicator
`Tabs.ListPrimitive`와 `Tabs.IndicatorPrimitive`를 직접 조합하면 인디케이터의 스타일을 제어할 수 있습니다.
```tsx
import { Tabs } from '@vapor-ui/core';
export default function TabsCustomIndicator() {
return (
홈
소개
서비스
);
}
```
## Props Table
***
### Tabs.Root
| Prop | Type | Default | Description |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `defaultValue` | `any` | `0` | 기본값. 비제어 컴포넌트에서 사용 값이 `null`이면 탭이 선택되지 않습니다. |
| `value` | `any` | - | 현재 선택된 탭의 값. 제어 컴포넌트에서 사용 값이 `null`이면 탭이 선택되지 않습니다. |
| `orientation` | `horizontal`, `vertical` | `horizontal` | 컴포넌트 방향(레이아웃 흐름 방향) |
| `onValueChange` | `(value: any, eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; } & { activationDirection: ActivationDirection; }) => void` | - | 새 값이 설정될 때 호출되는 콜백 |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `variant` | `line`, `fill` | - | Tabs의 스타일 변형을 지정합니다. |
| `size` | `sm`, `md`, `lg`, `xl` | - | Tabs의 크기를 지정합니다. |
| `disabled` | `false`, `true` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. Root에 설정 시 모든 하위 탭에 자동으로 적용됩니다. |
| `activateOnFocus` | `false`, `true` | `false` | 포커스 시 즉시 탭을 활성화할지 여부. `false`일 경우 Enter 또는 Space 키로 활성화합니다. |
| `loopFocus` | `false`, `true` | `true` | 키보드 내비게이션 시 첫 번째/마지막 탭에서 순환할지 여부. `true`일 경우 마지막 탭에서 화살표 키를 누르면 첫 번째 탭으로 이동합니다. |
### Tabs.List
| Prop | Type | Default | Description |
| ------------------ | ---------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `variant` | `line`, `fill` | - | Tabs의 스타일 변형을 지정합니다. |
| `orientation` | `horizontal`, `vertical` | - | 컴포넌트의 방향(레이아웃 흐름 방향)을 지정합니다. |
| `size` | `sm`, `md`, `lg`, `xl` | - | Tabs의 크기를 지정합니다. |
| `disabled` | `false`, `true` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| `indicatorElement` | `ReactElement` | - | 커스텀 인디케이터 요소입니다. 기본값은 `<Tabs.IndicatorPrimitive />`입니다. |
#### Tabs.ListPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `variant` | `line`, `fill` | - | Tabs의 스타일 변형을 지정합니다. |
| `orientation` | `horizontal`, `vertical` | - | 컴포넌트의 방향(레이아웃 흐름 방향)을 지정합니다. |
| `size` | `sm`, `md`, `lg`, `xl` | - | Tabs의 크기를 지정합니다. |
| `disabled` | `false`, `true` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
#### Tabs.IndicatorPrimitive
| Prop | Type | Default | Description |
| ----------------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `renderBeforeHydration` | `false`, `true` | `false` | React hydration 전에 렌더링할지 여부입니다. 서버 사이드 렌더링 후 인디케이터가 보이지 않는 시간을 최소화합니다. |
### Tabs.Button
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `value` | `any` | - | Tab의 값 지정하지 않으면 자식 요소의 위치 인덱스가 값으로 사용됩니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | render prop으로 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부 렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Tabs.Panel
| Prop | Type | Default | Description |
| ------------- | ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `value` | `any` | - | Tab Panel의 값입니다. 해당 값을 가진 Tab이 선택되면 표시됩니다. 제공되지 않으면 패널의 인덱스가 사용됩니다. 서버에서 Tab Panel을 렌더링하려면 명시적으로 제공하는 것이 권장됩니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 패널이 숨겨져 있는 동안 HTML 요소를 DOM에 유지할지 여부입니다. |
# TextInput
URL: /docs/components/text-input
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/text-input.mdx
TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다.
***
title: 'TextInput'
site\_name: 'TextInput - Vapor Core'
description: 'TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다.'
-----------------------------------------------------------------------------
```tsx
import { TextInput } from '@vapor-ui/core';
export default function DefaultTextInput() {
return ;
}
```
## Property
***
### Size
TextInput의 크기를 설정합니다.
```tsx
import { HStack, Text, TextInput, VStack } from '@vapor-ui/core';
export default function TextInputSize() {
return (
sm
md
lg
xl
);
}
```
### Type
TextInput의 타입을 설정합니다.
```tsx
import { HStack, Text, TextInput, VStack } from '@vapor-ui/core';
export default function TextInputType() {
return (
text
email
password
);
}
```
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```tsx
import { TextInput, VStack } from '@vapor-ui/core';
export default function TextInputDisabled() {
return (
);
}
```
### Invalid
유효하지 않은 상태(필수 항목 누락, 잘못된 입력 등)를 표시하여 올바른 입력을 유도합니다.
```tsx
import { TextInput, VStack } from '@vapor-ui/core';
export default function TextInputInvalid() {
return (
);
}
```
### Read Only
값을 수정할 수 없지만, 텍스트를 복사하거나 읽을 수 있는 상태입니다.
```tsx
import { TextInput, VStack } from '@vapor-ui/core';
export default function TextInputReadOnly() {
return (
);
}
```
## Examples
***
### States
TextInput의 다양한 상태를 보여줍니다.
```tsx
import { HStack, Text, TextInput, VStack } from '@vapor-ui/core';
export default function TextInputStates() {
return (
default
disabled
invalid
readOnly
);
}
```
## Props Table
***
### TextInput
| Prop | Type | Default | Description |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `type` | `search`, `text`, `email`, `password`, `url`, `tel` | `text` | 인풋의 타입을 설정합니다. |
| `defaultValue` | `string` | - | |
| `value` | `string` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `onValueChange` | `(value: string, event: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; }) => void` | - | |
| `invalid` | `false`, `true` | `false` | |
# Text
URL: /docs/components/text
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/text.mdx
Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다.
***
title: 'Text'
site\_name: 'Text - Vapor Core'
description: 'Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다.'
--------------------------------------------------------------------
```tsx
import { Text } from '@vapor-ui/core';
export default function DefaultText() {
return Hello World;
}
```
## Property
***
### Typography
텍스트의 타이포그래피 스타일을 설정합니다.
```tsx
import { Text, VStack } from '@vapor-ui/core';
export default function TextTypography() {
return (
Display1Heading1Subtitle1Body1
);
}
```
### Foreground
텍스트의 색상을 설정합니다.
```tsx
import { HStack, Text } from '@vapor-ui/core';
export default function TextForeground() {
return (
PrimarySecondarySuccessWarningDangerHint
);
}
```
## Props Table
***
### Text
| Prop | Type | Default | Description |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------- |
| `textAlign` | `null`, `left`, `right`, `center`, `end`, `start`, `justify`, `match-parent` | - | |
| `foreground` | `white`, `primary-100`, `primary-200`, `secondary-100`, `success-100`, `success-200`, `warning-100`, `warning-200`, `danger-100`, `danger-200`, `hint-100`, `hint-200`, `contrast-100`, `contrast-200`, `secondary-200`, `normal-100`, `normal-200` | `normal-200` | 텍스트의 전경색을 설정합니다. |
| `typography` | `body1`, `display1`, `display2`, `display3`, `display4`, `heading1`, `heading2`, `heading3`, `heading4`, `heading5`, `heading6`, `subtitle1`, `subtitle2`, `body2`, `body3`, `body4`, `code1`, `code2` | `body2` | 텍스트에 적용할 타이포그래피 스타일을 설정합니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Textarea
URL: /docs/components/textarea
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/textarea.mdx
Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다.
***
title: 'Textarea'
site\_name: 'Textarea - Vapor Core'
description: 'Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다.'
-----------------------------------------------------------------------
```tsx
import { Box, Textarea } from '@vapor-ui/core';
export default function DefaultTextarea() {
return (
);
}
```
## Property
***
### Size
Textarea의 크기를 설정합니다.
```tsx
import { HStack, Text, Textarea, VStack } from '@vapor-ui/core';
export default function TextareaSize() {
return (
sm
md
lg
xl
);
}
```
### Auto Resize
텍스트 내용에 따라 높이가 자동 조절됩니다.
```tsx
import { Box, Textarea } from '@vapor-ui/core';
export default function TextareaAutoResize() {
return (
);
}
```
### States
Textarea의 다양한 상태를 보여줍니다.
```tsx
import { HStack, Text, Textarea, VStack } from '@vapor-ui/core';
export default function TextareaStates() {
return (
default
disabled
invalid
readOnly
);
}
```
## Examples
***
### maxLength
Textarea에 `maxLength` 속성을 추가하여 입력 가능한 최대 문자 수를 제한하는 기능을 제공합니다.
```tsx
import { Box, Textarea } from '@vapor-ui/core';
export default function TextareaCharacterCount() {
return (
);
}
```
## Props Table
***
### Textarea
| Prop | Type | Default | Description |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | Textarea의 크기를 지정합니다. |
| `defaultValue` | `string` | - | Textarea의 초기 값입니다.
제어 컴포넌트로 렌더링하려면 `value` prop을 대신 사용하세요. |
| `value` | `string` | - | Textarea의 현재 값입니다.
비제어 컴포넌트로 렌더링하려면 `defaultValue` prop을 대신 사용하세요. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `invalid` | `false`, `true` | `false` | Textarea가 유효하지 않은 상태인지 여부입니다. |
| `autoResize` | `false`, `true` | `false` | 콘텐츠에 맞춰 Textarea의 높이를 자동으로 조정할지 여부입니다. |
| `onValueChange` | `(value: string, event: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; }) => void` | - | Textarea의 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
# Toast
URL: /docs/components/toast
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/toast.mdx
Toast는 일시적인 알림 메시지를 사용자에게 표시하는 컴포넌트입니다.
***
title: 'Toast'
site\_name: 'Toast - Vapor Core'
description: 'Toast는 일시적인 알림 메시지를 사용자에게 표시하는 컴포넌트입니다.'
------------------------------------------------------
Toast 컴포넌트는 화면의 모서리에 일시적인 알림 메시지를 표시하는 데 사용됩니다.
사용자의 작업에 대한 피드백을 제공하고, 피드백을 하나의 리스트로 관리하기 때문에 다른 컴포넌트와 사용 방식이 다릅니다.
```tsx
import { Button, Toast } from '@vapor-ui/core';
const toastManager = Toast.createToastManager();
export default function Default() {
return (
);
}
const App = () => {
const addToast = () => {
toastManager.add({
title: 'This is a toast message!',
description: 'Here is a description for the toast message.',
});
};
return Add Toast;
};
```
## Property
### Methods
Toast를 추가, 업데이트 및 제거할 수 있습니다.
```tsx
import { Button, HStack, Toast } from '@vapor-ui/core';
const toastManager = Toast.createToastManager();
export default function Method() {
return (
);
}
const App = () => {
const toastManager = Toast.useToastManager();
const addToast = () => {
toastManager.add({
title: 'This is a toast message added by method!',
description: 'Here is a description for the toast message added by method.',
});
};
const updateToast = () => {
const id = toastManager.add({
title: 'This is a toast message to be updated!',
description: 'Here is a description for the toast message to be updated.',
actionProps: {
children: 'Update',
onClick: () => {
toastManager.update(id, {
title: 'Updated!',
colorPalette: 'success',
});
},
},
});
};
const removeToast = () => {
const id = toastManager.add({
title: 'This is a toast message to be removed!',
description: 'Here is a description for the toast message to be removed.',
actionProps: {
children: 'Remove',
onClick: () => {
toastManager.close(id);
toastManager.add({
title: 'Toast removed!',
colorPalette: 'danger',
});
},
},
});
};
const promiseToast = () => {
const fakePromise = new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) resolve('Data loaded successfully!');
else reject(new Error('Failed to load data'));
}, 3000);
});
toastManager.promise(fakePromise, {
loading: {
title: 'Loading...',
description: 'Please wait while we load the data.',
colorPalette: 'info',
},
success: {
title: 'Success!',
description: 'The data has been loaded successfully.',
colorPalette: 'success',
},
error: {
title: 'Error!',
description: 'There was an error loading the data.',
colorPalette: 'danger',
},
});
};
return (
Add ToastUpdate ToastRemove ToastPromise Toast
);
};
```
### ColorPalette
Toast의 색상 팔레트를 설정합니다.
```tsx
import { Button, HStack, Toast } from '@vapor-ui/core';
const toastManager = Toast.createToastManager();
export default function ColorPalette() {
const addToast = (colorPalette: 'info' | 'danger' | 'success') => {
toastManager.add({
title: 'This is a color palette toast message!',
description: 'Here is a description for the color palette toast message.',
colorPalette,
});
};
return (
addToast('info')}>
Info Toast
addToast('danger')}>
Danger Toast
addToast('success')}>
Success Toast
);
}
```
## Examples
### Action
Action 버튼과 함께 사용할 수 있습니다.
```tsx
import { Button, Toast } from '@vapor-ui/core';
const toastManager = Toast.createToastManager();
export default function Action() {
const handleActionToast = () => {
toastManager.add({
title: 'This is an action toast message!',
description: 'Here is a description for the action toast message.',
actionProps: {
children: 'action',
onClick: () => {
alert('Action button clicked!');
},
},
});
};
return (
Action Toast
);
}
```
### Close
Close 버튼을 제거할 수 있습니다.
```tsx
import { Button, Toast } from '@vapor-ui/core';
const toastManager = Toast.createToastManager();
export default function Close() {
const addToast = () => {
toastManager.add({
title: 'This is a toast message without close button!',
description: 'Here is a description for the toast message without close button.',
close: false,
});
};
return (
Wihtout Close Button
);
}
```
### Icon
Icon을 커스텀 할 수 있습니다.
```tsx
import { Button, HStack, Toast } from '@vapor-ui/core';
import { CertificateIcon, HeartIcon, WarningIcon } from '@vapor-ui/icons';
const toastManager = Toast.createToastManager();
export default function Icon() {
const addToast = (
colorPalette: Toast.RootPrimitive.ToastObject['colorPalette'],
icon: Toast.RootPrimitive.ToastObject['icon'],
) => {
toastManager.add({
title: 'This is a color palette toast message!',
description: 'Here is a description for the color palette toast message.',
colorPalette,
icon,
});
};
return (
addToast('info', )}
>
Info Toast
addToast('danger', )}
>
Danger Toast
addToast('success', )}
>
Success Toast
);
}
```
### Custom
Toast 아이템을 완전히 커스텀할 수 있습니다.
```tsx
import type { PropsWithChildren } from 'react';
import { Button, HStack, IconButton, Toast, VStack } from '@vapor-ui/core';
import { InfoCircleIcon } from '@vapor-ui/icons';
const toastManager = Toast.createToastManager();
export default function Custom() {
// const { add } = Toast.useToastManager();
const showToast = () => {
const removeToast = (id: string) => {
toastManager.close(id);
};
const id = toastManager.add({
title: 'This is a custom toast message!',
description: 'Here is a description for the custom toast message.',
colorPalette: 'info',
icon: ,
actionProps: {
children: 'Undo',
onClick: () => removeToast(id),
},
});
};
return (
Show Toast
);
}
const ToastProvider = (props: PropsWithChildren) => {
return (
{props.children}
);
};
const ToastList = () => {
const { toasts } = Toast.useToastManager();
return toasts.map((toast) => {
return (
}
$css={{
position: 'absolute',
color: '$fg-normal-200',
right: '8px',
top: '8px',
}}
/>
);
});
};
```
## Props
### Toast.Provider
| Prop | Type | Default | Description |
| ---------------- | -------------- | ------- | ------------------------------------- |
| **toastManager** | `ToastManager` | - | Toast의 상태를 관리하는 ToastManager 인스턴스입니다. |
| `timeout` | `number` | `4000` | Toast가 자동으로 닫히기까지의 시간(밀리초)입니다. |
| `limit` | `number` | - | 동시에 표시할 수 있는 최대 Toast 개수입니다. |
| `children` | `ReactNode` | - | |
### Toast.ProviderPrimitive
| Prop | Type | Default | Description |
| ---------------- | -------------- | ------- | ------------------------------------- |
| **toastManager** | `ToastManager` | - | Toast의 상태를 관리하는 ToastManager 인스턴스입니다. |
| `timeout` | `number` | `4000` | Toast가 자동으로 닫히기까지의 시간(밀리초)입니다. |
| `limit` | `number` | - | 동시에 표시할 수 있는 최대 Toast 개수입니다. |
| `children` | `ReactNode` | - | |
### Toast.PortalPrimitive
| Prop | Type | Default | Description |
| ----------- | ----------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `ReactNode` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 상위 요소입니다. |
### Toast.ViewportPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `ReactNode` | - | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Toast.RootPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| **toast** | `ToastObject` | - | Toast 데이터 객체입니다. `useToastManager` 훅에서 반환된 toasts 배열의 항목을 전달합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Toast.ContentPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `ReactNode` | - | |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Toast.TitlePrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Toast.DescriptionPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
### Toast.ActionPrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------------------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | Action 버튼 크기 |
| `colorPalette` | `primary`, `secondary`, `success`, `warning`, `danger`, `contrast` | `primary` | Action 버튼 색상 |
| `variant` | `outline`, `fill`, `ghost` | `fill` | Action 버튼 스타일 (fill: 채움, outline: 테두리, ghost: 투명) |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | 컴포넌트가 `render` 속성을 통해 대체될 때 네이티브 `<button>` 요소를 렌더링할지 여부입니다. 렌더링된 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Toast.ClosePrimitive
| Prop | Type | Default | Description |
| -------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `children` | `ReactNode` | - | 닫기 버튼 내부에 표시할 아이콘 또는 콘텐츠 |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `nativeButton` | `false`, `true` | `true` | 컴포넌트가 `render` 속성을 통해 대체될 때 네이티브 `<button>` 요소를 렌더링할지 여부입니다. 렌더링된 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하세요. |
### Toast.IconPrimitive
| Prop | Type | Default | Description |
| ----------- | -------- | ------- | ---------------- |
| `className` | `string` | - | 요소에 적용된 CSS 클래스. |
### useToastManager
| Prop | Type | Default | Description |
| -------------- | --------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- |
| `id` | `string` | - | Toast의 고유 식별자입니다. 지정하지 않으면 자동으로 생성됩니다. |
| `title` | `string` | - | Toast의 제목입니다. |
| `description` | `string` | - | Toast의 설명 텍스트입니다. |
| `colorPalette` | `success`, `danger`, `info` | `info` | Toast의 색상 팔레트입니다. 각 팔레트에 따라 기본 아이콘이 자동으로 설정됩니다. |
| `icon` | `ReactNode` | - | Toast에 표시할 커스텀 아이콘입니다. 지정하지 않으면 `colorPalette`에 따른 기본 아이콘이 사용됩니다. |
| `close` | `false`, `true` | `true` | 닫기 버튼을 표시할지 여부입니다. |
| `actionProps` | `ActionProps` | - | Toast 액션 버튼에 전달할 props입니다. `children`, `onClick`, `colorPalette`, `size`, `variant` 등 Button 컴포넌트의 props를 포함합니다. |
| `data` | `object` | - | Toast에 연결할 커스텀 데이터 객체입니다. 제네릭 타입으로 타입 안전성을 제공합니다. |
| `priority` | `number` | - | Toast의 우선순위입니다. 높은 값이 먼저 표시됩니다. |
# ToggleGroup
URL: /docs/components/toggle-group
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/toggle-group.mdx
ToggleGroup은 여러 Toggle을 하나의 그룹으로 묶어 상태를 함께 관리하는 컴포넌트입니다. 단일 선택과 다중 선택을 지원하며 키보드 내비게이션과 접근성을 제공합니다.
***
title: 'ToggleGroup'
site\_name: 'ToggleGroup - Vapor Core'
description: 'ToggleGroup은 여러 Toggle을 하나의 그룹으로 묶어 상태를 함께 관리하는 컴포넌트입니다. 단일 선택과 다중 선택을 지원하며 키보드 내비게이션과 접근성을 제공합니다.'
-----------------------------------------------------------------------------------------------------------------
```tsx
import { Toggle, ToggleGroup } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
} from '@vapor-ui/icons';
export default function DefaultToggleGroup() {
return (
);
}
```
주의!
* `ToggleGroup` 내부의 각 `Toggle`에는 그룹 내에서 고유한 `value` 속성이 필요합니다.
## Property
***
### Size
ToggleGroup의 크기를 지정합니다.
```tsx
import { HStack, Text, Toggle, ToggleGroup, VStack } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
} from '@vapor-ui/icons';
const items = [
{ value: 'left', label: '왼쪽 정렬', Icon: AlignLeftOutlineIcon },
{ value: 'center', label: '가운데 정렬', Icon: AlignCenterOutlineIcon },
{ value: 'right', label: '오른쪽 정렬', Icon: AlignRightOutlineIcon },
];
const sizes = ['sm', 'md', 'lg', 'xl'] as const;
export default function ToggleGroupSize() {
return (
{sizes.map((size) => (
{size}
{items.map(({ value, label, Icon }) => (
))}
))}
);
}
```
### Multiple
`multiple`을 `true`로 설정하면 여러 개의 Toggle을 동시에 선택할 수 있습니다.
```tsx
import { HStack, Text, Toggle, ToggleGroup, VStack } from '@vapor-ui/core';
import { BoldOutlineIcon, ItalicIcon, UnderlineOutlineIcon } from '@vapor-ui/icons';
export default function ToggleGroupMultiple() {
return (
multiple={'{false}'} (기본값)
multiple={'{true}'}
);
}
```
### Disabled
ToggleGroup 전체를 비활성화합니다.
```tsx
import { Toggle, ToggleGroup } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
} from '@vapor-ui/icons';
export default function ToggleGroupDisabled() {
return (
);
}
```
## Examples
***
### Controlled
`value`와 `onValueChange`로 ToggleGroup의 선택 상태를 외부에서 제어할 수 있습니다. 값은 눌린 Toggle의 `value` 배열로 관리됩니다.
```tsx
'use client';
import { useState } from 'react';
import { HStack, Text, Toggle, ToggleGroup, VStack } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
} from '@vapor-ui/icons';
export default function ToggleGroupControlled() {
const [value, setValue] = useState(['left']);
const [value2, setValue2] = useState(['left']);
return (
Single
Selected: {value.length > 0 ? value.join(', ') : 'none'}
Multiple
Selected: {value2.length > 0 ? value2.join(', ') : 'none'}
);
}
```
## Props Table
***
### ToggleGroup
| Prop | Type | Default | Description |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | |
| `defaultValue` | `readonly string[]` | - | The pressed state of the toggle group represented by an array of the values of all pressed toggle buttons. This is the uncontrolled counterpart of `value`. |
| `onValueChange` | `(groupValue: string[], eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; trigger: Element \| undefined; }) => void` | - | Callback fired when the pressed states of the toggle group changes. |
| `value` | `readonly string[]` | - | The pressed state of the toggle group represented by an array of the values of all pressed toggle buttons. This is the controlled counterpart of `defaultValue`. |
| `className` | `string \| ((state: ToggleGroup.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | Whether the toggle group should ignore user interaction. |
| `loopFocus` | `boolean` | - | Whether to loop keyboard focus back to the first item when the end of the list is reached while using the arrow keys. |
| `multiple` | `boolean` | - | When `false` only one item in the group can be pressed. If any item in the group becomes pressed, the others will become unpressed. When `true` multiple items can be pressed. |
| `orientation` | `Orientation` | - | |
| `style` | `React.CSSProperties \| ((state: ToggleGroup.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: ToggleGroup.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
# Toggle
URL: /docs/components/toggle
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/toggle.mdx
Toggle은 두 가지 상태(on/off)를 전환할 수 있는 버튼 컴포넌트입니다. 단독으로 사용하거나 ToggleGroup, Toolbar와 결합하여 사용할 수 있습니다.
***
title: 'Toggle'
site\_name: 'Toggle - Vapor Core'
description: 'Toggle은 두 가지 상태(on/off)를 전환할 수 있는 버튼 컴포넌트입니다. 단독으로 사용하거나 ToggleGroup, Toolbar와 결합하여 사용할 수 있습니다.'
--------------------------------------------------------------------------------------------------------------
```tsx
import { Toggle } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function DefaultToggle() {
return (
);
}
```
## Property
***
### Size
Toggle의 크기를 지정합니다.
```tsx
import { HStack, Text, Toggle, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function ToggleSize() {
return (
sm
md
lg
xl
);
}
```
### Variant
Toggle의 시각적 위계를 설정합니다.
```tsx
import { HStack, Text, Toggle, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function ToggleVariant() {
return (
default
accent
);
}
```
### Pressed
Toggle의 눌림 상태를 지정합니다. 초기 상태는 `defaultPressed`로 설정합니다.
```tsx
import { HStack, Text, Toggle, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function TogglePressed() {
return (
unpressed
pressed
);
}
```
### Disabled
Toggle의 비활성화 상태를 지정합니다.
```tsx
import { HStack, Text, Toggle, VStack } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function ToggleDisabled() {
return (
unpressed
pressed
);
}
```
## Examples
***
### Controlled
`pressed`와 `onPressedChange`로 Toggle의 눌림 상태를 외부에서 제어할 수 있습니다.
```tsx
'use client';
import { useState } from 'react';
import { HStack, Text, Toggle } from '@vapor-ui/core';
import { HeartIcon } from '@vapor-ui/icons';
export default function ToggleControlled() {
const [pressed, setPressed] = useState(false);
return (
State: {pressed ? 'On' : 'Off'}
);
}
```
## Props Table
***
### Toggle
| Prop | Type | Default | Description |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | `md` | |
| `variant` | `default`, `accent` | `default` | |
| `defaultPressed` | `boolean` | - | Whether the toggle button is currently pressed. This is the uncontrolled counterpart of `pressed`. |
| `onPressedChange` | `(pressed: boolean, eventDetails: { reason: "none"; event: Event; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; trigger: Element \| undefined; }) => void` | - | Callback fired when the pressed state is changed. |
| `pressed` | `boolean` | - | Whether the toggle button is currently pressed. This is the controlled counterpart of `defaultPressed`. |
| `value` | `string` | - | A unique string that identifies the toggle when used inside a toggle group. |
| `className` | `string \| ((state: Toggle.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | Whether the component should ignore user interaction. |
| `nativeButton` | `boolean` | - | Whether the component renders a native `<button>` element when replacing it via the `render` prop. Set to `false` if the rendered element is not a button (for example, `<div>`). |
| `style` | `React.CSSProperties \| ((state: Toggle.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toggle.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
# Toolbar
URL: /docs/components/toolbar
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/toolbar.mdx
Toolbar는 관련된 액션을 하나의 영역에 모아 제공하는 컴포넌트입니다. 버튼, 토글, 입력, 구분선 등을 조합할 수 있으며 키보드 내비게이션과 접근성을 지원합니다.
***
title: 'Toolbar'
site\_name: 'Toolbar - Vapor Core'
description: 'Toolbar는 관련된 액션을 하나의 영역에 모아 제공하는 컴포넌트입니다. 버튼, 토글, 입력, 구분선 등을 조합할 수 있으며 키보드 내비게이션과 접근성을 지원합니다.'
------------------------------------------------------------------------------------------------------------
```tsx
import { type ComponentType, cloneElement, useState } from 'react';
import { Card, Select, Toggle, ToggleGroup, Toolbar, Tooltip } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
BoldOutlineIcon,
ItalicIcon,
StrikeOutlineIcon,
UnderlineOutlineIcon,
} from '@vapor-ui/icons';
export default function DefaultToolbar() {
const [fontFamily, setFontFamily] = useState('');
const [fontSize, setFontSize] = useState();
const handleValueChange = (value: string) => {
const parsedValue = value ? parseInt(value, 10) : NaN;
setFontSize(isNaN(parsedValue) ? 16 : parsedValue);
};
return (
}>
}>
}>
}>
}>
}
>
}
>
}
>
Button 1Button 2Button 3
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.
Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed,
dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper
congue, euismod non, mi.
);
}
/* -----------------------------------------------------------------------------------------------*/
type SelectItem = {
value: string;
label: string;
};
const selectItems: SelectItem[] = [
{ value: 'helvetica', label: 'Helvetica' },
{ value: 'Roboto', label: 'Roboto' },
{ value: 'Arial', label: 'Arial' },
{ value: 'Monospace', label: 'Monospace' },
{ value: 'Montserrat', label: 'Montserrat' },
];
interface TooltipButtonProps {
description: React.ReactNode;
children: React.ReactElement;
}
const TooltipButton = ({ description, children, ...props }: TooltipButtonProps) => {
return (
{description}
);
};
/* -----------------------------------------------------------------------------------------------*/
interface AlignSelectProps {
trigger: ComponentType;
items: SelectItem[];
value: string;
onValueChange: (value: string) => void;
placeholder?: string;
}
const AlignSelect = ({
trigger: Trigger,
items,
value,
onValueChange,
placeholder,
}: AlignSelectProps) => {
const [font, setFont] = useState(value);
const handleFontChange = (value: string | null) => {
setFont((prev) => value ?? prev);
onValueChange(value ?? '');
};
const trigger = cloneElement(} />, {
children: (
<>
>
),
});
return (
{trigger}
{items.map((item) => (
{item.label}
))}
);
};
```
주의!
* `Toolbar.Button`에 `render` prop으로 `Toggle`, `IconButton` 등 다른 컴포넌트를 결합할 수 있습니다.
* 스크린 리더 사용자를 위해 `Toolbar.Root`에 `aria-label`을 지정하세요.
## Property
***
### Size
Toolbar의 크기를 지정합니다. 하위의 `Toolbar.Button`, `Toolbar.Input`에도 함께 적용됩니다.
```tsx
import { HStack, Text, Toggle, Toolbar, VStack } from '@vapor-ui/core';
import { BoldOutlineIcon, ItalicIcon, UnderlineOutlineIcon } from '@vapor-ui/icons';
const sizes = ['sm', 'md', 'lg', 'xl'] as const;
export default function ToolbarSize() {
return (
{sizes.map((size) => (
{size}
}>
}>
}>
))}
);
}
```
### Variant
Toolbar의 스타일 변형을 지정합니다.
```tsx
import { HStack, Text, Toggle, Toolbar, VStack } from '@vapor-ui/core';
import { BoldOutlineIcon, ItalicIcon, UnderlineOutlineIcon } from '@vapor-ui/icons';
const variants = ['outline', 'ghost'] as const;
export default function ToolbarVariant() {
return (
{variants.map((variant) => (
{variant}
}>
}>
}>
))}
);
}
```
### Disabled
Toolbar 전체를 비활성화합니다. 하위 아이템도 함께 비활성화됩니다.
```tsx
import { Toggle, Toolbar } from '@vapor-ui/core';
import { BoldOutlineIcon, ItalicIcon, UnderlineOutlineIcon } from '@vapor-ui/icons';
export default function ToolbarDisabled() {
return (
}>
}>
}>
);
}
```
## Examples
***
### Separator
`Toolbar.Separator`로 관련 있는 아이템 묶음을 시각적으로 구분할 수 있습니다.
```tsx
import { Toggle, ToggleGroup, Toolbar } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
BoldOutlineIcon,
ItalicIcon,
UnderlineOutlineIcon,
} from '@vapor-ui/icons';
export default function ToolbarSeparator() {
return (
}>
}>
}>
}>
}>
}>
}>
);
}
```
### Group
`Toolbar.Group`으로 아이템을 논리적으로 묶어 함께 관리할 수 있습니다. 그룹 단위로 `disabled`를 지정할 수 있습니다.
```tsx
import { Toolbar } from '@vapor-ui/core';
export default function ToolbarGroup() {
return (
실행 취소다시 실행잘라내기복사붙여넣기
);
}
```
### Input
`Toolbar.Input`으로 툴바 안에 텍스트 입력 필드를 배치할 수 있습니다. `onValueChange`로 입력값 변화를 처리합니다.
```tsx
'use client';
import { useState } from 'react';
import { Toggle, Toolbar } from '@vapor-ui/core';
import { BoldOutlineIcon, ItalicIcon } from '@vapor-ui/icons';
export default function ToolbarInput() {
const [fontSize, setFontSize] = useState('');
return (
}>
}>
);
}
```
## Props Table
***
### Toolbar.Root
| Prop | Type | Default | Description |
| ----------- | -------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `size` | `sm`, `md`, `lg`, `xl` | - | |
| `variant` | `outline`, `ghost` | `outline` | |
| `className` | `string \| ((state: Toolbar.Root.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | |
| `loopFocus` | `boolean` | - | If `true`, using keyboard navigation will wrap focus to the other end of the toolbar once the end is reached. |
| `style` | `React.CSSProperties \| ((state: Toolbar.Root.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toolbar.Root.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### Toolbar.Group
| Prop | Type | Default | Description |
| ----------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string \| ((state: Toolbar.Group.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | When `true` all toolbar items in the group are disabled. |
| `style` | `React.CSSProperties \| ((state: Toolbar.Group.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toolbar.Group.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### Toolbar.Button
| Prop | Type | Default | Description |
| ----------------------- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string \| ((state: Toolbar.Button.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | When `true` the item is disabled. |
| `focusableWhenDisabled` | `boolean` | - | When `true` the item remains focusable when disabled. |
| `nativeButton` | `boolean` | - | Whether the component renders a native `<button>` element when replacing it via the `render` prop. Set to `false` if the rendered element is not a button (for example, `<div>`). |
| `style` | `React.CSSProperties \| ((state: Toolbar.Button.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toolbar.Button.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### Toolbar.Input
| Prop | Type | Default | Description |
| ----------------------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `defaultValue` | `string \| number \| readonly string[]` | - | |
| `onValueChange` | `(value: string) => void` | - | Callback fired when the value of the Input changes. It receives the new value and the original change event details from the underlying BaseToolbar.Input component. |
| `className` | `string \| ((state: Toolbar.Input.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `disabled` | `boolean` | - | When `true` the item is disabled. |
| `focusableWhenDisabled` | `boolean` | - | When `true` the item remains focusable when disabled. |
| `style` | `React.CSSProperties \| ((state: Toolbar.Input.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toolbar.Input.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
### Toolbar.Separator
| Prop | Type | Default | Description |
| ----------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `className` | `string \| ((state: Toolbar.Separator.State) => (string \| undefined))` | - | CSS class applied to the element, or a function that returns a class based on the component’s state. |
| `style` | `React.CSSProperties \| ((state: Toolbar.Separator.State) => (React.CSSProperties \| undefined))` | - | Style applied to the element, or a function that returns a style object based on the component's state. Style applied to the element, or a function that returns a style object based on the component’s state. |
| `render` | `ReactElement \| ((props: HTMLProps, state: Toolbar.Separator.State) => ReactElement)` | - | Allows you to replace the component's HTML element with a different tag, or compose it with another component.
Accepts a `ReactElement` or a function that returns the element to render. |
# Tooltip
URL: /docs/components/tooltip
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/tooltip.mdx
요소에 대한 추가 정보를 제공하는 툴팁 컴포넌트입니다
***
title: 'Tooltip'
site\_name: 'Tooltip - Vapor Core'
description: '요소에 대한 추가 정보를 제공하는 툴팁 컴포넌트입니다'
--------------------------------------------
```tsx
'use client';
import { HStack, IconButton, Tooltip } from '@vapor-ui/core';
import { AlignCenterOutlineIcon, BoldOutlineIcon, UnderlineOutlineIcon } from '@vapor-ui/icons';
export default function DefaultTooltip() {
return (
}
/>
Bold
}
/>
Underline
}
/>
Align Center
);
}
```
주의!
* **반드시 Button, IconButton 등과 같은 상호작용이 가능한 요소와 함께 사용하세요.** Tooltip은 상호작용 가능한 요소의 동작에 대한 추가 정보를 제공하는 작은 팝업입니다. 상호작용이 불가능한 요소에 사용하거나, 단순히 정보를 제공하기 위한 용도로 사용하려면 `Popover` 컴포넌트를 고려해보세요.
* **Tooltip에 중요한 정보를 포함하지 마세요.** Tooltip은 보조적인 정보를 제공하기 위한 용도로 설계되었으며, 중요한 정보는 포함하지 않는 것이 좋습니다. 중요한 정보는 항상 페이지의 주요 콘텐츠에 포함시켜야 합니다.
## Property
***
### Positioning
Tooltip의 표시 위치를 설정합니다.
```tsx
import { Button, HStack, Text, Tooltip, VStack } from '@vapor-ui/core';
export default function TooltipPositioning() {
return (
top
상단} />
상단에 표시되는 툴팁
right
우측} />
우측에 표시되는 툴팁
bottom
하단} />
하단에 표시되는 툴팁
left
좌측} />
좌측에 표시되는 툴팁
);
}
```
### Alignment
Tooltip의 정렬 위치를 설정합니다.
```tsx
import { Button, HStack, Text, Tooltip, VStack } from '@vapor-ui/core';
export default function TooltipAlignment() {
return (
Bottom Alignment
start
시작} />
시작 위치에 정렬된 툴팁
center
중앙} />
중앙에 정렬된 툴팁
end
끝} />
끝 위치에 정렬된 툴팁
Right Alignment
start
시작} />
상단 시작 위치
center
중앙} />
중앙 위치
end
끝} />
하단 끝 위치
);
}
```
### Delay
`Tooltip.Trigger`의 `delay` prop으로 Tooltip이 표시되기까지의 지연 시간을 설정합니다.
```tsx
import { Button, HStack, Text, Tooltip, VStack } from '@vapor-ui/core';
export default function TooltipDelay() {
return (
0ms
즉시 표시} />
지연 없이 바로 표시되는 툴팁
500ms
0.5초 지연} />
0.5초 후에 표시되는 툴팁
1000ms
1초 지연} />
1초 후에 표시되는 툴팁
2000ms
2초 지연} />
2초 후에 표시되는 툴팁
);
}
```
### Offset
Tooltip의 거리와 정렬 오프셋을 조정할 수 있습니다.
```tsx
import { Button, HStack, Text, Tooltip, VStack } from '@vapor-ui/core';
export default function TooltipOffset() {
return (
Side Offset
0px
0px} />
거리 0px
10px
10px} />
거리 10px
20px
20px} />
거리 20px
Align Offset
-20px
-20px} />
정렬 오프셋 -20px
0px
0px} />
정렬 오프셋 0px
+20px
+20px} />
정렬 오프셋 +20px
);
}
```
## Examples
***
### Content Variations
다양한 형태의 툴팁 내용을 표시할 수 있습니다.
```tsx
'use client';
import { HStack, IconButton, Text, Tooltip, VStack } from '@vapor-ui/core';
import {
AlignCenterOutlineIcon,
AlignJustifyOutlineIcon,
AlignLeftOutlineIcon,
AlignRightOutlineIcon,
} from '@vapor-ui/icons';
export default function TooltipPopup() {
return (
왼쪽 정렬
}>
왼쪽 정렬
중앙 정렬
}>
중앙 정렬
오른쪽 정렬
}>
오른쪽 정렬
양쪽 정렬
}>
양쪽 정렬
);
}
```
## Props Table
***
### Tooltip.Root
| Prop | Type | Default | Description |
| ----------------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `disabled` | `false`, `true` | `false` | 컴포넌트가 사용자 상호작용을 무시할지 여부입니다. |
| `open` | `false`, `true` | - | 툴팁이 현재 열려 있는지 여부입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `defaultOpen` | `false`, `true` | `false` | 툴팁이 초기에 열려 있는지 여부입니다.
제어 컴포넌트로 렌더링하려면 `open` prop을 대신 사용하세요. |
| `onOpenChange` | `(open: boolean, eventDetails: ChangeEventDetails) => void` | - | 툴팁이 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. |
| `onOpenChangeComplete` | `(open: boolean) => void` | - | 툴팁이 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. |
| `disableHoverablePopup` | `false`, `true` | `false` | 툴팁 팝업 위에 마우스를 올렸을 때 툴팁이 열린 상태로 유지되는 기능을 비활성화합니다. `true`일 경우 툴팁 내용에 마우스를 올리면 툴팁이 닫힙니다. |
| `trackCursorAxis` | `none`, `x`, `y`, `both` | `none` | 툴팁이 커서를 추적할 축을 결정합니다. |
| `actionsRef` | `RefObject` | - | 명령형 작업에 대한 ref입니다. - `unmount`: 지정된 경우, 툴팁은 닫힐 때 언마운트되지 않습니다. 대신 `unmount` 함수를 수동으로 호출하여 툴팁을 언마운트해야 합니다. 외부 라이브러리에서 툴팁의 애니메이션을 제어할 때 유용합니다. |
### Tooltip.Trigger
| Prop | Type | Default | Description |
| ------------ | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `delay` | `number` | `600` | 툴팁을 열기 전에 대기할 시간입니다. 밀리초 단위로 지정됩니다. |
| `closeDelay` | `number` | `0` | 툴팁을 닫기 전에 대기할 시간입니다. 밀리초 단위로 지정됩니다. |
### Tooltip.Popup
| Prop | Type | Default | Description |
| ------------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `portalElement` | `ReactElement` | - | |
| `positionerElement` | `ReactElement` | - | |
#### Tooltip.PortalPrimitive
| Prop | Type | Default | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `null`, `string`, `number`, `false`, `true`, `ReactElement`, `Iterable`, `ReactPortal` | - | |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `keepMounted` | `false`, `true` | `false` | 팝업이 숨겨져 있는 동안 포털을 DOM에 유지할지 여부입니다. |
| `container` | `null`, `HTMLElement`, `ShadowRoot`, `RefObject` | - | 포털 요소를 렌더링할 부모 요소입니다. |
#### Tooltip.PositionerPrimitive
| Prop | Type | Default | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sticky` | `false`, `true` | `false` | 앵커 요소가 뷰포트 밖으로 스크롤된 후에도 팝업을 뷰포트에 유지할지 여부입니다. |
| `anchor` | `null`, `Element`, `VirtualElement`, `RefObject`, `() => Element \| VirtualElement \| null` | - | 팝업을 위치시킬 앵커 요소입니다. 기본적으로 팝업은 트리거에 대해 위치합니다. |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `align` | `center`, `end`, `start` | `center` | 지정된 측면을 기준으로 팝업을 정렬하는 방법입니다. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
| `side` | `bottom`, `left`, `right`, `top`, `inline-end`, `inline-start` | `top` | 팝업을 정렬할 앵커 요소의 측면입니다. 충돌을 피하기 위해 자동으로 변경될 수 있습니다. |
| `positionMethod` | `absolute`, `fixed` | `absolute` | 사용할 CSS `position` 속성을 결정합니다. |
| `sideOffset` | `number`, `OffsetFunction` | `0` | 앵커와 팝업 사이의 거리(픽셀)입니다. 앵커 및 포지셔너 요소의 치수와 측면 및 정렬을 읽기 위해 거리를 반환하는 함수도 허용합니다.
함수는 다음 속성을 가진 `data` 객체 매개변수를 받습니다: - `data.anchor`: `width` 및 `height` 속성을 가진 앵커 요소의 치수 - `data.positioner`: `width` 및 `height` 속성을 가진 포지셔너 요소의 치수 - `data.side`: 포지셔너가 정렬되는 앵커 요소의 측면 - `data.align`: 지정된 측면을 기준으로 포지셔너가 정렬되는 방법 |
| `alignOffset` | `number`, `OffsetFunction` | `0` | 정렬 축을 따른 추가 오프셋(픽셀)입니다. 앵커 및 포지셔너 요소의 치수와 측면 및 정렬을 읽기 위해 오프셋을 반환하는 함수도 허용합니다.
함수는 다음 속성을 가진 `data` 객체 매개변수를 받습니다: - `data.anchor`: `width` 및 `height` 속성을 가진 앵커 요소의 치수 - `data.positioner`: `width` 및 `height` 속성을 가진 포지셔너 요소의 치수 - `data.side`: 포지셔너가 정렬되는 앵커 요소의 측면 - `data.align`: 지정된 측면을 기준으로 포지셔너가 정렬되는 방법 |
| `collisionBoundary` | `Element`, `clipping-ancestors`, `Element[]`, `{ x: number; y: number; height: number; width: number; }` | `clipping-ancestors` | 팝업이 제한되는 영역을 구분하는 요소 또는 사각형입니다. |
| `collisionPadding` | `number`, `{ bottom?: number \| undefined; left?: number \| undefined; right?: number \| undefined; top?: number \| undefined; }` | `5` | 충돌 경계의 가장자리로부터 유지할 추가 공간입니다. |
| `arrowPadding` | `number` | `5` | 화살표와 팝업 가장자리 사이에 유지할 최소 거리입니다.
팝업의 둥근 모서리 밖으로 화살표 요소가 튀어나오는 것을 방지하는 데 사용합니다. |
| `trackAnchor` | `false`, `true` | `true` | 팝업이 위치 앵커의 레이아웃 이동을 추적할지 여부입니다. |
| `collisionAvoidance` | `SideFlipMode`, `SideShiftMode` | - | 팝업을 배치할 때 충돌을 처리하는 방법을 결정합니다. |
#### Tooltip.PopupPrimitive
| Prop | Type | Default | Description |
| ----------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------- |
| `className` | `string`, `(state: State) => string` | - | 요소에 적용된 CSS 클래스 또는 컴포넌트의 상태에 따라 클래스를 반환하는 함수. |
| `render` | `ReactElement` | - | 컴포넌트의 HTML 요소를 다른 태그로 대체하거나 다른 컴포넌트와 조합할 수 있습니다. 렌더링할 요소를 반환하는 `ReactElement` 또는 함수를 인수로 받습니다. |
# Agent Skills
URL: /docs/getting-started/ai-skill
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(tools)/ai-skill.mdx
AI Agent에서 Vapor UI 스킬을 설치하고 사용하는 방법
***
title: Agent Skills
description: AI Agent에서 Vapor UI 스킬을 설치하고 사용하는 방법
-------------------------------------------------
이 문서에서는 AI Agent에서 Vapor UI 스킬을 설치하고 활용하는 방법을 설명합니다.
## 개요
Vapor UI 스킬은 AI Agent가 Vapor UI 컴포넌트를 이해하고 코드를 생성할 수 있도록 돕는 Agent Skill입니다. 컴포넌트 조회, 예제 코드 생성, Figma 디자인 변환 등의 기능을 제공합니다.
## 설치
```bash
npx skills add goorm-dev/vapor-ui
```
설치가 완료되면 AI Agent가 자동으로 스킬을 인식합니다.
## 사용 방법
### 자동 트리거
다음과 같은 요청 시 스킬이 자동으로 활성화됩니다:
* "vapor-ui 컴포넌트 목록 보여줘"
* "Button 컴포넌트 사용법 알려줘"
* "vapor-ui로 로그인 페이지 만들어줘"
* "이 Figma 디자인을 코드로 변환해줘"
* "아이콘 찾아줘"
### 명시적 호출
```
/vapor-ui Button 사용법 알려줘
```
## 주요 기능
### 컴포넌트 조회
사용 가능한 컴포넌트 목록과 상세 정보(props, variants)를 조회합니다.
**예시 요청:**
* "어떤 컴포넌트가 있어?"
* "Avatar 컴포넌트 props 알려줘"
* "폼 관련 컴포넌트 뭐 있어?"
### 예제 코드 생성
컴포넌트별 예제 코드를 조회하고, 요청에 맞는 UI 코드를 생성합니다.
**예시 요청:**
* "Button 예제 코드 보여줘"
* "navbar block1 코드 참고해서 만들어줘"
* "로그인 폼 만들어줘"
### 아이콘 검색
`@vapor-ui/icons` 패키지의 아이콘을 검색합니다.
**예시 요청:**
* "arrow 아이콘 찾아줘"
* "outline 스타일 아이콘 목록"
* "검색 아이콘 이름이 뭐야?"
### Figma 디자인 변환
Figma URL을 제공하면 디자인을 분석하여 Vapor UI 코드로 변환합니다.
**예시 요청:**
* "이 Figma 디자인 코드로 만들어줘: [https://figma.com/design/](https://figma.com/design/)..."
* "시안 구현해줘"
## 버전 지정
프로젝트의 Vapor UI 버전을 자동으로 감지합니다. 특정 버전을 사용하려면 직접 지정할 수 있습니다.
**자동 감지:**
스킬이 프로젝트의 `package.json` 또는 lock 파일을 분석하여 설치된 버전을 확인합니다.
**직접 지정:**
```
1.0.0-beta.12 버전 기준으로 Button 사용법 알려줘
```
## 참고 자료
* [LLMs.txt](/docs/getting-started/llms-txt): Cursor 등 AI 도구에서 문서 활용
* [Agent Skills 문서](https://skills.sh/docs/cli): 스킬 설치 및 관리
# Codemod
URL: /docs/getting-started/codemod
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(tools)/codemod.mdx
Vapor UI v1 마이그레이션을 자동으로 수행하는 CLI 도구
***
title: Codemod
description: Vapor UI v1 마이그레이션을 자동으로 수행하는 CLI 도구
-------------------------------------------------
`@vapor-ui/codemod`를 사용하면 `@vapor-ui/core` v1의 breaking changes를 자동으로 마이그레이션할 수 있습니다.
## 시작하기 전에
`@vapor-ui/core`에서 import한 컴포넌트만 변환됩니다. 다른 라이브러리의 동일한 이름의 컴포넌트는
변환되지 않습니다.
* **Git 상태 확인**: uncommitted changes가 있으면 실행되지 않습니다. `--force` 옵션으로 우회할 수 있습니다.
* **Dry Run 권장**: `--dry` 옵션으로 변경 사항을 먼저 확인하세요.
***
## 빠른 시작
별도 설치 없이 `npx`로 실행합니다:
```bash
npx @vapor-ui/codemod v1/migrate ./src
```
이 명령어는 아래의 모든 변환을 한 번에 적용합니다.
### 옵션
| 옵션 | 설명 |
| -------------------- | ---------------------------------------- |
| `--dry` | 변경 사항을 미리보기만 하고 파일에 적용하지 않음 |
| `--force` | Git 안전 검사를 우회하고 강제 실행 |
| `--parser ` | 파서 지정: `babel`, `ts`, `tsx` (기본값: `tsx`) |
| `--extensions ` | 변환할 파일 확장자 (기본값: `tsx,ts,jsx,js`) |
***
## 변환 목록
### `loop` → `loopFocus`
포커스 루프 동작을 제어하는 prop 이름이 변경됩니다.
**대상 컴포넌트:** `Menu`, `Tabs`
```tsx
// Before
Open...
// After
Open...
```
```tsx
// Before
...
// After
...
```
***
### `trackAnchor` → `disableAnchorTracking`
앵커 추적 prop이 부정형으로 변경됩니다. boolean 값이 반전됩니다.
**대상 컴포넌트:** `Popover`, `Menu`, `Tooltip`
```tsx
// Before
Content
// After
Content
```
```tsx
// Before
...
// After
...
```
표현식에는 `!` 연산자가 자동으로 추가됩니다:
```tsx
// Before
// After
```
***
### `hoverable` → `disableHoverablePopup`
Tooltip 팝업의 hover 가능 여부를 제어하는 prop이 부정형으로 변경됩니다. boolean 값이 반전됩니다.
**대상 컴포넌트:** `Tooltip`
```tsx
// Before
Hover meContent
// After
Hover meContent
```
```tsx
// Before
// After
```
***
### Hover props를 `Root`에서 `Trigger`로 이동
hover 관련 props가 `Root`에서 `Trigger`로 이동합니다.
**대상 컴포넌트 및 props:**
| Prop | Menu | Popover | Tooltip |
| ------------- | :--: | :-----: | :-----: |
| `openOnHover` | O | O | - |
| `delay` | O | O | O |
| `closeDelay` | O | O | O |
**Menu:**
```tsx
// Before
Open...
// After
Open...
```
**Popover:**
```tsx
// Before
HoverContent
// After
HoverContent
```
**Tooltip:**
```tsx
// Before
HoverContent
// After
HoverContent
```
***
### `onClearErrors` 제거
`Form.Root`에서 `onClearErrors` prop이 제거됩니다. v1에서는 `errors` prop으로 전달한 에러가 필드 값 변경 시 자동으로 클리어됩니다.
**대상 컴포넌트:** `Form`
```tsx
// Before
{
setErrors((prev) => {
const next = { ...prev };
Object.keys(clearedErrors).forEach((name) => delete next[name]);
return next;
});
}}
>
// After
```
***
### `selected` → `current`
현재 선택된 링크를 나타내는 prop 이름이 Breadcrumb API와 일관성을 맞추기 위해 변경됩니다.
**대상 컴포넌트:** `NavigationMenu`
```tsx
// Before
Home
// After
Home
```
```tsx
// Before
Dashboard
// After
Dashboard
```
***
## 고급 사용법
### 여러 변환이 적용되는 경우
```tsx
// Before
import { Menu, Tooltip } from '@vapor-ui/core';
function App() {
return (
<>
MenuItem 1Item 2Hover meTooltip content
>
);
}
// After
import { Menu, Tooltip } from '@vapor-ui/core';
function App() {
return (
<>
MenuItem 1Item 2Hover meTooltip content
>
);
}
```
### Alias import 처리
alias로 import한 컴포넌트도 올바르게 변환됩니다:
```tsx
// Before
import { Menu as VaporMenu } from '@vapor-ui/core';
Open
// After
Open
```
***
## 수동 마이그레이션
codemod로 자동 변환할 수 없는 항목입니다. 직접 검색하여 수정하세요.
### `data-selected` → `data-active`
CSS 선택자에서 사용되는 data attribute가 변경됩니다.
**대상 컴포넌트:** `Tabs`, `NavigationMenu`
기존 Tabs는 상태 이름이 `selected`, `highlighted`, `active`가 혼재되어 있어 "현재 활성 탭"이 무엇인지 직관적이지 않았습니다. v1에서는 `data-active`로 통일합니다.
```css
/* Before */
[data-selected] {
background-color: var(--color-primary);
}
/* After */
[data-active] {
background-color: var(--color-primary);
}
```
CSS 선택자는 컴포넌트 import와 무관하게 사용되므로 codemod로 자동 변환할 수 없습니다.
`data-selected`를 검색하여 직접 수정하세요.
# ESLint Plugin
URL: /docs/getting-started/eslint
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(tools)/eslint.mdx
ESLint Plugin Vapor를 사용하여 접근성 규칙을 자동으로 검사하고 코드 품질을 향상시키세요.
***
title: ESLint Plugin
description: ESLint Plugin Vapor를 사용하여 접근성 규칙을 자동으로 검사하고 코드 품질을 향상시키세요.
-----------------------------------------------------------------------
**ESLint Plugin Vapor**는 Vapor UI 컴포넌트의 **접근성 규칙을 자동으로 검사**하여 더 나은 사용자 경험을 보장합니다.
## Why
* Vapor UI 컴포넌트를 사용할 때 자주 발생하는 접근성 문제들을 **개발 단계에서 미리 발견**할 수 있습니다.
* 수동으로 검토하기 어려운 접근성 가이드라인을 **자동으로 체크**합니다. 이제 개발자는 더 나은 코드를 작성하는 데에만 집중할 수 있습니다.
* 웹사이트의 전반적인 사용자 경험을 향상시키고, 더 넓은 사용자층에게 다가갈 수 있습니다.
## Installation
프로젝트에서 사용 중인 패키지 매니저로 플러그인을 설치하세요. `eslint-plugin-vapor`는 eslint-plugin-jsx-a11y, typescript-eslint와 함께 사용할 수 있습니다.
```package-install
npm install --save-dev eslint-plugin-vapor eslint-plugin-jsx-a11y typescript-eslint
```
## Configuration
### Flat Config
ESLint 9.0+ 버전을 사용하는 경우, `eslint.config.js` 파일에 다음과 같이 설정하세요:
```js
import vapor from 'eslint-plugin-vapor';
export default [
{
plugins: {
vapor,
},
rules: {
'vapor/icon-button-has-aria-label': 'error',
'vapor/navigation-has-aria-label': 'error',
},
},
// 또는 recommended 설정 사용
vapor.configs.recommended,
];
```
### Legacy Config
ESLint 8.x 버전을 사용하는 경우, `.eslintrc.js` 파일에 다음과 같이 설정하세요:
```js
module.exports = {
plugins: ['vapor'],
extends: ['plugin:vapor/legacy'],
// 또는 개별 규칙 설정
rules: {
'vapor/icon-button-has-aria-label': 'error',
'vapor/navigation-has-aria-label': 'error',
},
};
```
## Rules
### icon-button-has-aria-label
`IconButton` 컴포넌트에 `aria-label` 속성이 있는지 검사합니다.
```tsx
// ❌
// ✅
```
### navigation-has-aria-label
`NavigationMenu.Root`와 `Breadcrumb.Root` 컴포넌트에 `aria-label` 속성이 있는지 검사합니다.
```tsx
// ❌
......
// ✅
......
```
### alt-text-on-avatar
`Avatar` 컴포넌트를 이미지로 사용할 때, `src`와 `alt` 속성이 있는지 검사합니다.
```tsx
// ❌
// ✅
```
### should-have-title-on-dialog
`Dialog` 컴포넌트에 `Dialog.Title`, 혹은 `aria-label` 속성이 포함되어 있는지 검사합니다.
```tsx
// ❌
// ✅
// 또는
```
# LLMs.txt
URL: /docs/getting-started/llms-txt
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(tools)/llms-txt.mdx
Cursor 등 AI 도구에서 Vapor Design System 문서를 활용하는 방법
***
title: LLMs.txt
description: Cursor 등 AI 도구에서 Vapor Design System 문서를 활용하는 방법
-------------------------------------------------------------
이 문서에서는 LLMs.txt 파일의 구성과 AI 도구에서 활용하는 방법을 설명합니다.
## LLMs.txt 개요
LLMs.txt는 LLM(Large Language Model)이 Vapor Design System 문서를 이해하도록 구조화한 텍스트 파일입니다. 컨텍스트 창이 제한된 AI 도구에서 핵심 정보를 빠르게 파악할 수 있습니다.
## 파일 구성
| 파일명 | 설명 |
| ------------- | ------------------------------------- |
| llms.txt | 전체 라우트 및 카테고리 개요를 포함한 메인 인덱스 파일 |
| llms-full.txt | 모든 문서(컴포넌트, 가이드, API 등)를 포함한 전체 문서 세트 |
### 인덱스 파일
* [llms.txt](/llms.txt): 각 문서에 대한 요약과 링크를 포함합니다.
* [llms-full.txt](/llms-full.txt): 모든 내용을 포함하며 큰 컨텍스트 워크플로우에 적합합니다.
### 문서 경로
**가이드**
* [/docs/getting-started/installation.mdx](/docs/getting-started/installation.mdx): 설치 가이드
**디자인 토큰**
* [/docs/getting-started/color.mdx](/docs/getting-started/color.mdx): 색상 시스템
* [/docs/getting-started/size.mdx](/docs/getting-started/size.mdx): 크기 및 여백
* [/docs/getting-started/typography.mdx](/docs/getting-started/typography.mdx): 타이포그래피 시스템
**테마**
* [/theme/theme-provider.mdx](/theme/theme-provider.mdx): 테마 설정 가이드
**컴포넌트**
* [/docs/components/\[component-name\].mdx](/docs/components/avatar.mdx): 컴포넌트별 사용법과 API (예: Avatar)
## AI 도구에서 사용
Cursor 등 LLM 기반 코드 도구에서 LLMs.txt 파일을 활용하려면 `@Docs` 기능을 사용합니다.
* [Cursor @Docs 문서](https://docs.cursor.com/context/@-symbols/@-docs)
# Color
URL: /docs/getting-started/color
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/(tokens)/color.mdx
컬러 토큰은 브랜드의 정체성과 사용자 경험을 지원하는 다양한 색상을 정의합니다.
***
title: Color
description: 컬러 토큰은 브랜드의 정체성과 사용자 경험을 지원하는 다양한 색상을 정의합니다.
---------------------------------------------------------
| token | value |
| --------------------------------------- | ----------------------------- |
| --vapor-color-canvas | #ffffff |
| --vapor-color-white | #FFFFFF |
| --vapor-color-black | #000000 |
| --vapor-color-gray-025 | #fafafa |
| --vapor-color-gray-050 | #f4f4f4 |
| --vapor-color-gray-100 | #e1e1e1 |
| --vapor-color-gray-200 | #c6c6c6 |
| --vapor-color-gray-300 | #a3a3a3 |
| --vapor-color-gray-400 | #959595 |
| --vapor-color-gray-500 | #767676 |
| --vapor-color-gray-600 | #5d5d5d |
| --vapor-color-gray-700 | #4c4c4c |
| --vapor-color-gray-800 | #393939 |
| --vapor-color-gray-900 | #262626 |
| --vapor-color-red-050 | #fff5f4 |
| --vapor-color-red-100 | #ffd8d7 |
| --vapor-color-red-200 | #ffb3b2 |
| --vapor-color-red-300 | #fc7d7f |
| --vapor-color-red-400 | #f8636a |
| --vapor-color-red-500 | #da3944 |
| --vapor-color-red-600 | #bb1225 |
| --vapor-color-red-700 | #9e0006 |
| --vapor-color-red-800 | #790000 |
| --vapor-color-red-900 | #570000 |
| --vapor-color-pink-050 | #fff5f7 |
| --vapor-color-pink-100 | #ffd8e2 |
| --vapor-color-pink-200 | #ffb1c6 |
| --vapor-color-pink-300 | #f77ca3 |
| --vapor-color-pink-400 | #f26394 |
| --vapor-color-pink-500 | #d13e76 |
| --vapor-color-pink-600 | #b5135d |
| --vapor-color-pink-700 | #9a0047 |
| --vapor-color-pink-800 | #77002d |
| --vapor-color-pink-900 | #550016 |
| --vapor-color-grape-050 | #fcf5fe |
| --vapor-color-grape-100 | #f4d8fb |
| --vapor-color-grape-200 | #e9b4f7 |
| --vapor-color-grape-300 | #d883ef |
| --vapor-color-grape-400 | #d06bea |
| --vapor-color-grape-500 | #b542d1 |
| --vapor-color-grape-600 | #9a1cb7 |
| --vapor-color-grape-700 | #83009f |
| --vapor-color-grape-800 | #62007e |
| --vapor-color-grape-900 | #43005e |
| --vapor-color-violet-050 | #f9f5ff |
| --vapor-color-violet-100 | #ebdbff |
| --vapor-color-violet-200 | #d9b9ff |
| --vapor-color-violet-300 | #b691fa |
| --vapor-color-violet-400 | #a480f7 |
| --vapor-color-violet-500 | #805cec |
| --vapor-color-violet-600 | #693fcf |
| --vapor-color-violet-700 | #5929ba |
| --vapor-color-violet-800 | #4805a3 |
| --vapor-color-violet-900 | #2e007a |
| --vapor-color-blue-050 | #eff8ff |
| --vapor-color-blue-100 | #c6e6ff |
| --vapor-color-blue-200 | #8dcdff |
| --vapor-color-blue-300 | #51a9f7 |
| --vapor-color-blue-400 | #4198f2 |
| --vapor-color-blue-500 | #2A72E5 |
| --vapor-color-blue-600 | #0957c8 |
| --vapor-color-blue-700 | #0043b3 |
| --vapor-color-blue-800 | #002b9b |
| --vapor-color-blue-900 | #000e84 |
| --vapor-color-cyan-050 | #eef9fb |
| --vapor-color-cyan-100 | #c2e8f0 |
| --vapor-color-cyan-200 | #84d2e2 |
| --vapor-color-cyan-300 | #1bb3cc |
| --vapor-color-cyan-400 | #14a3bc |
| --vapor-color-cyan-500 | #04819c |
| --vapor-color-cyan-600 | #006680 |
| --vapor-color-cyan-700 | #00536c |
| --vapor-color-cyan-800 | #003e57 |
| --vapor-color-cyan-900 | #002941 |
| --vapor-color-green-050 | #edfaf4 |
| --vapor-color-green-100 | #bbecd7 |
| --vapor-color-green-200 | #75d9b4 |
| --vapor-color-green-300 | #43b790 |
| --vapor-color-green-400 | #33a782 |
| --vapor-color-green-500 | #058765 |
| --vapor-color-green-600 | #006c4b |
| --vapor-color-green-700 | #00583a |
| --vapor-color-green-800 | #004226 |
| --vapor-color-green-900 | #002e13 |
| --vapor-color-lime-050 | #f1fae8 |
| --vapor-color-lime-100 | #c9eca8 |
| --vapor-color-lime-200 | #9ad84a |
| --vapor-color-lime-300 | #71b61a |
| --vapor-color-lime-400 | #61a613 |
| --vapor-color-lime-500 | #428600 |
| --vapor-color-lime-600 | #276c00 |
| --vapor-color-lime-700 | #115a00 |
| --vapor-color-lime-800 | #004400 |
| --vapor-color-lime-900 | #002e00 |
| --vapor-color-yellow-050 | #fff7e7 |
| --vapor-color-yellow-100 | #ffdd95 |
| --vapor-color-yellow-200 | #fbbd05 |
| --vapor-color-yellow-300 | #d99700 |
| --vapor-color-yellow-400 | #ca8700 |
| --vapor-color-yellow-500 | #a96800 |
| --vapor-color-yellow-600 | #8d4f00 |
| --vapor-color-yellow-700 | #7a3c00 |
| --vapor-color-yellow-800 | #632700 |
| --vapor-color-yellow-900 | #4d1100 |
| --vapor-color-orange-050 | #fff6f1 |
| --vapor-color-orange-100 | #ffd9c8 |
| --vapor-color-orange-200 | #fcb797 |
| --vapor-color-orange-300 | #f4864f |
| --vapor-color-orange-400 | #ef6f25 |
| --vapor-color-orange-500 | #d34701 |
| --vapor-color-orange-600 | #b72100 |
| --vapor-color-orange-700 | #9e0000 |
| --vapor-color-orange-800 | #790000 |
| --vapor-color-orange-900 | #560000 |
| --vapor-color-background-primary-100 | var(--vapor-color-blue-100) |
| --vapor-color-background-primary-200 | var(--vapor-color-blue-500) |
| --vapor-color-background-primary-weak | var(--vapor-color-blue-100) |
| --vapor-color-background-primary | var(--vapor-color-blue-500) |
| --vapor-color-background-secondary-100 | var(--vapor-color-gray-050) |
| --vapor-color-background-secondary-200 | var(--vapor-color-gray-100) |
| --vapor-color-background-secondary-weak | var(--vapor-color-gray-050) |
| --vapor-color-background-secondary | var(--vapor-color-gray-100) |
| --vapor-color-background-success-100 | var(--vapor-color-green-100) |
| --vapor-color-background-success-200 | var(--vapor-color-green-500) |
| --vapor-color-background-success-weak | var(--vapor-color-green-100) |
| --vapor-color-background-success | var(--vapor-color-green-500) |
| --vapor-color-background-warning-100 | var(--vapor-color-orange-100) |
| --vapor-color-background-warning-200 | var(--vapor-color-orange-500) |
| --vapor-color-background-warning-weak | var(--vapor-color-orange-100) |
| --vapor-color-background-warning | var(--vapor-color-orange-500) |
| --vapor-color-background-danger-100 | var(--vapor-color-red-100) |
| --vapor-color-background-danger-200 | var(--vapor-color-red-500) |
| --vapor-color-background-danger-weak | var(--vapor-color-red-100) |
| --vapor-color-background-danger | var(--vapor-color-red-500) |
| --vapor-color-background-hint-100 | var(--vapor-color-gray-100) |
| --vapor-color-background-hint-200 | var(--vapor-color-gray-600) |
| --vapor-color-background-hint-weak | var(--vapor-color-gray-100) |
| --vapor-color-background-hint | var(--vapor-color-gray-600) |
| --vapor-color-background-contrast-100 | var(--vapor-color-gray-300) |
| --vapor-color-background-contrast-200 | var(--vapor-color-gray-800) |
| --vapor-color-background-contrast-weak | var(--vapor-color-gray-500) |
| --vapor-color-background-contrast | var(--vapor-color-gray-800) |
| --vapor-color-background-canvas-100 | var(--vapor-color-canvas) |
| --vapor-color-background-canvas-200 | var(--vapor-color-gray-050) |
| --vapor-color-background-overlay-100 | var(--vapor-color-canvas) |
| --vapor-color-background-canvas-base | var(--vapor-color-white) |
| --vapor-color-background-canvas-sunken | var(--vapor-color-gray-050) |
| --vapor-color-background-canvas-raised | var(--vapor-color-gray-025) |
| --vapor-color-background-canvas-dim | var(--vapor-color-black) |
| --vapor-color-background-canvas-overlay | var(--vapor-color-white) |
| --vapor-color-foreground-primary-100 | var(--vapor-color-blue-600) |
| --vapor-color-foreground-primary-200 | var(--vapor-color-blue-700) |
| --vapor-color-foreground-primary | var(--vapor-color-blue-600) |
| --vapor-color-foreground-primary-strong | var(--vapor-color-blue-700) |
| --vapor-color-foreground-secondary-100 | var(--vapor-color-gray-800) |
| --vapor-color-foreground-secondary-200 | var(--vapor-color-gray-900) |
| --vapor-color-foreground-secondary | var(--vapor-color-gray-700) |
| --vapor-color-foreground-success-100 | var(--vapor-color-green-600) |
| --vapor-color-foreground-success-200 | var(--vapor-color-green-700) |
| --vapor-color-foreground-success | var(--vapor-color-green-600) |
| --vapor-color-foreground-success-strong | var(--vapor-color-green-700) |
| --vapor-color-foreground-warning-100 | var(--vapor-color-orange-600) |
| --vapor-color-foreground-warning-200 | var(--vapor-color-orange-700) |
| --vapor-color-foreground-warning | var(--vapor-color-orange-600) |
| --vapor-color-foreground-warning-strong | var(--vapor-color-orange-700) |
| --vapor-color-foreground-danger-100 | var(--vapor-color-red-600) |
| --vapor-color-foreground-danger-200 | var(--vapor-color-red-700) |
| --vapor-color-foreground-danger | var(--vapor-color-red-600) |
| --vapor-color-foreground-danger-strong | var(--vapor-color-red-700) |
| --vapor-color-foreground-hint-100 | var(--vapor-color-gray-600) |
| --vapor-color-foreground-hint-200 | var(--vapor-color-gray-700) |
| --vapor-color-foreground-hint | var(--vapor-color-gray-500) |
| --vapor-color-foreground-contrast-100 | var(--vapor-color-gray-800) |
| --vapor-color-foreground-contrast-200 | var(--vapor-color-gray-900) |
| --vapor-color-foreground-contrast | var(--vapor-color-black) |
| --vapor-color-foreground-normal-100 | var(--vapor-color-gray-700) |
| --vapor-color-foreground-normal-200 | var(--vapor-color-gray-900) |
| --vapor-color-foreground-normal | var(--vapor-color-gray-900) |
| --vapor-color-foreground-inverse | var(--vapor-color-white) |
| --vapor-color-foreground-staticWhite | var(--vapor-color-white) |
| --vapor-color-foreground-staticBlack | var(--vapor-color-black) |
| --vapor-color-border-normal | var(--vapor-color-gray-100) |
| --vapor-color-border-primary | var(--vapor-color-blue-500) |
| --vapor-color-border-secondary | var(--vapor-color-gray-200) |
| --vapor-color-border-success | var(--vapor-color-green-500) |
| --vapor-color-border-warning | var(--vapor-color-orange-500) |
| --vapor-color-border-danger | var(--vapor-color-red-500) |
| --vapor-color-border-hint | var(--vapor-color-gray-600) |
| --vapor-color-border-contrast | var(--vapor-color-gray-800) |
# Size
URL: /docs/getting-started/size
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/(tokens)/size.mdx
요소의 크기,여백과 관련된 값을 정의하여 일관된 디자인을 유지하는 데 도움을 줍니다.
***
title: Size
description: 요소의 크기,여백과 관련된 값을 정의하여 일관된 디자인을 유지하는 데 도움을 줍니다.
------------------------------------------------------------
| token | value |
| ----------------------------- | -------- |
| --vapor-size-borderRadius-000 | 0rem |
| --vapor-size-borderRadius-050 | 0.125rem |
| --vapor-size-borderRadius-100 | 0.25rem |
| --vapor-size-borderRadius-200 | 0.375rem |
| --vapor-size-borderRadius-300 | 0.5rem |
| --vapor-size-borderRadius-400 | 0.75rem |
| --vapor-size-borderRadius-500 | 1rem |
| --vapor-size-borderRadius-600 | 1.25rem |
| --vapor-size-borderRadius-700 | 1.5rem |
| --vapor-size-borderRadius-800 | 2rem |
| --vapor-size-borderRadius-900 | 2.5rem |
| --vapor-size-space-000 | 0rem |
| --vapor-size-space-025 | 0.125rem |
| --vapor-size-space-050 | 0.25rem |
| --vapor-size-space-075 | 0.375rem |
| --vapor-size-space-100 | 0.5rem |
| --vapor-size-space-150 | 0.75rem |
| --vapor-size-space-175 | 0.875rem |
| --vapor-size-space-200 | 1rem |
| --vapor-size-space-225 | 1.125rem |
| --vapor-size-space-250 | 1.25rem |
| --vapor-size-space-300 | 1.5rem |
| --vapor-size-space-400 | 2rem |
| --vapor-size-space-500 | 2.5rem |
| --vapor-size-space-600 | 3rem |
| --vapor-size-space-700 | 3.5rem |
| --vapor-size-space-800 | 4rem |
| --vapor-size-space-900 | 4.5rem |
| --vapor-size-dimension-025 | 0.125rem |
| --vapor-size-dimension-050 | 0.25rem |
| --vapor-size-dimension-075 | 0.375rem |
| --vapor-size-dimension-100 | 0.5rem |
| --vapor-size-dimension-150 | 0.75rem |
| --vapor-size-dimension-175 | 0.875rem |
| --vapor-size-dimension-200 | 1rem |
| --vapor-size-dimension-225 | 1.125rem |
| --vapor-size-dimension-250 | 1.25rem |
| --vapor-size-dimension-300 | 1.5rem |
| --vapor-size-dimension-400 | 2rem |
| --vapor-size-dimension-500 | 2.5rem |
| --vapor-size-dimension-600 | 3rem |
| --vapor-size-dimension-700 | 3.5rem |
| --vapor-size-dimension-800 | 4rem |
# Typography
URL: /docs/getting-started/typography
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/(handbook)/(tokens)/typography.mdx
텍스트의 스타일과 형식을 정의하여 일관된 글꼴 사용과 가독성을 보장합니다.
***
title: Typography
description: 텍스트의 스타일과 형식을 정의하여 일관된 글꼴 사용과 가독성을 보장합니다.
------------------------------------------------------
| token | value |
| ------------------------------------ | ---------- |
| --vapor-typography-fontFamily-sans | Pretendard |
| --vapor-typography-fontFamily-code | FiraCode |
| --vapor-typography-fontSize-025 | 10px |
| --vapor-typography-fontSize-050 | 12px |
| --vapor-typography-fontSize-075 | 14px |
| --vapor-typography-fontSize-100 | 16px |
| --vapor-typography-fontSize-200 | 18px |
| --vapor-typography-fontSize-300 | 20px |
| --vapor-typography-fontSize-400 | 24px |
| --vapor-typography-fontSize-500 | 32px |
| --vapor-typography-fontSize-600 | 38px |
| --vapor-typography-fontSize-700 | 48px |
| --vapor-typography-fontSize-800 | 64px |
| --vapor-typography-fontSize-900 | 80px |
| --vapor-typography-fontSize-1000 | 120px |
| --vapor-typography-fontWeight-400 | regular |
| --vapor-typography-fontWeight-500 | medium |
| --vapor-typography-fontWeight-700 | bold |
| --vapor-typography-fontWeight-800 | extra-bold |
| --vapor-typography-letterSpacing-000 | 0 |
| --vapor-typography-letterSpacing-100 | -0.1px |
| --vapor-typography-letterSpacing-200 | -0.2px |
| --vapor-typography-letterSpacing-300 | -0.3px |
| --vapor-typography-letterSpacing-400 | -0.4px |
| --vapor-typography-lineHeight-025 | 14px |
| --vapor-typography-lineHeight-050 | 18px |
| --vapor-typography-lineHeight-075 | 22px |
| --vapor-typography-lineHeight-100 | 24px |
| --vapor-typography-lineHeight-200 | 26px |
| --vapor-typography-lineHeight-300 | 30px |
| --vapor-typography-lineHeight-400 | 36px |
| --vapor-typography-lineHeight-500 | 48px |
| --vapor-typography-lineHeight-600 | 56px |
| --vapor-typography-lineHeight-700 | 62px |
| --vapor-typography-lineHeight-800 | 84px |
| --vapor-typography-lineHeight-900 | 104px |
| --vapor-typography-lineHeight-1000 | 156px |