# Icons
URL: /docs/icons
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/icons.mdx
@vapor-ui/icons 라이브러리에서 제공하는 아이콘입니다.
아이콘을 클릭해 import 문을 복사할 수 있습니다.
***
title: Icons
description: |
@vapor-ui/icons 라이브러리에서 제공하는 아이콘입니다.
아이콘을 클릭해 import 문을 복사할 수 있습니다.
------------------------------
## Basic Icons
| Icon Name | Import Statement |
| --------------------------- | ------------------------------------------------------------- |
| `AchievementIcon` | `import { AchievementIcon } from '@vapor-ui/icons'` |
| `AddUserIcon` | `import { AddUserIcon } from '@vapor-ui/icons'` |
| `AiGoormeeIcon` | `import { AiGoormeeIcon } from '@vapor-ui/icons'` |
| `AiSmartieIcon` | `import { AiSmartieIcon } from '@vapor-ui/icons'` |
| `AirplayIcon` | `import { AirplayIcon } from '@vapor-ui/icons'` |
| `AlgorithmIcon` | `import { AlgorithmIcon } from '@vapor-ui/icons'` |
| `AppleIcon` | `import { AppleIcon } from '@vapor-ui/icons'` |
| `ArrowDownCircleIcon` | `import { ArrowDownCircleIcon } from '@vapor-ui/icons'` |
| `AssignmentIcon` | `import { AssignmentIcon } from '@vapor-ui/icons'` |
| `AwsIcon` | `import { AwsIcon } from '@vapor-ui/icons'` |
| `AzureIcon` | `import { AzureIcon } from '@vapor-ui/icons'` |
| `BedIcon` | `import { BedIcon } from '@vapor-ui/icons'` |
| `BellOffIcon` | `import { BellOffIcon } from '@vapor-ui/icons'` |
| `BellOnIcon` | `import { BellOnIcon } from '@vapor-ui/icons'` |
| `BitbucketIcon` | `import { BitbucketIcon } from '@vapor-ui/icons'` |
| `BlogColorIcon` | `import { BlogColorIcon } from '@vapor-ui/icons'` |
| `BlogIcon` | `import { BlogIcon } from '@vapor-ui/icons'` |
| `BookIcon` | `import { BookIcon } from '@vapor-ui/icons'` |
| `BookmarkIcon` | `import { BookmarkIcon } from '@vapor-ui/icons'` |
| `BottomPlayerIcon` | `import { BottomPlayerIcon } from '@vapor-ui/icons'` |
| `BranchIcon` | `import { BranchIcon } from '@vapor-ui/icons'` |
| `BreakpointIcon` | `import { BreakpointIcon } from '@vapor-ui/icons'` |
| `BuildIcon` | `import { BuildIcon } from '@vapor-ui/icons'` |
| `CafeIcon` | `import { CafeIcon } from '@vapor-ui/icons'` |
| `CakeIcon` | `import { CakeIcon } from '@vapor-ui/icons'` |
| `CalculatorIcon` | `import { CalculatorIcon } from '@vapor-ui/icons'` |
| `CalendarIcon` | `import { CalendarIcon } from '@vapor-ui/icons'` |
| `CallIcon` | `import { CallIcon } from '@vapor-ui/icons'` |
| `CameraIcon` | `import { CameraIcon } from '@vapor-ui/icons'` |
| `CampIcon` | `import { CampIcon } from '@vapor-ui/icons'` |
| `CaptionIcon` | `import { CaptionIcon } from '@vapor-ui/icons'` |
| `CarIcon` | `import { CarIcon } from '@vapor-ui/icons'` |
| `CardsIcon` | `import { CardsIcon } from '@vapor-ui/icons'` |
| `CaretDownIcon` | `import { CaretDownIcon } from '@vapor-ui/icons'` |
| `CaretLeftIcon` | `import { CaretLeftIcon } from '@vapor-ui/icons'` |
| `CaretRightIcon` | `import { CaretRightIcon } from '@vapor-ui/icons'` |
| `CaretUpIcon` | `import { CaretUpIcon } from '@vapor-ui/icons'` |
| `CertificateIcon` | `import { CertificateIcon } from '@vapor-ui/icons'` |
| `ChapterIcon` | `import { ChapterIcon } from '@vapor-ui/icons'` |
| `ChartPieIcon` | `import { ChartPieIcon } from '@vapor-ui/icons'` |
| `ChatgptIcon` | `import { ChatgptIcon } from '@vapor-ui/icons'` |
| `CheckCircleIcon` | `import { CheckCircleIcon } from '@vapor-ui/icons'` |
| `CheckboxIcon` | `import { CheckboxIcon } from '@vapor-ui/icons'` |
| `ChromeColorIcon` | `import { ChromeColorIcon } from '@vapor-ui/icons'` |
| `ChromeIcon` | `import { ChromeIcon } from '@vapor-ui/icons'` |
| `ClassIcon` | `import { ClassIcon } from '@vapor-ui/icons'` |
| `CodeBlockIcon` | `import { CodeBlockIcon } from '@vapor-ui/icons'` |
| `CodevisorIcon` | `import { CodevisorIcon } from '@vapor-ui/icons'` |
| `CollaborationIcon` | `import { CollaborationIcon } from '@vapor-ui/icons'` |
| `ComponentIcon` | `import { ComponentIcon } from '@vapor-ui/icons'` |
| `ContainerIcon` | `import { ContainerIcon } from '@vapor-ui/icons'` |
| `ContainerRunIcon` | `import { ContainerRunIcon } from '@vapor-ui/icons'` |
| `ContainerShareIcon` | `import { ContainerShareIcon } from '@vapor-ui/icons'` |
| `ContainerStopIcon` | `import { ContainerStopIcon } from '@vapor-ui/icons'` |
| `ContainerToImageIcon` | `import { ContainerToImageIcon } from '@vapor-ui/icons'` |
| `ControlCommonIcon` | `import { ControlCommonIcon } from '@vapor-ui/icons'` |
| `CopyIcon` | `import { CopyIcon } from '@vapor-ui/icons'` |
| `CouponIcon` | `import { CouponIcon } from '@vapor-ui/icons'` |
| `CourseHistoryIcon` | `import { CourseHistoryIcon } from '@vapor-ui/icons'` |
| `CourseIcon` | `import { CourseIcon } from '@vapor-ui/icons'` |
| `CpuIcon` | `import { CpuIcon } from '@vapor-ui/icons'` |
| `CreditCardIcon` | `import { CreditCardIcon } from '@vapor-ui/icons'` |
| `CursorshareoffIcon` | `import { CursorshareoffIcon } from '@vapor-ui/icons'` |
| `CursorshareonIcon` | `import { CursorshareonIcon } from '@vapor-ui/icons'` |
| `DarkIcon` | `import { DarkIcon } from '@vapor-ui/icons'` |
| `DashboardIcon` | `import { DashboardIcon } from '@vapor-ui/icons'` |
| `DatabaseIcon` | `import { DatabaseIcon } from '@vapor-ui/icons'` |
| `DebugContinueIcon` | `import { DebugContinueIcon } from '@vapor-ui/icons'` |
| `DebugIcon` | `import { DebugIcon } from '@vapor-ui/icons'` |
| `DeployPushIcon` | `import { DeployPushIcon } from '@vapor-ui/icons'` |
| `DetailViewIcon` | `import { DetailViewIcon } from '@vapor-ui/icons'` |
| `DiscIcon` | `import { DiscIcon } from '@vapor-ui/icons'` |
| `DiscordColorIcon` | `import { DiscordColorIcon } from '@vapor-ui/icons'` |
| `DiscordIcon` | `import { DiscordIcon } from '@vapor-ui/icons'` |
| `DiscussionIcon` | `import { DiscussionIcon } from '@vapor-ui/icons'` |
| `DiskIcon` | `import { DiskIcon } from '@vapor-ui/icons'` |
| `DislikeIcon` | `import { DislikeIcon } from '@vapor-ui/icons'` |
| `DislikeThumbIcon` | `import { DislikeThumbIcon } from '@vapor-ui/icons'` |
| `DividerIcon` | `import { DividerIcon } from '@vapor-ui/icons'` |
| `DockerIcon` | `import { DockerIcon } from '@vapor-ui/icons'` |
| `DocktoBottomIcon` | `import { DocktoBottomIcon } from '@vapor-ui/icons'` |
| `DocumentViewerIcon` | `import { DocumentViewerIcon } from '@vapor-ui/icons'` |
| `DotIcon` | `import { DotIcon } from '@vapor-ui/icons'` |
| `DownloadIcon` | `import { DownloadIcon } from '@vapor-ui/icons'` |
| `DragIndicatorIcon` | `import { DragIndicatorIcon } from '@vapor-ui/icons'` |
| `EditIcon` | `import { EditIcon } from '@vapor-ui/icons'` |
| `EraserIcon` | `import { EraserIcon } from '@vapor-ui/icons'` |
| `ErrorCircleIcon` | `import { ErrorCircleIcon } from '@vapor-ui/icons'` |
| `ExamIcon` | `import { ExamIcon } from '@vapor-ui/icons'` |
| `ExamListIcon` | `import { ExamListIcon } from '@vapor-ui/icons'` |
| `ExamReportIcon` | `import { ExamReportIcon } from '@vapor-ui/icons'` |
| `ExploreIcon` | `import { ExploreIcon } from '@vapor-ui/icons'` |
| `ExportIcon` | `import { ExportIcon } from '@vapor-ui/icons'` |
| `ExportImageIcon` | `import { ExportImageIcon } from '@vapor-ui/icons'` |
| `FacebookColorIcon` | `import { FacebookColorIcon } from '@vapor-ui/icons'` |
| `FacebookIcon` | `import { FacebookIcon } from '@vapor-ui/icons'` |
| `FigmaColorIcon` | `import { FigmaColorIcon } from '@vapor-ui/icons'` |
| `FigmaIcon` | `import { FigmaIcon } from '@vapor-ui/icons'` |
| `FileAddIcon` | `import { FileAddIcon } from '@vapor-ui/icons'` |
| `FileDeleteIcon` | `import { FileDeleteIcon } from '@vapor-ui/icons'` |
| `FileIcon` | `import { FileIcon } from '@vapor-ui/icons'` |
| `FilenewIcon` | `import { FilenewIcon } from '@vapor-ui/icons'` |
| `FilterIcon` | `import { FilterIcon } from '@vapor-ui/icons'` |
| `FirefoxColorIcon` | `import { FirefoxColorIcon } from '@vapor-ui/icons'` |
| `FlagIcon` | `import { FlagIcon } from '@vapor-ui/icons'` |
| `FlaskIcon` | `import { FlaskIcon } from '@vapor-ui/icons'` |
| `FlightIcon` | `import { FlightIcon } from '@vapor-ui/icons'` |
| `FoldIcon` | `import { FoldIcon } from '@vapor-ui/icons'` |
| `FolderIcon` | `import { FolderIcon } from '@vapor-ui/icons'` |
| `FolderNewIcon` | `import { FolderNewIcon } from '@vapor-ui/icons'` |
| `FolderSearchIcon` | `import { FolderSearchIcon } from '@vapor-ui/icons'` |
| `ForkIcon` | `import { ForkIcon } from '@vapor-ui/icons'` |
| `FunctionIcon` | `import { FunctionIcon } from '@vapor-ui/icons'` |
| `GameIcon` | `import { GameIcon } from '@vapor-ui/icons'` |
| `GcpIcon` | `import { GcpIcon } from '@vapor-ui/icons'` |
| `GitIcon` | `import { GitIcon } from '@vapor-ui/icons'` |
| `GithubColorIcon` | `import { GithubColorIcon } from '@vapor-ui/icons'` |
| `GithubIcon` | `import { GithubIcon } from '@vapor-ui/icons'` |
| `GitlabIcon` | `import { GitlabIcon } from '@vapor-ui/icons'` |
| `GoogleCalendarIcon` | `import { GoogleCalendarIcon } from '@vapor-ui/icons'` |
| `GoogleColorIcon` | `import { GoogleColorIcon } from '@vapor-ui/icons'` |
| `GoogleDrawingIcon` | `import { GoogleDrawingIcon } from '@vapor-ui/icons'` |
| `GoogleIcon` | `import { GoogleIcon } from '@vapor-ui/icons'` |
| `GooglePresentationIcon` | `import { GooglePresentationIcon } from '@vapor-ui/icons'` |
| `GoogleSpreadsheetIcon` | `import { GoogleSpreadsheetIcon } from '@vapor-ui/icons'` |
| `GoormduinoIcon` | `import { GoormduinoIcon } from '@vapor-ui/icons'` |
| `GpuIcon` | `import { GpuIcon } from '@vapor-ui/icons'` |
| `GroupIcon` | `import { GroupIcon } from '@vapor-ui/icons'` |
| `GuestIcon` | `import { GuestIcon } from '@vapor-ui/icons'` |
| `HeartIcon` | `import { HeartIcon } from '@vapor-ui/icons'` |
| `HelpCircleIcon` | `import { HelpCircleIcon } from '@vapor-ui/icons'` |
| `HelpIcon` | `import { HelpIcon } from '@vapor-ui/icons'` |
| `HighlightViewIcon` | `import { HighlightViewIcon } from '@vapor-ui/icons'` |
| `HomeIcon` | `import { HomeIcon } from '@vapor-ui/icons'` |
| `HourglassIcon` | `import { HourglassIcon } from '@vapor-ui/icons'` |
| `IdCardIcon` | `import { IdCardIcon } from '@vapor-ui/icons'` |
| `IdeShareIcon` | `import { IdeShareIcon } from '@vapor-ui/icons'` |
| `ImageIcon` | `import { ImageIcon } from '@vapor-ui/icons'` |
| `ImagePackIcon` | `import { ImagePackIcon } from '@vapor-ui/icons'` |
| `ImageToContainerIcon` | `import { ImageToContainerIcon } from '@vapor-ui/icons'` |
| `ImportIcon` | `import { ImportIcon } from '@vapor-ui/icons'` |
| `InfoCircleIcon` | `import { InfoCircleIcon } from '@vapor-ui/icons'` |
| `InstagramColorIcon` | `import { InstagramColorIcon } from '@vapor-ui/icons'` |
| `InstagramIcon` | `import { InstagramIcon } from '@vapor-ui/icons'` |
| `IntelliSenseClassIcon` | `import { IntelliSenseClassIcon } from '@vapor-ui/icons'` |
| `IntelliSenseColorIcon` | `import { IntelliSenseColorIcon } from '@vapor-ui/icons'` |
| `IntelliSenseConstantIcon` | `import { IntelliSenseConstantIcon } from '@vapor-ui/icons'` |
| `IntelliSenseEnumIcon` | `import { IntelliSenseEnumIcon } from '@vapor-ui/icons'` |
| `IntelliSenseEventIcon` | `import { IntelliSenseEventIcon } from '@vapor-ui/icons'` |
| `IntelliSenseFunctionIcon` | `import { IntelliSenseFunctionIcon } from '@vapor-ui/icons'` |
| `IntelliSenseInterfaceIcon` | `import { IntelliSenseInterfaceIcon } from '@vapor-ui/icons'` |
| `IntelliSenseModuleIcon` | `import { IntelliSenseModuleIcon } from '@vapor-ui/icons'` |
| `IntelliSenseNullIcon` | `import { IntelliSenseNullIcon } from '@vapor-ui/icons'` |
| `IntelliSenseOperatorIcon` | `import { IntelliSenseOperatorIcon } from '@vapor-ui/icons'` |
| `IntelliSensePropertyIcon` | `import { IntelliSensePropertyIcon } from '@vapor-ui/icons'` |
| `IntelliSenseSnippetIcon` | `import { IntelliSenseSnippetIcon } from '@vapor-ui/icons'` |
| `IntelliSenseStructureIcon` | `import { IntelliSenseStructureIcon } from '@vapor-ui/icons'` |
| `IntelliSenseTextIcon` | `import { IntelliSenseTextIcon } from '@vapor-ui/icons'` |
| `IntelliSenseUnitIcon` | `import { IntelliSenseUnitIcon } from '@vapor-ui/icons'` |
| `IntelliSenseValueIcon` | `import { IntelliSenseValueIcon } from '@vapor-ui/icons'` |
| `IntellijColorIcon` | `import { IntellijColorIcon } from '@vapor-ui/icons'` |
| `ItalicIcon` | `import { ItalicIcon } from '@vapor-ui/icons'` |
| `JiraIcon` | `import { JiraIcon } from '@vapor-ui/icons'` |
| `JupyterColorIcon` | `import { JupyterColorIcon } from '@vapor-ui/icons'` |
| `JupyterlabColorIcon` | `import { JupyterlabColorIcon } from '@vapor-ui/icons'` |
| `JupyterlabIcon` | `import { JupyterlabIcon } from '@vapor-ui/icons'` |
| `KakaoIcon` | `import { KakaoIcon } from '@vapor-ui/icons'` |
| `KeyboardIcon` | `import { KeyboardIcon } from '@vapor-ui/icons'` |
| `KeyboardTabIcon` | `import { KeyboardTabIcon } from '@vapor-ui/icons'` |
| `KidIcon` | `import { KidIcon } from '@vapor-ui/icons'` |
| `KrampolineIcon` | `import { KrampolineIcon } from '@vapor-ui/icons'` |
| `KubernatesIcon` | `import { KubernatesIcon } from '@vapor-ui/icons'` |
| `LightIcon` | `import { LightIcon } from '@vapor-ui/icons'` |
| `LightbulbIcon` | `import { LightbulbIcon } from '@vapor-ui/icons'` |
| `LightningIcon` | `import { LightningIcon } from '@vapor-ui/icons'` |
| `LikeIcon` | `import { LikeIcon } from '@vapor-ui/icons'` |
| `LikeThumbIcon` | `import { LikeThumbIcon } from '@vapor-ui/icons'` |
| `LinkedinIcon` | `import { LinkedinIcon } from '@vapor-ui/icons'` |
| `ListIcon` | `import { ListIcon } from '@vapor-ui/icons'` |
| `ListNumberedIcon` | `import { ListNumberedIcon } from '@vapor-ui/icons'` |
| `LiveLessonIcon` | `import { LiveLessonIcon } from '@vapor-ui/icons'` |
| `LocationIcon` | `import { LocationIcon } from '@vapor-ui/icons'` |
| `LockIcon` | `import { LockIcon } from '@vapor-ui/icons'` |
| `MagicWandIcon` | `import { MagicWandIcon } from '@vapor-ui/icons'` |
| `MailIcon` | `import { MailIcon } from '@vapor-ui/icons'` |
| `MarkModeIcon` | `import { MarkModeIcon } from '@vapor-ui/icons'` |
| `MarkdownIcon` | `import { MarkdownIcon } from '@vapor-ui/icons'` |
| `MediumIcon` | `import { MediumIcon } from '@vapor-ui/icons'` |
| `MemoIcon` | `import { MemoIcon } from '@vapor-ui/icons'` |
| `MemoryIcon` | `import { MemoryIcon } from '@vapor-ui/icons'` |
| `MessageIcon` | `import { MessageIcon } from '@vapor-ui/icons'` |
| `MethodIcon` | `import { MethodIcon } from '@vapor-ui/icons'` |
| `MicOffIcon` | `import { MicOffIcon } from '@vapor-ui/icons'` |
| `MicOnIcon` | `import { MicOnIcon } from '@vapor-ui/icons'` |
| `MinusBoxIcon` | `import { MinusBoxIcon } from '@vapor-ui/icons'` |
| `MovieIcon` | `import { MovieIcon } from '@vapor-ui/icons'` |
| `MysqlColorIcon` | `import { MysqlColorIcon } from '@vapor-ui/icons'` |
| `MysqlIcon` | `import { MysqlIcon } from '@vapor-ui/icons'` |
| `NaverIcon` | `import { NaverIcon } from '@vapor-ui/icons'` |
| `NaverblogColorIcon` | `import { NaverblogColorIcon } from '@vapor-ui/icons'` |
| `NaverblogIcon` | `import { NaverblogIcon } from '@vapor-ui/icons'` |
| `NetworkIcon` | `import { NetworkIcon } from '@vapor-ui/icons'` |
| `NextIcon` | `import { NextIcon } from '@vapor-ui/icons'` |
| `NoImageIcon` | `import { NoImageIcon } from '@vapor-ui/icons'` |
| `NoUserIcon` | `import { NoUserIcon } from '@vapor-ui/icons'` |
| `NoticeBoardIcon` | `import { NoticeBoardIcon } from '@vapor-ui/icons'` |
| `NoticeCircleIcon` | `import { NoticeCircleIcon } from '@vapor-ui/icons'` |
| `NotionIcon` | `import { NotionIcon } from '@vapor-ui/icons'` |
| `ObjectIcon` | `import { ObjectIcon } from '@vapor-ui/icons'` |
| `OpenFileIcon` | `import { OpenFileIcon } from '@vapor-ui/icons'` |
| `OpenFolderIcon` | `import { OpenFolderIcon } from '@vapor-ui/icons'` |
| `OperaColorIcon` | `import { OperaColorIcon } from '@vapor-ui/icons'` |
| `OrganizationIcon` | `import { OrganizationIcon } from '@vapor-ui/icons'` |
| `PanelOpenIcon` | `import { PanelOpenIcon } from '@vapor-ui/icons'` |
| `ParentsIcon` | `import { ParentsIcon } from '@vapor-ui/icons'` |
| `PauseIcon` | `import { PauseIcon } from '@vapor-ui/icons'` |
| `PaycoIcon` | `import { PaycoIcon } from '@vapor-ui/icons'` |
| `PaypalColorIcon` | `import { PaypalColorIcon } from '@vapor-ui/icons'` |
| `PcIcon` | `import { PcIcon } from '@vapor-ui/icons'` |
| `PdfIcon` | `import { PdfIcon } from '@vapor-ui/icons'` |
| `PhoneIcon` | `import { PhoneIcon } from '@vapor-ui/icons'` |
| `PinSetIcon` | `import { PinSetIcon } from '@vapor-ui/icons'` |
| `PipetteIcon` | `import { PipetteIcon } from '@vapor-ui/icons'` |
| `PlansIcon` | `import { PlansIcon } from '@vapor-ui/icons'` |
| `PlayIcon` | `import { PlayIcon } from '@vapor-ui/icons'` |
| `PlugInIcon` | `import { PlugInIcon } from '@vapor-ui/icons'` |
| `PlugOutIcon` | `import { PlugOutIcon } from '@vapor-ui/icons'` |
| `PlusBoxIcon` | `import { PlusBoxIcon } from '@vapor-ui/icons'` |
| `PortforwardingIcon` | `import { PortforwardingIcon } from '@vapor-ui/icons'` |
| `PowerIcon` | `import { PowerIcon } from '@vapor-ui/icons'` |
| `PreIcon` | `import { PreIcon } from '@vapor-ui/icons'` |
| `PresentScreenIcon` | `import { PresentScreenIcon } from '@vapor-ui/icons'` |
| `PreviewIcon` | `import { PreviewIcon } from '@vapor-ui/icons'` |
| `PrintIcon` | `import { PrintIcon } from '@vapor-ui/icons'` |
| `ProductHuntColorIcon` | `import { ProductHuntColorIcon } from '@vapor-ui/icons'` |
| `ProgrammingIcon` | `import { ProgrammingIcon } from '@vapor-ui/icons'` |
| `ProjectIcon` | `import { ProjectIcon } from '@vapor-ui/icons'` |
| `ProjectOpenIcon` | `import { ProjectOpenIcon } from '@vapor-ui/icons'` |
| `ProjectSettingIcon` | `import { ProjectSettingIcon } from '@vapor-ui/icons'` |
| `PropertyIcon` | `import { PropertyIcon } from '@vapor-ui/icons'` |
| `PsychologyIcon` | `import { PsychologyIcon } from '@vapor-ui/icons'` |
| `PublishIcon` | `import { PublishIcon } from '@vapor-ui/icons'` |
| `QnAIcon` | `import { QnAIcon } from '@vapor-ui/icons'` |
| `QuoteIcon` | `import { QuoteIcon } from '@vapor-ui/icons'` |
| `ReferenceIcon` | `import { ReferenceIcon } from '@vapor-ui/icons'` |
| `RemoteIcon` | `import { RemoteIcon } from '@vapor-ui/icons'` |
| `RemoteOffIcon` | `import { RemoteOffIcon } from '@vapor-ui/icons'` |
| `ReplaceIcon` | `import { ReplaceIcon } from '@vapor-ui/icons'` |
| `ResultManagementIcon` | `import { ResultManagementIcon } from '@vapor-ui/icons'` |
| `RouteIcon` | `import { RouteIcon } from '@vapor-ui/icons'` |
| `RstudioColorIcon` | `import { RstudioColorIcon } from '@vapor-ui/icons'` |
| `RunIcon` | `import { RunIcon } from '@vapor-ui/icons'` |
| `SaveAsIcon` | `import { SaveAsIcon } from '@vapor-ui/icons'` |
| `SaveIcon` | `import { SaveIcon } from '@vapor-ui/icons'` |
| `SavingIcon` | `import { SavingIcon } from '@vapor-ui/icons'` |
| `SbomIcon` | `import { SbomIcon } from '@vapor-ui/icons'` |
| `SchoolIcon` | `import { SchoolIcon } from '@vapor-ui/icons'` |
| `SendIcon` | `import { SendIcon } from '@vapor-ui/icons'` |
| `SentryIcon` | `import { SentryIcon } from '@vapor-ui/icons'` |
| `SettingIcon` | `import { SettingIcon } from '@vapor-ui/icons'` |
| `ShareIcon` | `import { ShareIcon } from '@vapor-ui/icons'` |
| `ShoppingCartIcon` | `import { ShoppingCartIcon } from '@vapor-ui/icons'` |
| `SideNavIcon` | `import { SideNavIcon } from '@vapor-ui/icons'` |
| `SlackColorIcon` | `import { SlackColorIcon } from '@vapor-ui/icons'` |
| `SlackIcon` | `import { SlackIcon } from '@vapor-ui/icons'` |
| `SlotIcon` | `import { SlotIcon } from '@vapor-ui/icons'` |
| `SoundOffIcon` | `import { SoundOffIcon } from '@vapor-ui/icons'` |
| `SoundOnIcon` | `import { SoundOnIcon } from '@vapor-ui/icons'` |
| `SourcecodeIcon` | `import { SourcecodeIcon } from '@vapor-ui/icons'` |
| `SplitIcon` | `import { SplitIcon } from '@vapor-ui/icons'` |
| `SshIcon` | `import { SshIcon } from '@vapor-ui/icons'` |
| `StarIcon` | `import { StarIcon } from '@vapor-ui/icons'` |
| `StopIcon` | `import { StopIcon } from '@vapor-ui/icons'` |
| `StorageIcon` | `import { StorageIcon } from '@vapor-ui/icons'` |
| `StorybookColorIcon` | `import { StorybookColorIcon } from '@vapor-ui/icons'` |
| `StorybookIcon` | `import { StorybookIcon } from '@vapor-ui/icons'` |
| `StripeColorIcon` | `import { StripeColorIcon } from '@vapor-ui/icons'` |
| `StripeIcon` | `import { StripeIcon } from '@vapor-ui/icons'` |
| `StruckIcon` | `import { StruckIcon } from '@vapor-ui/icons'` |
| `StudentManagementIcon` | `import { StudentManagementIcon } from '@vapor-ui/icons'` |
| `SyllabusIcon` | `import { SyllabusIcon } from '@vapor-ui/icons'` |
| `TabletIcon` | `import { TabletIcon } from '@vapor-ui/icons'` |
| `TaegukColorIcon` | `import { TaegukColorIcon } from '@vapor-ui/icons'` |
| `TaegukIcon` | `import { TaegukIcon } from '@vapor-ui/icons'` |
| `TakeoffIcon` | `import { TakeoffIcon } from '@vapor-ui/icons'` |
| `TestIcon` | `import { TestIcon } from '@vapor-ui/icons'` |
| `TimeIcon` | `import { TimeIcon } from '@vapor-ui/icons'` |
| `TrashIcon` | `import { TrashIcon } from '@vapor-ui/icons'` |
| `TreeCollapseIcon` | `import { TreeCollapseIcon } from '@vapor-ui/icons'` |
| `TrelloIcon` | `import { TrelloIcon } from '@vapor-ui/icons'` |
| `TwoFileIcon` | `import { TwoFileIcon } from '@vapor-ui/icons'` |
| `UnlockIcon` | `import { UnlockIcon } from '@vapor-ui/icons'` |
| `UploadIcon` | `import { UploadIcon } from '@vapor-ui/icons'` |
| `UppercaseIcon` | `import { UppercaseIcon } from '@vapor-ui/icons'` |
| `UserCheckIcon` | `import { UserCheckIcon } from '@vapor-ui/icons'` |
| `UserIcon` | `import { UserIcon } from '@vapor-ui/icons'` |
| `UserMoveIcon` | `import { UserMoveIcon } from '@vapor-ui/icons'` |
| `UserSearchIcon` | `import { UserSearchIcon } from '@vapor-ui/icons'` |
| `VariableIcon` | `import { VariableIcon } from '@vapor-ui/icons'` |
| `VideocamOffIcon` | `import { VideocamOffIcon } from '@vapor-ui/icons'` |
| `VideocamOnIcon` | `import { VideocamOnIcon } from '@vapor-ui/icons'` |
| `ViewModuleIcon` | `import { ViewModuleIcon } from '@vapor-ui/icons'` |
| `ViewOffIcon` | `import { ViewOffIcon } from '@vapor-ui/icons'` |
| `ViewOnIcon` | `import { ViewOnIcon } from '@vapor-ui/icons'` |
| `VscodeColorIcon` | `import { VscodeColorIcon } from '@vapor-ui/icons'` |
| `VscodeIcon` | `import { VscodeIcon } from '@vapor-ui/icons'` |
| `WarningIcon` | `import { WarningIcon } from '@vapor-ui/icons'` |
| `WordMatchIcon` | `import { WordMatchIcon } from '@vapor-ui/icons'` |
| `XIcon` | `import { XIcon } from '@vapor-ui/icons'` |
| `YoutubeColorIcon` | `import { YoutubeColorIcon } from '@vapor-ui/icons'` |
| `YoutubeIcon` | `import { YoutubeIcon } from '@vapor-ui/icons'` |
## Outline Icons
| Icon Name | Import Statement |
| -------------------------------------- | ------------------------------------------------------------------------ |
| `AccessibilityOutlineIcon` | `import { AccessibilityOutlineIcon } from '@vapor-ui/icons'` |
| `AchievementOutlineIcon` | `import { AchievementOutlineIcon } from '@vapor-ui/icons'` |
| `AddCartOutlineIcon` | `import { AddCartOutlineIcon } from '@vapor-ui/icons'` |
| `AddUserOutlineIcon` | `import { AddUserOutlineIcon } from '@vapor-ui/icons'` |
| `AiGoormeeOutlineIcon` | `import { AiGoormeeOutlineIcon } from '@vapor-ui/icons'` |
| `AiSmartieOutlineIcon` | `import { AiSmartieOutlineIcon } from '@vapor-ui/icons'` |
| `AichatOutlineIcon` | `import { AichatOutlineIcon } from '@vapor-ui/icons'` |
| `AirplayOutlineIcon` | `import { AirplayOutlineIcon } from '@vapor-ui/icons'` |
| `AlgorithmOutlineIcon` | `import { AlgorithmOutlineIcon } from '@vapor-ui/icons'` |
| `AlignCenterOutlineIcon` | `import { AlignCenterOutlineIcon } from '@vapor-ui/icons'` |
| `AlignJustifyOutlineIcon` | `import { AlignJustifyOutlineIcon } from '@vapor-ui/icons'` |
| `AlignLeftOutlineIcon` | `import { AlignLeftOutlineIcon } from '@vapor-ui/icons'` |
| `AlignRightOutlineIcon` | `import { AlignRightOutlineIcon } from '@vapor-ui/icons'` |
| `AnalysisOutlineIcon` | `import { AnalysisOutlineIcon } from '@vapor-ui/icons'` |
| `ArrowDownOutlineIcon` | `import { ArrowDownOutlineIcon } from '@vapor-ui/icons'` |
| `ArrowUpOutlineIcon` | `import { ArrowUpOutlineIcon } from '@vapor-ui/icons'` |
| `AssignmentOutlineIcon` | `import { AssignmentOutlineIcon } from '@vapor-ui/icons'` |
| `AttachFileOutlineIcon` | `import { AttachFileOutlineIcon } from '@vapor-ui/icons'` |
| `AttemptOutlineIcon` | `import { AttemptOutlineIcon } from '@vapor-ui/icons'` |
| `AutoCodeOutlineIcon` | `import { AutoCodeOutlineIcon } from '@vapor-ui/icons'` |
| `BackPageOutlineIcon` | `import { BackPageOutlineIcon } from '@vapor-ui/icons'` |
| `BackUpOutlineIcon` | `import { BackUpOutlineIcon } from '@vapor-ui/icons'` |
| `BedOutlineIcon` | `import { BedOutlineIcon } from '@vapor-ui/icons'` |
| `BellOffOutlineIcon` | `import { BellOffOutlineIcon } from '@vapor-ui/icons'` |
| `BellOnOutlineIcon` | `import { BellOnOutlineIcon } from '@vapor-ui/icons'` |
| `BlankOutlineIcon` | `import { BlankOutlineIcon } from '@vapor-ui/icons'` |
| `BlockOutlineIcon` | `import { BlockOutlineIcon } from '@vapor-ui/icons'` |
| `BoldOutlineIcon` | `import { BoldOutlineIcon } from '@vapor-ui/icons'` |
| `BookOutlineIcon` | `import { BookOutlineIcon } from '@vapor-ui/icons'` |
| `BookmarkOutlineIcon` | `import { BookmarkOutlineIcon } from '@vapor-ui/icons'` |
| `BottomPlayerOutlineIcon` | `import { BottomPlayerOutlineIcon } from '@vapor-ui/icons'` |
| `BranchOutlineIcon` | `import { BranchOutlineIcon } from '@vapor-ui/icons'` |
| `BuildOutlineIcon` | `import { BuildOutlineIcon } from '@vapor-ui/icons'` |
| `BulletlistOutlineIcon` | `import { BulletlistOutlineIcon } from '@vapor-ui/icons'` |
| `CafeOutlineIcon` | `import { CafeOutlineIcon } from '@vapor-ui/icons'` |
| `CakeOutlineIcon` | `import { CakeOutlineIcon } from '@vapor-ui/icons'` |
| `CalculatorOutlineIcon` | `import { CalculatorOutlineIcon } from '@vapor-ui/icons'` |
| `CalendarOutlineIcon` | `import { CalendarOutlineIcon } from '@vapor-ui/icons'` |
| `CallOutlineIcon` | `import { CallOutlineIcon } from '@vapor-ui/icons'` |
| `CameraOutlineIcon` | `import { CameraOutlineIcon } from '@vapor-ui/icons'` |
| `CampOutlineIcon` | `import { CampOutlineIcon } from '@vapor-ui/icons'` |
| `CaptionOutlineIcon` | `import { CaptionOutlineIcon } from '@vapor-ui/icons'` |
| `CarOutlineIcon` | `import { CarOutlineIcon } from '@vapor-ui/icons'` |
| `CardsOutlineIcon` | `import { CardsOutlineIcon } from '@vapor-ui/icons'` |
| `CertificateOutlineIcon` | `import { CertificateOutlineIcon } from '@vapor-ui/icons'` |
| `ChapterOutlineIcon` | `import { ChapterOutlineIcon } from '@vapor-ui/icons'` |
| `ChartOutlineIcon` | `import { ChartOutlineIcon } from '@vapor-ui/icons'` |
| `ChartPieOutlineIcon` | `import { ChartPieOutlineIcon } from '@vapor-ui/icons'` |
| `CheckCartOutlineIcon` | `import { CheckCartOutlineIcon } from '@vapor-ui/icons'` |
| `CheckCircleOutlineIcon` | `import { CheckCircleOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronDoubleLeftOutlineIcon` | `import { ChevronDoubleLeftOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronDoubleRightOutlineIcon` | `import { ChevronDoubleRightOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronDownOutlineIcon` | `import { ChevronDownOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronLeftOutlineIcon` | `import { ChevronLeftOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronRightOutlineIcon` | `import { ChevronRightOutlineIcon } from '@vapor-ui/icons'` |
| `ChevronUpOutlineIcon` | `import { ChevronUpOutlineIcon } from '@vapor-ui/icons'` |
| `CloseOutlineIcon` | `import { CloseOutlineIcon } from '@vapor-ui/icons'` |
| `CodeBlockOutlineIcon` | `import { CodeBlockOutlineIcon } from '@vapor-ui/icons'` |
| `CollaborationOutlineIcon` | `import { CollaborationOutlineIcon } from '@vapor-ui/icons'` |
| `CollapseOutlineIcon` | `import { CollapseOutlineIcon } from '@vapor-ui/icons'` |
| `CommitOutlineIcon` | `import { CommitOutlineIcon } from '@vapor-ui/icons'` |
| `ConfirmOutlineIcon` | `import { ConfirmOutlineIcon } from '@vapor-ui/icons'` |
| `ContainerOutlineIcon` | `import { ContainerOutlineIcon } from '@vapor-ui/icons'` |
| `ContainerRunOutlineIcon` | `import { ContainerRunOutlineIcon } from '@vapor-ui/icons'` |
| `ContainerShareOutlineIcon` | `import { ContainerShareOutlineIcon } from '@vapor-ui/icons'` |
| `ContainerStopOutlineIcon` | `import { ContainerStopOutlineIcon } from '@vapor-ui/icons'` |
| `ControlCommonOutlineIcon` | `import { ControlCommonOutlineIcon } from '@vapor-ui/icons'` |
| `CopyAsMarkdownOutlineIcon` | `import { CopyAsMarkdownOutlineIcon } from '@vapor-ui/icons'` |
| `CopyOutlineIcon` | `import { CopyOutlineIcon } from '@vapor-ui/icons'` |
| `CorrectOutlineIcon` | `import { CorrectOutlineIcon } from '@vapor-ui/icons'` |
| `CouponOutlineIcon` | `import { CouponOutlineIcon } from '@vapor-ui/icons'` |
| `CourseOutlineIcon` | `import { CourseOutlineIcon } from '@vapor-ui/icons'` |
| `CpuOutlineIcon` | `import { CpuOutlineIcon } from '@vapor-ui/icons'` |
| `CreateBranchOutlineIcon` | `import { CreateBranchOutlineIcon } from '@vapor-ui/icons'` |
| `CreditCardOutlineIcon` | `import { CreditCardOutlineIcon } from '@vapor-ui/icons'` |
| `DarkOutlineIcon` | `import { DarkOutlineIcon } from '@vapor-ui/icons'` |
| `DashboardOutlineIcon` | `import { DashboardOutlineIcon } from '@vapor-ui/icons'` |
| `DatabaseOutlineIcon` | `import { DatabaseOutlineIcon } from '@vapor-ui/icons'` |
| `DebugOutlineIcon` | `import { DebugOutlineIcon } from '@vapor-ui/icons'` |
| `DeployOutlineIcon` | `import { DeployOutlineIcon } from '@vapor-ui/icons'` |
| `DeployPushOutlineIcon` | `import { DeployPushOutlineIcon } from '@vapor-ui/icons'` |
| `DetailViewOutlineIcon` | `import { DetailViewOutlineIcon } from '@vapor-ui/icons'` |
| `DiscOutlineIcon` | `import { DiscOutlineIcon } from '@vapor-ui/icons'` |
| `DiscardOutlineIcon` | `import { DiscardOutlineIcon } from '@vapor-ui/icons'` |
| `DiscussionOutlineIcon` | `import { DiscussionOutlineIcon } from '@vapor-ui/icons'` |
| `DislikeOutlineIcon` | `import { DislikeOutlineIcon } from '@vapor-ui/icons'` |
| `DislikeThumbOutlineIcon` | `import { DislikeThumbOutlineIcon } from '@vapor-ui/icons'` |
| `DividerOutlineIcon` | `import { DividerOutlineIcon } from '@vapor-ui/icons'` |
| `DocktoBottomOutlineIcon` | `import { DocktoBottomOutlineIcon } from '@vapor-ui/icons'` |
| `DocumentViewerOutlineIcon` | `import { DocumentViewerOutlineIcon } from '@vapor-ui/icons'` |
| `DollarOutlineIcon` | `import { DollarOutlineIcon } from '@vapor-ui/icons'` |
| `DownloadOutlineIcon` | `import { DownloadOutlineIcon } from '@vapor-ui/icons'` |
| `EditOutlineIcon` | `import { EditOutlineIcon } from '@vapor-ui/icons'` |
| `EnterOutlineIcon` | `import { EnterOutlineIcon } from '@vapor-ui/icons'` |
| `EqualOutlineIcon` | `import { EqualOutlineIcon } from '@vapor-ui/icons'` |
| `EraserOutlineIcon` | `import { EraserOutlineIcon } from '@vapor-ui/icons'` |
| `ErrorCircleOutlineIcon` | `import { ErrorCircleOutlineIcon } from '@vapor-ui/icons'` |
| `ExamListOutlineIcon` | `import { ExamListOutlineIcon } from '@vapor-ui/icons'` |
| `ExamOutlineIcon` | `import { ExamOutlineIcon } from '@vapor-ui/icons'` |
| `ExamReportOutlineIcon` | `import { ExamReportOutlineIcon } from '@vapor-ui/icons'` |
| `ExpandOutlineIcon` | `import { ExpandOutlineIcon } from '@vapor-ui/icons'` |
| `ExploreOutlineIcon` | `import { ExploreOutlineIcon } from '@vapor-ui/icons'` |
| `ExportOutlineIcon` | `import { ExportOutlineIcon } from '@vapor-ui/icons'` |
| `FileAddOutlineIcon` | `import { FileAddOutlineIcon } from '@vapor-ui/icons'` |
| `FileDeleteOutlineIcon` | `import { FileDeleteOutlineIcon } from '@vapor-ui/icons'` |
| `FileEditOutlineIcon` | `import { FileEditOutlineIcon } from '@vapor-ui/icons'` |
| `FileNewOutlineIcon` | `import { FileNewOutlineIcon } from '@vapor-ui/icons'` |
| `FileOutlineIcon` | `import { FileOutlineIcon } from '@vapor-ui/icons'` |
| `FilterOutlineIcon` | `import { FilterOutlineIcon } from '@vapor-ui/icons'` |
| `FlagOutlineIcon` | `import { FlagOutlineIcon } from '@vapor-ui/icons'` |
| `FoldOutlineIcon` | `import { FoldOutlineIcon } from '@vapor-ui/icons'` |
| `FolderNewOutlineIcon` | `import { FolderNewOutlineIcon } from '@vapor-ui/icons'` |
| `FolderOutlineIcon` | `import { FolderOutlineIcon } from '@vapor-ui/icons'` |
| `FolderSearchOutlineIcon` | `import { FolderSearchOutlineIcon } from '@vapor-ui/icons'` |
| `ForkOutlineIcon` | `import { ForkOutlineIcon } from '@vapor-ui/icons'` |
| `FormatColorTextOutlineIcon` | `import { FormatColorTextOutlineIcon } from '@vapor-ui/icons'` |
| `ForwardPageOutlineIcon` | `import { ForwardPageOutlineIcon } from '@vapor-ui/icons'` |
| `FunctionOutlineIcon` | `import { FunctionOutlineIcon } from '@vapor-ui/icons'` |
| `FunctionsOutlineIcon` | `import { FunctionsOutlineIcon } from '@vapor-ui/icons'` |
| `GameOutlineIcon` | `import { GameOutlineIcon } from '@vapor-ui/icons'` |
| `GiftOutlineIcon` | `import { GiftOutlineIcon } from '@vapor-ui/icons'` |
| `GitMergeOutlineIcon` | `import { GitMergeOutlineIcon } from '@vapor-ui/icons'` |
| `GlobalOutlineIcon` | `import { GlobalOutlineIcon } from '@vapor-ui/icons'` |
| `GoogleDrawingOutlineIcon` | `import { GoogleDrawingOutlineIcon } from '@vapor-ui/icons'` |
| `GooglePresentationOutlineIcon` | `import { GooglePresentationOutlineIcon } from '@vapor-ui/icons'` |
| `GoogleSpreadsheetOutlineIcon` | `import { GoogleSpreadsheetOutlineIcon } from '@vapor-ui/icons'` |
| `GroupOutlineIcon` | `import { GroupOutlineIcon } from '@vapor-ui/icons'` |
| `HardBreakOutlineIcon` | `import { HardBreakOutlineIcon } from '@vapor-ui/icons'` |
| `HeadingOutlineIcon` | `import { HeadingOutlineIcon } from '@vapor-ui/icons'` |
| `HeartOutlineIcon` | `import { HeartOutlineIcon } from '@vapor-ui/icons'` |
| `HelpCircleOutlineIcon` | `import { HelpCircleOutlineIcon } from '@vapor-ui/icons'` |
| `HighlightViewOutlineIcon` | `import { HighlightViewOutlineIcon } from '@vapor-ui/icons'` |
| `HistoryOutlineIcon` | `import { HistoryOutlineIcon } from '@vapor-ui/icons'` |
| `HomeOutlineIcon` | `import { HomeOutlineIcon } from '@vapor-ui/icons'` |
| `IdCardOutlineIcon` | `import { IdCardOutlineIcon } from '@vapor-ui/icons'` |
| `ImageOutlineIcon` | `import { ImageOutlineIcon } from '@vapor-ui/icons'` |
| `ImagePackOutlineIcon` | `import { ImagePackOutlineIcon } from '@vapor-ui/icons'` |
| `ImageToContainerOutlineIcon` | `import { ImageToContainerOutlineIcon } from '@vapor-ui/icons'` |
| `ImportOutlineIcon` | `import { ImportOutlineIcon } from '@vapor-ui/icons'` |
| `InOutlineIcon` | `import { InOutlineIcon } from '@vapor-ui/icons'` |
| `IndentDecreaseOutlineIcon` | `import { IndentDecreaseOutlineIcon } from '@vapor-ui/icons'` |
| `IndentIncreaseOutlineIcon` | `import { IndentIncreaseOutlineIcon } from '@vapor-ui/icons'` |
| `InfiniteOutlineIcon` | `import { InfiniteOutlineIcon } from '@vapor-ui/icons'` |
| `InfoCircleOutlineIcon` | `import { InfoCircleOutlineIcon } from '@vapor-ui/icons'` |
| `InputSettingOutlineIcon` | `import { InputSettingOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseEnumOutlineIcon` | `import { IntelliSenseEnumOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseEventOutlineIcon` | `import { IntelliSenseEventOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseFieldOutlineIcon` | `import { IntelliSenseFieldOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseModuleOutlineIcon` | `import { IntelliSenseModuleOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSensePropertyOutlineIcon` | `import { IntelliSensePropertyOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseReferenceOutlineIcon` | `import { IntelliSenseReferenceOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseSnippetOutlineIcon` | `import { IntelliSenseSnippetOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseTypeParameterOutlineIcon` | `import { IntelliSenseTypeParameterOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseUnitOutlineIcon` | `import { IntelliSenseUnitOutlineIcon } from '@vapor-ui/icons'` |
| `IntelliSenseVariableOutlineIcon` | `import { IntelliSenseVariableOutlineIcon } from '@vapor-ui/icons'` |
| `KeyboardOutlineIcon` | `import { KeyboardOutlineIcon } from '@vapor-ui/icons'` |
| `KidOutlineIcon` | `import { KidOutlineIcon } from '@vapor-ui/icons'` |
| `LightOutlineIcon` | `import { LightOutlineIcon } from '@vapor-ui/icons'` |
| `LightbulbOutlineIcon` | `import { LightbulbOutlineIcon } from '@vapor-ui/icons'` |
| `LightningOutlineIcon` | `import { LightningOutlineIcon } from '@vapor-ui/icons'` |
| `LikeOutlineIcon` | `import { LikeOutlineIcon } from '@vapor-ui/icons'` |
| `LikeThumbOutlineIcon` | `import { LikeThumbOutlineIcon } from '@vapor-ui/icons'` |
| `LineSpacingOutlineIcon` | `import { LineSpacingOutlineIcon } from '@vapor-ui/icons'` |
| `LineStyleOutlineIcon` | `import { LineStyleOutlineIcon } from '@vapor-ui/icons'` |
| `LinearScaleOutlineIcon` | `import { LinearScaleOutlineIcon } from '@vapor-ui/icons'` |
| `LinkOffOutlineIcon` | `import { LinkOffOutlineIcon } from '@vapor-ui/icons'` |
| `LinkOutlineIcon` | `import { LinkOutlineIcon } from '@vapor-ui/icons'` |
| `LiveLessonOutlineIcon` | `import { LiveLessonOutlineIcon } from '@vapor-ui/icons'` |
| `LocationOutlineIcon` | `import { LocationOutlineIcon } from '@vapor-ui/icons'` |
| `LockOutlineIcon` | `import { LockOutlineIcon } from '@vapor-ui/icons'` |
| `LongTextOutlineIcon` | `import { LongTextOutlineIcon } from '@vapor-ui/icons'` |
| `MagicWandOutlineIcon` | `import { MagicWandOutlineIcon } from '@vapor-ui/icons'` |
| `MailOutlineIcon` | `import { MailOutlineIcon } from '@vapor-ui/icons'` |
| `ManagementOutlineIcon` | `import { ManagementOutlineIcon } from '@vapor-ui/icons'` |
| `MarkModeOutlineIcon` | `import { MarkModeOutlineIcon } from '@vapor-ui/icons'` |
| `MarkdownOutlineIcon` | `import { MarkdownOutlineIcon } from '@vapor-ui/icons'` |
| `MemoOutlineIcon` | `import { MemoOutlineIcon } from '@vapor-ui/icons'` |
| `MenuOutlineIcon` | `import { MenuOutlineIcon } from '@vapor-ui/icons'` |
| `MergeUpOutlineIcon` | `import { MergeUpOutlineIcon } from '@vapor-ui/icons'` |
| `MessageOutlineIcon` | `import { MessageOutlineIcon } from '@vapor-ui/icons'` |
| `MethodOutlineIcon` | `import { MethodOutlineIcon } from '@vapor-ui/icons'` |
| `MicOffOutlineIcon` | `import { MicOffOutlineIcon } from '@vapor-ui/icons'` |
| `MicOnOutlineIcon` | `import { MicOnOutlineIcon } from '@vapor-ui/icons'` |
| `MinusBoxOutlineIcon` | `import { MinusBoxOutlineIcon } from '@vapor-ui/icons'` |
| `MinusOutlineIcon` | `import { MinusOutlineIcon } from '@vapor-ui/icons'` |
| `MoreCommonOutlineIcon` | `import { MoreCommonOutlineIcon } from '@vapor-ui/icons'` |
| `MovieOutlineIcon` | `import { MovieOutlineIcon } from '@vapor-ui/icons'` |
| `NetfficeOutlineIcon` | `import { NetfficeOutlineIcon } from '@vapor-ui/icons'` |
| `NetworkOutlineIcon` | `import { NetworkOutlineIcon } from '@vapor-ui/icons'` |
| `NextOutlineIcon` | `import { NextOutlineIcon } from '@vapor-ui/icons'` |
| `NoImageOutlineIcon` | `import { NoImageOutlineIcon } from '@vapor-ui/icons'` |
| `NoUserOutlineIcon` | `import { NoUserOutlineIcon } from '@vapor-ui/icons'` |
| `NoticeBoardOutlineIcon` | `import { NoticeBoardOutlineIcon } from '@vapor-ui/icons'` |
| `NoticeCircleOutlineIcon` | `import { NoticeCircleOutlineIcon } from '@vapor-ui/icons'` |
| `NumberlistOutlineIcon` | `import { NumberlistOutlineIcon } from '@vapor-ui/icons'` |
| `OpenFileOutlineIcon` | `import { OpenFileOutlineIcon } from '@vapor-ui/icons'` |
| `OpenFolderOutlineIcon` | `import { OpenFolderOutlineIcon } from '@vapor-ui/icons'` |
| `OpenInNewOutlineIcon` | `import { OpenInNewOutlineIcon } from '@vapor-ui/icons'` |
| `OutOutlineIcon` | `import { OutOutlineIcon } from '@vapor-ui/icons'` |
| `PandasOutlineIcon` | `import { PandasOutlineIcon } from '@vapor-ui/icons'` |
| `PanelOpenOutlineIcon` | `import { PanelOpenOutlineIcon } from '@vapor-ui/icons'` |
| `PauseOutlineIcon` | `import { PauseOutlineIcon } from '@vapor-ui/icons'` |
| `PcOutlineIcon` | `import { PcOutlineIcon } from '@vapor-ui/icons'` |
| `PdfOutlineIcon` | `import { PdfOutlineIcon } from '@vapor-ui/icons'` |
| `PhoneOutlineIcon` | `import { PhoneOutlineIcon } from '@vapor-ui/icons'` |
| `PinSetOutlineIcon` | `import { PinSetOutlineIcon } from '@vapor-ui/icons'` |
| `PlansOutlineIcon` | `import { PlansOutlineIcon } from '@vapor-ui/icons'` |
| `PlayOutlineIcon` | `import { PlayOutlineIcon } from '@vapor-ui/icons'` |
| `PlaylistOutlineIcon` | `import { PlaylistOutlineIcon } from '@vapor-ui/icons'` |
| `PlusBoxOutlineIcon` | `import { PlusBoxOutlineIcon } from '@vapor-ui/icons'` |
| `PlusOutlineIcon` | `import { PlusOutlineIcon } from '@vapor-ui/icons'` |
| `PortforwardingOutlineIcon` | `import { PortforwardingOutlineIcon } from '@vapor-ui/icons'` |
| `PreOutlineIcon` | `import { PreOutlineIcon } from '@vapor-ui/icons'` |
| `PresentScreenOutlineIcon` | `import { PresentScreenOutlineIcon } from '@vapor-ui/icons'` |
| `PresetOutlineIcon` | `import { PresetOutlineIcon } from '@vapor-ui/icons'` |
| `PreviewOutlineIcon` | `import { PreviewOutlineIcon } from '@vapor-ui/icons'` |
| `PriceOutlineIcon` | `import { PriceOutlineIcon } from '@vapor-ui/icons'` |
| `PrintOutlineIcon` | `import { PrintOutlineIcon } from '@vapor-ui/icons'` |
| `ProgrammingOutlineIcon` | `import { ProgrammingOutlineIcon } from '@vapor-ui/icons'` |
| `ProjectOutlineIcon` | `import { ProjectOutlineIcon } from '@vapor-ui/icons'` |
| `ProjectSettingOutlineIcon` | `import { ProjectSettingOutlineIcon } from '@vapor-ui/icons'` |
| `PsychologyOutlineIcon` | `import { PsychologyOutlineIcon } from '@vapor-ui/icons'` |
| `PublishOutlineIcon` | `import { PublishOutlineIcon } from '@vapor-ui/icons'` |
| `PullOutlineIcon` | `import { PullOutlineIcon } from '@vapor-ui/icons'` |
| `QnAOutlineIcon` | `import { QnAOutlineIcon } from '@vapor-ui/icons'` |
| `QrcodeOutlineIcon` | `import { QrcodeOutlineIcon } from '@vapor-ui/icons'` |
| `QuoteOutlineIcon` | `import { QuoteOutlineIcon } from '@vapor-ui/icons'` |
| `ReferenceOutlineIcon` | `import { ReferenceOutlineIcon } from '@vapor-ui/icons'` |
| `RefreshOutlineIcon` | `import { RefreshOutlineIcon } from '@vapor-ui/icons'` |
| `RegexOutlineIcon` | `import { RegexOutlineIcon } from '@vapor-ui/icons'` |
| `ReloadOutlineIcon` | `import { ReloadOutlineIcon } from '@vapor-ui/icons'` |
| `RemoteOffOutlineIcon` | `import { RemoteOffOutlineIcon } from '@vapor-ui/icons'` |
| `RemoteOutlineIcon` | `import { RemoteOutlineIcon } from '@vapor-ui/icons'` |
| `ReplyOutlineIcon` | `import { ReplyOutlineIcon } from '@vapor-ui/icons'` |
| `RestaurantOutlineIcon` | `import { RestaurantOutlineIcon } from '@vapor-ui/icons'` |
| `ResultManagementOutlineIcon` | `import { ResultManagementOutlineIcon } from '@vapor-ui/icons'` |
| `RouteOutlineIcon` | `import { RouteOutlineIcon } from '@vapor-ui/icons'` |
| `RunOutlineIcon` | `import { RunOutlineIcon } from '@vapor-ui/icons'` |
| `SaveAsOutlineIcon` | `import { SaveAsOutlineIcon } from '@vapor-ui/icons'` |
| `SaveOutlineIcon` | `import { SaveOutlineIcon } from '@vapor-ui/icons'` |
| `SavingOutlineIcon` | `import { SavingOutlineIcon } from '@vapor-ui/icons'` |
| `SchoolOutlineIcon` | `import { SchoolOutlineIcon } from '@vapor-ui/icons'` |
| `SearchOutlineIcon` | `import { SearchOutlineIcon } from '@vapor-ui/icons'` |
| `SendOutlineIcon` | `import { SendOutlineIcon } from '@vapor-ui/icons'` |
| `SettingOutlineIcon` | `import { SettingOutlineIcon } from '@vapor-ui/icons'` |
| `ShareOutlineIcon` | `import { ShareOutlineIcon } from '@vapor-ui/icons'` |
| `ShoppingCartOutlineIcon` | `import { ShoppingCartOutlineIcon } from '@vapor-ui/icons'` |
| `ShortTextOutlineIcon` | `import { ShortTextOutlineIcon } from '@vapor-ui/icons'` |
| `ShortcutOutlineIcon` | `import { ShortcutOutlineIcon } from '@vapor-ui/icons'` |
| `SideNavOutlineIcon` | `import { SideNavOutlineIcon } from '@vapor-ui/icons'` |
| `SignalPowerOutlineIcon` | `import { SignalPowerOutlineIcon } from '@vapor-ui/icons'` |
| `SlashOutlineIcon` | `import { SlashOutlineIcon } from '@vapor-ui/icons'` |
| `SoundOffOutlineIcon` | `import { SoundOffOutlineIcon } from '@vapor-ui/icons'` |
| `SoundOnOutlineIcon` | `import { SoundOnOutlineIcon } from '@vapor-ui/icons'` |
| `SpinnerOutlineIcon` | `import { SpinnerOutlineIcon } from '@vapor-ui/icons'` |
| `SplitHorizontalOutlineIcon` | `import { SplitHorizontalOutlineIcon } from '@vapor-ui/icons'` |
| `SplitVerticalOutlineIcon` | `import { SplitVerticalOutlineIcon } from '@vapor-ui/icons'` |
| `StarOutlineIcon` | `import { StarOutlineIcon } from '@vapor-ui/icons'` |
| `StepInOutlineIcon` | `import { StepInOutlineIcon } from '@vapor-ui/icons'` |
| `StepOutOutlineIcon` | `import { StepOutOutlineIcon } from '@vapor-ui/icons'` |
| `StepOverOutlineIcon` | `import { StepOverOutlineIcon } from '@vapor-ui/icons'` |
| `StopOutlineIcon` | `import { StopOutlineIcon } from '@vapor-ui/icons'` |
| `StruckOutlineIcon` | `import { StruckOutlineIcon } from '@vapor-ui/icons'` |
| `StudentManagementOutlineIcon` | `import { StudentManagementOutlineIcon } from '@vapor-ui/icons'` |
| `SyllabusOutlineIcon` | `import { SyllabusOutlineIcon } from '@vapor-ui/icons'` |
| `TableFilterOutlineIcon` | `import { TableFilterOutlineIcon } from '@vapor-ui/icons'` |
| `TableOutlineIcon` | `import { TableOutlineIcon } from '@vapor-ui/icons'` |
| `TabletOutlineIcon` | `import { TabletOutlineIcon } from '@vapor-ui/icons'` |
| `TerminalConnectOutlineIcon` | `import { TerminalConnectOutlineIcon } from '@vapor-ui/icons'` |
| `TerminalOutlineIcon` | `import { TerminalOutlineIcon } from '@vapor-ui/icons'` |
| `TerminalWindowOutlineIcon` | `import { TerminalWindowOutlineIcon } from '@vapor-ui/icons'` |
| `TestOutlineIcon` | `import { TestOutlineIcon } from '@vapor-ui/icons'` |
| `TextColorOutlineIcon` | `import { TextColorOutlineIcon } from '@vapor-ui/icons'` |
| `TextOutlineIcon` | `import { TextOutlineIcon } from '@vapor-ui/icons'` |
| `TextScanOutlineIcon` | `import { TextScanOutlineIcon } from '@vapor-ui/icons'` |
| `TimeOutlineIcon` | `import { TimeOutlineIcon } from '@vapor-ui/icons'` |
| `TransferOutlineIcon` | `import { TransferOutlineIcon } from '@vapor-ui/icons'` |
| `TranslateOutlineIcon` | `import { TranslateOutlineIcon } from '@vapor-ui/icons'` |
| `TrashOutlineIcon` | `import { TrashOutlineIcon } from '@vapor-ui/icons'` |
| `UnderlineOutlineIcon` | `import { UnderlineOutlineIcon } from '@vapor-ui/icons'` |
| `UndoOutlineIcon` | `import { UndoOutlineIcon } from '@vapor-ui/icons'` |
| `UnlockOutlineIcon` | `import { UnlockOutlineIcon } from '@vapor-ui/icons'` |
| `UploadOutlineIcon` | `import { UploadOutlineIcon } from '@vapor-ui/icons'` |
| `UserCheckOutlineIcon` | `import { UserCheckOutlineIcon } from '@vapor-ui/icons'` |
| `UserMoveOutlineIcon` | `import { UserMoveOutlineIcon } from '@vapor-ui/icons'` |
| `UserOutlineIcon` | `import { UserOutlineIcon } from '@vapor-ui/icons'` |
| `UserSearchOutlineIcon` | `import { UserSearchOutlineIcon } from '@vapor-ui/icons'` |
| `VideocamOffOutlineIcon` | `import { VideocamOffOutlineIcon } from '@vapor-ui/icons'` |
| `VideocamOnOutlineIcon` | `import { VideocamOnOutlineIcon } from '@vapor-ui/icons'` |
| `ViewExpandOutlineIcon` | `import { ViewExpandOutlineIcon } from '@vapor-ui/icons'` |
| `ViewModuleOutlineIcon` | `import { ViewModuleOutlineIcon } from '@vapor-ui/icons'` |
| `ViewOffOutlineIcon` | `import { ViewOffOutlineIcon } from '@vapor-ui/icons'` |
| `ViewOnOutlineIcon` | `import { ViewOnOutlineIcon } from '@vapor-ui/icons'` |
| `ViewShrinkOutlineIcon` | `import { ViewShrinkOutlineIcon } from '@vapor-ui/icons'` |
| `WarningOutlineIcon` | `import { WarningOutlineIcon } from '@vapor-ui/icons'` |
| `WordSearchOutlineIcon` | `import { WordSearchOutlineIcon } from '@vapor-ui/icons'` |
| `ZoomInOutlineIcon` | `import { ZoomInOutlineIcon } from '@vapor-ui/icons'` |
| `ZoomOutOutlineIcon` | `import { ZoomOutOutlineIcon } from '@vapor-ui/icons'` |
# Welcome, Vapor UI
URL: /docs
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/index.mdx
Vapor는 구름의 세 번째 디자인 시스템으로, 다양한 서브 패키지들로 구성되어 있습니다. 각 서브 패키지는 다음과 같은 역할을 수행합니다.
***
title: Welcome, Vapor UI
description: Vapor는 구름의 세 번째 디자인 시스템으로, 다양한 서브 패키지들로 구성되어 있습니다. 각 서브 패키지는 다음과 같은 역할을 수행합니다.
-------------------------------------------------------------------------------------------
# Avatar
URL: /docs/components/avatar
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/avatar.mdx
Avatar는 사용자가 설정한 프로필 이미지 혹은 텍스트를 UI상에 나타냅니다.
***
title: 'Avatar'
site\_name: 'Avatar - Vapor Core'
description: 'Avatar는 사용자가 설정한 프로필 이미지 혹은 텍스트를 UI상에 나타냅니다.'
-----------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/avatar/default-avatar.tsx",
"codeblock": true
}
```
## Property
***
### Size
Avatar 사이즈는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/avatar/avatar-size.tsx",
"codeblock": true
}
```
### Shape
Avatar 모양은 circle, square 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/avatar/avatar-shape.tsx",
"codeblock": true
}
```
## Examples
***
### Custom Usage
Avatar의 유연한 사용 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/avatar/flexible.tsx",
"codeblock": true
}
```
### Fallback Only
이미지 로드 실패 시 표시되는 Fallback 텍스트나 이니셜을 사용하는 패턴입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/avatar/avatar-fallback-only.tsx",
"codeblock": true
}
```
## Props Table
***
### Avatar.Root
Avatar의 메인 컨테이너 컴포넌트입니다. size와 shape 속성을 제공하며, 모든 하위 컴포넌트에서 공통으로 사용할 수 있도록 컨텍스트를 제공합니다.
| prop | type | default | description |
| ----------- | ----------------------- | -------- | ------------------------------------------------------------------ |
| `render` | `ReactElement,function` | `span` | 아바타를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `size` | `sm,md,lg,xl` | `md` | 아바타 컴포넌트의 크기를 조절합니다. |
| `shape` | `circle,square` | `square` | 아바타 컴포넌트의 모양을 조절합니다. |
| `alt` | `string` | `-` | 웹 접근성을 위한 아바타 이미지의 대체 텍스트입니다. |
| `src` | `string` | `-` | 아바타 이미지의 소스 URL입니다. |
| `delay` | `number` | `null` | 폴백을 표시하기 전의 지연 시간(밀리초)입니다. |
| `children` | `ReactNode` | `null` | 자식 컴포넌트(Avatar.Image, Avatar.Fallback)입니다. |
| `className` | `string,function` | `null` | 아바타의 최상위 요소에 적용할 CSS 클래스명입니다. 함수 형태로 전달하면 상태에 따른 동적 클래스 적용이 가능합니다. |
### Avatar.ImagePrimitive
Avatar 이미지를 표시하는 컴포넌트입니다. src가 로드되지 않거나 오류가 발생할 경우 자동으로 Fallback 컴포넌트가 표시됩니다.
| prop | type | default | description |
| ----------------------- | ----------------------- | ------- | --------------------------------------------------------------------------------------- |
| `render` | `ReactElement,function` | `img` | 이미지를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `src` | `string` | `-` | 표시할 이미지의 소스 URL입니다. Root에서 상속받습니다. |
| `alt` | `string` | `-` | 이미지의 대체 텍스트입니다. Root에서 상속받습니다. |
| `onLoadingStatusChange` | `function` | `-` | 이미지 로딩 상태 변경 시 호출되는 콜백 함수입니다. (status: 'loading' \| 'loaded' \| 'error') => void 형태입니다. |
| `className` | `string,function` | `-` | 이미지에 적용할 CSS 클래스입니다. 함수 형태로 전달하면 상태에 따른 동적 클래스 적용이 가능합니다. |
### Avatar.FallbackPrimitive
이미지가 로드되지 않을 때 표시되는 대체 컴포넌트입니다. alt 속성을 기반으로 자동으로 이니셜을 생성하고, Linear Congruential Generator 알고리즘을 사용해 일관된 배경 색상을 제공합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ------- | -------------------------------------------------------- |
| `render` | `ReactElement,function` | `span` | 폴백 콘텐츠를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `delay` | `number` | `-` | 폴백을 표시하기 전의 지연 시간(밀리초)입니다. 느린 연결에서만 표시되도록 지연시키는데 유용합니다. |
| `children` | `ReactNode` | `-` | 이미지 로딩 실패 시 표시할 콘텐츠입니다. 기본적으로 alt에서 이니셜을 자동 생성합니다. |
| `className` | `string,function` | `-` | 폴백에 적용할 CSS 클래스입니다. 함수 형태로 전달하면 상태에 따른 동적 클래스 적용이 가능합니다. |
# Badge
URL: /docs/components/badge
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/badge.mdx
Badge는 이미지, 컨텐츠 등의 상태 또는 분류를 시각적으로 표시합니다.
***
title: 'Badge'
site\_name: 'Badge - Vapor Core'
description: 'Badge는 이미지, 컨텐츠 등의 상태 또는 분류를 시각적으로 표시합니다.'
--------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/badge/default-badge.tsx",
"codeblock": true
}
```
## Property
***
### ColorPalette
Badge 색상은 primary, success, warning, danger, contrast, hint 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/badge/badge-color.tsx",
"codeblock": true
}
```
### Shape
Badge 모양은 square, pill 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/badge/badge-shape.tsx",
"codeblock": true
}
```
### Size
Badge 사이즈는 sm, md, lg 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/badge/badge-size.tsx",
"codeblock": true
}
```
## Props Table
***
이 컴포넌트는 `span` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| -------------- | ---------------------------------------------- | --------- | ------------------------------------------------------------- |
| `colorPalette` | `primary,hint,danger,success,warning,contrast` | `primary` | 배지의 색상(의미)을 설정합니다. 예컨대 success는 성공 상태를, danger는 오류 상태를 나타냅니다. |
| `size` | `sm,md,lg` | `md` | 배지의 크기를 설정합니다. sm은 작은 크기, lg는 큰 크기를 의미합니다. |
| `shape` | `square,pill` | `square` | 배지의 모양을 설정합니다. square는 둥근 사각형, pill은 완전히 둥근 알약 형태입니다. |
# Breadcrumb
URL: /docs/components/breadcrumb
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/breadcrumb.mdx
사용자가 현재 페이지의 위치를 파악하고 이전 페이지로 쉽게 이동할 수 있도록 도와주는 네비게이션 컴포넌트입니다.
***
title: 'Breadcrumb'
site\_name: 'Breadcrumb - Vapor Core'
description: '사용자가 현재 페이지의 위치를 파악하고 이전 페이지로 쉽게 이동할 수 있도록 도와주는 네비게이션 컴포넌트입니다.'
-----------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/breadcrumb/default-breadcrumb.tsx",
"codeblock": true
}
```
## Property
***
### Size
브레드크럼 사이즈는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/breadcrumb/breadcrumb-size.tsx",
"codeblock": true
}
```
### Current
현재 페이지를 나타내는 링크의 상태를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/breadcrumb/breadcrumb-current.tsx",
"codeblock": true
}
```
## Examples
***
### With Ellipsis
긴 네비게이션 경로에서 중간 단계를 생략 표시로 나타낸 패턴입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/breadcrumb/breadcrumb-ellipsis.tsx",
"codeblock": true
}
```
### Composition Pattern
브레드크럼 컴포넌트의 다양한 구성 패턴입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/breadcrumb/breadcrumb-composition.tsx",
"codeblock": true
}
```
## Props Table
***
### Breadcrumb.Root
브레드크럼의 메인 컨테이너 컴포넌트입니다. size 속성을 제공하며, 모든 하위 컴포넌트에서 공통으로 사용할 수 있도록 컨텍스트를 제공합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ------------------------------------------- |
| `render` | `ReactElement,function` | `nav` | 브레드크럼을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `size` | `sm,md,lg,xl` | `md` | 브레드크럼의 크기를 설정합니다. 텍스트 크기와 아이콘 크기가 함께 조절됩니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 브레드크럼의 하위 컴포넌트들을 포함합니다. |
### Breadcrumb.Item
개별 브레드크럼 항목을 나타내는 컴포넌트입니다. 각각의 링크나 구분자를 감싸는 역할을 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ------------------------------ |
| `render` | `ReactElement,function` | `li` | 아이템을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 브레드크럼 아이템의 내용을 포함합니다. |
### Breadcrumb.Separator
브레드크럼 항목들 사이의 구분자를 표시하는 컴포넌트입니다. 기본적으로 슬래시(/) 아이콘을 사용하며, 커스텀 아이콘으로 변경할 수 있습니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | -------------------------------------------------- |
| `render` | `ReactElement,function` | `li` | 구분자를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 커스텀 구분자 아이콘을 제공할 수 있습니다. 기본값은 SlashOutlineIcon입니다. |
### Breadcrumb.Ellipsis
긴 네비게이션 경로에서 중간 단계를 생략할 때 사용하는 컴포넌트입니다. 기본적으로 점 3개(...) 아이콘을 표시하며, 커스텀 아이콘으로 변경할 수 있습니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | --------------------------------------------------------- |
| `render` | `ReactElement,function` | `span` | 생략 표시를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 커스텀 생략 표시 아이콘을 제공할 수 있습니다. 기본값은 MoreCommonOutlineIcon입니다. |
### Breadcrumb.ListPrimitive
브레드크럼 항목들을 담는 순서가 있는 리스트 컨테이너입니다. 의미적으로 올바른 구조를 위해 `
` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ------------------------------ |
| `render` | `ReactElement,function` | `ol` | 리스트를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 브레드크럼 아이템들을 포함합니다. |
### Breadcrumb.LinkPrimitive
브레드크럼 내의 클릭 가능한 링크 컴포넌트입니다. 현재 페이지인지 여부에 따라 시각적 스타일과 접근성 속성이 자동으로 조정됩니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ---------------------------------------------------------- |
| `render` | `ReactElement,function` | `a \| span` | 링크를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. current prop에 따라 기본값이 달라집니다. |
| `current` | `boolean` | `false` | 현재 페이지를 나타내는 링크인지 설정합니다. true일 경우 시각적으로 구분되어 표시됩니다. |
| `href` | `string` | `undefined` | 링크의 목적지 URL을 설정합니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 링크의 텍스트 내용을 포함합니다. |
# Button
URL: /docs/components/button
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/button.mdx
Button은 사용자가 주요 작업을 수행하도록 돕는 핵심 상호작용 요소입니다.
***
title: 'Button'
site\_name: 'Button - Vapor Core'
description: 'Button은 사용자가 주요 작업을 수행하도록 돕는 핵심 상호작용 요소입니다.'
----------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/default-button.tsx",
"codeblock": true
}
```
## Property
***
### ColorPalette
Button 색상은 primary, secondary, success, warning, danger, contrast 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-color.tsx",
"codeblock": true
}
```
### Size
Button 사이즈는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-size.tsx",
"codeblock": true
}
```
### Variant
Button 스타일은 fill, outline, ghost 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-variant.tsx",
"codeblock": true
}
```
### Stretch
`stretch`가 true일 경우 버튼이 컨테이너의 전체 너비를 차지합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-stretch.tsx",
"codeblock": true
}
```
### Disabled
`disabled` 속성을 사용하여 버튼을 비활성화할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-disabled.tsx",
"codeblock": true
}
```
## Examples
***
### Button with Icon
아이콘과 함께 사용하는 버튼 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/button/button-with-icon.tsx",
"codeblock": true
}
```
## Props Table
***
이 컴포넌트는 `button` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| -------------- | --------------------------------------------------- | ----------- | -------------------------------- |
| `render` | `ReactElement,function` | `button` | 버튼을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `colorPalette` | `primary,secondary,success,warning,danger,contrast` | `primary` | 버튼의 주 색상(의미)을 설정합니다. |
| `size` | `sm,md,lg,xl` | `md` | 버튼의 크기를 설정합니다. |
| `variant` | `fill,outline,ghost` | `fill` | 버튼의 스타일 변형을 선택합니다. |
| `stretch` | `boolean` | `false` | true일 경우 버튼이 컨테이너의 전체 너비를 차지합니다. |
| `disabled` | `boolean` | `false` | 버튼을 비활성화 상태로 만듭니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 버튼의 내용을 포함합니다. |
| `type` | `button,submit,reset` | `button` | 버튼의 타입을 설정합니다. |
| `onClick` | `function` | `undefined` | 버튼 클릭 시 호출되는 이벤트 핸들러입니다. |
# Callout
URL: /docs/components/callout
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/callout.mdx
Callout은 중요한 정보를 시각적으로 강조하여 사용자에게 전달하는 메시지 컴포넌트입니다.
***
title: 'Callout'
site\_name: 'Callout - Vapor Core'
description: 'Callout은 중요한 정보를 시각적으로 강조하여 사용자에게 전달하는 메시지 컴포넌트입니다.'
------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/callout/default-callout.tsx",
"codeblock": true
}
```
## Property
***
### ColorPalette
Callout 색상은 primary, success, warning, danger, hint, contrast 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/callout/callout-color.tsx",
"codeblock": true
}
```
## Examples
***
### Callout with Icon
아이콘과 함께 사용하는 Callout 예제입니다. 아이콘은 `Callout.Icon`으로 감싸서 고정된 크기를 유지합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/callout/callout-with-icon.tsx",
"codeblock": true
}
```
## Props Table
***
### Callout.Root
이 컴포넌트는 `div` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| -------------- | ---------------------------------------------- | ----------- | ---------------------------------- |
| `render` | `ReactElement,function` | `div` | Callout을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `colorPalette` | `primary,success,warning,danger,hint,contrast` | `primary` | Callout의 색상을 설정합니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | Callout의 내용을 포함합니다. |
### Callout.Icon
Callout 내에서 아이콘을 표시하는 데 사용되는 컴포넌트입니다. 아이콘의 크기와 위치를 적절히 조정하여 일관된 시각적 경험을 제공합니다. 이 컴포넌트는 `div` 요소를 기반으로, 표준 HTML 속성을 지원합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ------------------------------ |
| `render` | `ReactElement,function` | `div` | 아이콘을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 아이콘 컴포넌트를 포함합니다. |
# Card
URL: /docs/components/card
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/card.mdx
Card는 이미지와 텍스트, 일부 기능 버튼을 포함한 컨테이너로 콘텐츠를 제공합니다.
***
title: 'Card'
site\_name: 'Card - Vapor Core'
description: 'Card는 이미지와 텍스트, 일부 기능 버튼을 포함한 컨테이너로 콘텐츠를 제공합니다.'
--------------------------------------------------------------
```tsx import {Card} from '@vapor-ui/core';
export default function DefaultCard() {
return (
Basic TemplateThis is a Basic TemplateFooter
);
}
```
## Examples
***
### Simple Usage
기본적인 Card 사용법입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/card/card-basic.tsx",
"codeblock": true
}
```
### Layout
Card의 레이아웃은 Header, Body, Footer를 조합하여 다양한 구성으로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/card/card-layout.tsx",
"codeblock": true
}
```
## Props Table
***
### Card.Root
Card의 메인 컨테이너 컴포넌트입니다. 카드의 전체 레이아웃과 구조를 제공하며, 하위 컴포넌트들을 위한 컨테이너 역할을 합니다. 이 컴포넌트는 `div` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | -------------------------------- |
| `render` | `ReactElement,function` | `div` | 카드를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 카드 루트 요소에 적용할 추가 CSS 클래스를 지정합니다. |
| `children` | `ReactNode` | `undefined` | 카드에 표시할 콘텐츠입니다. |
### Card.Header
Card의 헤더 영역을 표시하는 컴포넌트입니다. 제목, 부제목, 메타 정보 등을 배치하는 데 사용됩니다. 자동으로 하단 경계선이 적용됩니다. 이 컴포넌트는 `div` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ----------------------------- |
| `render` | `ReactElement,function` | `div` | 헤더를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 헤더 요소에 적용할 추가 CSS 클래스를 지정합니다. |
| `children` | `ReactNode` | `undefined` | 헤더에 표시할 콘텐츠입니다. |
### Card.Body
Card의 주요 콘텐츠 영역을 표시하는 컴포넌트입니다. 텍스트, 이미지, 설명 등 카드의 핵심 내용을 담는 데 사용됩니다. 이 컴포넌트는 `div` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ----------------------------- |
| `render` | `ReactElement,function` | `div` | 바디를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 바디 요소에 적용할 추가 CSS 클래스를 지정합니다. |
| `children` | `ReactNode` | `undefined` | 바디에 표시할 콘텐츠입니다. |
### Card.Footer
Card의 하단 영역을 표시하는 컴포넌트입니다. 액션 버튼, 링크, 추가 메타 정보 등을 배치하는 데 사용됩니다. 자동으로 상단 경계선이 적용됩니다. 이 컴포넌트는 `div` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | ----------------------- | ----------- | ----------------------------- |
| `render` | `ReactElement,function` | `div` | 푸터를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `undefined` | 푸터 요소에 적용할 추가 CSS 클래스를 지정합니다. |
| `children` | `ReactNode` | `undefined` | 푸터에 표시할 콘텐츠입니다. |
# Checkbox
URL: /docs/components/checkbox
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/checkbox.mdx
Checkbox는 여러 항목 중 복수 선택을 가능하게 하는 입력 컴포넌트입니다.
***
title: 'Checkbox'
site\_name: 'Checkbox - Vapor Core'
description: 'Checkbox는 여러 항목 중 복수 선택을 가능하게 하는 입력 컴포넌트입니다.'
-----------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/default-checkbox.tsx",
"codeblock": true
}
```
## Property
***
### Size
Checkbox 사이즈는 md, lg 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/checkbox-size.tsx",
"codeblock": true
}
```
### Disabled
비활성화된 상태의 Checkbox입니다. 사용자가 상호작용할 수 없습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/checkbox-disabled.tsx",
"codeblock": true
}
```
### Invalid
유효하지 않은 상태의 Checkbox입니다. 폼 검증 실패 시 사용됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/checkbox-invalid.tsx",
"codeblock": true
}
```
### Indeterminate
부분적으로 선택된 상태의 Checkbox입니다. 하위 항목 중 일부만 선택되었을 때 사용됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/checkbox-indeterminate.tsx",
"codeblock": true
}
```
### Read Only
사용자는 체크박스 상태를 변경할 수 없지만, 현재 상태를 확인할 수 있도록 허용하는 상태입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/checkbox/checkbox-readonly.tsx",
"codeblock": true
}
```
## Props Table
***
### Checkbox.Root
Checkbox의 메인 컨테이너 컴포넌트입니다. Base UI의 Checkbox를 래핑하여 size, disabled, invalid 등의 속성을 제공하며, 체크, 미체크, 불확정 상태를 시각적으로 나타냅니다. 이 컴포넌트는 `button` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------------- | ----------------------- | ----------- | --------------------------------------------------------------------- |
| `render` | `ReactElement,function` | `button` | 체크박스를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `checked` | `boolean,indeterminate` | `undefined` | 체크박스의 제어된 체크 상태입니다. onCheckedChange와 함께 사용해야 합니다. |
| `defaultChecked` | `boolean,indeterminate` | `undefined` | 체크박스가 처음 렌더링될 때의 체크 상태입니다. 체크 상태를 제어할 필요가 없을 때 사용합니다. |
| `onCheckedChange` | `function` | `undefined` | 체크박스의 체크 상태가 변경될 때 호출되는 이벤트 핸들러입니다. (checked: boolean) => void 형태입니다. |
| `disabled` | `boolean` | `false` | true일 때 사용자가 체크박스와 상호작용하는 것을 방지합니다. |
| `required` | `boolean` | `undefined` | true일 때 소유 폼을 제출하기 전에 사용자가 체크박스를 체크해야 함을 나타냅니다. |
| `name` | `string` | `undefined` | 체크박스의 이름입니다. 소유 폼과 함께 이름/값 쌍의 일부로 제출됩니다. |
| `value` | `string` | `on` | 이름과 함께 제출될 때 데이터로 제공되는 값입니다. |
| `size` | `md,lg` | `md` | 체크박스의 크기를 설정합니다. |
| `invalid` | `boolean` | `false` | 폼 유효성 검증 실패 등의 상태를 나타냅니다. |
| `indeterminate` | `boolean` | `false` | 혼합(indeterminate) 상태를 표시합니다. 일부 선택된 경우를 나타낼 때 사용합니다. |
| `readOnly` | `boolean` | `false` | true일 때 체크박스가 읽기 전용 상태가 되어 사용자 상호작용을 방지하지만 폼 제출에는 포함됩니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 체크박스의 내용을 포함합니다. 기본적으로 Checkbox.Indicator가 자동으로 포함됩니다. |
### Checkbox.IndicatorPrimitive
체크박스의 체크 상태를 시각적으로 표시하는 인디케이터 컴포넌트입니다. 체크됨/미체크됨/불확정 상태에 따라 적절한 아이콘을 표시합니다. Root 컴포넌트에서 자동으로 포함되므로 대부분의 경우 직접 사용할 필요가 없습니다. 이 컴포넌트는 `div` 요소를 기반으로 합니다.
| prop | type | default | description |
| ------------ | ----------------------- | ----------- | ------------------------------------------------------------------------- |
| `render` | `ReactElement,function` | `div` | 체크박스 인디케이터를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `forceMount` | `boolean` | `undefined` | 더 정밀한 제어가 필요할 때 강제로 마운트하는 데 사용됩니다. React 애니메이션 라이브러리로 애니메이션을 제어할 때 유용합니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
# Collapsible
URL: /docs/components/collapsible
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/collapsible.mdx
Collapsible은 콘텐츠를 접었다 펼칠 수 있는 대화형 컴포넌트입니다. 아코디언이나 확장 가능한 섹션을 구현할 때 사용합니다.
***
title: 'Collapsible'
site\_name: 'Collapsible - Vapor Core'
description: 'Collapsible은 콘텐츠를 접었다 펼칠 수 있는 대화형 컴포넌트입니다. 아코디언이나 확장 가능한 섹션을 구현할 때 사용합니다.'
----------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/collapsible/default-collapsible.tsx",
"codeblock": true
}
```
## Property
***
### Open State
Collapsible의 열림/닫힘 상태를 제어할 수 있습니다. `defaultOpen`으로 초기 상태를 설정하거나, `open`과 `onOpenChange`로 완전히 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/collapsible/collapsible-open-state.tsx",
"codeblock": true
}
```
### Keep Mounted
`keepMounted` 속성을 사용하여 패널이 닫힌 상태에서도 DOM에 유지할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/collapsible/collapsible-keep-mounted.tsx",
"codeblock": true
}
```
### Disabled
Collapsible을 비활성화하여 사용자 상호작용을 막을 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/collapsible/collapsible-disabled.tsx",
"codeblock": true
}
```
## Props Table
***
### Collapsible.Root
이 컴포넌트는 `div` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| -------------- | ------------------- | ------- | ----------------------------------------------------- |
| `open` | `boolean` | `-` | 콜랩시블의 제어된 열림 상태입니다. onOpenChange와 함께 사용해야 합니다. |
| `defaultOpen` | `boolean` | `false` | 콜랩시블이 처음 렌더링될 때의 열림 상태입니다. 열림 상태를 제어할 필요가 없을 때 사용합니다. |
| `onOpenChange` | `function` | `-` | 콜랩시블의 열림 상태가 변경될 때 호출되는 이벤트 핸들러입니다. |
| `disabled` | `boolean` | `false` | 콜랩시블의 상호작용을 비활성화합니다. |
| `render` | `ReactElement,null` | `-` | 커스텀 렌더링 요소를 지정합니다. |
| `className` | `string` | `-` | 루트 요소에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 콜랩시블의 자식 컴포넌트들입니다. |
### Collapsible.Trigger
이 컴포넌트는 `button` 요소를 기반으로, 표준 HTML 속성(`onClick`, `disabled` 등)을 지원합니다.
| prop | type | default | description |
| ----------- | ------------------- | ------- | -------------------------- |
| `render` | `ReactElement,null` | `-` | 커스텀 트리거 요소를 지정합니다. |
| `className` | `string` | `-` | 트리거 요소에 적용할 추가 CSS 클래스입니다. |
| `disabled` | `boolean` | `false` | 트리거를 비활성화합니다. |
| `children` | `ReactNode` | `-` | 트리거의 자식 컴포넌트들입니다. |
### Collapsible.Panel
이 컴포넌트는 `div` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| ------------------ | ------------------- | ------- | --------------------------------------------------------- |
| `keepMounted` | `boolean` | `false` | 패널이 닫힌 상태에서도 DOM에 유지할지 여부를 설정합니다. |
| `hiddenUntilFound` | `boolean` | `false` | 브라우저의 페이지 내 검색이나 fragment navigation에서 콘텐츠를 찾을 수 있도록 합니다. |
| `className` | `string` | `-` | 패널 요소에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 패널의 자식 컴포넌트들입니다. |
| `render` | `ReactElement,null` | `-` | 커스텀 렌더링 요소를 지정합니다. |
# Dialog
URL: /docs/components/dialog
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/dialog.mdx
Dialog는 페이지 위에 모달 형태로 정보를 표시하거나 작업을 수행하도록 하는 컴포넌트입니다.
***
title: 'Dialog'
site\_name: 'Dialog - Vapor Core'
description: 'Dialog는 페이지 위에 모달 형태로 정보를 표시하거나 작업을 수행하도록 하는 컴포넌트입니다.'
--------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/dialog/default-dialog.tsx",
"codeblock": true
}
```
## Property
***
### Size
Dialog 사이즈는 md, lg, xl로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/dialog/dialog-size.tsx",
"codeblock": true
}
```
### Modal Behavior
Dialog의 모달 동작을 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/dialog/dialog-modal.tsx",
"codeblock": true
}
```
## Examples
***
### Custom Usage
Dialog.Root, Dialog.Trigger, Dialog.CombinedContent, Dialog.Header, Dialog.Body, Dialog.Footer를 조합한 패턴입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/dialog/flexible.tsx",
"codeblock": true
}
```
## Props Table
***
### Dialog.Root
Dialog의 루트 컨테이너로, 다이얼로그의 상태와 동작을 관리합니다. 크기, 모달 동작, 열림/닫힘 상태를 제어할 수 있습니다.
| prop | type | default | description |
| -------------- | ---------------- | ------- | ----------------------------------------------------------------- |
| `defaultOpen` | `boolean` | `null` | 다이얼로그의 초기 열림 상태를 설정합니다. 비제어 컴포넌트로 사용할 때 활용됩니다. |
| `open` | `boolean` | `null` | 다이얼로그의 열림 상태를 제어합니다. 제어 컴포넌트로 사용할 때 onOpenChange와 함께 사용합니다. |
| `onOpenChange` | `function` | `null` | 다이얼로그의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. (open: boolean) => void |
| `modal` | `boolean` | `true` | 모달 동작을 제어합니다. true일 때는 포커스 트랩이 활성화되고 배경과 상호작용이 차단됩니다. |
| `dismissible` | `boolean` | `true` | ESC 키나 배경 클릭으로 다이얼로그를 닫을 수 있는지 설정합니다. closeOnClickOverlay로 매핑됩니다. |
| `size` | `"md","lg","xl"` | `"md"` | 다이얼로그의 크기를 설정합니다. md(중간), lg(큰), xl(매우 큰) 크기를 제공합니다. |
### Dialog.PortalPrimitive
Dialog 콘텐츠를 document.body 또는 지정된 컨테이너에 렌더링합니다. 다이얼로그가 다른 요소들 위에 표시되도록 보장합니다.
| prop | type | default | description |
| ------------- | ------------- | --------------- | -------------------------------------- |
| `keepMounted` | `boolean` | `false` | 다이얼로그가 닫혀있어도 DOM에 마운트된 상태로 유지할지 설정합니다. |
| `container` | `HTMLElement` | `document.body` | 다이얼로그를 렌더링할 DOM 컨테이너를 지정합니다. |
### Dialog.OverlayPrimitive
Dialog의 배경 오버레이입니다. 다이얼로그 외부 영역을 어둡게 하고 클릭 이벤트를 처리합니다.
| prop | type | default | description |
| ------------- | -------------- | ------- | ----------------------------------- |
| `render` | `ReactElement` | `div` | 오버레이를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `keepMounted` | `boolean` | `false` | 다이얼로그가 닫혀있어도 오버레이를 DOM에 유지할지 설정합니다. |
| `className` | `string` | `null` | 오버레이 요소에 적용할 CSS 클래스명입니다. |
### Dialog.PopupPrimitive
Dialog의 실제 콘텐츠 영역입니다. Portal과 Overlay를 별도로 구성해야 합니다. 세밀한 제어가 필요할 때 사용합니다.
| prop | type | default | description |
| -------------- | -------------- | ------- | -------------------------------------------------------- |
| `render` | `ReactElement` | `div` | 콘텐츠를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `initialFocus` | `function` | `null` | 다이얼로그가 열릴 때 초기 포커스를 받을 요소를 반환하는 함수입니다. () => HTMLElement |
| `finalFocus` | `function` | `null` | 다이얼로그가 닫힐 때 포커스를 이동시킬 요소를 반환하는 함수입니다. () => HTMLElement |
| `className` | `string` | `null` | 콘텐츠 요소에 적용할 CSS 클래스명입니다. |
### Dialog.Popup
`PortalPrimitive`, `OverlayPrimitive`, `PopupPrimitive`가 통합된 편의 컴포넌트입니다. 대부분의 경우 이 컴포넌트를 사용하는 것을 권장합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------ |
| `className` | `string` | `null` | 콘텐츠 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 다이얼로그 내부에 렌더링할 콘텐츠입니다. |
### Dialog.Trigger
Dialog를 여는 트리거 버튼입니다. render prop을 통해 커스텀 요소로 렌더링할 수 있습니다.
| prop | type | default | description |
| ----------- | -------------- | -------- | ------------------------------ |
| `render` | `ReactElement` | `button` | 트리거를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 트리거 요소에 적용할 CSS 클래스명입니다. |
### Dialog.Close
Dialog를 닫는 버튼입니다. 다이얼로그 내 어디든 배치할 수 있으며, render prop을 통해 커스텀 요소로 사용할 수 있습니다.
| prop | type | default | description |
| ----------- | -------------- | -------- | -------------------------------- |
| `render` | `ReactElement` | `button` | 닫기 버튼을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 닫기 버튼에 적용할 CSS 클래스명입니다. |
### Dialog.Title
Dialog의 제목입니다. 접근성을 위해 필수로 포함해야 하며, 스크린 리더가 다이얼로그를 식별할 때 사용됩니다.
| prop | type | default | description |
| ----------- | -------------- | ------- | ----------------------------- |
| `render` | `ReactElement` | `h2` | 제목을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 제목 요소에 적용할 CSS 클래스명입니다. |
### Dialog.Description
Dialog의 설명 텍스트입니다. 스크린 리더 사용자에게 추가 컨텍스트를 제공하기 위해 사용하는 것을 권장합니다.
| prop | type | default | description |
| ----------- | -------------- | ------- | ----------------------------- |
| `render` | `ReactElement` | `p` | 설명을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 설명 요소에 적용할 CSS 클래스명입니다. |
### Dialog.Header
Dialog의 상단 영역입니다. 일반적으로 Title과 Close 버튼을 배치합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | --------------------------------------------- |
| `render` | `ReactElement` | `div` | 헤더를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 헤더 영역에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 헤더 영역에 렌더링할 내용입니다. 보통 Title과 Close 버튼을 포함합니다. |
### Dialog.Body
Dialog의 중앙 콘텐츠 영역입니다. Description과 주요 내용을 배치합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ----------------------------- |
| `render` | `ReactElement` | `div` | 바디를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 바디 영역에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 바디 영역에 렌더링할 주요 콘텐츠입니다. |
### Dialog.Footer
Dialog의 하단 영역입니다. 확인, 취소 등의 액션 버튼들을 배치합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------------------ |
| `render` | `ReactElement` | `div` | 푸터를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `null` | 푸터 영역에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 푸터 영역에 렌더링할 내용입니다. 보통 액션 버튼들을 포함합니다. |
# Field
URL: /docs/components/field
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/field.mdx
Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다.
***
title: Field
site\_name: Field - Vapor Core
description: Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다.
---------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/default-field.tsx",
"codeblock": true
}
```
## Property
***
### Invalid State
`invalid` prop을 사용하여 필드의 유효하지 않은 상태를 표시할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-invalid.tsx",
"codeblock": true
}
```
### Validation Mode
`validationMode` prop을 사용하여 언제 검증을 수행할지 제어할 수 있습니다. `onChange`는 입력할 때마다, `onBlur`는 포커스를 잃을 때 검증을 수행합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-validation-mode.tsx",
"codeblock": true
}
```
### Match
`Field.Error`의 `match` prop을 사용하여 특정 조건에 따라 에러 메시지 표시를 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-match.tsx",
"codeblock": true
}
```
## Examples
***
### With Description
Field.Description을 사용하여 필드에 대한 추가 설명을 제공할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-description.tsx",
"codeblock": true
}
```
### With Validation
Field.Error와 Field.Success를 사용하여 유효성 검사 결과를 표시할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-validation.tsx",
"codeblock": true
}
```
### With Checkbox
Checkbox 컴포넌트와 Field를 함께 사용하는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-checkbox.tsx",
"codeblock": true
}
```
### With Switch
Switch 컴포넌트와 Field를 함께 사용하는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-switch.tsx",
"codeblock": true
}
```
### With RadioGroup
RadioGroup과 Field를 함께 사용하여 선택지가 있는 필드를 만드는 예제입니다.
```tsx
'use client';
import { Field, Radio, RadioGroup } from '@vapor-ui/core';
export default function FieldRadioGroup() {
return (
성별
남성
여성
기타
개인정보 보호를 위해 선택사항입니다.
);
}
```
### With Different Input Types
다양한 폼 컨트롤(TextInput, Checkbox, Switch, Select 등)과 Field를 함께 사용하는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-with-inputs.tsx",
"codeblock": true
}
```
### Required Fields
필수 필드와 선택 필드를 구분하여 표시하는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-required.tsx",
"codeblock": true
}
```
### Field States
다양한 필드 상태(일반, 오류, 성공, 비활성화)를 보여주는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-states.tsx",
"codeblock": true
}
```
### Controlled Fields
제어 컴포넌트로 필드를 관리하고 실시간으로 상태를 표시하는 예제입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-controlled.tsx",
"codeblock": true
}
```
### Disabled
disabled 속성을 사용하여 비활성화된 필드를 만들 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/field/field-disabled.tsx",
"codeblock": true
}
```
## Props Table
***
### Field.Root
Field의 메인 컨테이너 컴포넌트입니다. 폼 필드의 기본 구조를 제공하며, 라벨, 입력 요소, 설명, 에러 메시지 등을 포함할 수 있습니다.
| prop | type | default | description |
| ------------------------ | ----------------------------- | ---------- | --------------------------------------------------------- |
| `name` | `string` | | 필드의 고유한 이름을 설정합니다. 폼 제출 시 식별자로 사용됩니다. |
| `disabled` | `boolean` | `false` | 필드와 내부 폼 컨트롤들을 비활성화합니다. |
| `invalid` | `boolean` | | 필드가 유효하지 않은 상태임을 나타냅니다. |
| `validate` | `function` | | 필드 값을 검증하는 함수를 설정합니다. |
| `validationMode` | `'onBlur','onChange'` | `'onBlur'` | 유효성 검사가 실행되는 타이밍을 설정합니다. |
| `validationDebounceTime` | `number` | `0` | 유효성 검사 실행 전 대기 시간(밀리초)을 설정합니다. |
| `className` | `string,function` | | 필드 상태에 따라 적용할 CSS 클래스 또는 클래스를 반환하는 함수입니다. |
| `render` | `React.ReactElement,function` | | 커스텀 렌더링 함수 또는 React 엘리먼트입니다. |
| `children` | `React.ReactNode` | | 필드 내부의 컨텐츠입니다. Label, Description, Error, 폼 컨트롤 등을 포함합니다. |
### Field.Label
필드에 라벨을 제공하는 컴포넌트입니다. 자동으로 폼 컨트롤과 연결됩니다.
| prop | type | default | description |
| ----------- | ----------------------------- | ------- | ----------------------------------------- |
| `children` | `React.ReactNode` | | 라벨의 텍스트 또는 내용입니다. |
| `className` | `string,function` | | 필드 상태에 따라 적용할 CSS 클래스 또는 클래스를 반환하는 함수입니다. |
| `render` | `React.ReactElement,function` | | 커스텀 렌더링 함수 또는 React 엘리먼트입니다. |
### Field.Description
필드에 대한 추가 설명을 제공하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ----------------------------- | ------- | ----------------------------------------- |
| `children` | `React.ReactNode` | | 설명 텍스트의 내용입니다. 필드에 대한 추가 정보를 제공합니다. |
| `className` | `string,function` | | 필드 상태에 따라 적용할 CSS 클래스 또는 클래스를 반환하는 함수입니다. |
| `render` | `React.ReactElement,function` | | 커스텀 렌더링 함수 또는 React 엘리먼트입니다. |
### Field.Error
필드 유효성 검사 실패 시 표시되는 오류 메시지 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ----------------------------- | ------- | ------------------------------------------------------------------- |
| `children` | `React.ReactNode` | | 에러 메시지의 내용입니다. |
| `match` | `boolean,string,function` | | 에러가 표시될 조건을 설정합니다. boolean, 유효성 상태 문자열, 또는 조건을 판단하는 함수를 사용할 수 있습니다. |
| `className` | `string,function` | | 필드 상태에 따라 적용할 CSS 클래스 또는 클래스를 반환하는 함수입니다. |
| `render` | `React.ReactElement,function` | | 커스텀 렌더링 함수 또는 React 엘리먼트입니다. |
### Field.Success
필드 유효성 검사 성공 시 표시되는 성공 메시지 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ----------------------------- | ------- | ----------------------------------------- |
| `children` | `React.ReactNode` | | 성공 메시지의 내용입니다. 필드가 유효할 때만 표시됩니다. |
| `className` | `string,function` | | 필드 상태에 따라 적용할 CSS 클래스 또는 클래스를 반환하는 함수입니다. |
| `render` | `React.ReactElement,function` | | 커스텀 렌더링 함수 또는 React 엘리먼트입니다. |
### Field.Validity
필드의 유효성 상태에 따라 커스텀 내용을 표시할 수 있는 컴포넌트입니다.
| prop | type | default | description |
| ---------- | ---------- | ------- | --------------------------------------------------------------------------------- |
| `children` | `function` | | 필드의 유효성 상태를 받아 내용을 반환하는 함수입니다. (validity: FieldValidityState) => ReactNode 형태입니다. |
# IconButton
URL: /docs/components/icon-button
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/icon-button.mdx
IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다.
***
title: 'IconButton'
site\_name: 'IconButton - Vapor Core'
description: 'IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다.'
--------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/default-icon-button.tsx",
"codeblock": true
}
```
## Property
***
### Size
IconButton 사이즈는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/icon-button-size.tsx",
"codeblock": true
}
```
### ColorPalette
IconButton 색상은 primary, secondary, success, warning, danger, contrast 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/icon-button-color.tsx",
"codeblock": true
}
```
### Variant
IconButton 스타일 변형은 fill, outline, ghost 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/icon-button-variant.tsx",
"codeblock": true
}
```
### Shape
IconButton 모양은 square, circle 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/icon-button-shape.tsx",
"codeblock": true
}
```
### Disabled
비활성화된 상태의 IconButton입니다. 사용자가 상호작용할 수 없습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/icon-button/icon-button-disabled.tsx",
"codeblock": true
}
```
## Props Table
***
IconButton은 아이콘만으로 작업을 수행하는 버튼 컴포넌트입니다. Button 컴포넌트를 확장하여 추가적인 shape 속성과 아이콘 전용 스타일링을 제공합니다. 접근성을 위해 적절한 `aria-label`을 반드시 제공해야 합니다. 이 컴포넌트는 `button` 요소를 기반으로 합니다.
| prop | type | default | description |
| -------------- | --------------------------------------------------- | ----------- | ------------------------------------------------------------ |
| `render` | `ReactElement,function` | `button` | 아이콘 버튼을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `colorPalette` | `primary,secondary,success,warning,danger,contrast` | `primary` | 아이콘 버튼의 주 색상(의미)을 설정합니다. |
| `size` | `sm,md,lg,xl` | `md` | 버튼 및 아이콘의 크기를 설정합니다. |
| `variant` | `fill,outline,ghost` | `fill` | 버튼의 스타일 변형을 선택합니다. |
| `shape` | `square,circle` | `square` | circle 경우 버튼이 완전히 원형이 됩니다. |
| `disabled` | `boolean` | `false` | 버튼을 비활성화합니다. |
| `aria-label` | `string` | `-` | 화면 읽기 전용 사용자에게 아이콘 버튼의 용도를 설명하는 텍스트입니다. 가시적 레이블이 없으므로 필수입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `children` | `ReactNode` | `undefined` | 아이콘 버튼에 표시할 아이콘을 포함합니다. |
# InputGroup
URL: /docs/components/input-group
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/input-group.mdx
InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다.
***
title: 'InputGroup'
site\_name: 'InputGroup - Vapor Core'
description: 'InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다.'
-----------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/input-group/default-input-group.tsx",
"codeblock": true
}
```
## Examples
***
### Basic Usage
InputGroup은 입력 컴포넌트(TextInput, Textarea)와 Counter를 조합하여 사용합니다. 입력 컴포넌트에 maxLength가 설정되면 자동으로 "현재글자수/최대글자수" 형태로 표시되고, maxLength가 없으면 현재 글자 수만 표시됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/input-group/input-group-basic.tsx",
"codeblock": true
}
```
### With Textarea
InputGroup은 Textarea와도 함께 사용할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/input-group/input-group-textarea.tsx",
"codeblock": true
}
```
### Custom Counter
Counter는 함수형 children을 지원하여 커스텀 카운터 UI를 구현할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/input-group/input-group-custom-counter.tsx",
"codeblock": true
}
```
## Props Table
***
### InputGroup.Root
InputGroup의 루트 컨테이너로, 입력 컴포넌트(TextInput, Textarea)와 Counter를 감싸는 래퍼 역할을 합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------------------------------------------------------------ |
| `render` | `ReactElement` | `div` | 루트 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 루트 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | InputGroup 내부에 렌더링할 자식 요소들입니다. Vapor UI의 TextInput, Textarea 컴포넌트를 포함할 수 있습니다. |
### InputGroup.Counter
문자 수를 표시하는 카운터 컴포넌트입니다. 함수형 children을 통해 커스텀 카운터를 구현할 수 있습니다.
| prop | type | default | description |
| ----------- | -------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `children` | `React.ReactNode,({ count, maxLength, value }: CounterRenderProps) => React.ReactNode` | `null` | 카운터 내용을 렌더링하는 children입니다. 함수형 children을 사용하면 count, maxLength, value를 받아 커스텀 카운터를 구현할 수 있습니다. |
| `render` | `React.ReactElement` | `span` | 카운터 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 카운터 요소에 적용할 CSS 클래스명입니다. |
# Menu
URL: /docs/components/menu
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/menu.mdx
드롭다운 메뉴와 컨텍스트 메뉴를 제공하는 컴포넌트입니다
***
title: 'Menu'
site\_name: 'Menu - Vapor Core'
description: '드롭다운 메뉴와 컨텍스트 메뉴를 제공하는 컴포넌트입니다'
---------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/default-menu.tsx",
"codeblock": true
}
```
## Property
***
### Positioning
Menu의 표시 위치를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-positioning.tsx",
"codeblock": true
}
```
### Groups
Menu 아이템을 그룹으로 구성할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-groups.tsx",
"codeblock": true
}
```
### Disabled
Menu와 개별 아이템을 비활성화할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-disabled.tsx",
"codeblock": true
}
```
## Examples
***
### Checkbox Items
체크박스 형태의 메뉴 아이템을 사용할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-checkbox.tsx",
"codeblock": true
}
```
### Radio Items
라디오 버튼 형태의 메뉴 아이템을 사용할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-radio.tsx",
"codeblock": true
}
```
### Submenu
서브메뉴를 구성할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/menu/menu-submenu.tsx",
"codeblock": true
}
```
## Props Table
***
### Menu.Root
Menu의 루트 컨테이너 컴포넌트입니다. 위치 관련 props와 Base UI Menu.Root의 모든 props를 지원합니다.
| prop | type | default | description |
| -------------------- | ------------------------------- | ------------------- | ------------------------------- |
| `open` | `boolean` | `-` | 메뉴의 열림 상태를 제어합니다 (제어 모드). |
| `defaultOpen` | `boolean` | `false` | 메뉴의 초기 열림 상태를 설정합니다. |
| `onOpenChange` | `function` | `-` | 메뉴의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
| `disabled` | `boolean` | `false` | 메뉴 전체를 비활성화할지 여부를 설정합니다. |
| `openOnHover` | `boolean` | `false` | 호버 시 메뉴를 열지 여부를 설정합니다. |
| `delay` | `number` | `0` | 메뉴가 열리기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `closeDelay` | `number` | `0` | 메뉴가 닫히기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `side` | `top,right,bottom,left` | `bottom` | 메뉴가 표시될 위치를 설정합니다. |
| `align` | `start,center,end` | `center` | 메뉴의 정렬을 설정합니다. |
| `sideOffset` | `number` | `0` | 트리거와 메뉴 사이의 거리를 설정합니다. |
| `alignOffset` | `number` | `0` | 정렬 축에서의 오프셋을 설정합니다. |
| `anchor` | `Element,VirtualElement,null` | `null` | 메뉴의 위치를 계산할 기준 앵커 요소를 설정합니다. |
| `arrowPadding` | `number` | `4` | 화살표와 콘텐츠 사이의 패딩을 설정합니다. |
| `collisionAvoidance` | `boolean,object` | `{ align: 'none' }` | 충돌 회피 동작을 설정합니다. |
| `collisionBoundary` | `Element,Array,string` | `clippingAncestors` | 충돌 감지를 위한 경계 요소를 설정합니다. |
| `collisionPadding` | `number,object` | `0` | 충돌 경계와의 패딩을 설정합니다. |
| `positionMethod` | `absolute,fixed` | `absolute` | 메뉴의 CSS 위치 지정 방법을 설정합니다. |
| `sticky` | `partial,always` | `partial` | 앵커 요소에 대한 메뉴의 고정 동작을 설정합니다. |
| `trackAnchor` | `boolean` | `true` | 앵커 요소의 움직임을 추적할지 여부를 설정합니다. |
### Menu.Trigger
Menu를 트리거하는 컴포넌트입니다.
| prop | type | default | description |
| ---------- | ----------------------- | ------- | ------------------------------------------------- |
| `disabled` | `boolean` | `-` | 트리거를 비활성화할지 여부를 설정합니다. Root의 disabled 상태를 상속받습니다. |
| `render` | `ReactElement,function` | `-` | 커스텀 렌더링을 위한 요소나 함수를 설정합니다. |
### Menu.PortalPrimitive
Menu 콘텐츠를 DOM 트리의 다른 위치로 렌더링하는 컴포넌트입니다.
| prop | type | default | description |
| ------------- | ------------------ | --------------- | -------------------------------------- |
| `container` | `Element,function` | `document.body` | 포털이 렌더링될 컨테이너 요소를 설정합니다. |
| `keepMounted` | `boolean` | `false` | 닫힌 상태에서도 DOM에 마운트된 상태를 유지할지 여부를 설정합니다. |
### Menu.Popup
Menu의 실제 콘텐츠를 포함하는 컴포넌트입니다. 내장된 Positioner, Popup을 포함하며, 자동으로 위치가 조정됩니다.
| prop | type | default | description |
| ------------------- | --------------- | ------- | ------------------------------- |
| `className` | `string` | `-` | 콘텐츠에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 메뉴 내부에 표시될 콘텐츠입니다. |
| `style` | `CSSProperties` | `-` | 콘텐츠에 적용할 인라인 스타일입니다. |
| `onPointerEnter` | `function` | `-` | 포인터가 콘텐츠 영역에 진입할 때 호출되는 함수입니다. |
| `onPointerLeave` | `function` | `-` | 포인터가 콘텐츠 영역에서 벗어날 때 호출되는 함수입니다. |
| `onEscapeKeyDown` | `function` | `-` | ESC 키를 눌렀을 때 호출되는 함수입니다. |
| `onInteractOutside` | `function` | `-` | 메뉴 외부에서 상호작용할 때 호출되는 함수입니다. |
### Menu.Item
개별 메뉴 아이템 컴포넌트입니다.
| prop | type | default | description |
| -------------- | ----------------------- | ------- | ------------------------------------------------------- |
| `disabled` | `boolean` | `false` | 개별 메뉴 아이템을 비활성화할지 여부를 설정합니다. Root의 disabled 상태를 상속받습니다. |
| `closeOnClick` | `boolean` | `true` | 클릭 시 메뉴를 닫을지 여부를 설정합니다. |
| `render` | `ReactElement,function` | `-` | 커스텀 렌더링을 위한 요소나 함수를 설정합니다. |
| `className` | `string` | `-` | 아이템에 적용할 추가 CSS 클래스입니다. |
### Menu.Separator
메뉴 아이템들 사이의 구분선을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------- | ------- | ----------------------- |
| `className` | `string` | `-` | 구분선에 적용할 추가 CSS 클래스입니다. |
### Menu.Group
메뉴 아이템들을 그룹화하는 컨테이너 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ----------- | ------- | ---------------------- |
| `className` | `string` | `-` | 그룹에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 그룹 내부에 포함될 콘텐츠입니다. |
### Menu.GroupLabel
메뉴 그룹의 라벨을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ----------- | ------- | ------------------------- |
| `className` | `string` | `-` | 그룹 라벨에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 그룹 라벨 텍스트입니다. |
### Menu.SubmenuRoot
서브메뉴의 루트 컨테이너 컴포넌트입니다.
| prop | type | default | description |
| ------------------ | ----------------------- | ------- | -------------------------------------------------- |
| `open` | `boolean` | `-` | 서브메뉴의 열림 상태를 제어합니다 (제어 모드). |
| `defaultOpen` | `boolean` | `false` | 서브메뉴의 초기 열림 상태를 설정합니다. |
| `onOpenChange` | `function` | `-` | 서브메뉴의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
| `openOnHover` | `boolean` | `true` | 호버 시 서브메뉴를 열지 여부를 설정합니다. |
| `delay` | `number` | `0` | 서브메뉴가 열리기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `closeDelay` | `number` | `0` | 서브메뉴가 닫히기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `closeParentOnEsc` | `boolean` | `false` | ESC 키를 눌렀을 때 부모 메뉴도 함께 닫을지 여부를 설정합니다. |
| `disabled` | `boolean` | `false` | 서브메뉴를 비활성화할지 여부를 설정합니다. Root의 disabled 상태를 상속받습니다. |
| `side` | `top,right,bottom,left` | `right` | 서브메뉴가 표시될 위치를 설정합니다. |
| `align` | `start,center,end` | `start` | 서브메뉴의 정렬을 설정합니다. |
| `sideOffset` | `number` | `0` | 트리거와 서브메뉴 사이의 거리를 설정합니다. |
| `alignOffset` | `number` | `0` | 정렬 축에서의 오프셋을 설정합니다. |
### Menu.SubmenuPopup
서브메뉴의 실제 콘텐츠를 포함하는 컴포넌트입니다. finalFocus가 자동으로 설정되어 서브메뉴가 닫힐 때 트리거로 포커스가 돌아갑니다.
| prop | type | default | description |
| ----------- | --------------- | ------- | ---------------------------- |
| `className` | `string` | `-` | 서브메뉴 콘텐츠에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 서브메뉴 내부에 표시될 콘텐츠입니다. |
| `style` | `CSSProperties` | `-` | 서브메뉴 콘텐츠에 적용할 인라인 스타일입니다. |
### Menu.SubmenuTriggerItem
서브메뉴를 트리거하는 메뉴 아이템 컴포넌트입니다. ChevronRightOutlineIcon이 자동으로 추가됩니다.
| prop | type | default | description |
| ----------- | ----------- | ------- | ----------------------------------------------------------------- |
| `disabled` | `boolean` | `false` | 서브메뉴 트리거 아이템을 비활성화할지 여부를 설정합니다. SubmenuRoot의 disabled 상태를 상속받습니다. |
| `className` | `string` | `-` | 서브메뉴 트리거 아이템에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 서브메뉴 트리거 아이템의 콘텐츠입니다. ChevronRightOutlineIcon이 자동으로 추가됩니다. |
### Menu.CheckboxItem
체크박스 형태의 메뉴 아이템 컴포넌트입니다.
| prop | type | default | description |
| ----------------- | ---------- | ------- | ------------------------------------------------------ |
| `checked` | `boolean` | `false` | 체크박스 아이템의 체크 상태를 설정합니다. |
| `defaultChecked` | `boolean` | `false` | 체크박스 아이템의 초기 체크 상태를 설정합니다. |
| `onCheckedChange` | `function` | `-` | 체크 상태가 변경될 때 호출되는 콜백 함수입니다. |
| `disabled` | `boolean` | `false` | 체크박스 아이템을 비활성화할지 여부를 설정합니다. Root의 disabled 상태를 상속받습니다. |
| `closeOnClick` | `boolean` | `false` | 클릭 시 메뉴를 닫을지 여부를 설정합니다. |
| `className` | `string` | `-` | 체크박스 아이템에 적용할 추가 CSS 클래스입니다. |
### Menu.RadioGroup
라디오 그룹 메뉴 컴포넌트입니다.
| prop | type | default | description |
| --------------- | ---------- | ------- | --------------------------- |
| `value` | `string` | `-` | 선택된 라디오 아이템의 값을 설정합니다. |
| `defaultValue` | `string` | `-` | 초기 선택된 라디오 아이템의 값을 설정합니다. |
| `onValueChange` | `function` | `-` | 선택된 값이 변경될 때 호출되는 콜백 함수입니다. |
### Menu.RadioItem
라디오 아이템 메뉴 컴포넌트입니다.
| prop | type | default | description |
| -------------- | --------- | ------- | ----------------------------------------------------- |
| `value` | `string` | `-` | 라디오 아이템의 값을 설정합니다. |
| `disabled` | `boolean` | `false` | 라디오 아이템을 비활성화할지 여부를 설정합니다. Root의 disabled 상태를 상속받습니다. |
| `closeOnClick` | `boolean` | `true` | 클릭 시 메뉴를 닫을지 여부를 설정합니다. |
| `className` | `string` | `-` | 라디오 아이템에 적용할 추가 CSS 클래스입니다. |
# MultiSelect
URL: /docs/components/multi-select
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/multi-select.mdx
MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다.
***
title: 'MultiSelect'
site\_name: 'MultiSelect - Vapor Core'
description: 'MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다.'
-----------------------------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/default-multi-select.tsx",
"codeblock": true
}
```
## Property
***
### Size
MultiSelect의 크기는 sm, md, lg, xl 로 제공합니다. 크기에 따라 선택된 값들의 배지 크기도 자동으로 조정됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-size.tsx",
"codeblock": true
}
```
### Controlled State
MultiSelect의 선택 상태를 외부에서 제어할 수 있습니다. 값은 배열 형태로 관리됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-controlled.tsx",
"codeblock": true
}
```
### States
MultiSelect의 다양한 상태(비활성화, 읽기 전용, 오류)를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-states.tsx",
"codeblock": true
}
```
## Examples
***
### Items Configuration
MultiSelect는 배열 형태와 객체 형태의 아이템 데이터를 모두 지원합니다. items prop을 사용하면 자동으로 값이 포맷팅되어 배지로 표시됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-items.tsx",
"codeblock": true
}
```
### Grouping Options
관련된 옵션들을 그룹으로 묶어 구조화할 수 있습니다. Group과 GroupLabel, Separator를 사용하여 명확한 구조를 만들 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-grouping.tsx",
"codeblock": true
}
```
### Custom Value Display
MultiSelect.Value에 함수형 children을 제공하여 선택된 값들의 표시 방법을 커스터마이징할 수 있습니다. 기본적으로는 배지 형태로 표시되지만, 문자열이나 커스텀 컴포넌트로 변경할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/multi-select/multi-select-custom-value.tsx",
"codeblock": true
}
```
## Props Table
***
### MultiSelect.Root
MultiSelect의 루트 컨테이너로, 전체 MultiSelect 컴포넌트의 상태와 동작을 관리합니다.
| prop | type | default | description |
| --------------- | -------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------- |
| `items` | `Array<{label: string, value: string}>,Record` | `null` | MultiSelect의 옵션 아이템들을 정의합니다. 배열 형태(label, value 속성을 가진 객체) 또는 객체 형태(키-값 쌍)로 제공할 수 있습니다. |
| `placeholder` | `React.ReactNode` | `null` | 값이 선택되지 않았을 때 표시할 플레이스홀더 텍스트입니다. |
| `size` | `'sm','md','lg','xl'` | `'md'` | MultiSelect의 크기를 설정합니다. 선택된 값들이 배지 형태로 표시될 때 크기도 함께 조정됩니다. |
| `invalid` | `boolean` | `false` | MultiSelect가 유효하지 않은 상태임을 나타냅니다. true일 때 오류 스타일이 적용됩니다. |
| `value` | `unknown[]` | `[]` | MultiSelect의 현재 선택된 값들의 배열입니다. 제어 컴포넌트로 사용할 때 필요합니다. |
| `defaultValue` | `unknown[]` | `[]` | MultiSelect의 초기 선택 값들의 배열입니다. 비제어 컴포넌트로 사용할 때 설정합니다. |
| `onValueChange` | `(value: unknown[], event?: Event) => void` | `null` | 선택된 값들이 변경될 때 호출되는 콜백 함수입니다. |
| `disabled` | `boolean` | `false` | MultiSelect를 비활성화 상태로 만듭니다. |
| `readOnly` | `boolean` | `false` | MultiSelect를 읽기 전용 상태로 만듭니다. 값을 변경할 수 없지만 포커스는 가능합니다. |
| `open` | `boolean` | `false` | MultiSelect 드롭다운의 열림/닫힘 상태를 제어합니다. |
| `defaultOpen` | `boolean` | `false` | MultiSelect 드롭다운의 초기 열림 상태를 설정합니다. |
| `onOpenChange` | `(open: boolean, event?: Event) => void` | `null` | 드롭다운 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
### MultiSelect.Trigger
MultiSelect 드롭다운을 여는 트리거 요소입니다.
| prop | type | default | description |
| -------------- | -------------------- | -------- | ----------------------------------- |
| `render` | `React.ReactElement` | `button` | 트리거 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 트리거 요소에 적용할 CSS 클래스명입니다. |
| `nativeButton` | `boolean` | `true` | 네이티브 button 요소의 동작을 사용할지 여부를 설정합니다. |
### MultiSelect.ValuePrimitive
선택된 값들을 표시하는 컴포넌트입니다. 기본적으로 배지 형태로 표시되며, 함수형 children을 통해 커스텀 값 표시가 가능합니다.
| prop | type | default | description |
| ----------- | ------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- |
| `children` | `React.ReactNode,(value: unknown[]) => React.ReactNode` | `null` | 선택된 값들을 표시하는 children입니다. 함수형 children을 사용하면 선택된 값들의 배열을 받아 커스텀 표시를 구현할 수 있습니다. 기본적으로 선택된 값들은 Badge 컴포넌트로 표시됩니다. |
| `render` | `React.ReactElement` | `span` | 값 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 값 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.PlaceholderPrimitive
값이 선택되지 않았을 때 표시되는 플레이스홀더 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | -------------------------------------- |
| `render` | `React.ReactElement` | `span` | 플레이스홀더 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 플레이스홀더 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.TriggerIconPrimitive
트리거 버튼의 드롭다운 아이콘을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------------------------ | ---------------------------------------------------- |
| `children` | `React.ReactNode` | `ChevronDownOutlineIcon` | 트리거 아이콘으로 표시할 요소입니다. 기본값은 ChevronDownOutlineIcon입니다. |
| `render` | `React.ReactElement` | `div` | 트리거 아이콘 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 트리거 아이콘 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.PortalPrimitive
MultiSelect 드롭다운을 DOM의 다른 위치에 렌더링하는 포털 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ------------------------------- | --------------- | -------------------- |
| `container` | `HTMLElement,() => HTMLElement` | `document.body` | 포털이 렌더링될 컨테이너 요소입니다. |
### MultiSelect.PositionerPrimitive
MultiSelect 드롭다운의 위치를 설정하는 컴포넌트입니다.
| prop | type | default | description |
| ---------------------- | ------------------------------- | ---------- | ------------------------------- |
| `side` | `'top','right','bottom','left'` | `'bottom'` | 드롭다운이 나타날 위치를 설정합니다. |
| `align` | `'start','center','end'` | `'start'` | 드롭다운의 정렬 방향을 설정합니다. |
| `sideOffset` | `number` | `4` | 트리거와 드롭다운 사이의 거리를 픽셀 단위로 설정합니다. |
| `alignOffset` | `number` | `0` | 정렬 축에서의 오프셋을 픽셀 단위로 설정합니다. |
| `alignItemWithTrigger` | `boolean` | `false` | 선택된 아이템을 트리거와 정렬할지 여부를 설정합니다. |
| `className` | `string` | `null` | 포지셔너 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.PopupPrimitive
MultiSelect의 실제 드롭다운 팝업 영역입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 팝업 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 팝업 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.Popup
MultiSelect의 드롭다운 콘텐츠를 담는 컨테이너입니다. Portal과 Positioner를 조합하여 구성됩니다.
| prop | type | default | description |
| ------------------- | -------------------- | ------- | -------------------------------------------- |
| `portalElement` | `React.ReactElement` | `null` | 기본값으로 지정된 컴포넌트 대신 렌더링할 요소입니다. |
| `positionerElement` | `React.ReactElement` | `null` | 기본값으로 지정된 컴포넌트 대신 렌더링할 요소입니다. |
| `render` | `React.ReactElement` | `div` | 콘텐츠 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 콘텐츠 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.Item
개별 선택 옵션을 나타내는 컴포넌트입니다. 다중 선택이 가능합니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ----------------------------------- |
| `value` | `unknown` | `null` | 아이템의 값입니다. |
| `render` | `React.ReactElement` | `div` | 아이템 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 아이템 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 아이템 내부에 렌더링할 콘텐츠입니다. |
### MultiSelect.ItemIndicatorPrimitive
선택된 아이템에 표시되는 인디케이터 아이콘 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | -------------------- | ------------------------------------------------------ |
| `children` | `React.ReactNode` | `ConfirmOutlineIcon` | 선택된 아이템에 표시할 인디케이터 아이콘입니다. 기본값은 ConfirmOutlineIcon입니다. |
| `render` | `React.ReactElement` | `span` | 인디케이터 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 인디케이터 요소에 적용할 CSS 클래스명입니다. |
### MultiSelect.Group
관련된 아이템들을 그룹화하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 그룹 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 그룹 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 그룹 내부에 렌더링할 콘텐츠입니다. |
### MultiSelect.GroupLabel
그룹의 라벨을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ------------------------------------- |
| `render` | `React.ReactElement` | `div` | 그룹 라벨 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 그룹 라벨 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 그룹 라벨에 표시할 텍스트 또는 요소입니다. |
### MultiSelect.Separator
그룹 간의 구분선을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ----------------------------------- |
| `render` | `React.ReactElement` | `div` | 구분선 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 구분선 요소에 적용할 CSS 클래스명입니다. |
# NavigationMenu
URL: /docs/components/navigation-menu
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/navigation-menu.mdx
여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다.
***
title: 'NavigationMenu'
site\_name: 'NavigationMenu - Vapor Core'
description: '여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다.'
-------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/default-navigation-menu.tsx",
"codeblock": true
}
```
## Property
***
### Size
NavigationMenu 사이즈는 sm, md, lg, xl로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/navigation-menu-size.tsx",
"codeblock": true
}
```
### Direction
NavigationMenu 방향은 horizontal, vertical로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/navigation-menu-direction.tsx",
"codeblock": true
}
```
### Disabled
NavigationMenu.Link의 비활성화 상태를 보여주는 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/navigation-menu-disabled.tsx",
"codeblock": true
}
```
### Selected
NavigationMenu.Link의 선택된 상태를 보여주는 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/navigation-menu-selected.tsx",
"codeblock": true
}
```
## Examples
***
### With Icons
Nav에 아이콘을 추가한 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/navigation-menu-with-icon.tsx",
"codeblock": true
}
```
### With Popup
팝오버 형태의 네비게이션 메뉴 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/with-popup.tsx",
"codeblock": true
}
```
### Flexible Usage
NavigationMenu의 모든 프리셋 컴포넌트를 분리하여 사용합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/navigation-menu/flexible.tsx",
"codeblock": true
}
```
## Props Table
***
### NavigationMenu.Root
NavigationMenu의 메인 컨테이너 컴포넌트입니다. 네비게이션의 크기, 모양, 방향 등의 속성을 제공하며, 모든 하위 컴포넌트에서 공통으로 사용할 수 있도록 컨텍스트를 제공합니다. 이 컴포넌트는 `nav` 요소를 기반으로 합니다.
| prop | type | default | description |
| ------------------- | --------------------- | ------------ | ---------------------------------------------------------------------------- |
| `defaultValue` | `string` | `-` | 초기 렌더링 시 활성화되어야 하는 메뉴 아이템의 값입니다. 값 상태를 제어할 필요가 없을 때 사용합니다. |
| `value` | `string` | `-` | 활성화할 메뉴 아이템의 제어된 값입니다. onValueChange와 함께 사용해야 합니다. |
| `onValueChange` | `function` | `-` | 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
| `delayDuration` | `number` | `200` | 마우스가 트리거에 진입한 시점부터 콘텐츠가 열릴 때까지의 지연 시간(밀리초)입니다. |
| `skipDelayDuration` | `number` | `300` | 사용자가 다시 지연 없이 다른 트리거에 진입할 수 있는 시간(밀리초)입니다. |
| `dir` | `ltr,rtl` | `-` | 해당하는 경우 메뉴의 읽기 방향입니다. 생략하면 DirectionProvider에서 전역적으로 상속받거나 LTR 읽기 모드로 가정합니다. |
| `orientation` | `horizontal,vertical` | `horizontal` | 메뉴의 방향입니다. |
| `aria-label` | `string` | `-` | 스크린 리더 사용자에게 네비게이션의 목적을 설명하는 접근성 레이블입니다. |
| `direction` | `horizontal,vertical` | `horizontal` | 네비게이션 메뉴가 가로 또는 세로 방향으로 배치될지 결정합니다. |
| `size` | `sm,md,lg,xl` | `md` | Nav.Link의 높이·타이포그래피 크기 등을 제어합니다. |
| `stretch` | `boolean` | `false` | stretch가 true이면 Nav.List와 Nav.Item이 가용 공간을 가득 채웁니다. |
| `disabled` | `boolean` | `false` | Nav.Link를 비활성화할지 여부입니다. |
| `children` | `ReactNode` | `-` | 네비게이션 메뉴의 자식 컴포넌트들입니다. |
### NavigationMenu.List
NavigationMenu의 리스트 컨테이너 컴포넌트입니다. 네비게이션 아이템들을 담는 리스트 역할을 합니다. 이 컴포넌트는 `ul` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | -------------- | ------- | ------------------------------------ |
| `render` | `ReactElement` | `ul` | 네비게이션 리스트를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `className` | `string` | `-` | 리스트(ul)에 추가 클래스를 적용합니다. |
| `children` | `ReactNode` | `-` | 리스트에 표시할 콘텐츠입니다. |
### NavigationMenu.Item
NavigationMenu의 개별 아이템 컴포넌트입니다. 각각의 네비게이션 링크를 감싸는 리스트 아이템 역할을 합니다. 이 컴포넌트는 `li` 요소를 기반으로 합니다.
| prop | type | default | description |
| ----------- | -------------- | ------- | ---------------------------------------------------------------- |
| `render` | `ReactElement` | `li` | 네비게이션 아이템을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `value` | `string` | `-` | 네비게이션 메뉴가 제어될 때 아이템을 활성 값과 연결하는 고유한 값입니다. 제어되지 않을 때는 자동으로 관리됩니다. |
| `className` | `string` | `-` | 리스트 아이템(li)에 추가 클래스를 적용합니다. |
| `children` | `ReactNode` | `-` | 아이템에 표시할 콘텐츠입니다. |
### NavigationMenu.Link
NavigationMenu의 링크 컴포넌트입니다. 실제 네비게이션 링크를 표시하며, 선택됨 상태와 비활성화 상태를 관리합니다. 이 컴포넌트는 `a` 요소를 기반으로 합니다.
| prop | type | default | description |
| ---------- | -------------- | ------- | ----------------------------------- |
| `render` | `ReactElement` | `a` | 네비게이션 링크를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `selected` | `boolean` | `false` | 현재 페이지와 일치하는 링크를 나타냅니다. |
| `disabled` | `boolean` | `false` | 링크를 비활성화합니다. |
| `href` | `string` | `-` | 링크 대상 URL입니다. |
| `children` | `ReactNode` | `-` | 링크에 표시할 콘텐츠입니다. |
# Popover
URL: /docs/components/popover
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/popover.mdx
Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.
***
title: 'Popover'
site\_name: 'Popover - Vapor Core'
description: 'Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.'
-------------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/popover/default-popover.tsx",
"codeblock": true
}
```
## Property
***
### PositionerProps
Popover가 나타날 위치와 정렬을 설정할 수 있습니다. 기본값은 'bottom'입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/popover/popover-positioning.tsx",
"codeblock": true
}
```
### Offset
Popover와 트리거 간의 거리를 세밀하게 조정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/popover/popover-offset.tsx",
"codeblock": true
}
```
## Examples
***
### Content Variations
팝오버는 간단한 텍스트부터 복잡한 상호작용 요소까지 다양한 콘텐츠를 담을 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/popover/popover-content.tsx",
"codeblock": true
}
```
## Props Table
***
### Popover.Root
Popover의 루트 컨테이너로, 전체 Popover 컴포넌트의 상태와 동작을 관리합니다.
| prop | type | default | description |
| -------------- | --------------------------------------------------------- | ----------- | -------------------------------------------------------------------- |
| `open` | `boolean` | `undefined` | 팝오버의 열림 상태를 제어합니다. 이 prop이 제공되면 컴포넌트가 제어 모드로 동작합니다. |
| `defaultOpen` | `boolean` | `false` | 팝오버의 초기 열림 상태를 설정합니다. 비제어 모드에서만 사용됩니다. |
| `onOpenChange` | `(open: boolean, event?: Event, reason?: string) => void` | `undefined` | 팝오버의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. open 상태, 이벤트, 그리고 변경 이유를 인자로 받습니다. |
| `modal` | `boolean,{ trapFocus?: boolean }` | `true` | 팝오버가 모달 형태로 동작할지 여부를 설정합니다. true일 때 배경을 클릭하면 팝오버가 닫히고 포커스 트랩이 적용됩니다. |
| `openOnHover` | `boolean` | `false` | 마우스 호버 시 팝오버를 열지 여부를 설정합니다. |
| `delay` | `number,{ open?: number; close?: number }` | `0` | 팝오버 열기/닫기 지연 시간을 밀리초 단위로 설정합니다. |
### Popover.Trigger
Popover를 여는 트리거 요소입니다.
| prop | type | default | description |
| ---------- | ------------------------------------------------------------------------------------- | ----------- | --------------------------------------------------------------- |
| `render` | `React.ReactElement,(props: TriggerProps, state: TriggerState) => React.ReactElement` | `undefined` | 트리거 요소를 렌더링하는 함수 또는 컴포넌트입니다. 함수로 제공될 경우 props와 state를 인자로 받습니다. |
| `disabled` | `boolean` | `false` | 트리거 요소를 비활성화할지 여부를 설정합니다. |
### Popover.Popup
Popover의 실제 콘텐츠를 담는 컨테이너입니다. Portal과 Positioner를 조합하여 구성됩니다.
| prop | type | default | description |
| ------------------- | -------------------- | ----------- | ----------------------------------------------------------------- |
| `portalElement` | `React.ReactElement` | `undefined` | Portal 컴포넌트에 전달될 React Element입니다. 팝오버가 렌더링될 위치와 관련된 설정을 제어합니다. |
| `positionerElement` | `React.ReactElement` | `undefined` | Positioner 컴포넌트에 전달될 React Element입니다. 팝오버의 위치와 정렬에 관한 설정을 제어합니다. |
| `className` | `string` | `undefined` | 팝오버 컨텐츠에 적용할 CSS 클래스명입니다. |
### Popover.PortalPrimitive
Popover를 DOM의 다른 위치에 렌더링하는 포털 컴포넌트입니다.
| prop | type | default | description |
| ------------- | ------------------------------------ | --------------- | -------------------------------------------------------------- |
| `container` | `HTMLElement,() => HTMLElement,null` | `document.body` | 팝오버가 렌더링될 컨테이너 요소를 지정합니다. null을 전달하면 포탈을 사용하지 않고 인라인으로 렌더링합니다. |
| `keepMounted` | `boolean` | `false` | 팝오버가 닫혀있을 때도 DOM에 마운트된 상태를 유지할지 여부를 설정합니다. |
### Popover.PositionerPrimitive
Popover의 위치를 설정하는 컴포넌트입니다.
| prop | type | default | description |
| -------------------- | ----------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------- |
| `side` | `'top','right','bottom','left'` | `'bottom'` | 팝오버가 표시될 기본 방향을 설정합니다. 공간이 부족할 경우 자동으로 다른 방향으로 조정될 수 있습니다. |
| `align` | `'start','center','end'` | `'center'` | 팝오버의 정렬 방향을 설정합니다. side 축에 수직인 축에서의 정렬을 제어합니다. |
| `sideOffset` | `number,(side: Side) => number` | `8` | 트리거와 팝오버 사이의 거리(픽셀)를 설정합니다. 함수로 제공하면 방향에 따라 다른 값을 설정할 수 있습니다. |
| `alignOffset` | `number,(side: Side) => number` | `0` | 정렬 축에서의 오프셋(픽셀)을 설정합니다. 양수는 end 방향으로, 음수는 start 방향으로 이동합니다. |
| `collisionPadding` | `number,{ top?: number; right?: number; bottom?: number; left?: number }` | `8` | 충돌 감지 시 사용할 패딩 값을 설정합니다. 뷰포트 경계에서 이 값만큼 여백을 두고 충돌을 감지합니다. |
| `collisionAvoidance` | `boolean,{ boundary?: HTMLElement; rootBoundary?: 'viewport' \| 'document'; padding?: number }` | `true` | 충돌 회피 동작을 설정합니다. false로 설정하면 충돌 감지를 비활성화합니다. |
| `arrowPadding` | `number` | `4` | 화살표와 팝오버 모서리 사이의 최소 거리를 픽셀 단위로 설정합니다. |
| `sticky` | `boolean,'partial'` | `false` | 팝오버가 트리거를 따라 이동할지 여부를 설정합니다. 'partial'로 설정하면 부분적으로만 따라갑니다. |
### Popover.PopupPrimitive
Popover의 실제 팝업 콘텐츠 영역입니다.
| prop | type | default | description |
| ----------- | --------------------------------------------------------------------------------- | ----------- | --------------------------- |
| `className` | `string` | `undefined` | 팝오버 팝업에 적용할 CSS 클래스명입니다. |
| `style` | `CSSProperties` | `undefined` | 팝오버 팝업에 적용할 인라인 스타일입니다. |
| `render` | `React.ReactElement,(props: PopupProps, state: PopupState) => React.ReactElement` | `undefined` | 팝업 요소를 렌더링하는 함수 또는 컴포넌트입니다. |
### Popover.Title
Popover의 제목을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| -------- | -------------------------------------------------------------- | ----------- | --------------------------- |
| `render` | `React.ReactElement,(props: TitleProps) => React.ReactElement` | `undefined` | 제목 요소를 렌더링하는 함수 또는 컴포넌트입니다. |
### Popover.Description
Popover의 설명을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| -------- | -------------------------------------------------------------------- | ----------- | --------------------------- |
| `render` | `React.ReactElement,(props: DescriptionProps) => React.ReactElement` | `undefined` | 설명 요소를 렌더링하는 함수 또는 컴포넌트입니다. |
### Popover.Close
Popover를 닫는 버튼 컴포넌트입니다.
| prop | type | default | description |
| -------- | -------------------------------------------------------------- | ----------- | --------------------------- |
| `render` | `React.ReactElement,(props: CloseProps) => React.ReactElement` | `undefined` | 닫기 버튼을 렌더링하는 함수 또는 컴포넌트입니다. |
# RadioCard
URL: /docs/components/radio-card
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/radio-card.mdx
RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다.
***
title: 'RadioCard'
site\_name: 'RadioCard - Vapor Core'
description: 'RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다.'
-----------------------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/default-radio-card.tsx",
"codeblock": true
}
```
## Property
***
### Size
RadioCard 사이즈는 md, lg로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/radio-card-size.tsx",
"codeblock": true
}
```
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/radio-card-disabled.tsx",
"codeblock": true
}
```
### Read Only
RadioCard의 읽기 전용 상태입니다. 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/radio-card-readonly.tsx",
"codeblock": true
}
```
## Examples
***
### Simple Usage
기본적인 RadioCard 사용법입니다. RadioGroup.Root와 함께 사용해야 합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/radio-card-simple.tsx",
"codeblock": true
}
```
### Direction
RadioCard의 방향을 조절할 수 있습니다. VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-card/radio-card-direction.tsx",
"codeblock": true
}
```
## Props Table
***
### RadioGroup.Root
RadioGroup의 메인 컨테이너 컴포넌트입니다. RadioCard를 포함한 모든 라디오 버튼의 크기, 방향, 상태 등의 속성을 제공하며, 하위 컴포넌트에서 공통으로 사용할 수 있도록 컨텍스트를 제공합니다.
| prop | type | default | description |
| ---------------- | --------------------- | ------- | ---------------------------------------------------------------------------------- |
| `render` | `ReactElement` | `div` | 라디오 그룹을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `defaultValue` | `string` | `-` | 초기 렌더링 시 체크되어야 하는 라디오 아이템의 값입니다. 라디오 아이템의 상태를 제어할 필요가 없을 때 사용합니다. |
| `value` | `string` | `-` | 체크할 라디오 아이템의 제어된 값입니다. onValueChange와 함께 사용해야 합니다. |
| `onValueChange` | `function` | `-` | 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
| `disabled` | `boolean` | `-` | true일 때 사용자가 라디오 아이템과 상호작용하는 것을 방지합니다. |
| `name` | `string` | `-` | 그룹의 이름입니다. 소유하는 폼과 함께 name/value 쌍의 일부로 제출됩니다. |
| `required` | `boolean` | `-` | true일 때 소유하는 폼이 제출되기 전에 사용자가 라디오 아이템을 체크해야 함을 나타냅니다. |
| `orientation` | `horizontal,vertical` | `-` | 컴포넌트의 방향입니다. |
| `dir` | `ltr,rtl` | `-` | 라디오 그룹의 읽기 방향입니다. 생략하면 DirectionProvider에서 전역적으로 상속받거나 LTR(왼쪽에서 오른쪽) 읽기 모드로 가정합니다. |
| `loop` | `boolean` | `true` | true일 때 키보드 탐색이 마지막 아이템에서 첫 번째 아이템으로, 그 반대로도 순환합니다. |
| `size` | `md,lg` | `md` | RadioGroup.Item 간의 간격 및 Control 크기를 조정합니다. |
| `invalid` | `boolean` | `false` | 폼 유효성 검증 실패 등의 상태를 나타냅니다. |
| `visuallyHidden` | `boolean` | `false` | Item의 레이블을 시각적으로 숨기지만 스크린리더에는 읽히도록 합니다. |
### RadioGroup.Label
RadioGroup의 레이블 컴포넌트입니다. RadioCard 그룹을 하나로 설명할 수 있는 공통 제목에 해당합니다.
| prop | type | default | description |
| ---------- | -------------- | ------- | ---------------------------------- |
| `render` | `ReactElement` | `label` | 라디오 레이블을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `htmlFor` | `string` | `-` | 레이블이 연결될 Control 요소의 id입니다. |
| `children` | `ReactNode` | `-` | 레이블에 표시할 텍스트나 노드입니다. |
### RadioCard
카드 형태의 라디오 버튼 컴포넌트입니다. RadioGroup.Root 내에서 사용되며, 컨텍스트를 통해 크기와 상태를 상속받습니다.
| prop | type | default | description |
| ----------- | -------------------- | -------- | ------------------------------------------------------------------------- |
| `value` | `string,number,null` | `null` | RadioCard의 값입니다. RadioGroup 내에서 선택된 값을 식별하는 데 사용됩니다. |
| `size` | `"md","lg"` | `"md"` | RadioCard의 크기를 설정합니다. RadioGroup 컨텍스트에서 상속받거나 개별적으로 설정할 수 있습니다. |
| `invalid` | `boolean` | `false` | RadioCard가 유효하지 않은 상태인지 여부를 설정합니다. RadioGroup의 invalid 속성에 의해 상속될 수 있습니다. |
| `disabled` | `boolean` | `false` | RadioCard를 비활성화할지 여부를 설정합니다. 비활성화된 카드는 선택할 수 없습니다. |
| `readOnly` | `boolean` | `false` | RadioCard를 읽기 전용으로 설정할지 여부를 결정합니다. 읽기 전용 상태에서는 값을 변경할 수 없습니다. |
| `required` | `boolean` | `false` | RadioCard가 필수 선택 항목인지 여부를 설정합니다. |
| `className` | `string` | `null` | RadioCard 요소에 적용할 CSS 클래스명입니다. |
| `render` | `ReactElement` | `button` | RadioCard 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `children` | `React.ReactNode` | `null` | RadioCard 내부에 렌더링할 자식 요소입니다. 일반적으로 카드에 표시될 텍스트나 콘텐츠를 포함합니다. |
# Radio
URL: /docs/components/radio
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/radio.mdx
Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다.
***
title: 'Radio'
site\_name: 'Radio - Vapor Core'
description: 'Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다.'
-------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/default-radio-group.tsx",
"codeblock": true
}
```
## Property
***
### Size
RadioGroup 사이즈는 md, lg로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/radio-group-size.tsx",
"codeblock": true
}
```
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/radio-group-disabled.tsx",
"codeblock": true
}
```
### Read Only
RadioGroup의 읽기 전용 상태입니다. 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/radio-readonly.tsx",
"codeblock": true
}
```
## Examples
***
### Direction
Radio 그룹의 방향을 조절할 수 있습니다. VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/radio-direction.tsx",
"codeblock": true
}
```
### Flexible
Radio의 유연한 사용예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/radio-group/flexible.tsx",
"codeblock": true
}
```
## Props Table
***
### RadioGroup.Root
RadioGroup의 메인 컨테이너 컴포넌트입니다. 라디오 버튼 그룹의 크기, 방향, 상태 등의 속성을 제공하며, 모든 하위 컴포넌트에서 공통으로 사용할 수 있도록 컨텍스트를 제공합니다.
| prop | type | default | description |
| ---------------- | --------------------- | ------- | ---------------------------------------------------------------------------------- |
| `render` | `ReactElement` | `div` | 라디오 그룹을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `defaultValue` | `string` | `-` | 초기 렌더링 시 체크되어야 하는 라디오 아이템의 값입니다. 라디오 아이템의 상태를 제어할 필요가 없을 때 사용합니다. |
| `value` | `string` | `-` | 체크할 라디오 아이템의 제어된 값입니다. onValueChange와 함께 사용해야 합니다. |
| `onValueChange` | `function` | `-` | 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
| `disabled` | `boolean` | `-` | true일 때 사용자가 라디오 아이템과 상호작용하는 것을 방지합니다. |
| `name` | `string` | `-` | 그룹의 이름입니다. 소유하는 폼과 함께 name/value 쌍의 일부로 제출됩니다. |
| `required` | `boolean` | `-` | true일 때 소유하는 폼이 제출되기 전에 사용자가 라디오 아이템을 체크해야 함을 나타냅니다. |
| `orientation` | `horizontal,vertical` | `-` | 컴포넌트의 방향입니다. |
| `dir` | `ltr,rtl` | `-` | 라디오 그룹의 읽기 방향입니다. 생략하면 DirectionProvider에서 전역적으로 상속받거나 LTR(왼쪽에서 오른쪽) 읽기 모드로 가정합니다. |
| `loop` | `boolean` | `true` | true일 때 키보드 탐색이 마지막 아이템에서 첫 번째 아이템으로, 그 반대로도 순환합니다. |
| `size` | `md,lg` | `md` | RadioGroup.Item 간의 간격 및 Control 크기를 조정합니다. |
| `invalid` | `boolean` | `false` | 폼 유효성 검증 실패 등의 상태를 나타냅니다. |
| `visuallyHidden` | `boolean` | `false` | Item의 레이블을 시각적으로 숨기지만 스크린리더에는 읽히도록 합니다. |
### RadioGroup.Label
RadioGroup의 레이블 컴포넌트입니다. 모든 라디오 버튼을 하나로 설명할 수 있는 공통 제목에 해당합니다.
| prop | type | default | description |
| ---------- | -------------- | ------- | ---------------------------------- |
| `render` | `ReactElement` | `label` | 라디오 레이블을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `htmlFor` | `string` | `-` | 레이블이 연결될 Control 요소의 id입니다. |
| `children` | `ReactNode` | `-` | 레이블에 표시할 텍스트나 노드입니다. |
### Radio.Root
Radio의 루트 컴포넌트로, 실제 라디오 버튼 요소를 렌더링합니다. 개별 라디오 선택 옵션을 제공합니다.
| prop | type | default | description |
| ----------- | -------------------- | ----------------- | ---------------------------------------------------------------------- |
| `value` | `string,number,null` | `null` | 라디오 버튼의 값입니다. RadioGroup 내에서 선택된 값을 식별하는 데 사용됩니다. |
| `size` | `"md","lg"` | `"md"` | 라디오 버튼의 크기를 설정합니다. |
| `invalid` | `boolean` | `false` | 라디오 버튼이 유효하지 않은 상태인지 여부를 설정합니다. RadioGroup의 invalid 속성에 의해 상속될 수 있습니다. |
| `disabled` | `boolean` | `false` | 라디오 버튼을 비활성화할지 여부를 설정합니다. |
| `readOnly` | `boolean` | `false` | 라디오 버튼을 읽기 전용으로 설정할지 여부를 결정합니다. |
| `required` | `boolean` | `false` | 라디오 버튼이 필수 선택 항목인지 여부를 설정합니다. |
| `className` | `string` | `null` | 라디오 버튼 요소에 적용할 CSS 클래스명입니다. |
| `render` | `ReactElement` | `button` | 라디오 버튼 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `children` | `React.ReactNode` | `Radio.Indicator` | 라디오 버튼 내부에 렌더링할 자식 요소입니다. 기본적으로 Radio.Indicator가 렌더링됩니다. |
### Radio.IndicatorPrimitive
라디오 버튼의 선택 상태를 시각적으로 표시하는 인디케이터 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------- | ------- | ----------------------------------------- |
| `className` | `string` | `null` | 라디오 인디케이터 요소에 적용할 CSS 클래스명입니다. |
| `render` | `ReactElement` | `div` | 라디오 인디케이터 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
# Select
URL: /docs/components/select
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/select.mdx
Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다.
***
title: 'Select'
site\_name: 'Select - Vapor Core'
description: 'Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다.'
----------------------------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/default-select.tsx",
"codeblock": true
}
```
## Property
***
### Size
Select의 크기는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-size.tsx",
"codeblock": true
}
```
### Positioning
Select 드롭다운이 나타날 위치를 설정할 수 있습니다. 기본값은 'bottom'입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-positioning.tsx",
"codeblock": true
}
```
### Controlled State
Select의 선택 상태를 외부에서 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-controlled.tsx",
"codeblock": true
}
```
### States
Select의 다양한 상태(비활성화, 읽기 전용, 오류)를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-states.tsx",
"codeblock": true
}
```
## Examples
***
### Items Configuration
Select는 배열 형태와 객체 형태의 아이템 데이터를 모두 지원합니다. items prop을 사용하면 자동으로 값이 포맷팅됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-items.tsx",
"codeblock": true
}
```
### Grouping Options
관련된 옵션들을 그룹으로 묶어 구조화할 수 있습니다. Group과 GroupLabel, Separator를 사용하여 명확한 구조를 만들 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-grouping.tsx",
"codeblock": true
}
```
### Custom Value Display
Select.Value에 함수형 children을 제공하여 선택된 값을 커스터마이징할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/select/select-custom-value.tsx",
"codeblock": true
}
```
## Props Table
***
### Select.Root
Select의 루트 컨테이너로, 전체 Select 컴포넌트의 상태와 동작을 관리합니다.
| prop | type | default | description |
| --------------- | -------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------- |
| `items` | `Array<{label: string, value: string}>,Record` | `null` | Select의 옵션 아이템들을 정의합니다. 배열 형태(label, value 속성을 가진 객체) 또는 객체 형태(키-값 쌍)로 제공할 수 있습니다. |
| `placeholder` | `React.ReactNode` | `null` | 값이 선택되지 않았을 때 표시할 플레이스홀더 텍스트입니다. |
| `size` | `'sm','md','lg','xl'` | `'md'` | Select의 크기를 설정합니다. |
| `invalid` | `boolean` | `false` | Select가 유효하지 않은 상태임을 나타냅니다. true일 때 오류 스타일이 적용됩니다. |
| `value` | `unknown` | `null` | Select의 현재 선택된 값입니다. 제어 컴포넌트로 사용할 때 필요합니다. |
| `defaultValue` | `unknown` | `null` | Select의 초기 선택 값입니다. 비제어 컴포넌트로 사용할 때 설정합니다. |
| `onValueChange` | `(value: unknown, event?: Event) => void` | `null` | 값이 변경될 때 호출되는 콜백 함수입니다. |
| `disabled` | `boolean` | `false` | Select를 비활성화 상태로 만듭니다. |
| `readOnly` | `boolean` | `false` | Select를 읽기 전용 상태로 만듭니다. 값을 변경할 수 없지만 포커스는 가능합니다. |
| `open` | `boolean` | `false` | Select 드롭다운의 열림/닫힘 상태를 제어합니다. |
| `defaultOpen` | `boolean` | `false` | Select 드롭다운의 초기 열림 상태를 설정합니다. |
| `onOpenChange` | `(open: boolean, event?: Event) => void` | `null` | 드롭다운 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
### Select.Trigger
Select 드롭다운을 여는 트리거 요소입니다.
| prop | type | default | description |
| -------------- | -------------------- | -------- | ----------------------------------- |
| `render` | `React.ReactElement` | `button` | 트리거 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 트리거 요소에 적용할 CSS 클래스명입니다. |
| `nativeButton` | `boolean` | `true` | 네이티브 button 요소의 동작을 사용할지 여부를 설정합니다. |
### Select.ValuePrimitive
선택된 값을 표시하는 컴포넌트입니다. 함수형 children을 통해 커스텀 값 표시가 가능합니다.
| prop | type | default | description |
| ----------- | ----------------------------------------------------- | ------- | ------------------------------------------------------------------------- |
| `children` | `React.ReactNode,(value: unknown) => React.ReactNode` | `null` | 선택된 값을 표시하는 children입니다. 함수형 children을 사용하면 선택된 값을 받아 커스텀 표시를 구현할 수 있습니다. |
| `render` | `React.ReactElement` | `span` | 값 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 값 요소에 적용할 CSS 클래스명입니다. |
### Select.PlaceholderPrimitive
값이 선택되지 않았을 때 표시되는 플레이스홀더 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | -------------------------------------- |
| `render` | `React.ReactElement` | `span` | 플레이스홀더 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 플레이스홀더 요소에 적용할 CSS 클래스명입니다. |
### Select.TriggerIconPrimitive
트리거 버튼의 드롭다운 아이콘을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------------------------ | ---------------------------------------------------- |
| `children` | `React.ReactNode` | `ChevronDownOutlineIcon` | 트리거 아이콘으로 표시할 요소입니다. 기본값은 ChevronDownOutlineIcon입니다. |
| `render` | `React.ReactElement` | `div` | 트리거 아이콘 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 트리거 아이콘 요소에 적용할 CSS 클래스명입니다. |
### Select.PortalPrimitive
Select 드롭다운을 DOM의 다른 위치에 렌더링하는 포털 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ------------------------------- | --------------- | -------------------- |
| `container` | `HTMLElement,() => HTMLElement` | `document.body` | 포털이 렌더링될 컨테이너 요소입니다. |
### Select.PositionerPrimitive
Select 드롭다운의 위치를 설정하는 컴포넌트입니다.
| prop | type | default | description |
| ---------------------- | ------------------------------- | ---------- | ------------------------------- |
| `side` | `'top','right','bottom','left'` | `'bottom'` | 드롭다운이 나타날 위치를 설정합니다. |
| `align` | `'start','center','end'` | `'start'` | 드롭다운의 정렬 방향을 설정합니다. |
| `sideOffset` | `number` | `4` | 트리거와 드롭다운 사이의 거리를 픽셀 단위로 설정합니다. |
| `alignOffset` | `number` | `0` | 정렬 축에서의 오프셋을 픽셀 단위로 설정합니다. |
| `alignItemWithTrigger` | `boolean` | `false` | 선택된 아이템을 트리거와 정렬할지 여부를 설정합니다. |
| `className` | `string` | `null` | 포지셔너 요소에 적용할 CSS 클래스명입니다. |
### Select.PopupPrimitive
Select의 실제 드롭다운 팝업 영역입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 팝업 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 팝업 요소에 적용할 CSS 클래스명입니다. |
### Select.Popup
Select의 드롭다운 콘텐츠를 담는 컨테이너입니다. Portal과 Positioner를 조합하여 구성됩니다.
| prop | type | default | description |
| ----------------- | ----------------------- | ------- | ----------------------------------- |
| `portalProps` | `SelectPortalProps` | `null` | Portal 컴포넌트에 전달할 props입니다. |
| `positionerProps` | `SelectPositionerProps` | `null` | Positioner 컴포넌트에 전달할 props입니다. |
| `render` | `React.ReactElement` | `div` | 콘텐츠 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 콘텐츠 요소에 적용할 CSS 클래스명입니다. |
### Select.Item
개별 선택 옵션을 나타내는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ----------------------------------- |
| `value` | `unknown` | `null` | 아이템의 값입니다. |
| `render` | `React.ReactElement` | `div` | 아이템 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 아이템 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 아이템 내부에 렌더링할 콘텐츠입니다. |
### Select.ItemIndicatorPrimitive
선택된 아이템에 표시되는 인디케이터 아이콘 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | -------------------- | ------------------------------------------------------ |
| `children` | `React.ReactNode` | `ConfirmOutlineIcon` | 선택된 아이템에 표시할 인디케이터 아이콘입니다. 기본값은 ConfirmOutlineIcon입니다. |
| `render` | `React.ReactElement` | `span` | 인디케이터 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 인디케이터 요소에 적용할 CSS 클래스명입니다. |
### Select.Group
관련된 아이템들을 그룹화하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 그룹 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 그룹 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 그룹 내부에 렌더링할 콘텐츠입니다. |
### Select.GroupLabel
그룹의 라벨을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ------------------------------------- |
| `render` | `React.ReactElement` | `div` | 그룹 라벨 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 그룹 라벨 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 그룹 라벨에 표시할 텍스트 또는 요소입니다. |
### Select.Separator
그룹 간의 구분선을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ----------------------------------- |
| `render` | `React.ReactElement` | `div` | 구분선 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 구분선 요소에 적용할 CSS 클래스명입니다. |
# Sheet
URL: /docs/components/sheet
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/sheet.mdx
Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.
***
title: 'Sheet'
site\_name: 'Sheet - Vapor Core'
description: 'Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.'
---------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/sheet/default-sheet.tsx",
"codeblock": true
}
```
## Property
***
### Side
Sheet가 나타날 위치를 설정할 수 있습니다. 기본값은 'right'입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/sheet/sheet-side.tsx",
"codeblock": true
}
```
### Controlled State
Sheet의 열림/닫힘 상태를 외부에서 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/sheet/sheet-controlled.tsx",
"codeblock": true
}
```
### Keep Mounted
Sheet가 닫혀도 DOM에서 제거되지 않고 유지되도록 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/sheet/sheet-keep-mounted.tsx",
"codeblock": true
}
```
## Examples
***
### Custom Usage
유연한 Sheet 사용 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/sheet/flexible.tsx",
"codeblock": true
}
```
## Props Table
***
### Sheet.Root
Sheet의 루트 컨테이너로, 전체 Sheet 컴포넌트의 상태와 동작을 관리합니다.
| prop | type | default | description |
| -------------- | ------------------------- | ------- | --------------------------------------- |
| `open` | `boolean` | `null` | Sheet의 열림 상태를 제어합니다. 제어된 상태에서 사용됩니다. |
| `defaultOpen` | `boolean` | `false` | Sheet의 초기 열림 상태입니다. 제어되지 않은 상태에서 사용됩니다. |
| `onOpenChange` | `(open: boolean) => void` | `null` | Sheet의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
| `children` | `React.ReactNode` | `null` | Sheet 내부에 렌더링할 자식 요소들입니다. |
### Sheet.Trigger
Sheet를 여는 트리거 요소입니다.
| prop | type | default | description |
| ----------- | -------------------- | -------- | ----------------------------------- |
| `render` | `React.ReactElement` | `button` | 트리거 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 트리거 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 트리거 버튼 내부에 표시할 내용입니다. |
### Sheet.Popup
Sheet의 실제 콘텐츠를 담는 컨테이너입니다. Portal, Overlay, Positioner를 조합하여 구성됩니다.
| prop | type | default | description |
| ------------------- | -------------------- | ------- | ------------------------------------------------------------- |
| `portalElement` | `React.ReactElement` | `{}` | Portal 컴포넌트에 전달할 ReactElement입니다. keepMounted 옵션을 포함할 수 있습니다. |
| `overlayElement` | `React.ReactElement` | `{}` | Overlay 컴포넌트에 전달할 ReactElement입니다. |
| `positionerElement` | `React.ReactElement` | `{}` | Positioner 컴포넌트에 전달할 ReactElement입니다. side 옵션을 포함할 수 있습니다. |
| `className` | `string` | `null` | Sheet 콘텐츠 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | Sheet 내부에 렌더링할 콘텐츠입니다. |
### Sheet.PortalPrimitive
Sheet를 DOM의 다른 위치에 렌더링하는 포털 컴포넌트입니다.
| prop | type | default | description |
| ------------- | ------------------------------- | --------------- | ------------------------------------- |
| `keepMounted` | `boolean` | `false` | Sheet이 닫혀도 DOM에서 제거되지 않고 유지되도록 설정합니다. |
| `container` | `HTMLElement,() => HTMLElement` | `document.body` | Portal이 렌더링될 컨테이너 요소를 지정합니다. |
### Sheet.OverlayPrimitive
Sheet 뒤의 배경 오버레이를 담당합니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ------------------------------------ |
| `render` | `React.ReactElement` | `div` | 오버레이 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 오버레이 요소에 적용할 CSS 클래스명입니다. |
### Sheet.PopupPrimitive
Sheet의 실제 팝업 콘텐츠 영역입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 팝업 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 팝업 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 팝업 내부에 렌더링할 콘텐츠입니다. |
### Sheet.PositionerPrimitive
Sheet의 위치를 설정하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ------------------------------- | --------- | ------------------------------------ |
| `side` | `"top","right","bottom","left"` | `"right"` | Sheet가 나타날 화면의 위치를 설정합니다. |
| `render` | `React.ReactElement` | `div` | 포지셔너 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 포지셔너 요소에 적용할 CSS 클래스명입니다. |
### Sheet.Header
Sheet의 헤더 영역을 담당합니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ------------------------------------------------ |
| `render` | `React.ReactElement` | `div` | 헤더 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 헤더 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 헤더 내부에 렌더링할 내용입니다. 일반적으로 Title과 Close 버튼을 포함합니다. |
### Sheet.Body
Sheet의 본문 영역을 담당합니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `div` | 본문 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 본문 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 본문 내부에 렌더링할 주요 콘텐츠입니다. |
### Sheet.Footer
Sheet의 푸터 영역을 담당합니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | --------------------------------------- |
| `render` | `React.ReactElement` | `div` | 푸터 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 푸터 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 푸터 내부에 렌더링할 내용입니다. 일반적으로 액션 버튼들을 포함합니다. |
### Sheet.Title
Sheet의 제목을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `h2` | 제목 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 제목 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | Sheet의 제목 텍스트입니다. |
### Sheet.Description
Sheet의 설명을 표시하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | ------- | ---------------------------------- |
| `render` | `React.ReactElement` | `p` | 설명 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 설명 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | Sheet의 설명 텍스트입니다. |
### Sheet.Close
Sheet를 닫는 버튼 컴포넌트입니다.
| prop | type | default | description |
| ----------- | -------------------- | -------- | ------------------------------------- |
| `render` | `React.ReactElement` | `button` | 닫기 버튼 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 닫기 버튼 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 닫기 버튼 내부에 표시할 내용입니다. |
# Switch
URL: /docs/components/switch
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/switch.mdx
Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다.
***
title: 'Switch'
site\_name: 'Switch - Vapor Core'
description: 'Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다.'
---------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/default-switch.tsx",
"codeblock": true
}
```
## Property
***
### Size
Switch 크기는 sm, md, lg 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/switch-size.tsx",
"codeblock": true
}
```
### Checked
기능이 활성화된 상태를 의미합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/switch-checked.tsx",
"codeblock": true
}
```
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/switch-disabled.tsx",
"codeblock": true
}
```
### Read Only
사용자는 스위치 상태를 변경할 수 없지만, 현재 상태를 확인할 수 있도록 허용하는 상태입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/switch-readonly.tsx",
"codeblock": true
}
```
## Examples
***
### Controlled
제어되는 Switch 컴포넌트의 사용 예시입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/switch/switch-controlled.tsx",
"codeblock": true
}
```
## Props Table
***
### Switch.Root
Switch의 컴포넌트의 상태와 설정을 제공합니다.
| prop | type | default | description |
| ----------------- | -------------- | -------- | ------------------------------------------------------- |
| `render` | `ReactElement` | `button` | 스위치를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `defaultChecked` | `boolean` | `-` | 초기 렌더링 시 체크되어야 하는지 여부입니다. 스위치의 상태를 제어할 필요가 없을 때 사용합니다. |
| `checked` | `boolean` | `-` | 체크된 상태의 제어된 상태입니다. onCheckedChange와 함께 사용해야 합니다. |
| `onCheckedChange` | `function` | `-` | 스위치의 체크된 상태가 변경될 때 호출되는 이벤트 핸들러입니다. |
| `disabled` | `boolean` | `-` | true일 때 사용자가 스위치와 상호작용하는 것을 방지합니다. |
| `required` | `boolean` | `-` | true일 때 소유하는 폼이 제출되기 전에 사용자가 스위치를 체크해야 함을 나타냅니다. |
| `name` | `string` | `-` | 스위치의 이름입니다. 소유하는 폼과 함께 name/value 쌍의 일부로 제출됩니다. |
| `value` | `string` | `on` | 체크될 때 name과 함께 제출될 값입니다. |
| `size` | `sm,md,lg` | `md` | 스위치의 크기를 설정합니다. |
| `readOnly` | `boolean` | `false` | true일 때 스위치가 읽기 전용 상태가 되어 사용자 상호작용을 방지하지만 폼 제출에는 포함됩니다. |
# Tabs
URL: /docs/components/tabs
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/tabs.mdx
Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다.
***
title: 'Tabs'
site\_name: 'Tabs - Vapor Core'
description: 'Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다.'
---------------------------------------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/default-tabs.tsx",
"codeblock": true
}
```
## Property
***
### Size
Tabs의 크기는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-size.tsx",
"codeblock": true
}
```
### Variant
Tabs는 line과 plain 두 가지 스타일 변형을 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-variant.tsx",
"codeblock": true
}
```
### Orientation
Tabs는 수평(horizontal)과 수직(vertical) 배치를 지원합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-orientation.tsx",
"codeblock": true
}
```
### Controlled State
Tabs의 활성 상태를 외부에서 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-controlled.tsx",
"codeblock": true
}
```
### States
Tabs의 다양한 상태(개별 탭 비활성화, 전체 탭 그룹 비활성화)를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-states.tsx",
"codeblock": true
}
```
## Examples
***
### Keyboard Navigation
Tabs는 완전한 키보드 내비게이션을 지원합니다. 포커스 동작과 순환 내비게이션을 세밀하게 제어할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tabs/tabs-keyboard.tsx",
"codeblock": true
}
```
## Props Table
***
### Tabs.Root
Tabs의 루트 컨테이너로, 전체 Tabs 컴포넌트의 상태와 동작을 관리합니다.
| prop | type | default | description |
| ----------------- | ------------------------- | -------------- | ------------------------------------------------------------------------- |
| `variant` | `'line','plain'` | `'line'` | Tabs의 시각적 스타일을 설정합니다. 'line'은 하단에 보더가 있는 스타일, 'plain'은 심플한 스타일입니다. |
| `size` | `'sm','md','lg','xl'` | `'md'` | Tabs의 크기를 설정합니다. |
| `orientation` | `'horizontal','vertical'` | `'horizontal'` | 탭의 배치 방향을 설정합니다. horizontal은 가로, vertical은 세로 배치입니다. |
| `disabled` | `boolean` | `false` | 모든 탭을 비활성화 상태로 만듭니다. |
| `activateOnFocus` | `boolean` | `true` | 키보드로 포커스를 이동할 때 바로 탭을 활성화할지 여부를 설정합니다. false일 때는 Enter나 Space로 활성화해야 합니다. |
| `loop` | `boolean` | `true` | 키보드 내비게이션에서 끝에 도달했을 때 처음으로 순환할지 여부를 설정합니다. |
| `value` | `string` | `null` | 현재 활성화된 탭의 값입니다. 제어 컴포넌트로 사용할 때 필요합니다. |
| `defaultValue` | `string` | `null` | 초기에 활성화할 탭의 값입니다. 비제어 컴포넌트로 사용할 때 설정합니다. |
| `onValueChange` | `(value: string) => void` | `null` | 활성 탭이 변경될 때 호출되는 콜백 함수입니다. |
| `className` | `string` | `null` | 루트 요소에 적용할 CSS 클래스명입니다. |
### Tabs.List
탭 트리거들을 담는 컨테이너입니다. 탭의 배치와 스타일을 관리합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------------------------- |
| `className` | `string` | `null` | 탭 리스트 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 탭 리스트 내부에 렌더링할 Trigger와 Indicator 컴포넌트들입니다. |
### Tabs.Trigger
개별 탭을 나타내는 버튼 컴포넌트입니다. 클릭하거나 키보드로 활성화할 수 있습니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------------------- |
| `value` | `string` | `null` | 탭 트리거의 고유 값입니다. 이 값으로 탭을 식별하고 활성화합니다. |
| `disabled` | `boolean` | `false` | 개별 탭 트리거를 비활성화 상태로 만듭니다. |
| `className` | `string` | `null` | 탭 트리거 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 탭 트리거에 표시할 텍스트나 요소입니다. |
### Tabs.Indicator
현재 활성화된 탭을 시각적으로 표시하는 인디케이터입니다. 탭 전환 시 부드럽게 이동합니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | ------------------------------------------------------------- |
| `className` | `string` | `null` | 탭 인디케이터 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 인디케이터 내부에 렌더링할 커스텀 요소입니다. 기본적으로는 활성 탭을 표시하는 시각적 인디케이터가 표시됩니다. |
### Tabs.Panel
각 탭에 연결된 콘텐츠 패널입니다. 해당 탭이 활성화되었을 때만 표시됩니다.
| prop | type | default | description |
| ----------- | ----------------- | ------- | -------------------------------------------- |
| `value` | `string` | `null` | 패널에 연결된 탭의 값입니다. 해당 탭이 활성화되었을 때 이 패널이 표시됩니다. |
| `className` | `string` | `null` | 탭 패널 요소에 적용할 CSS 클래스명입니다. |
| `children` | `React.ReactNode` | `null` | 탭 패널에 표시할 콘텐츠입니다. |
# TextInput
URL: /docs/components/text-input
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/text-input.mdx
TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다.
***
title: 'TextInput'
site\_name: 'TextInput - Vapor Core'
description: 'TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다.'
-----------------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/default-text-input.tsx",
"codeblock": true
}
```
## Property
***
### Size
TextInput 크기는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-size.tsx",
"codeblock": true
}
```
### Type
TextInput 타입은 text, email, password, url, tel, search 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-type.tsx",
"codeblock": true
}
```
### Disabled
사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-disabled.tsx",
"codeblock": true
}
```
### Invalid
유효하지 않은 상태(필수 항목 누락, 잘못된 입력 등)임을 나타냅니다. 사용자에게 시각적 피드백을 제공하여 올바른 입력을 유도할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-invalid.tsx",
"codeblock": true
}
```
### Read Only
사용자는 값을 수정할 수 없지만, 텍스트를 복사하거나 읽을 수 있도록 허용하는 상태입니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-readonly.tsx",
"codeblock": true
}
```
## Examples
***
### States
TextInput의 다양한 상태를 보여줍니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text-input/text-input-states.tsx",
"codeblock": true
}
```
## Props Table
***
TextInput은 Base UI의 Input을 래핑한 단일 컴포넌트입니다. 다양한 텍스트 입력 타입을 지원하며, 제어형/비제어형 모두 사용할 수 있습니다. 이 컴포넌트는 `input` 요소를 기반으로 합니다.
| prop | type | default | description |
| --------------- | ------------------------------------ | ----------- | ----------------------------------------------------------------------- |
| `render` | `ReactElement,function` | `input` | 텍스트 입력을 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `type` | `text,email,password,url,tel,search` | `text` | 입력 필드의 HTML 타입을 지정합니다. |
| `value` | `string` | `undefined` | 제어형 컴포넌트로 사용할 때 입력 값입니다. |
| `defaultValue` | `string` | `''` | 비제어형 컴포넌트 초기 입력 값입니다. |
| `onValueChange` | `function` | `undefined` | 입력 값이 변경될 때 호출되는 콜백 함수입니다. (value: string, event: Event) => void 형태입니다. |
| `placeholder` | `string` | `undefined` | 입력 필드가 비어 있을 때 표시되는 안내 텍스트입니다. |
| `size` | `sm,md,lg,xl` | `md` | 입력 필드의 크기를 설정합니다. |
| `disabled` | `boolean` | `false` | 입력 필드를 비활성화합니다. |
| `invalid` | `boolean` | `false` | 검증 오류 상태임을 나타냅니다. |
| `readOnly` | `boolean` | `false` | 읽기 전용으로 설정하여 값 변경을 방지합니다. |
| `required` | `boolean` | `false` | 필수 입력 필드임을 나타냅니다. |
| `autoComplete` | `string` | `undefined` | 브라우저의 자동 완성 기능을 제어합니다. |
| `autoFocus` | `boolean` | `false` | 페이지 로드 시 자동으로 포커스를 받을지 설정합니다. |
| `maxLength` | `number` | `undefined` | 입력 가능한 최대 문자 수를 제한합니다. |
| `minLength` | `number` | `undefined` | 입력 가능한 최소 문자 수를 제한합니다. |
| `name` | `string` | `undefined` | 폼 제출 시 사용될 필드 이름입니다. |
| `id` | `string` | `undefined` | 입력 필드의 고유 식별자입니다. |
| `className` | `string` | `undefined` | 추가적인 CSS 클래스를 적용합니다. |
| `onChange` | `function` | `undefined` | 입력 값 변경 시 호출되는 네이티브 이벤트 핸들러입니다. |
| `onBlur` | `function` | `undefined` | 포커스를 잃었을 때 호출되는 이벤트 핸들러입니다. |
| `onFocus` | `function` | `undefined` | 포커스를 받았을 때 호출되는 이벤트 핸들러입니다. |
# Text
URL: /docs/components/text
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/text.mdx
Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다.
***
title: 'Text'
site\_name: 'Text - Vapor Core'
description: 'Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다.'
--------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/text/default-text.tsx",
"codeblock": true
}
```
## Property
***
### Typography
Typography prop을 사용하여 텍스트의 시각적 스타일을 지정할 수 있습니다. Display, Heading, Subtitle, Body, Code 등 다양한 텍스트 스타일이 제공됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text/text-typography.tsx",
"codeblock": true
}
```
### Foreground
Foreground prop을 사용하여 텍스트의 색상을 지정할 수 있습니다. 브랜드 색상, 상태 색상, 중성 색상 등 다양한 색상 토큰이 제공됩니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/text/text-foreground.tsx",
"codeblock": true
}
```
## Props Table
***
이 컴포넌트는 `span` 요소를 기반으로, 표준 HTML 속성(`className`, `style` 등)을 지원합니다.
| prop | type | default | description |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------ |
| `typography` | `display1,display2,display3,display4,heading1,heading2,heading3,heading4,heading5,heading6,subtitle1,subtitle2,body1,body2,body3,body4,code1,code2,undefined` | `body1` | 적용할 타이포그래피 스타일 토큰입니다. |
| `foreground` | `primary,primary-200,secondary,secondary-200,success,success-200,warning,warning-200,danger,danger-200,hint,hint-200,contrast,contrast-200,normal,normal-100,accent,accent-200,undefined` | `normal` | 텍스트 색상을 지정하는 전경색 토큰입니다. |
| `render` | `ReactElement` | `span` | 텍스트를 렌더링할 때 사용할 커스텀 렌더링 요소입니다. |
| `children` | `React.ReactNode` | `null` | 텍스트 내용입니다. |
# Textarea
URL: /docs/components/textarea
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/textarea.mdx
Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다.
***
title: 'Textarea'
site\_name: 'Textarea - Vapor Core'
description: 'Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다.'
-----------------------------------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/textarea/default-textarea.tsx",
"codeblock": true
}
```
## Property
***
### Size
Textarea 크기는 sm, md, lg, xl 로 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/textarea/textarea-size.tsx",
"codeblock": true
}
```
### Auto Resize
텍스트 내용에 따라 자동으로 높이가 조절되는 기능을 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/textarea/textarea-auto-resize.tsx",
"codeblock": true
}
```
### States
Textarea의 다양한 상태를 보여줍니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/textarea/textarea-states.tsx",
"codeblock": true
}
```
## Examples
***
### maxLength
Textarea에 `maxLength` 속성을 추가하여 입력 가능한 최대 문자 수를 제한하는 기능을 제공합니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/textarea/textarea-character-count.tsx",
"codeblock": true
}
```
## Props Table
***
### Textarea
간단한 단일 컴포넌트로 사용할 수 있는 Textarea입니다.
| prop | type | default | description |
| --------------- | ----------------------- | ------- | ----------------------------------------------------------------------------------------- |
| `render` | `ReactElement,function` | `-` | 다른 태그로 컴포넌트의 HTML 요소를 교체하거나 다른 컴포넌트와 합성할 수 있습니다. ReactElement 또는 렌더링할 요소를 반환하는 함수를 허용합니다. |
| `value` | `string` | `-` | 텍스트 영역의 제어된 값입니다. onValueChange와 함께 사용해야 합니다. |
| `defaultValue` | `string` | `-` | 텍스트 영역이 처음 렌더링될 때의 값입니다. 값을 제어할 필요가 없을 때 사용합니다. |
| `onValueChange` | `function` | `-` | 텍스트 영역의 값이 변경될 때 호출되는 이벤트 핸들러입니다. |
| `disabled` | `boolean` | `false` | true일 때 사용자가 텍스트 영역과 상호작용하는 것을 방지합니다. |
| `readOnly` | `boolean` | `false` | true일 때 사용자가 값을 수정할 수 없지만 텍스트를 선택하고 복사할 수 있습니다. |
| `invalid` | `boolean` | `false` | 폼 유효성 검증 실패 등의 상태를 나타냅니다. |
| `placeholder` | `string` | `-` | 텍스트 영역이 비어있을 때 표시되는 힌트 텍스트입니다. |
| `rows` | `number` | `-` | 텍스트 영역의 표시할 행 수를 지정합니다. |
| `cols` | `number` | `-` | 텍스트 영역의 표시할 열 수를 지정합니다. |
| `size` | `sm,md,lg,xl` | `md` | 텍스트 영역의 크기를 설정합니다. |
| `autoResize` | `boolean` | `false` | 텍스트 내용에 따라 자동으로 높이가 조절되는지 설정합니다. |
| `maxLength` | `number` | `-` | 입력 가능한 최대 문자 수를 제한합니다. |
| `required` | `boolean` | `false` | 폼 필드가 필수인지 설정합니다. |
# Tooltip
URL: /docs/components/tooltip
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/tooltip.mdx
요소에 대한 추가 정보를 제공하는 툴팁 컴포넌트입니다
***
title: 'Tooltip'
site\_name: 'Tooltip - Vapor Core'
description: '요소에 대한 추가 정보를 제공하는 툴팁 컴포넌트입니다'
--------------------------------------------
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/default-tooltip.tsx",
"codeblock": true
}
```
## Property
***
### Positioning
Tooltip의 표시 위치를 설정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/tooltip-positioning.tsx",
"codeblock": true
}
```
### Alignment
Tooltip의 정렬 위치를 조정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/tooltip-alignment.tsx",
"codeblock": true
}
```
### Delay
Tooltip이 표시되는 지연 시간을 조정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/tooltip-delay.tsx",
"codeblock": true
}
```
### Offset
Tooltip의 거리와 정렬 오프셋을 조정할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/tooltip-offset.tsx",
"codeblock": true
}
```
## Examples
***
### Content Variations
다양한 형태의 툴팁 내용을 표시할 수 있습니다.
```json doc-gen:file
{
"file": "./src/components/demo/examples/tooltip/tooltip-content.tsx",
"codeblock": true
}
```
## Props Table
***
### Tooltip.Root
Tooltip의 루트 컨테이너 컴포넌트입니다. 위치 관련 props와 Base UI Tooltip.Root의 모든 props를 지원합니다.
| prop | type | default | description |
| -------------------- | ------------------------------- | ------------------- | ------------------------------- |
| `openOnClick` | `boolean` | `false` | 클릭 시 툴팁을 열지 여부를 설정합니다. |
| `openOnHover` | `boolean` | `true` | 호버 시 툴팁을 열지 여부를 설정합니다. |
| `openOnFocus` | `boolean` | `true` | 포커스 시 툴팁을 열지 여부를 설정합니다. |
| `delay` | `number` | `0` | 툴팁이 열리기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `closeDelay` | `number` | `0` | 툴팁이 닫히기 전 지연 시간을 밀리초 단위로 설정합니다. |
| `open` | `boolean` | `-` | 툴팁의 열림 상태를 제어합니다 (제어 모드). |
| `defaultOpen` | `boolean` | `false` | 툴팁의 초기 열림 상태를 설정합니다. |
| `onOpenChange` | `function` | `-` | 툴팁의 열림 상태가 변경될 때 호출되는 콜백 함수입니다. |
| `disabled` | `boolean` | `false` | 툴팁을 비활성화할지 여부를 설정합니다. |
| `side` | `top,right,bottom,left` | `top` | 툴팁이 표시될 위치를 설정합니다. |
| `align` | `start,center,end` | `center` | 툴팁의 정렬을 설정합니다. |
| `sideOffset` | `number` | `6` | 트리거와 툴팁 사이의 거리를 설정합니다. |
| `alignOffset` | `number` | `0` | 정렬 축에서의 오프셋을 설정합니다. |
| `anchor` | `Element,VirtualElement,null` | `null` | 툴팁의 위치를 계산할 기준 앵커 요소를 설정합니다. |
| `arrowPadding` | `number` | `4` | 화살표와 콘텐츠 사이의 패딩을 설정합니다. |
| `collisionAvoidance` | `boolean,object` | `{ align: 'none' }` | 충돌 회피 동작을 설정합니다. |
| `collisionBoundary` | `Element,Array,string` | `clippingAncestors` | 충돌 감지를 위한 경계 요소를 설정합니다. |
| `collisionPadding` | `number,object` | `0` | 충돌 경계와의 패딩을 설정합니다. |
| `positionMethod` | `absolute,fixed` | `absolute` | 툴팁의 CSS 위치 지정 방법을 설정합니다. |
| `sticky` | `partial,always` | `partial` | 앵커 요소에 대한 툴팁의 고정 동작을 설정합니다. |
| `trackAnchor` | `boolean` | `true` | 앵커 요소의 움직임을 추적할지 여부를 설정합니다. |
### Tooltip.Trigger
Tooltip을 트리거하는 컴포넌트입니다.
| prop | type | default | description |
| -------- | ----------------------- | ------- | -------------------------- |
| `render` | `ReactElement,function` | `-` | 커스텀 렌더링을 위한 요소나 함수를 설정합니다. |
### Tooltip.Portal
Tooltip 콘텐츠를 DOM 트리의 다른 위치로 렌더링하는 컴포넌트입니다.
| prop | type | default | description |
| ------------- | ------------------ | --------------- | -------------------------------------- |
| `container` | `Element,function` | `document.body` | 포털이 렌더링될 컨테이너 요소를 설정합니다. |
| `keepMounted` | `boolean` | `false` | 닫힌 상태에서도 DOM에 마운트된 상태를 유지할지 여부를 설정합니다. |
### Tooltip.PositionerPrimitive
Tooltip의 위치를 설정하는 컴포넌트입니다.
| prop | type | default | description |
| ----------- | ------------------------------- | --------- | ------------------------------------ |
| `side` | `"top","right","bottom","left"` | `"right"` | Tooltip이 나타날 화면의 위치를 설정합니다. |
| `render` | `React.ReactElement` | `div` | 포지셔너 요소를 렌더링할 때 사용할 커스텀 렌더링 prop입니다. |
| `className` | `string` | `null` | 포지셔너 요소에 적용할 CSS 클래스명입니다. |
### Tooltip.Popup
Tooltip의 실제 콘텐츠를 포함하는 컴포넌트입니다. 내장된 Portal, Positioner, Popup, Arrow를 포함하며, 자동으로 화살표가 포함되어 위치에 따라 화살표 방향이 조정됩니다.
| prop | type | default | description |
| ------------------- | --------------- | ------- | ------------------------------- |
| `className` | `string` | `-` | 콘텐츠에 적용할 추가 CSS 클래스입니다. |
| `children` | `ReactNode` | `-` | 툴팁 내부에 표시될 콘텐츠입니다. |
| `style` | `CSSProperties` | `-` | 콘텐츠에 적용할 인라인 스타일입니다. |
| `onPointerEnter` | `function` | `-` | 포인터가 콘텐츠 영역에 진입할 때 호출되는 함수입니다. |
| `onPointerLeave` | `function` | `-` | 포인터가 콘텐츠 영역에서 벗어날 때 호출되는 함수입니다. |
| `onEscapeKeyDown` | `function` | `-` | ESC 키를 눌렀을 때 호출되는 함수입니다. |
| `onInteractOutside` | `function` | `-` | 툴팁 외부에서 상호작용할 때 호출되는 함수입니다. |
# Next.js - App Router
URL: /docs/frameworks/next-js-app
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/frameworks/next-js-app.mdx
Vapor UI 컴포넌트를 Nextjs app router와 사용하는 방법
***
title: 'Next.js - App Router'
description: 'Vapor UI 컴포넌트를 Nextjs app router와 사용하는 방법'
--------------------------------------------------------
## Next.js - App Router
Next.js 13의 app/ 디렉토리는 기본적으로 서버 컴포넌트를 사용합니다. Vapor UI 컴포넌트는 빌드 시점에 `use client`를 추가하므로 서버 컴포넌트에서 사용할 수 있습니다.
### 프로젝트 생성
먼저, Next.js 프로젝트를 생성합니다. 설치 과정에서 **App Router** 사용을 선택해 주세요.
```bash
npx create-next-app@latest
```
### 라이브러리 설치
프로젝트 디렉토리로 이동하여 VaporUI를 설치합니다.
```bash
cd your-project-name
```
```package-install
npm install @vapor-ui/core @vapor-ui/icons
```
### `next.config.ts` 설정
프로젝트의 루트 디렉토리에 있는 `next.config.ts` 파일을 열고, [`optimizePackageImports`](https://nextjs.org/docs/app/api-reference/config/next-config-js/optimizePackageImports) 옵션을 추가합니다. 이 설정은 `@vapor-ui/core` 라이브러리에서 사용하는 부분만 빌드에 포함시켜 **최종 번들 사이즈를 줄여줍니다.**
```typescript title="next.config.ts"
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
// Vapor UI 번들 최적화 설정
experimental: {
optimizePackageImports: ['@vapor-ui/core', '@vapor-ui/icons'],
},
};
export default nextConfig;
```
### 컴포넌트 사용 예시
이제 페이지에서 Vapor UI 컴포넌트와 테마 전환 기능을 사용할 수 있습니다.
```tsx title="src/app/page.tsx"
import { Card, Text } from '@vapor-ui/core';
export default function HomePage() {
return (
Welcome to Vapor UI!
이것은 Next.js App Router와 함께 Vapor UI 컴포넌트를 사용하는
예시입니다.
);
}
```
# Next.js - Pages Router
URL: /docs/frameworks/next-js-pages
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/frameworks/next-js-pages.mdx
Vapor UI 컴포넌트를 Nextjs Pages Router와 사용하는 방법
***
title: 'Next.js - Pages Router'
description: 'Vapor UI 컴포넌트를 Nextjs Pages Router와 사용하는 방법'
----------------------------------------------------------
## Next.js - Pages Router
Next.js Pages Router는 전통적인 파일 시스템 기반 라우팅을 사용합니다. Vapor UI 컴포넌트는 Pages Router 환경에서도 완벽하게 작동합니다.
### 프로젝트 생성
먼저, Next.js 프로젝트를 생성합니다. Pages Router를 사용하도록 설정해주세요.
```bash
npx create-next-app@latest
```
### 라이브러리 설치
프로젝트 디렉토리로 이동하여 Vapor UI를 설치합니다.
```bash
cd your-project-name
```
```package-install
npm install @vapor-ui/core @vapor-ui/icons
```
### `next.config.ts` 설정
Pages Router에서는 `transpilePackages` 옵션을 사용하여 라이브러리를 트랜스파일합니다.
```typescript title="next.config.ts"
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
reactStrictMode: true,
transpilePackages: ['@vapor-ui/core', '@vapor-ui/icons'],
};
export default nextConfig;
```
### 컴포넌트 사용 예시
이제 페이지에서 Vapor UI 컴포넌트와 테마 전환 기능을 사용할 수 있습니다.
```tsx title="pages/index.tsx"
import { Card, Text } from '@vapor-ui/core';
export default function HomePage() {
return (
Welcome to Vapor UI!
이것은 Next.js Pages Router와 함께 Vapor UI 컴포넌트를 사용하는
예시입니다.
);
}
```
# React Router
URL: /docs/frameworks/react-router
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/frameworks/react-router.mdx
Vapor UI 컴포넌트를 React Router와 함께 사용하는 방법
***
title: 'React Router'
description: 'Vapor UI 컴포넌트를 React Router와 함께 사용하는 방법'
------------------------------------------------------
## React Router
React Router는 React 애플리케이션에서 선언적 라우팅을 위한 표준 라이브러리입니다. SPA(Single Page Application)를 구축할 때 필수적인 도구입니다.
### 프로젝트 생성
Vite를 사용하여 React 프로젝트를 생성하고 React Router를 설치합니다.
```bash
# 프로젝트 생성
npx create-react-router@latest my-react-router-app
cd my-react-router-app
```
### 라이브러리 설치
Vapor UI 패키지를 설치합니다.
```package-install
npm install @vapor-ui/core @vapor-ui/icons
```
### Vite 설정
Vite 설정 파일에서 Vapor UI 패키지가 SSR에서 올바르게 작동하도록 구성합니다.
```typescript title="vite.config.ts"
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [react()],
ssr: {
noExternal: ['@vapor-ui/core', '@vapor-ui/icons'],
},
});
```
### 컴포넌트 사용 예시
```tsx title="pages/index.tsx"
import { Card, Text } from '@vapor-ui/core';
export default function HomePage() {
return (
Welcome to Vapor UI!
이것은 React Router와 함께 Vapor UI 컴포넌트를 사용하는 예시입니다.
);
}
```
# Vite
URL: /docs/frameworks/vite-react
Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/frameworks/vite-react.mdx
Vapor UI 컴포넌트를 Vite와 React에서 사용하는 방법
***
title: 'Vite'
description: 'Vapor UI 컴포넌트를 Vite와 React에서 사용하는 방법'
---------------------------------------------------
## Vite + React
Vite는 빠른 개발 서버와 최적화된 빌드를 제공하는 모던 프론트엔드 빌드 도구입니다. React와 함께 사용하면 뛰어난 개발자 경험을 제공합니다.
### 프로젝트 생성
Vite React 프로젝트를 생성하고 기본 의존성을 설치합니다.
```bash
# Vite React 프로젝트 생성 (TypeScript 템플릿)
npm create vite@latest
# 프로젝트 폴더로 이동
cd my-vapor-vite-app
# 기본 의존성 설치
npm install
```
### 라이브러리 설치
Vapor UI 패키지를 설치합니다.
```package-install
npm install @vapor-ui/core @vapor-ui/icons
```
### Vite 설정
Vite 설정을 구성합니다.
```typescript title="vite.config.ts"
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
});
```
### 컴포넌트 사용 예시
```tsx title="src/App.tsx"
import { Card, Text } from '@vapor-ui/core';
export default function HomePage() {
return (