# 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는 구름의 세 번째 디자인 시스템으로, 다양한 서브 패키지들로 구성되어 있습니다. 각 서브 패키지는 다음과 같은 역할을 수행합니다. ------------------------------------------------------------------------------------------- # Icons URL: /docs/components/icons Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/icons.mdx Vapor UI 아이콘 라이브러리. 아이콘을 클릭하면 import 문이 복사됩니다. *** title: Icons description: Vapor UI 아이콘 라이브러리. 아이콘을 클릭하면 import 문이 복사됩니다. ----------------------------------------------------------- ## 설치 ```package-install @vapor-ui/icons ``` ## 사용법 ```tsx import { CheckCircleIcon, SearchOutlineIcon } from '@vapor-ui/icons'; function Example() { return ( <> ); } ``` ### Props | Prop | Type | Default | Description | | ------- | ----------------- | -------------- | ----------- | | `size` | `string` `number` | `24` | 아이콘 크기 (px) | | `color` | `string` | `currentColor` | 아이콘 색상 | ## 아이콘 스타일 아이콘을 클릭하면 import 문이 자동으로 복사됩니다. ## 아이콘 목록 ## Basic Icons | Icon Name | Import Statement | | --------------------------------------- | ------------------------------------------------------------------------- | | `AchievementIcon` | `import { AchievementIcon } from '@vapor-ui/icons'` | | `AddUserIcon` | `import { AddUserIcon } from '@vapor-ui/icons'` | | `AfghanistanColorIcon` | `import { AfghanistanColorIcon } 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'` | | `AlbaniaColorIcon` | `import { AlbaniaColorIcon } from '@vapor-ui/icons'` | | `AlgeriaColorIcon` | `import { AlgeriaColorIcon } from '@vapor-ui/icons'` | | `AlgorithmIcon` | `import { AlgorithmIcon } from '@vapor-ui/icons'` | | `AndorraColorIcon` | `import { AndorraColorIcon } from '@vapor-ui/icons'` | | `AngolaColorIcon` | `import { AngolaColorIcon } from '@vapor-ui/icons'` | | `AntiguaAndBarbudaColorIcon` | `import { AntiguaAndBarbudaColorIcon } from '@vapor-ui/icons'` | | `AppleIcon` | `import { AppleIcon } from '@vapor-ui/icons'` | | `ArgentinaColorIcon` | `import { ArgentinaColorIcon } from '@vapor-ui/icons'` | | `ArmeniaColorIcon` | `import { ArmeniaColorIcon } from '@vapor-ui/icons'` | | `ArrowDownCircleIcon` | `import { ArrowDownCircleIcon } from '@vapor-ui/icons'` | | `AssignmentIcon` | `import { AssignmentIcon } from '@vapor-ui/icons'` | | `AustraliaColorIcon` | `import { AustraliaColorIcon } from '@vapor-ui/icons'` | | `AustriaColorIcon` | `import { AustriaColorIcon } from '@vapor-ui/icons'` | | `AwsIcon` | `import { AwsIcon } from '@vapor-ui/icons'` | | `AzerbaijanColorIcon` | `import { AzerbaijanColorIcon } from '@vapor-ui/icons'` | | `AzureIcon` | `import { AzureIcon } from '@vapor-ui/icons'` | | `BahamasColorIcon` | `import { BahamasColorIcon } from '@vapor-ui/icons'` | | `BahrainColorIcon` | `import { BahrainColorIcon } from '@vapor-ui/icons'` | | `BangladeshColorIcon` | `import { BangladeshColorIcon } from '@vapor-ui/icons'` | | `BarbadosColorIcon` | `import { BarbadosColorIcon } from '@vapor-ui/icons'` | | `BedIcon` | `import { BedIcon } from '@vapor-ui/icons'` | | `BelarusColorIcon` | `import { BelarusColorIcon } from '@vapor-ui/icons'` | | `BelgiumColorIcon` | `import { BelgiumColorIcon } from '@vapor-ui/icons'` | | `BelizeColorIcon` | `import { BelizeColorIcon } from '@vapor-ui/icons'` | | `BellOffIcon` | `import { BellOffIcon } from '@vapor-ui/icons'` | | `BellOnIcon` | `import { BellOnIcon } from '@vapor-ui/icons'` | | `BeninColorIcon` | `import { BeninColorIcon } from '@vapor-ui/icons'` | | `BhutanColorIcon` | `import { BhutanColorIcon } 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'` | | `BoliviaColorIcon` | `import { BoliviaColorIcon } from '@vapor-ui/icons'` | | `BookIcon` | `import { BookIcon } from '@vapor-ui/icons'` | | `BookmarkIcon` | `import { BookmarkIcon } from '@vapor-ui/icons'` | | `BosniaAndHerzegovinaColorIcon` | `import { BosniaAndHerzegovinaColorIcon } from '@vapor-ui/icons'` | | `BotswanaColorIcon` | `import { BotswanaColorIcon } from '@vapor-ui/icons'` | | `BottomPlayerIcon` | `import { BottomPlayerIcon } from '@vapor-ui/icons'` | | `BranchIcon` | `import { BranchIcon } from '@vapor-ui/icons'` | | `BrazilColorIcon` | `import { BrazilColorIcon } from '@vapor-ui/icons'` | | `BreakpointIcon` | `import { BreakpointIcon } from '@vapor-ui/icons'` | | `BruneiColorIcon` | `import { BruneiColorIcon } from '@vapor-ui/icons'` | | `BuildIcon` | `import { BuildIcon } from '@vapor-ui/icons'` | | `BulgariaColorIcon` | `import { BulgariaColorIcon } from '@vapor-ui/icons'` | | `BurkinaFasoColorIcon` | `import { BurkinaFasoColorIcon } from '@vapor-ui/icons'` | | `BurundiColorIcon` | `import { BurundiColorIcon } 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'` | | `CambodiaColorIcon` | `import { CambodiaColorIcon } from '@vapor-ui/icons'` | | `CameraIcon` | `import { CameraIcon } from '@vapor-ui/icons'` | | `CameroonColorIcon` | `import { CameroonColorIcon } from '@vapor-ui/icons'` | | `CampIcon` | `import { CampIcon } from '@vapor-ui/icons'` | | `CanadaColorIcon` | `import { CanadaColorIcon } from '@vapor-ui/icons'` | | `CapeVerdeColorIcon` | `import { CapeVerdeColorIcon } 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'` | | `CentralAfricanRepublicColorIcon` | `import { CentralAfricanRepublicColorIcon } from '@vapor-ui/icons'` | | `CertificateIcon` | `import { CertificateIcon } from '@vapor-ui/icons'` | | `ChadColorIcon` | `import { ChadColorIcon } 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'` | | `ChileColorIcon` | `import { ChileColorIcon } from '@vapor-ui/icons'` | | `ChinaColorIcon` | `import { ChinaColorIcon } 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'` | | `ColombiaColorIcon` | `import { ColombiaColorIcon } from '@vapor-ui/icons'` | | `ComorosColorIcon` | `import { ComorosColorIcon } 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'` | | `CookIslandsColorIcon` | `import { CookIslandsColorIcon } from '@vapor-ui/icons'` | | `CopyIcon` | `import { CopyIcon } from '@vapor-ui/icons'` | | `CostaRicaColorIcon` | `import { CostaRicaColorIcon } 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'` | | `CroatiaColorIcon` | `import { CroatiaColorIcon } from '@vapor-ui/icons'` | | `CubaColorIcon` | `import { CubaColorIcon } from '@vapor-ui/icons'` | | `CursorshareoffIcon` | `import { CursorshareoffIcon } from '@vapor-ui/icons'` | | `CursorshareonIcon` | `import { CursorshareonIcon } from '@vapor-ui/icons'` | | `CyprusColorIcon` | `import { CyprusColorIcon } from '@vapor-ui/icons'` | | `CzechRepublicColorIcon` | `import { CzechRepublicColorIcon } 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'` | | `DemocraticRepublicOfTheCongoColorIcon` | `import { DemocraticRepublicOfTheCongoColorIcon } from '@vapor-ui/icons'` | | `DenmarkColorIcon` | `import { DenmarkColorIcon } 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'` | | `DjiboutiColorIcon` | `import { DjiboutiColorIcon } 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'` | | `DominicaColorIcon` | `import { DominicaColorIcon } from '@vapor-ui/icons'` | | `DominicanRepublicColorIcon` | `import { DominicanRepublicColorIcon } 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'` | | `EastTimorColorIcon` | `import { EastTimorColorIcon } from '@vapor-ui/icons'` | | `EcuadorColorIcon` | `import { EcuadorColorIcon } from '@vapor-ui/icons'` | | `EditIcon` | `import { EditIcon } from '@vapor-ui/icons'` | | `EgyptColorIcon` | `import { EgyptColorIcon } from '@vapor-ui/icons'` | | `ElSalvadorColorIcon` | `import { ElSalvadorColorIcon } from '@vapor-ui/icons'` | | `EquatorialGuineaColorIcon` | `import { EquatorialGuineaColorIcon } from '@vapor-ui/icons'` | | `EraserIcon` | `import { EraserIcon } from '@vapor-ui/icons'` | | `EritreaColorIcon` | `import { EritreaColorIcon } from '@vapor-ui/icons'` | | `ErrorCircleIcon` | `import { ErrorCircleIcon } from '@vapor-ui/icons'` | | `EstoniaColorIcon` | `import { EstoniaColorIcon } from '@vapor-ui/icons'` | | `EswatiniColorIcon` | `import { EswatiniColorIcon } from '@vapor-ui/icons'` | | `EthiopiaColorIcon` | `import { EthiopiaColorIcon } 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'` | | `FijiColorIcon` | `import { FijiColorIcon } 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'` | | `FinlandColorIcon` | `import { FinlandColorIcon } 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'` | | `FranceColorIcon` | `import { FranceColorIcon } from '@vapor-ui/icons'` | | `FunctionIcon` | `import { FunctionIcon } from '@vapor-ui/icons'` | | `GabonColorIcon` | `import { GabonColorIcon } from '@vapor-ui/icons'` | | `GambiaColorIcon` | `import { GambiaColorIcon } from '@vapor-ui/icons'` | | `GameIcon` | `import { GameIcon } from '@vapor-ui/icons'` | | `GcpIcon` | `import { GcpIcon } from '@vapor-ui/icons'` | | `GeorgiaColorIcon` | `import { GeorgiaColorIcon } from '@vapor-ui/icons'` | | `GermanyColorIcon` | `import { GermanyColorIcon } from '@vapor-ui/icons'` | | `GhanaColorIcon` | `import { GhanaColorIcon } 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'` | | `GreeceColorIcon` | `import { GreeceColorIcon } from '@vapor-ui/icons'` | | `GrenadaColorIcon` | `import { GrenadaColorIcon } from '@vapor-ui/icons'` | | `GroupIcon` | `import { GroupIcon } from '@vapor-ui/icons'` | | `GuatemalaColorIcon` | `import { GuatemalaColorIcon } from '@vapor-ui/icons'` | | `GuestIcon` | `import { GuestIcon } from '@vapor-ui/icons'` | | `GuineaBissauColorIcon` | `import { GuineaBissauColorIcon } from '@vapor-ui/icons'` | | `GuineaColorIcon` | `import { GuineaColorIcon } from '@vapor-ui/icons'` | | `GuyanaColorIcon` | `import { GuyanaColorIcon } from '@vapor-ui/icons'` | | `HaitiColorIcon` | `import { HaitiColorIcon } 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'` | | `HondurasColorIcon` | `import { HondurasColorIcon } from '@vapor-ui/icons'` | | `HourglassIcon` | `import { HourglassIcon } from '@vapor-ui/icons'` | | `HungaryColorIcon` | `import { HungaryColorIcon } from '@vapor-ui/icons'` | | `IcelandColorIcon` | `import { IcelandColorIcon } 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'` | | `IndiaColorIcon` | `import { IndiaColorIcon } from '@vapor-ui/icons'` | | `IndonesiaColorIcon` | `import { IndonesiaColorIcon } 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'` | | `IranColorIcon` | `import { IranColorIcon } from '@vapor-ui/icons'` | | `IraqColorIcon` | `import { IraqColorIcon } from '@vapor-ui/icons'` | | `IrelandColorIcon` | `import { IrelandColorIcon } from '@vapor-ui/icons'` | | `IsraelColorIcon` | `import { IsraelColorIcon } from '@vapor-ui/icons'` | | `ItalicIcon` | `import { ItalicIcon } from '@vapor-ui/icons'` | | `ItalyColorIcon` | `import { ItalyColorIcon } from '@vapor-ui/icons'` | | `IvoryCoastColorIcon` | `import { IvoryCoastColorIcon } from '@vapor-ui/icons'` | | `JamaicaColorIcon` | `import { JamaicaColorIcon } from '@vapor-ui/icons'` | | `JapanColorIcon` | `import { JapanColorIcon } from '@vapor-ui/icons'` | | `JiraIcon` | `import { JiraIcon } from '@vapor-ui/icons'` | | `JordanColorIcon` | `import { JordanColorIcon } 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'` | | `KazakhstanColorIcon` | `import { KazakhstanColorIcon } from '@vapor-ui/icons'` | | `KenyaColorIcon` | `import { KenyaColorIcon } 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'` | | `KiribatiColorIcon` | `import { KiribatiColorIcon } from '@vapor-ui/icons'` | | `KosovoColorIcon` | `import { KosovoColorIcon } from '@vapor-ui/icons'` | | `KrampolineIcon` | `import { KrampolineIcon } from '@vapor-ui/icons'` | | `KubernatesIcon` | `import { KubernatesIcon } from '@vapor-ui/icons'` | | `KuwaitColorIcon` | `import { KuwaitColorIcon } from '@vapor-ui/icons'` | | `KyrgyzstanColorIcon` | `import { KyrgyzstanColorIcon } from '@vapor-ui/icons'` | | `LaosColorIcon` | `import { LaosColorIcon } from '@vapor-ui/icons'` | | `LatviaColorIcon` | `import { LatviaColorIcon } from '@vapor-ui/icons'` | | `LebanonColorIcon` | `import { LebanonColorIcon } from '@vapor-ui/icons'` | | `LesothoColorIcon` | `import { LesothoColorIcon } from '@vapor-ui/icons'` | | `LiberiaColorIcon` | `import { LiberiaColorIcon } from '@vapor-ui/icons'` | | `LibyaColorIcon` | `import { LibyaColorIcon } from '@vapor-ui/icons'` | | `LicenseIcon` | `import { LicenseIcon } from '@vapor-ui/icons'` | | `LiechtensteinColorIcon` | `import { LiechtensteinColorIcon } 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'` | | `LithuaniaColorIcon` | `import { LithuaniaColorIcon } 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'` | | `LuxembourgColorIcon` | `import { LuxembourgColorIcon } from '@vapor-ui/icons'` | | `MadagascarColorIcon` | `import { MadagascarColorIcon } from '@vapor-ui/icons'` | | `MagicWandIcon` | `import { MagicWandIcon } from '@vapor-ui/icons'` | | `MailIcon` | `import { MailIcon } from '@vapor-ui/icons'` | | `MalawiColorIcon` | `import { MalawiColorIcon } from '@vapor-ui/icons'` | | `MalaysiaColorIcon` | `import { MalaysiaColorIcon } from '@vapor-ui/icons'` | | `MaldivesColorIcon` | `import { MaldivesColorIcon } from '@vapor-ui/icons'` | | `MaliColorIcon` | `import { MaliColorIcon } from '@vapor-ui/icons'` | | `MaltaColorIcon` | `import { MaltaColorIcon } from '@vapor-ui/icons'` | | `MarkModeIcon` | `import { MarkModeIcon } from '@vapor-ui/icons'` | | `MarkdownIcon` | `import { MarkdownIcon } from '@vapor-ui/icons'` | | `MarshallIslandsColorIcon` | `import { MarshallIslandsColorIcon } from '@vapor-ui/icons'` | | `MauritaniaColorIcon` | `import { MauritaniaColorIcon } from '@vapor-ui/icons'` | | `MauritiusColorIcon` | `import { MauritiusColorIcon } 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'` | | `MexicoColorIcon` | `import { MexicoColorIcon } from '@vapor-ui/icons'` | | `MicOffIcon` | `import { MicOffIcon } from '@vapor-ui/icons'` | | `MicOnIcon` | `import { MicOnIcon } from '@vapor-ui/icons'` | | `MicronesiaColorIcon` | `import { MicronesiaColorIcon } from '@vapor-ui/icons'` | | `MinusBoxIcon` | `import { MinusBoxIcon } from '@vapor-ui/icons'` | | `MoldovaColorIcon` | `import { MoldovaColorIcon } from '@vapor-ui/icons'` | | `MonacoColorIcon` | `import { MonacoColorIcon } from '@vapor-ui/icons'` | | `MongoliaColorIcon` | `import { MongoliaColorIcon } from '@vapor-ui/icons'` | | `MontenegroColorIcon` | `import { MontenegroColorIcon } from '@vapor-ui/icons'` | | `MoroccoColorIcon` | `import { MoroccoColorIcon } from '@vapor-ui/icons'` | | `MovieIcon` | `import { MovieIcon } from '@vapor-ui/icons'` | | `MozambiqueColorIcon` | `import { MozambiqueColorIcon } from '@vapor-ui/icons'` | | `MyanmarColorIcon` | `import { MyanmarColorIcon } from '@vapor-ui/icons'` | | `MysqlColorIcon` | `import { MysqlColorIcon } from '@vapor-ui/icons'` | | `MysqlIcon` | `import { MysqlIcon } from '@vapor-ui/icons'` | | `NamibiaColorIcon` | `import { NamibiaColorIcon } from '@vapor-ui/icons'` | | `NauruColorIcon` | `import { NauruColorIcon } 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'` | | `NepalColorIcon` | `import { NepalColorIcon } from '@vapor-ui/icons'` | | `NetherlandsColorIcon` | `import { NetherlandsColorIcon } from '@vapor-ui/icons'` | | `NetworkIcon` | `import { NetworkIcon } from '@vapor-ui/icons'` | | `NewZealandColorIcon` | `import { NewZealandColorIcon } from '@vapor-ui/icons'` | | `NextIcon` | `import { NextIcon } from '@vapor-ui/icons'` | | `NicaraguaColorIcon` | `import { NicaraguaColorIcon } from '@vapor-ui/icons'` | | `NigerColorIcon` | `import { NigerColorIcon } from '@vapor-ui/icons'` | | `NigeriaColorIcon` | `import { NigeriaColorIcon } from '@vapor-ui/icons'` | | `NiueColorIcon` | `import { NiueColorIcon } from '@vapor-ui/icons'` | | `NoImageIcon` | `import { NoImageIcon } from '@vapor-ui/icons'` | | `NoUserIcon` | `import { NoUserIcon } from '@vapor-ui/icons'` | | `NorthMacedoniaColorIcon` | `import { NorthMacedoniaColorIcon } from '@vapor-ui/icons'` | | `NorwayColorIcon` | `import { NorwayColorIcon } 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'` | | `OmanColorIcon` | `import { OmanColorIcon } 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'` | | `PakistanColorIcon` | `import { PakistanColorIcon } from '@vapor-ui/icons'` | | `PalauColorIcon` | `import { PalauColorIcon } from '@vapor-ui/icons'` | | `PanamaColorIcon` | `import { PanamaColorIcon } from '@vapor-ui/icons'` | | `PanelOpenIcon` | `import { PanelOpenIcon } from '@vapor-ui/icons'` | | `PapuaNewGuineaColorIcon` | `import { PapuaNewGuineaColorIcon } from '@vapor-ui/icons'` | | `ParaguayColorIcon` | `import { ParaguayColorIcon } 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'` | | `PeruColorIcon` | `import { PeruColorIcon } from '@vapor-ui/icons'` | | `PhilippinesColorIcon` | `import { PhilippinesColorIcon } 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'` | | `PolandColorIcon` | `import { PolandColorIcon } from '@vapor-ui/icons'` | | `PortforwardingIcon` | `import { PortforwardingIcon } from '@vapor-ui/icons'` | | `PortugalColorIcon` | `import { PortugalColorIcon } 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'` | | `QatarColorIcon` | `import { QatarColorIcon } 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'` | | `RepublicOfTheCongoColorIcon` | `import { RepublicOfTheCongoColorIcon } from '@vapor-ui/icons'` | | `ResultManagementIcon` | `import { ResultManagementIcon } from '@vapor-ui/icons'` | | `RewardedAdsIcon` | `import { RewardedAdsIcon } from '@vapor-ui/icons'` | | `RomaniaColorIcon` | `import { RomaniaColorIcon } 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'` | | `RussiaColorIcon` | `import { RussiaColorIcon } from '@vapor-ui/icons'` | | `RwandaColorIcon` | `import { RwandaColorIcon } from '@vapor-ui/icons'` | | `SaintKittsAndNevisColorIcon` | `import { SaintKittsAndNevisColorIcon } from '@vapor-ui/icons'` | | `SaintLuciaColorIcon` | `import { SaintLuciaColorIcon } from '@vapor-ui/icons'` | | `SaintVincentAndTheGrenadinesColorIcon` | `import { SaintVincentAndTheGrenadinesColorIcon } from '@vapor-ui/icons'` | | `SamoaColorIcon` | `import { SamoaColorIcon } from '@vapor-ui/icons'` | | `SanMarinoColorIcon` | `import { SanMarinoColorIcon } from '@vapor-ui/icons'` | | `SaoTomeAndPrincipeColorIcon` | `import { SaoTomeAndPrincipeColorIcon } from '@vapor-ui/icons'` | | `SaudiArabiaColorIcon` | `import { SaudiArabiaColorIcon } 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'` | | `SenegalColorIcon` | `import { SenegalColorIcon } from '@vapor-ui/icons'` | | `SentryIcon` | `import { SentryIcon } from '@vapor-ui/icons'` | | `SerbiaColorIcon` | `import { SerbiaColorIcon } from '@vapor-ui/icons'` | | `SettingIcon` | `import { SettingIcon } from '@vapor-ui/icons'` | | `SeychellesColorIcon` | `import { SeychellesColorIcon } 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'` | | `SierraLeoneColorIcon` | `import { SierraLeoneColorIcon } from '@vapor-ui/icons'` | | `SingaporeColorIcon` | `import { SingaporeColorIcon } 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'` | | `SlovakiaColorIcon` | `import { SlovakiaColorIcon } from '@vapor-ui/icons'` | | `SloveniaColorIcon` | `import { SloveniaColorIcon } from '@vapor-ui/icons'` | | `SolomonIslandsColorIcon` | `import { SolomonIslandsColorIcon } from '@vapor-ui/icons'` | | `SomaliaColorIcon` | `import { SomaliaColorIcon } 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'` | | `SouthAfricaColorIcon` | `import { SouthAfricaColorIcon } from '@vapor-ui/icons'` | | `SouthKoreaColorIcon` | `import { SouthKoreaColorIcon } from '@vapor-ui/icons'` | | `SouthSudanColorIcon` | `import { SouthSudanColorIcon } from '@vapor-ui/icons'` | | `SpainColorIcon` | `import { SpainColorIcon } from '@vapor-ui/icons'` | | `SplitIcon` | `import { SplitIcon } from '@vapor-ui/icons'` | | `SriLankaColorIcon` | `import { SriLankaColorIcon } 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'` | | `SudanColorIcon` | `import { SudanColorIcon } from '@vapor-ui/icons'` | | `SurinameColorIcon` | `import { SurinameColorIcon } from '@vapor-ui/icons'` | | `SwedenColorIcon` | `import { SwedenColorIcon } from '@vapor-ui/icons'` | | `SwitzerlandColorIcon` | `import { SwitzerlandColorIcon } from '@vapor-ui/icons'` | | `SyllabusIcon` | `import { SyllabusIcon } from '@vapor-ui/icons'` | | `SyriaColorIcon` | `import { SyriaColorIcon } 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'` | | `TajikistanColorIcon` | `import { TajikistanColorIcon } from '@vapor-ui/icons'` | | `TakeoffIcon` | `import { TakeoffIcon } from '@vapor-ui/icons'` | | `TanzaniaColorIcon` | `import { TanzaniaColorIcon } from '@vapor-ui/icons'` | | `TestIcon` | `import { TestIcon } from '@vapor-ui/icons'` | | `ThailandColorIcon` | `import { ThailandColorIcon } from '@vapor-ui/icons'` | | `TimeIcon` | `import { TimeIcon } from '@vapor-ui/icons'` | | `TogoColorIcon` | `import { TogoColorIcon } from '@vapor-ui/icons'` | | `TongaColorIcon` | `import { TongaColorIcon } 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'` | | `TrinidadAndTobagoColorIcon` | `import { TrinidadAndTobagoColorIcon } from '@vapor-ui/icons'` | | `TunisiaColorIcon` | `import { TunisiaColorIcon } from '@vapor-ui/icons'` | | `TurkeyColorIcon` | `import { TurkeyColorIcon } from '@vapor-ui/icons'` | | `TurkmenistanColorIcon` | `import { TurkmenistanColorIcon } from '@vapor-ui/icons'` | | `TuvaluColorIcon` | `import { TuvaluColorIcon } from '@vapor-ui/icons'` | | `TwoFileIcon` | `import { TwoFileIcon } from '@vapor-ui/icons'` | | `UgandaColorIcon` | `import { UgandaColorIcon } from '@vapor-ui/icons'` | | `UkraineColorIcon` | `import { UkraineColorIcon } from '@vapor-ui/icons'` | | `UnitedArabEmiratesColorIcon` | `import { UnitedArabEmiratesColorIcon } from '@vapor-ui/icons'` | | `UnitedKingdomColorIcon` | `import { UnitedKingdomColorIcon } from '@vapor-ui/icons'` | | `UnitedStatesColorIcon` | `import { UnitedStatesColorIcon } 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'` | | `UruguayColorIcon` | `import { UruguayColorIcon } 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'` | | `UzbekistanColorIcon` | `import { UzbekistanColorIcon } from '@vapor-ui/icons'` | | `VanuatuColorIcon` | `import { VanuatuColorIcon } from '@vapor-ui/icons'` | | `VariableIcon` | `import { VariableIcon } from '@vapor-ui/icons'` | | `VaticanCityColorIcon` | `import { VaticanCityColorIcon } from '@vapor-ui/icons'` | | `VenezuelaColorIcon` | `import { VenezuelaColorIcon } from '@vapor-ui/icons'` | | `VideocamOffIcon` | `import { VideocamOffIcon } from '@vapor-ui/icons'` | | `VideocamOnIcon` | `import { VideocamOnIcon } from '@vapor-ui/icons'` | | `VietnamColorIcon` | `import { VietnamColorIcon } 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'` | | `YemenColorIcon` | `import { YemenColorIcon } from '@vapor-ui/icons'` | | `YoutubeColorIcon` | `import { YoutubeColorIcon } from '@vapor-ui/icons'` | | `YoutubeIcon` | `import { YoutubeIcon } from '@vapor-ui/icons'` | | `ZambiaColorIcon` | `import { ZambiaColorIcon } from '@vapor-ui/icons'` | | `ZimbabweColorIcon` | `import { ZimbabweColorIcon } 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'` | | `ChecklistOutlineIcon` | `import { ChecklistOutlineIcon } 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'` | | `Heading1OutlineIcon` | `import { Heading1OutlineIcon } from '@vapor-ui/icons'` | | `Heading2OutlineIcon` | `import { Heading2OutlineIcon } from '@vapor-ui/icons'` | | `Heading3OutlineIcon` | `import { Heading3OutlineIcon } from '@vapor-ui/icons'` | | `Heading4OutlineIcon` | `import { Heading4OutlineIcon } 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'` | | `StrikeOutlineIcon` | `import { StrikeOutlineIcon } 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'` | | `TriangleOutlineIcon` | `import { TriangleOutlineIcon } 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'` | # All Components URL: /docs/components Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/index.mdx 빠른 개발과 일관된 디자인을 위한 Vapor UI 디자인 시스템을 살펴보세요. *** title: All Components description: 빠른 개발과 일관된 디자인을 위한 Vapor UI 디자인 시스템을 살펴보세요. -------------------------------------------------------- *** ## Components # Introduction URL: /docs/getting-started Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/getting-started/index.mdx 빠른 개발과 일관된 디자인을 위한 Vapor UI 디자인 시스템을 살펴보세요. *** title: Introduction description: 빠른 개발과 일관된 디자인을 위한 Vapor UI 디자인 시스템을 살펴보세요. -------------------------------------------------------- ## Vapor UI 소개 Vapor UI는 개발자 경험과 디자인 일관성을 모두 만족시키는 React 컴포넌트 라이브러리입니다. 구름에서 개발한 세 번째 디자인 시스템으로, 실제 프로덕션에서 검증된 컴포넌트들을 제공합니다. ## 핵심 기능 * **모듈화된 구조**: 필요한 패키지만 선택적으로 설치하여 번들 크기를 최적화합니다. * **TypeScript 지원**: 모든 컴포넌트에 타입 정의가 포함되어 자동 완성과 타입 검사를 지원합니다. * **접근성 내장**: WCAG 2.1 AA 수준의 웹 접근성을 기본으로 제공합니다. * **Tailwind CSS 통합**: Tailwind 유틸리티 클래스로 컴포넌트를 빠르게 커스터마이징할 수 있습니다. * **다크 모드**: 라이트/다크 테마 자동 전환 시스템을 제공합니다. ## 적합한 프로젝트 Vapor UI는 다음과 같은 프로젝트에서 효과적으로 활용할 수 있습니다. * 빠른 프로토타이핑이 필요한 스타트업과 신규 프로젝트 * 일관된 디자인 시스템을 구축하려는 중대형 팀 * 접근성을 중요시하는 공공 서비스나 글로벌 서비스 * TypeScript 환경의 모던 React 프로젝트 * 디자인과 개발 간 협업이 중요한 조직 # Codemod URL: /docs/releases/codemod Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/codemod.md @vapor-ui/codemod 패키지의 릴리즈 노트입니다. *** title: Codemod description: '@vapor-ui/codemod 패키지의 릴리즈 노트입니다.' ------------------------------------------------ # @vapor-ui/codemod ## 1.0.0 ### Codemod * Add v1/migrate transform for @vapor-ui/core v1.0.0 migration ([#454](https://github.com/goorm-dev/vapor-ui/pull/454)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * `trackAnchor` → `disableAnchorTracking` (boolean inversion) * `loop` → `loopFocus` (Menu, Tabs) * Move `openOnHover`, `delay`, `closeDelay` from Root to Trigger (Tooltip, Preview Card) * `hoverable` → `disableHoverablePopup` (Tooltip only, boolean inversion) ## 1.0.0-beta.7 ### CLI * Add Tabs, Text, Textinput transform ([#319](https://github.com/goorm-dev/vapor-ui/pull/319)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * Add Dropdown, IconButton, Nav transformer ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add avatar, breadcrumb, card transform ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * Add Popover, RadioGroup, Switch Transform ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * Add codemod for icon packages name import ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add codemod cli packages ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add cli options ([#351](https://github.com/goorm-dev/vapor-ui/pull/351)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add button, badge, alert component color props to colorPalette ([#362](https://github.com/goorm-dev/vapor-ui/pull/362)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ## 1.0.0-beta.6 ### CLI * add checkbox, collapsible, dialog transform ([#316](https://github.com/goorm-dev/vapor-ui/pull/316)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add avatar, breadcrumb, card transform ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * add codemod cli packages ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ## 1.0.0-beta.5 ### CLI * Add codemod for icon packages name import ([#317](https://github.com/goorm-dev/vapor-ui/pull/317)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! # Color Generator URL: /docs/releases/color-generator Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/color-generator.md @vapor-ui/color-generator 패키지의 릴리즈 노트입니다. *** title: Color Generator description: '@vapor-ui/color-generator 패키지의 릴리즈 노트입니다.' -------------------------------------------------------- # @vapor-ui/color-generator ## 1.0.0-beta.8 ### Tokens * **BREAKING CHANGE**: rename `color-background-canvas` token to `color-canvas` ([#378](https://github.com/goorm-dev/vapor-ui/pull/378)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! The canvas background token has been renamed for better semantic clarity and consistency: * Token name: `color-background-canvas` → `color-canvas` * CSS variable: `--vapor-color-background-canvas` → `--vapor-color-canvas` **Migration required:** * Update all references from `color-background-canvas` to `color-canvas` * Replace CSS variables from `--vapor-color-background-canvas` to `--vapor-color-canvas` ## 1.0.0-beta.7 ### Color Generator * add color-border-normal semantic token that dynamically adapts to background color customization (light: 100 step, dark: 300 step) ([#370](https://github.com/goorm-dev/vapor-ui/pull/370)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 1.0.0-beta.6 ### Etc. * feat: update color generator & color palette ([#337](https://github.com/goorm-dev/vapor-ui/pull/337)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 1.0.0-beta.5 ### Etc. * feat: create @vapor-ui/color-generator & @vapor-ui/css-generator ([#234](https://github.com/goorm-dev/vapor-ui/pull/234)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * feat: update color tokens ([#261](https://github.com/goorm-dev/vapor-ui/pull/261)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! # Core URL: /docs/releases/core Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/core.md @vapor-ui/core 패키지의 릴리즈 노트입니다. *** title: Core description: '@vapor-ui/core 패키지의 릴리즈 노트입니다.' --------------------------------------------- # @vapor-ui/core ## 1.4.0 ### Sheet * Add `Sheet.ResizeHandle` for edge drag-and-keyboard resizing. ([#634](https://github.com/goorm-dev/vapor-ui/pull/634)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Checkbox * propagate `invalid` state to indicator element ([#618](https://github.com/goorm-dev/vapor-ui/pull/618)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/icons\@1.2.1 ## 1.3.0 ### Avatar * fix double rendering `FallbackPrimitive` ([#556](https://github.com/goorm-dev/vapor-ui/pull/556)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * deprecate `imageElement`/`fallbackElement` props ([#556](https://github.com/goorm-dev/vapor-ui/pull/556)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Spinner * add new `Spinner` component ([#567](https://github.com/goorm-dev/vapor-ui/pull/567)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Segmented Control * add new `SegmentedControl` component ([#569](https://github.com/goorm-dev/vapor-ui/pull/569)) - Thanks [@noahchoii](https://github.com/noahchoii)! ## 1.2.1 ### Menu * correct `gap` scale of list components ([#553](https://github.com/goorm-dev/vapor-ui/pull/553)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Select * correct `gap` scale of list components ([#553](https://github.com/goorm-dev/vapor-ui/pull/553)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### MultiSelect * correct `gap` scale of list components ([#553](https://github.com/goorm-dev/vapor-ui/pull/553)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/icons\@1.2.0 ## 1.2.0 ### All * add `forwardRef` to `Portal` elements ([#499](https://github.com/goorm-dev/vapor-ui/pull/499)) - Thanks [@noahchoii](https://github.com/noahchoii)! * support for functional className and style prop across all components ([#517](https://github.com/goorm-dev/vapor-ui/pull/517)) - Thanks [@noahchoii](https://github.com/noahchoii)! * implemente interaction layer corners using `box-shadow` and add animations to `Checkbox`, \`Radio ([#515](https://github.com/goorm-dev/vapor-ui/pull/515)) - Thanks [@noahchoii](https://github.com/noahchoii)! * adjust dark `background.hint.100` to improve surface hierarchy on overlay backgrounds ([#518](https://github.com/goorm-dev/vapor-ui/pull/518)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * remove css all property ([#493](https://github.com/goorm-dev/vapor-ui/pull/493)) - Thanks [@noahchoii](https://github.com/noahchoii)! * remove duplication from deprecated sprinkles ([#494](https://github.com/goorm-dev/vapor-ui/pull/494)) - Thanks [@noahchoii](https://github.com/noahchoii)! * split sprinkles className and hash with `-` ([#495](https://github.com/goorm-dev/vapor-ui/pull/495)) - Thanks [@noahchoii](https://github.com/noahchoii)! * bump @base-ui/react v1.2.0 ([#497](https://github.com/goorm-dev/vapor-ui/pull/497)) - Thanks [@noahchoii](https://github.com/noahchoii)! * bump @base-ui/react version v1.3.0 ([#519](https://github.com/goorm-dev/vapor-ui/pull/519)) - Thanks [@vapor-ui](https://github.com/vapor-ui)! ### Button * add `@base-ui/react` headless to the `Button` component ([#501](https://github.com/goorm-dev/vapor-ui/pull/501)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Checkbox * fix: improve checkbox border styles and interaction overlay sizing ([#354](https://github.com/goorm-dev/vapor-ui/pull/354)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Select * set the width and height of the `Select.TriggerIcon`'s SVG to 100%. ([#504](https://github.com/goorm-dev/vapor-ui/pull/504)) - Thanks [@noahchoii](https://github.com/noahchoii)! * deprecate `Select.PlaceholderPrimitive` component. Use `data-placeholder` for custom styling. ([#500](https://github.com/goorm-dev/vapor-ui/pull/500)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Switch * composite missing `className` prop ([#498](https://github.com/goorm-dev/vapor-ui/pull/498)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Toast * respect the user's reduced motion preference in toast animations ([#525](https://github.com/goorm-dev/vapor-ui/pull/525)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Etc. * add `:active` pseudo-selector to utility CSS properties ([#535](https://github.com/goorm-dev/vapor-ui/pull/535)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/icons\@1.1.0 ## 1.1.0 ### General changes * expand utility props and scoping it `$css` ([#476](https://github.com/goorm-dev/vapor-ui/pull/476)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * Change `useMutationObserver` hook to use only ref ([#332](https://github.com/goorm-dev/vapor-ui/pull/332)) - Thanks [@SimYunSup](https://github.com/SimYunSup)! ### Skeleton * Add new `Skeleton` component ([#481](https://github.com/goorm-dev/vapor-ui/pull/481)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Updated Dependencies * @vapor-ui/icons\@1.0.1 ## 1.0.0 ### Checkbox / Switch / Radio * **Breaking Change**: Root element changed from `HTMLButtonElement` to `HTMLSpanElement` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Dialog * fix(dialog): correct ReactElement type parameters in DialogPopup props ([#438](https://github.com/goorm-dev/vapor-ui/pull/438)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! Fixed incorrect type parameters for `portalElement` and `overlayElement` in `DialogPopup.Props` from `typeof Component` to `Component.Props`. ### Field * **Breaking Change**: `validationMode` default changed from `onBlur` to `onSubmit` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * **New Feature**: `Field.Item`: New component added for improved accessibility when using Checkbox, Radio, Switch with Field ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### FloatingBar * feat(FloatingBar): export `EventDetails` type ([#437](https://github.com/goorm-dev/vapor-ui/pull/437)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! Export `ChangeEventDetails` type from `FloatingBarRoot` namespace for docs-extractor compatibility. ### Form * **Breaking Change**: `onClearErrors` prop removed (now auto-handled internally) ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Menu * **Breaking Change**: `openOnHover`, `delay`, `closeDelay` props moved from `Menu.Root` to `Menu.Trigger` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### NavigationMenu * **Breaking Change**: `Link`: `selected` prop renamed to `current` (for Breadcrumb API consistency) ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * **Breaking Change**: `data-selected` attribute changed to `data-active` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Popover * **Breaking Change**: `openOnHover`, `delay`, `closeDelay` props moved from `Popover.Root` to `Popover.Trigger` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Radio Card * removed the size prop from the RadioCard component and simplified its styling by removing typography mixins ([#442](https://github.com/goorm-dev/vapor-ui/pull/442)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Tabs * fix(tabs): correct indicator position when list has padding ([#434](https://github.com/goorm-dev/vapor-ui/pull/434)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! Fix indicator positioning issue when Tabs.List has padding-inline (horizontal) or padding-block (vertical). The indicator now correctly positions itself by explicitly setting `left: 0` (horizontal) or `top: 0` (vertical), ensuring it uses only the CSS variables for positioning regardless of padding. * **Breaking Change**: `Tabs.Root`: `loop` prop renamed to `loopFocus` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * **Breaking Change**: `activateOnFocus` default changed from `true` to `false` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * **Breaking Change**: `data-selected` attribute changed to `data-active` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Tooltip * **Breaking Change**: `Tooltip.Root`: `hoverable` prop renamed to `disableHoverablePopup` (logic inverted) ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * **Breaking Change**: `delay`, `closeDelay` props moved from `Tooltip.Root` to `Tooltip.Trigger` ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Etc. * Migrate to Base UI v1.1.0 ([#453](https://github.com/goorm-dev/vapor-ui/pull/453)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * Updated internal utilities to use official @base-ui/utils package (v0.2.4) ([#443](https://github.com/goorm-dev/vapor-ui/pull/443)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * fix: prevent passing props to Fragment in `createRender` ([#403](https://github.com/goorm-dev/vapor-ui/pull/403)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! Fixed React warning `Invalid prop 'ref' supplied to 'React.Fragment'` by wrapping Fragment returns in a render callback to avoid `cloneElement` props merging. ### Updated Dependencies * @vapor-ui/icons\@1.0.0 ## 1.0.0-beta.12 ### Button * Update secondary button fill variant text color to use foreground.secondary\[200] for improved contrast ([#427](https://github.com/goorm-dev/vapor-ui/pull/427)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Dialog * adjust to max-width in dialog ([#394](https://github.com/goorm-dev/vapor-ui/pull/394)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Field * feat(field): add typography and foreground props to Field.Label ([#399](https://github.com/goorm-dev/vapor-ui/pull/399)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Floatingbar * add new `FloatingBar` component ([#359](https://github.com/goorm-dev/vapor-ui/pull/359)) - Thanks [@noahchoii](https://github.com/noahchoii)! * clone elements & enhance customizability ([#359](https://github.com/goorm-dev/vapor-ui/pull/359)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Tabs * Refactor Tabs component structure for better customization ([#429](https://github.com/goorm-dev/vapor-ui/pull/429)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * Changed `Tabs.Trigger` to `Tabs.Button` for clearer semantics * Extracted `Tabs.ListPrimitive` and `Tabs.IndicatorPrimitive` for enhanced customization * Added fill and line variant support with updated styles * Updated type definitions and utility props for better developer experience ### Updated Dependencies * @vapor-ui/icons\@1.0.0-beta.7 ## 1.0.0-beta.11 ### Text Input * Correct background-color of TextInput component ([#387](https://github.com/goorm-dev/vapor-ui/pull/387)) - Thanks [@agetbase](https://github.com/agetbase)! ### Etc. * clone elements & enhance customizability ([#359](https://github.com/goorm-dev/vapor-ui/pull/359)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/hooks\@1.0.0-beta.6 * @vapor-ui/icons\@1.0.0-beta.6 ## 1.0.0-beta.10 ### Toast * avoid overflowing when toast width is wider than view port width ([#390](https://github.com/goorm-dev/vapor-ui/pull/390)) - Thanks [@noahchoii](https://github.com/noahchoii)! ## 1.0.0-beta.9 ### Toast * remove toastManager ([#383](https://github.com/goorm-dev/vapor-ui/pull/383)) - Thanks [@noahchoii](https://github.com/noahchoii)! ## 1.0.0-beta.8 ### Toast * add new `Toast` component ([#376](https://github.com/goorm-dev/vapor-ui/pull/376)) - Thanks [@noahchoii](https://github.com/noahchoii)! ## 1.0.0-beta.7 ### Menu * Updated Menu.Item paddingRight from 6px to 12px to match Figma design specification ([#325](https://github.com/goorm-dev/vapor-ui/pull/325)) - Thanks [@agetbase](https://github.com/agetbase)! * Correct MenuPositionerPrimitive sideOffset from 8px to 4px to match Figma spec ([#342](https://github.com/goorm-dev/vapor-ui/pull/342)) - Thanks [@agetbase](https://github.com/agetbase)! ### Pagination * add new `Pagination` component ([#329](https://github.com/goorm-dev/vapor-ui/pull/329)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Table * add new `Table` component ([#294](https://github.com/goorm-dev/vapor-ui/pull/294)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * synchronized color tokens with figma ([#340](https://github.com/goorm-dev/vapor-ui/pull/340)) - Thanks [@noahchoii](https://github.com/noahchoii)! * **BREAKING CHANGE**: Remove `stretch` prop from Button, IconButton, and NavigationMenu components ([#368](https://github.com/goorm-dev/vapor-ui/pull/368)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! The `stretch` prop has been removed to align with Figma's component variant system. In Figma, width control is handled via "Fill Container" (Auto Layout), not as a component variant. **Migration Guide:** Replace `stretch` prop with Tailwind's `w-full` utility class: ```tsx // Before ... // After ... ``` **Why this change:** * Maintains Figma-React design system parity (SSOT principle) * Follows "React Props = Figma Variants" architectural principle * Aligns with Vapor UI's 4-layer component architecture (Container, Interaction, Contents, Slot) * Layout concerns should be handled by parent containers, not component props ## 1.0.0-beta.6 It contains the same code as the previous version. Please refer to that version. ## 1.0.0-beta.5 ### Button * update horizontal padding for small size (`050 (4px)` -> `100 (8px)`) ([#323](https://github.com/goorm-dev/vapor-ui/pull/323)) - Thanks [@agetbase](https://github.com/agetbase)! ### Checkbox * fix checkbox borderRadius sync error ([#267](https://github.com/goorm-dev/vapor-ui/pull/267)) - Thanks [@SimYunSup](https://github.com/SimYunSup)! ### Field * add default layout styles to field.label ([#289](https://github.com/goorm-dev/vapor-ui/pull/289)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Form * add new `Form` component ([#256](https://github.com/goorm-dev/vapor-ui/pull/256)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Icon Button * Fixed a CSS dependency order issue where `IconButton` styles loaded before `Button` styles, causing incorrect style inheritance. ### Radio * adjust indicator size to account for border ([#291](https://github.com/goorm-dev/vapor-ui/pull/291)) - Thanks [@SimYunSup](https://github.com/SimYunSup)! ### Radio Card * add new component `RadioCard` ([#284](https://github.com/goorm-dev/vapor-ui/pull/284)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Radio Group * synchronize the aria-labelledby with the recieved id prop ([#327](https://github.com/goorm-dev/vapor-ui/pull/327)) - Thanks [@noahchoii](https://github.com/noahchoii)! * replace layout styles into layout component like VStack, HStack ([#288](https://github.com/goorm-dev/vapor-ui/pull/288)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Text Input * add component layer ([#253](https://github.com/goorm-dev/vapor-ui/pull/253)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Theme * add ThemeScope component and migrate to data-attribute based theming ([#278](https://github.com/goorm-dev/vapor-ui/pull/278)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Theme Provider * remove ThemeScript and simplify ThemeProvider ([#240](https://github.com/goorm-dev/vapor-ui/pull/240)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Etc. * enabled CSS tree shaking ([#298](https://github.com/goorm-dev/vapor-ui/pull/298)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * Component CSS is now automatically imported by each component file. * add white foreground variant to foreground recipe ([#305](https://github.com/goorm-dev/vapor-ui/pull/305)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * export component with namespace ([#276](https://github.com/goorm-dev/vapor-ui/pull/276)) - Thanks [@noahchoii](https://github.com/noahchoii)! * migrate to base-ui beta v4 ([#292](https://github.com/goorm-dev/vapor-ui/pull/292)) - Thanks [@noahchoii](https://github.com/noahchoii)! * change components interface ([#360](https://github.com/goorm-dev/vapor-ui/pull/360)) - Thanks [@noahchoii](https://github.com/noahchoii)! * missing component exports in entry file ([#248](https://github.com/goorm-dev/vapor-ui/pull/248)) - Thanks [@noahchoii](https://github.com/noahchoii)! * add uilitiy css props ([#326](https://github.com/goorm-dev/vapor-ui/pull/326)) - Thanks [@noahchoii](https://github.com/noahchoii)! * rename `CombinedContent` to `Content` ([#247](https://github.com/goorm-dev/vapor-ui/pull/247)) - Thanks [@noahchoii](https://github.com/noahchoii)! * unify cascade layers under `vapor` namespace ([#334](https://github.com/goorm-dev/vapor-ui/pull/334)) - Thanks [@noahchoii](https://github.com/noahchoii)! * standardize state attributes for form components ([#282](https://github.com/goorm-dev/vapor-ui/pull/282)) - Thanks [@noahchoii](https://github.com/noahchoii)! * feat: rename color tokens ([#261](https://github.com/goorm-dev/vapor-ui/pull/261)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * prevent loading font while building CSS ([#265](https://github.com/goorm-dev/vapor-ui/pull/265)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * correct background color of interaction layer in dark mode ([#335](https://github.com/goorm-dev/vapor-ui/pull/335)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/icons\@1.0.0-beta.5 ## 0.6.0 ### Callout * add flex layout for icons and text alignment ([#181](https://github.com/goorm-dev/vapor-ui/pull/181)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Collapsible * add new `Collapsible` component ([#197](https://github.com/goorm-dev/vapor-ui/pull/197)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Field * add new `Field` components ([#224](https://github.com/goorm-dev/vapor-ui/pull/224)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Input Group * add new `InputGroup` component ([#230](https://github.com/goorm-dev/vapor-ui/pull/230)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Multi Select * add new `MultiSelect` component ([#225](https://github.com/goorm-dev/vapor-ui/pull/225)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Navigation Menu * Migrate `Nav` to `NavigationMenu` ([#211](https://github.com/goorm-dev/vapor-ui/pull/211)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Popover * add new `Popover` component ([#156](https://github.com/goorm-dev/vapor-ui/pull/156)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Select * add new `Select` component ([#222](https://github.com/goorm-dev/vapor-ui/pull/222)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Sheet * add new `Sheet` component ([#187](https://github.com/goorm-dev/vapor-ui/pull/187)) - Thanks [@noahchoii](https://github.com/noahchoii)! * edit spacing style implementation ([#238](https://github.com/goorm-dev/vapor-ui/pull/238)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Tabs * add new `Tabs` component ([#157](https://github.com/goorm-dev/vapor-ui/pull/157)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Textarea * Add new `Textarea` component ([#209](https://github.com/goorm-dev/vapor-ui/pull/209)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Tooltip * eidt tooltip offset ([#212](https://github.com/goorm-dev/vapor-ui/pull/212)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * change the overlay component interface ([#195](https://github.com/goorm-dev/vapor-ui/pull/195)) - Thanks [@noahchoii](https://github.com/noahchoii)! * remove `Label` sub-component from all form elements ([#204](https://github.com/goorm-dev/vapor-ui/pull/204)) - Thanks [@noahchoii](https://github.com/noahchoii)! * migrate to `Base UI` ([#186](https://github.com/goorm-dev/vapor-ui/pull/186)) - Thanks [@noahchoii](https://github.com/noahchoii)! * support readonly props in all of form elements ([#208](https://github.com/goorm-dev/vapor-ui/pull/208)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! * fix svg rendering issue on safari ([#237](https://github.com/goorm-dev/vapor-ui/pull/237)) - Thanks [@noahchoii](https://github.com/noahchoii)! * remove active style when provided readonly ([#246](https://github.com/goorm-dev/vapor-ui/pull/246)) - Thanks [@noahchoii](https://github.com/noahchoii)! * ensure focus styles take precedence over hover styles ([#200](https://github.com/goorm-dev/vapor-ui/pull/200)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Updated Dependencies * @vapor-ui/icons\@0.4.0 ## 0.5.0 ### Avatar * align CSS variable with build identifiers config ([#176](https://github.com/goorm-dev/vapor-ui/pull/176)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Breadcrumb * add new `Breadcrumb` component ([#151](https://github.com/goorm-dev/vapor-ui/pull/151)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Button * add `no-wrap` CSS properties ([#114](https://github.com/goorm-dev/vapor-ui/pull/114)) - Thanks [@jun094](https://github.com/jun094)! ### Menu * add new `Menu` component ([#147](https://github.com/goorm-dev/vapor-ui/pull/147)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Radio Group * add background-color(white) to RadioGroup Indicator ([#146](https://github.com/goorm-dev/vapor-ui/pull/146)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Tooltip * add new `Tooltip` component ([#150](https://github.com/goorm-dev/vapor-ui/pull/150)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * enhance vanillaExtractPlugin identifiers ([#161](https://github.com/goorm-dev/vapor-ui/pull/161)) - Thanks [@noahchoii](https://github.com/noahchoii)! * remove hover state when used touchscreen ([#158](https://github.com/goorm-dev/vapor-ui/pull/158)) - Thanks [@noahchoii](https://github.com/noahchoii)! * add `VComponentProps` ([#168](https://github.com/goorm-dev/vapor-ui/pull/168)) - Thanks [@noahchoii](https://github.com/noahchoii)! * add `box-shadow` tokens ([#143](https://github.com/goorm-dev/vapor-ui/pull/143)) - Thanks [@noahchoii](https://github.com/noahchoii)! * enhance vanillaExtractPlugin identifiers for better debugging ([#149](https://github.com/goorm-dev/vapor-ui/pull/149)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Updated Dependencies * @vapor-ui/icons\@1.0.0 ## 0.4.0 ### Badge * align text to center ([#137](https://github.com/goorm-dev/vapor-ui/pull/137)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Radio Group * remove incorrectly injected props ([#125](https://github.com/goorm-dev/vapor-ui/pull/125)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * change CSS layer names to `theme`, `reset`, `components`, and `utilities` ([#138](https://github.com/goorm-dev/vapor-ui/pull/138)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * add Tailwind CSS v4 preset ([#98](https://github.com/goorm-dev/vapor-ui/pull/98)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * improve DX by overhauling CSS bundling strategy ([#121](https://github.com/goorm-dev/vapor-ui/pull/121)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * add foreground mixin to style entry point ([#142](https://github.com/goorm-dev/vapor-ui/pull/142)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Updated Dependencies * @vapor-ui/icons\@0.2.0 ## 0.3.1 ### Theme Provider * add `primaryColor` props for user custom ([#87](https://github.com/goorm-dev/vapor-ui/pull/87)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 0.3.0 ### Etc. * remove sprinkles on each components ([#88](https://github.com/goorm-dev/vapor-ui/pull/88)) - Thanks [@noahchoii](https://github.com/noahchoii)! * correct CSS layer priority ([#94](https://github.com/goorm-dev/vapor-ui/pull/94)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 0.2.1 ### Theme Provider * support RSC ([#82](https://github.com/goorm-dev/vapor-ui/pull/82)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 0.2.0 ### Callout * add new `Callout` component ([#67](https://github.com/goorm-dev/vapor-ui/pull/67)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Checkbox * add new `Checkbox` Component ([#58](https://github.com/goorm-dev/vapor-ui/pull/58)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Dialog * edit dialog animation style ([#72](https://github.com/goorm-dev/vapor-ui/pull/72)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Radio Group * add new `RadioGroup` component ([#76](https://github.com/goorm-dev/vapor-ui/pull/76)) - Thanks [@noahchoii](https://github.com/noahchoii)! ### Switch * add new `Switch` component - Thanks [@noahchoii](https://github.com/noahchoii)! ### Etc. * remove `@vapor-ui/icons` for resolving storybook build error ([#57](https://github.com/goorm-dev/vapor-ui/pull/57)) - Thanks [@noahchoii](https://github.com/noahchoii)! * prevent code splitting while tsup build ([#81](https://github.com/goorm-dev/vapor-ui/pull/81)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * resolve circular dependency in vanilla-extract ([#73](https://github.com/goorm-dev/vapor-ui/pull/73)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * optimize build system for component bundling ([#73](https://github.com/goorm-dev/vapor-ui/pull/73)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ## 0.1.0 ### Etc. * create package ([#48](https://github.com/goorm-dev/vapor-ui/pull/48)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! # Css Generator URL: /docs/releases/css-generator Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/css-generator.md @vapor-ui/css-generator 패키지의 릴리즈 노트입니다. *** title: Css Generator description: '@vapor-ui/css-generator 패키지의 릴리즈 노트입니다.' ------------------------------------------------------ # @vapor-ui/css-generator ## 1.0.0-beta.8 ### Tokens * **BREAKING CHANGE**: rename `color-background-canvas` token to `color-canvas` ([#378](https://github.com/goorm-dev/vapor-ui/pull/378)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! The canvas background token has been renamed for better semantic clarity and consistency: * Token name: `color-background-canvas` → `color-canvas` * CSS variable: `--vapor-color-background-canvas` → `--vapor-color-canvas` **Migration required:** * Update all references from `color-background-canvas` to `color-canvas` * Replace CSS variables from `--vapor-color-background-canvas` to `--vapor-color-canvas` ### Updated Dependencies * @vapor-ui/color-generator\@1.0.0-beta.8 ## 1.0.0-beta.7 ### Updated Dependencies * @vapor-ui/color-generator\@1.0.0-beta.7 ## 1.0.0-beta.6 ### Etc. * feat: update color generator & color palette ([#337](https://github.com/goorm-dev/vapor-ui/pull/337)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Updated Dependencies * @vapor-ui/color-generator\@1.0.0-beta.6 ## 1.0.0-beta.5 ### Theme * feat(theme): Add ThemeScope component and migrate to data-attribute based theming ([#278](https://github.com/goorm-dev/vapor-ui/pull/278)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Etc. * feat: create @vapor-ui/color-generator & @vapor-ui/css-generator ([#234](https://github.com/goorm-dev/vapor-ui/pull/234)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! * feat: update color tokens ([#261](https://github.com/goorm-dev/vapor-ui/pull/261)) - Thanks [@ZeroChoi2781](https://github.com/ZeroChoi2781)! ### Updated Dependencies * @vapor-ui/color-generator\@1.0.0 # ESLint URL: /docs/releases/eslint-plugin-vapor Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/eslint-plugin-vapor.md eslint-plugin-vapor 패키지의 릴리즈 노트입니다. *** title: ESLint description: 'eslint-plugin-vapor 패키지의 릴리즈 노트입니다.' -------------------------------------------------- # eslint-plugin-vapor ## 1.0.0 ### Eslint Plugin Vapor * create new `eslint-plugin-vapor` for accessibilities ([#457](https://github.com/goorm-dev/vapor-ui/pull/457)) - Thanks [@noahchoii](https://github.com/noahchoii)! # Icons URL: /docs/releases/icons Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/releases/icons.md @vapor-ui/icons 패키지의 릴리즈 노트입니다. *** title: Icons description: '@vapor-ui/icons 패키지의 릴리즈 노트입니다.' ---------------------------------------------- # @vapor-ui/icons ## 1.2.1 ### Etc. * Update icons from Figma ([#608](https://github.com/goorm-dev/vapor-ui/pull/608)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **Updated Basic Icons:** `CopyOutlineIcon` ## 1.2.0 ### Etc. * Add new icons from Figma ([#554](https://github.com/goorm-dev/vapor-ui/pull/554)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New Basic Icons:** `LicenseIcon`, `RewardedAdsIcon` ## 1.1.0 ### Etc. * Add new icons from Figma ([#539](https://github.com/goorm-dev/vapor-ui/pull/539)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New Basic Icons:** `TriangleOutlineIcon` ## 1.0.1 ### Etc. * Check the center alignment of the IntelliSenseEventIcon ([#480](https://github.com/goorm-dev/vapor-ui/pull/480)) - Thanks [@noahchoii](https://github.com/noahchoii)! **Updated Symbol Icons:** `IntelliSenseEventIcon`, `IntelliSenseEventOutlineIcon` ## 1.0.0 ### Etc. * Sync icons from Figma and remove deleted HeadingOutlineIcon ([#430](https://github.com/goorm-dev/vapor-ui/pull/430)) - Thanks [@github-actions](https://github.com/apps/github-actions)! * Update icons from Figma ([#449](https://github.com/goorm-dev/vapor-ui/pull/449)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **Updated Symbol Icons:** `VscodeColorIcon` **New Symbol Icons:** `SouthKoreaColorIcon`, and 195 other country icons ## 1.0.0-beta.7 ### Icon Base * remove iconType ([#231](https://github.com/goorm-dev/vapor-ui/pull/231)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Etc. * Update icons from Figma ([#406](https://github.com/goorm-dev/vapor-ui/pull/406)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **Updated Basic Icons:** `Heading2OutlineIcon`, `StrikeOutlineIcon`, `ChecklistOutlineIcon`, `Heading3OutlineIcon`, `Heading4OutlineIcon`, `Heading1OutlineIcon` ## 1.0.0-beta.6 ### Etc. * clone elements & enhance customizability ([#359](https://github.com/goorm-dev/vapor-ui/pull/359)) - Thanks [@noahchoii](https://github.com/noahchoii)! * Add new icons from Figma ([#396](https://github.com/goorm-dev/vapor-ui/pull/396)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New:** `ChecklistOutlineIcon`, `StrikeOutlineIcon`, `Heading3OutlineIcon`, `Heading2OutlineIcon`, `Heading1OutlineIcon`, `Heading4OutlineIcon` ## 1.0.0-beta.5 ### Etc. * Add new icons from Figma ([#264](https://github.com/goorm-dev/vapor-ui/pull/264)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New:** `DocktoBottomIcon`, `SideNavIcon`, `SideNavOutlineIcon`, `DocktoBottomOutlineIcon` **Updated:** * Basic Icons: `PanelOpenIcon`, `PanelOpenOutlineIcon` * Update icons from Figma ([#285](https://github.com/goorm-dev/vapor-ui/pull/285)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **Updated:** `TreeCollapseIcon` ## 0.4.0 ### Icon Base * adjust prop precedence for dimensions(width, height, size) ([#182](https://github.com/goorm-dev/vapor-ui/pull/182)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! ### Etc. * Add new icons from Figma ([#207](https://github.com/goorm-dev/vapor-ui/pull/207)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New:** `MediumIcon` **Updated:** * Symbol Icons: `FirefoxColorIcon` * update icons from Figma ([#217](https://github.com/goorm-dev/vapor-ui/pull/217)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **Updated:** `TerminalWindowOutlineIcon` ## 0.3.0 ### Etc. * add new icons from Figma ([#179](https://github.com/goorm-dev/vapor-ui/pull/179)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New:** `LinearScaleOutlineIcon` **Updated:** * Basic Icons: `PlayIcon`, `ReplaceIcon`, `ClassIcon`, `ArrowUpOutlineIcon`, `ArrowDownOutlineIcon`, `TerminalOutlineIcon`, `ViewShrinkOutlineIcon`, `FolderSearchIcon`, `StarOutlineIcon`, `PriceOutlineIcon`, `HistoryOutlineIcon`, `CardsOutlineIcon`, `ZoomOutOutlineIcon`, `IntelliSensePropertyOutlineIcon`, `CorrectOutlineIcon`, `ChevronDoubleRightOutlineIcon`, `AutoCodeOutlineIcon`, `ChapterOutlineIcon` * Symbol Icons: `RstudioColorIcon` * add new icons from Figma ([#198](https://github.com/goorm-dev/vapor-ui/pull/198)) - Thanks [@github-actions](https://github.com/apps/github-actions)! **New:** `SidenavIcon` ## 0.2.0 ### Etc. * add new icons and update existing icon components ([#119](https://github.com/goorm-dev/vapor-ui/pull/119)) - Thanks [@MaxLee-dev](https://github.com/MaxLee-dev)! **New Icons Added** * `AlignJustifyOutlineIcon`, `CopyAsMarkdownOutlineIcon`, `IndentDecreaseOutlineIcon`, `SlotIcon`, `TextScanOutlineIcon` **Updated** * Updated approximately 190 existing icons with refined SVG paths and improved rendering * Minor coordinate adjustments for better visual consistency * Enhanced clipPath definitions where needed ## 0.1.0 ### Minor Changes * 68b001c: create avatar , badge , box , button , card , dialog , flex , grid , h-stack , icon-button, nav , text-input , text , theme-provider , v-stack # Avatar URL: /docs/components/avatar Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/avatar.mdx Avatar는 사용자가 설정한 프로필 이미지 혹은 텍스트를 UI상에 나타냅니다. *** title: 'Avatar' site\_name: 'Avatar - Vapor Core' description: 'Avatar는 사용자가 설정한 프로필 이미지 혹은 텍스트를 UI상에 나타냅니다.' ----------------------------------------------------------- ```tsx import { Avatar } from '@vapor-ui/core'; import { VAPOR_LOGO_URL } from '~/constants/image-urls'; export default function DefaultAvatar() { return ; } ``` ## Property *** ### Shape Avatar의 모양을 설정합니다. ```tsx import { Avatar, HStack, Text, VStack } from '@vapor-ui/core'; import { VAPOR_LOGO_URL } from '~/constants/image-urls'; export default function AvatarShape() { return ( square circle ); } ``` ### Size Avatar의 크기를 설정합니다. ```tsx import { Avatar, HStack, Text, VStack } from '@vapor-ui/core'; import { VAPOR_LOGO_URL } from '~/constants/image-urls'; export default function AvatarSize() { return ( sm md lg xl ); } ``` ## Examples *** ### Fallback 이미지가 없거나 로드에 실패한 경우, alt 텍스트의 첫 글자가 자동으로 표시됩니다. 배경색은 alt 문자열을 기반으로 결정됩니다. ```tsx import { Avatar, HStack } from '@vapor-ui/core'; export default function AvatarFallback() { return ( ); } ``` ### Custom Fallback FallbackPrimitive에 children을 전달하여 커스텀 fallback 콘텐츠를 표시합니다. ```tsx import { Avatar, HStack, Text, VStack } from '@vapor-ui/core'; export default function AvatarCustomFallback() { return ( auto initial custom text JD ); } ``` ### Custom Image `children`으로 `Avatar.ImagePrimitive`와 `Avatar.FallbackPrimitive`를 전달하면 각 슬롯에 직접 props를 적용할 수 있습니다. `src`, `alt`, `crossOrigin` 등 이미지 관련 props는 `Avatar.Root`에 전달하면 내부 Primitive로 자동 전달됩니다. ```tsx import { Avatar, HStack, Text, VStack } from '@vapor-ui/core'; const IMAGE_URL = 'https://avatars.githubusercontent.com/u/217160984?v=4'; export default function AvatarCustomImage() { return ( ImagePrimitive FallbackPrimitive JD ); } ``` ## Props Table *** ### Avatar.Root | Prop | Type | Default | Description | | ----------------------- | ------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | | `shape` | `circle`, `square` | `square` | 아바타 테두리 반경의 모양을 지정합니다. 기본값: `'square'` | | `size` | `sm`, `md`, `lg`, `xl` | `md` | 아바타의 크기를 지정합니다. 너비, 높이, 테두리 반경을 설정합니다. 기본값: `'md'`
폴백 콘텐츠의 크기를 지정합니다. 폰트 크기, 행간, 폰트 굵기, 자간을 설정합니다. 기본값: `'md'` | | `onLoadingStatusChange` | `(status: ImageLoadingStatus) => void` | - | 로딩 상태가 변경될 때 호출되는 콜백입니다. | | `className` | `string \| ((state: Avatar.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `fallbackElement` | `ReactElement>` | - | | | `imageElement` | `ReactElement>` | - | | | `delay` | `number` | - | 폴백을 표시하기 전 대기 시간을 밀리초 단위로 지정합니다. | | `style` | `React.CSSProperties \| ((state: Avatar.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Avatar.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Avatar.ImagePrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Avatar.ImagePrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Avatar.ImagePrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Avatar.ImagePrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Avatar.FallbackPrimitive | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Avatar.FallbackPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Avatar.FallbackPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Avatar.FallbackPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Badge URL: /docs/components/badge Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/badge.mdx Badge는 이미지, 컨텐츠 등의 상태 또는 분류를 시각적으로 표시합니다. *** title: 'Badge' site\_name: 'Badge - Vapor Core' description: 'Badge는 이미지, 컨텐츠 등의 상태 또는 분류를 시각적으로 표시합니다.' -------------------------------------------------------- ```tsx import { Badge } from '@vapor-ui/core'; export default function DefaultBadge() { return New; } ``` ## Property *** ### ColorPalette Badge의 색상을 설정합니다. ```tsx import { Badge, HStack, Text, VStack } from '@vapor-ui/core'; export default function BadgeColor() { return ( primary New hint New danger New success New warning New contrast New ); } ``` ### Shape Badge의 모양을 설정합니다. ```tsx import { Badge, HStack, Text, VStack } from '@vapor-ui/core'; export default function BadgeShape() { return ( square New pill New ); } ``` ### Size Badge의 크기를 설정합니다. ```tsx import { Badge, HStack, Text, VStack } from '@vapor-ui/core'; export default function BadgeSize() { return ( sm New md New lg New ); } ``` ## Props Table *** ### Badge | Prop | Type | Default | Description | | -------------- | -------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------ | | `colorPalette` | `primary`, `success`, `warning`, `danger`, `hint`, `contrast` | `primary` | | | `shape` | `square`, `pill` | `square` | | | `size` | `sm`, `md`, `lg` | `md` | | | `className` | `string \| ((state: Badge.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Badge.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Breadcrumb URL: /docs/components/breadcrumb Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/breadcrumb.mdx 사용자가 현재 페이지의 위치를 파악하고 이전 페이지로 쉽게 이동할 수 있도록 도와주는 네비게이션 컴포넌트입니다. *** title: 'Breadcrumb' site\_name: 'Breadcrumb - Vapor Core' description: '사용자가 현재 페이지의 위치를 파악하고 이전 페이지로 쉽게 이동할 수 있도록 도와주는 네비게이션 컴포넌트입니다.' ----------------------------------------------------------------------------- ```tsx import { Breadcrumb } from '@vapor-ui/core'; export default function DefaultBreadcrumb() { return ( Home Products Details ); } ``` ## Examples *** ### With Ellipsis 긴 네비게이션 경로에서 중간 단계를 생략 표시로 나타낸 패턴입니다. ```tsx import { Breadcrumb } from '@vapor-ui/core'; export default function BreadcrumbEllipsis() { return ( Home Category Subcategory Current Page ); } ``` ### Composition Pattern Breadcrumb 컴포넌트의 다양한 구성 패턴입니다. ```tsx import { Breadcrumb, Text, VStack } from '@vapor-ui/core'; import { ChevronRightOutlineIcon, HomeIcon } from '@vapor-ui/icons'; export default function BreadcrumbComposition() { return ( Basic Home Products Details Custom Separator Home Products Details With Icon Home Dashboard Settings ); } ``` ## Property *** ### Current 현재 페이지를 나타내는 링크의 상태를 설정할 수 있습니다. ```tsx import { Breadcrumb, Text, VStack } from '@vapor-ui/core'; export default function BreadcrumbCurrent() { return ( Normal Links Home Products Details With Current Page Home Products Details ); } ``` ### Size Breadcrumb의 크기를 설정합니다. ```tsx import { Breadcrumb, HStack, Text, VStack } from '@vapor-ui/core'; export default function BreadcrumbSize() { return ( sm Home Products Details md Home Products Details lg Home Products Details xl Home Products Details ); } ``` ## Props Table *** ### Breadcrumb.Root | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `className` | `string \| ((state: BreadcrumbRootPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbRootPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Breadcrumb.RootPrimitive | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `className` | `string \| ((state: BreadcrumbRootPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbRootPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Breadcrumb.ListPrimitive | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: BreadcrumbListPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbListPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Breadcrumb.Item | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `current` | `boolean` | - | | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `className` | `string \| ((state: BreadcrumbLinkPrimitiveState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbLinkPrimitiveState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Breadcrumb.ItemPrimitive | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: BreadcrumbItemPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbItemPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Breadcrumb.LinkPrimitive | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `current` | `boolean` | `false` | | | `size` | `sm`, `md`, `lg`, `xl` | `md` | | | `className` | `string \| ((state: BreadcrumbLinkPrimitiveState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbLinkPrimitiveState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Breadcrumb.Separator | Prop | Type | Default | Description | | ----------- | ---------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: BreadcrumbSeparator.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbSeparator.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Breadcrumb.Ellipsis | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: BreadcrumbEllipsisPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbEllipsisPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Breadcrumb.EllipsisPrimitive | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: BreadcrumbEllipsisPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: BreadcrumbEllipsisPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Button URL: /docs/components/button Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/button.mdx Button은 사용자가 주요 작업을 수행하도록 돕는 핵심 상호작용 요소입니다. *** title: 'Button' site\_name: 'Button - Vapor Core' description: 'Button은 사용자가 주요 작업을 수행하도록 돕는 핵심 상호작용 요소입니다.' ---------------------------------------------------------- ```tsx import { Button } from '@vapor-ui/core'; export default function DefaultButton() { return ; } ``` ## Property *** ### Variant Button의 시각적 스타일을 설정합니다. ```tsx import { Button, HStack, Text, VStack } from '@vapor-ui/core'; export default function ButtonVariant() { return ( fill outline ghost ); } ``` ### ColorPalette Button의 역할에 따른 색상을 설정합니다. ```tsx import { Button, HStack, Text, VStack } from '@vapor-ui/core'; export default function ButtonColor() { return ( primary secondary success warning danger contrast ); } ``` ### Disabled Button의 비활성화 상태를 설정합니다. ```tsx import { Button, HStack, Text, VStack } from '@vapor-ui/core'; export default function ButtonDisabled() { return ( enabled disabled ); } ``` ### Size Button의 크기를 설정합니다. ```tsx import { Button, HStack, Text, VStack } from '@vapor-ui/core'; export default function ButtonSize() { return ( sm md lg xl ); } ``` ## Examples *** ### Button with Icon Button의 역할을 직관적으로 표현하기 위해 아이콘과 함께 사용합니다. ```tsx import { Button, HStack } from '@vapor-ui/core'; import { CheckCircleIcon, ChevronRightOutlineIcon } from '@vapor-ui/icons'; export default function ButtonWithIcon() { return ( ); } ``` ## Props Table *** ### Button | Prop | Type | Default | Description | | ----------------------- | -------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `colorPalette` | `primary`, `secondary`, `success`, `warning`, `danger`, `contrast` | `primary` | 버튼에 적용할 색상 팔레트를 지정합니다. 모든 시각적 variant의 배경, 텍스트, 테두리 색상을 설정합니다. 기본값: `'primary'` | | `size` | `sm`, `md`, `lg`, `xl` | `md` | 버튼의 크기를 지정합니다. 높이, 패딩, 타이포그래피를 설정합니다. 기본값: `'md'` | | `variant` | `fill`, `outline`, `ghost` | `fill` | 버튼의 시각적 스타일을 지정합니다. 기본값: `'fill'` | | `className` | `string \| ((state: Button.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `focusableWhenDisabled` | `boolean` | - | 버튼이 비활성화 상태일 때 포커스 가능 여부를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Button.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Button.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Callout URL: /docs/components/callout Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/callout.mdx Callout은 중요한 정보를 시각적으로 강조하여 사용자에게 전달하는 메시지 컴포넌트입니다. *** title: 'Callout' site\_name: 'Callout - Vapor Core' description: 'Callout은 중요한 정보를 시각적으로 강조하여 사용자에게 전달하는 메시지 컴포넌트입니다.' ------------------------------------------------------------------ ```tsx import { Callout } from '@vapor-ui/core'; import { InfoCircleOutlineIcon } from '@vapor-ui/icons'; export default function DefaultCallout() { return ( Your changes have been saved successfully. ); } ``` ## Examples *** ### Callout with Icon Callout의 역할을 직관적으로 표현하기 위해 아이콘과 함께 사용합니다. ```tsx import { Callout, VStack } from '@vapor-ui/core'; import { CheckCircleIcon, HeartIcon, InfoCircleOutlineIcon } from '@vapor-ui/icons'; export default function CalloutWithIcon() { return ( Task completed successfully Please review your settings New notification available ); } ``` ## Property *** ### ColorPalette Callout의 역할에 따른 색상을 설정합니다. ```tsx import { Callout, Text, VStack } from '@vapor-ui/core'; export default function CalloutColor() { return ( primary Your changes have been saved successfully. success Your changes have been saved successfully. warning Your changes have been saved successfully. danger Your changes have been saved successfully. hint Your changes have been saved successfully. contrast Your changes have been saved successfully. ); } ``` ## Props Table *** ### Callout.Root | Prop | Type | Default | Description | | -------------- | -------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------ | | `colorPalette` | `primary`, `success`, `warning`, `danger`, `hint`, `contrast` | `primary` | | | `className` | `string \| ((state: CalloutRoot.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CalloutRoot.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Callout.Icon | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: CalloutIcon.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CalloutIcon.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Card URL: /docs/components/card Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/card.mdx Card는 이미지와 텍스트, 일부 기능 버튼을 포함한 컨테이너로 콘텐츠를 제공합니다. *** title: 'Card' site\_name: 'Card - Vapor Core' description: 'Card는 이미지와 텍스트, 일부 기능 버튼을 포함한 컨테이너로 콘텐츠를 제공합니다.' -------------------------------------------------------------- ```tsx import { Button, Card, HStack, Text, VStack } from '@vapor-ui/core'; export default function DefaultCard() { return ( } typography="heading5"> Project Settings Configure your project settings and preferences. ); } ``` ## Examples *** ### Layout 상황에 따라, 일부 영역을 생략하여 Card를 구성할 수 있습니다. ```tsx import { Card, HStack, Text, VStack } from '@vapor-ui/core'; export default function CardLayout() { return ( Body only A simple card with content only. Body + Footer Card content goes here. Updated 2 hours ago Header + Body } typography="heading6"> Notifications You have 3 unread messages. ); } ``` ## Props Table *** ### Card.Root | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: CardRoot.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CardRoot.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Card.Header | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: CardHeader.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CardHeader.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Card.Body | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: CardBody.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CardBody.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Card.Footer | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: CardFooter.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CardFooter.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Checkbox URL: /docs/components/checkbox Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/checkbox.mdx Checkbox는 여러 항목 중 복수 선택을 가능하게 하는 입력 컴포넌트입니다. *** title: 'Checkbox' site\_name: 'Checkbox - Vapor Core' description: 'Checkbox는 여러 항목 중 복수 선택을 가능하게 하는 입력 컴포넌트입니다.' ----------------------------------------------------------- ```tsx import { Checkbox, HStack, Text } from '@vapor-ui/core'; export default function DefaultCheckbox() { return ( } typography="body2"> I agree to the terms and conditions ); } ``` ## Property *** ### Indeterminate Checkbox의 혼합 상태 여부를 설정합니다. ```tsx import { Checkbox, HStack, Text, VStack } from '@vapor-ui/core'; export default function CheckboxIndeterminate() { return ( unchecked } typography="body2"> Select all indeterminate } typography="body2"> Select all checked } typography="body2"> Select all ); } ``` ### Disabled Checkbox의 비활성화 상태를 설정합니다. ```tsx import { Checkbox, HStack, Text, VStack } from '@vapor-ui/core'; export default function CheckboxDisabled() { return ( disabled } typography="body2"> Remember me disabled checked } typography="body2"> Remember me ); } ``` ### Invalid Checkbox의 유효하지 않음 상태를 설정합니다. ```tsx import { Checkbox, HStack, Text, VStack } from '@vapor-ui/core'; export default function CheckboxInvalid() { return ( invalid } typography="body2"> Accept terms invalid checked } typography="body2"> Accept terms ); } ``` ### Read Only Checkbox의 읽기 전용 상태를 설정합니다. ```tsx import { Checkbox, HStack, Text, VStack } from '@vapor-ui/core'; export default function CheckboxReadOnly() { return ( unchecked checked indeterminate ); } ``` ### Size Checkbox의 크기를 설정합니다. ```tsx import { Checkbox, HStack, Text, VStack } from '@vapor-ui/core'; export default function CheckboxSize() { return ( md } typography="body2"> Remember me lg } typography="body2"> Remember me ); } ``` ## Props Table *** ### Checkbox.Root | Prop | Type | Default | Description | | ----------------- | ------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `invalid` | `boolean` | `false` | | | `size` | `md`, `lg` | `md` | | | `checked` | `boolean` | - | 체크박스의 현재 선택 여부를 지정합니다.

비제어 체크박스로 렌더링하려면 `defaultChecked` prop을 사용합니다. | | `defaultChecked` | `boolean` | - | 체크박스의 초기 선택 여부를 지정합니다.

제어 체크박스로 렌더링하려면 `checked` prop을 사용합니다. | | `onCheckedChange` | `(checked: boolean, eventDetails: Checkbox.Root.ChangeEventDetails) => void` | - | 체크박스가 선택되거나 해제될 때 호출되는 이벤트 핸들러입니다. | | `value` | `string` | - | 선택된 체크박스의 값을 지정합니다. | | `className` | `string \| ((state: CheckboxRootState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 숨겨진 input을 소유하는 폼을 식별합니다.
체크박스가 폼 외부에 렌더링될 때 유용합니다. | | `id` | `string` | - | input 요소의 id를 지정합니다. | | `indeterminate` | `boolean` | - | 체크박스가 혼합 상태(선택도, 미선택도 아닌 상태)인지 여부를 설정합니다. | | `inputRef` | `Ref` | - | 숨겨진 `<input>` 요소에 접근하기 위한 ref를 지정합니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `parent` | `boolean` | - | 이 체크박스가 하위 체크박스 그룹을 관리하는지 여부를 설정합니다.

[Checkbox Group](https://base-ui.com/react/components/checkbox-group) 내에서 사용해야 합니다. | | `readOnly` | `boolean` | - | 사용자가 체크박스를 선택하거나 해제할 수 없도록 할지 여부를 설정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 체크박스를 선택해야 하는지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: CheckboxRootState) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `uncheckedValue` | `string` | - | 체크박스가 선택 해제된 상태에서 폼과 함께 제출되는 값을 지정합니다.
기본적으로 선택 해제된 체크박스는 네이티브 체크박스 동작과 동일하게 값을 제출하지 않습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: CheckboxRootState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Checkbox.IndicatorPrimitive | Prop | Type | Default | Description | | ------------- | ----------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Checkbox.IndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | `true` | 체크박스가 선택되지 않은 상태일 때 요소를 DOM에 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Checkbox.IndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Checkbox.IndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Collapsible URL: /docs/components/collapsible Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/collapsible.mdx Collapsible은 콘텐츠를 접었다 펼칠 수 있는 대화형 컴포넌트입니다. 아코디언이나 확장 가능한 섹션을 구현할 때 사용합니다. *** title: 'Collapsible' site\_name: 'Collapsible - Vapor Core' description: 'Collapsible은 콘텐츠를 접었다 펼칠 수 있는 대화형 컴포넌트입니다. 아코디언이나 확장 가능한 섹션을 구현할 때 사용합니다.' ---------------------------------------------------------------------------------------- ```tsx import { Collapsible, Text, VStack } from '@vapor-ui/core'; import { ChevronRightOutlineIcon } from '@vapor-ui/icons'; export default function DefaultCollapsible() { return ( Settings Account Notifications Privacy ); } ``` ## Property *** ### Open State `defaultOpen`으로 초기 열림 상태를 설정하거나, `open`과 `onOpenChange`로 제어 모드로 사용합니다. ```tsx import { useState } from 'react'; import { Button, Collapsible, HStack, Text, VStack } from '@vapor-ui/core'; export default function CollapsibleOpenState() { const [open, setOpen] = useState(true); return ( defaultOpen FAQ Section This panel starts open and manages its own state. controlled Release Notes This panel is controlled externally via state. ); } ``` ### Disabled Collapsible의 비활성화 상태를 설정합니다. ```tsx import { Collapsible, Text, VStack } from '@vapor-ui/core'; import { ChevronRightOutlineIcon } from '@vapor-ui/icons'; export default function CollapsibleDisabled() { return ( enabled Advanced Options Configure advanced settings for your project. disabled Advanced Options Configure advanced settings for your project. ); } ``` ### Keep Mounted `keepMounted`를 사용하면 패널이 닫힌 상태에서도 DOM에 유지됩니다. ```tsx import { Collapsible, HStack, Text, VStack } from '@vapor-ui/core'; import { ChevronRightOutlineIcon } from '@vapor-ui/icons'; export default function CollapsibleKeepMounted() { return ( default Help Section Removed from DOM when closed. keepMounted Help Section Stays in DOM when closed. ); } ``` ## Props Table *** ### Collapsible.Root | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `defaultOpen` | `boolean` | - | 콜랩서블 패널의 초기 열림 여부를 설정합니다.

제어 컴포넌트로 렌더링하려면 `open` prop을 사용합니다. | | `onOpenChange` | `(open: boolean, eventDetails: Collapsible.Root.ChangeEventDetails) => void` | - | 패널이 열리거나 닫힐 때 호출되는 이벤트 핸들러를 지정합니다. | | `open` | `boolean` | - | 콜랩서블 패널의 현재 열림 여부를 설정합니다.

비제어 컴포넌트로 렌더링하려면 `defaultOpen` prop을 사용합니다. | | `className` | `string \| ((state: Collapsible.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Collapsible.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Collapsible.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Collapsible.Trigger | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Collapsible.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Collapsible.Trigger.State) => (React.CSSProperties \| undefined)) \| ((state: CollapsibleTriggerState) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Collapsible.Trigger.State) => ReactElement) \| ((props: HTMLProps, state: CollapsibleTriggerState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Collapsible.Panel | Prop | Type | Default | Description | | ------------------ | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Collapsible.Panel.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `hiddenUntilFound` | `boolean` | - | 브라우저의 기본 페이지 검색 기능으로 패널 내용을 찾고 펼칠 수 있도록 허용합니다.

`keepMounted` prop을 재정의하며, `hidden="until-found"`를 사용해 DOM에서 요소를 제거하지 않고 숨깁니다. | | `keepMounted` | `boolean` | - | 패널이 숨겨진 동안 요소를 DOM에 유지할지 여부를 설정합니다.
`hiddenUntilFound`를 사용하는 경우 이 prop은 무시됩니다. | | `style` | `React.CSSProperties \| ((state: Collapsible.Panel.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Collapsible.Panel.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Dialog URL: /docs/components/dialog Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/dialog.mdx Dialog는 페이지 위에 모달 형태로 정보를 표시하거나 작업을 수행하도록 하는 컴포넌트입니다. *** title: 'Dialog' site\_name: 'Dialog - Vapor Core' description: 'Dialog는 페이지 위에 모달 형태로 정보를 표시하거나 작업을 수행하도록 하는 컴포넌트입니다.' -------------------------------------------------------------------- ```tsx import { Button, Dialog } from '@vapor-ui/core'; export default function DefaultDialog() { return ( }>클릭 알림 여기에 다이얼로그 본문 내용이 들어갑니다. 확인} /> ); } ``` ## Property *** ### Size Dialog의 크기를 설정합니다. ```tsx import { Button, Dialog, HStack, Text, VStack } from '@vapor-ui/core'; export default function DialogSize() { return ( md Medium Dialog} /> Medium Size Medium 크기의 다이얼로그입니다. 취소} /> 확인} /> lg Large Dialog} /> Large Size Large 크기의 다이얼로그입니다. 취소} /> 확인} /> xl Extra Large Dialog} /> Extra Large Size Extra Large 크기의 다이얼로그입니다. 취소} /> 확인} /> ); } ``` ### Modal Behavior Dialog의 모달 동작을 설정합니다. ```tsx import { Button, Dialog, HStack, Text, VStack } from '@vapor-ui/core'; export default function DialogModal() { return ( modal Modal Dialog} /> Modal Dialog 포커스가 다이얼로그 내부에 제한됩니다. 확인} /> non-modal Non-Modal Dialog} /> Non-Modal Dialog 배경의 다른 요소들과 상호작용할 수 있습니다. 확인} /> ); } ``` ## Examples *** ### Custom Usage Dialog 컴포넌트의 다양한 구성 패턴입니다. ```tsx import { Button, Dialog } from '@vapor-ui/core'; export default function Flexible() { return ( 확인 다이얼로그} /> 작업 확인 이 작업을 진행하시겠습니까? 이 작업은 되돌릴 수 없습니다. 취소} /> 삭제} /> ); } ``` ### Custom Overlay `Dialog.PortalPrimitive`, `Dialog.OverlayPrimitive`, `Dialog.PopupPrimitive`를 직접 조합하면 오버레이 스타일 등 레이어 구조를 제어할 수 있습니다. ```tsx import { Button, Dialog } from '@vapor-ui/core'; export default function DialogCustomOverlay() { return ( 열기} /> 커스텀 오버레이 Primitive를 직접 조합해 오버레이의 스타일을 제어한 예시입니다. 닫기} /> ); } ``` ## Props Table *** ### Dialog.Root | Prop | Type | Default | Description | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `size` | `md`, `lg`, `xl` | - | 다이얼로그 팝업의 너비를 지정합니다. 기본값: `'md'` | | `defaultOpen` | `boolean` | - | 다이얼로그의 초기 열림 여부를 지정합니다.

제어 컴포넌트로 사용하려면 `open` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: Dialog.Root.ChangeEventDetails) => void` | - | 다이얼로그가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 다이얼로그의 현재 열림 여부를 지정합니다. | | `closeOnClickOverlay` | `boolean` | `true` | `true`이면 오버레이를 클릭할 때 다이얼로그를 닫습니다. 기본값: `true` | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `unmount`: 다이얼로그를 수동으로 언마운트합니다.
외부에서 제어하는 닫기 애니메이션이 완료된 후 호출하십시오.
- `close`: 호출 시 다이얼로그를 명령형으로 닫습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((arg: { payload: unknown; }) => ReactNode)` | - | 다이얼로그의 콘텐츠를 지정합니다.
일반 React 노드이거나, 활성 트리거의 `payload`를 받는 렌더 함수를 사용할 수 있습니다. | | `defaultTriggerId` | `string`, `null` | - | 다이얼로그와 연결할 트리거의 ID를 지정합니다.
`defaultOpen` prop과 함께 사용하면 초기에 열린 상태의 다이얼로그를 만들 때 유용합니다. | | `handle` | `DialogHandle` | - | 다이얼로그를 트리거와 연결할 핸들을 지정합니다.
지정하면 외부 트리거에서 다이얼로그의 열림 상태를 설정할 수 있습니다.
`Dialog.createHandle()` 메서드로 생성할 수 있습니다. | | `modal` | `boolean`, `"trap-focus"` | - | 다이얼로그가 열릴 때 모달 상태로 진입할지 여부를 지정합니다.
- `true`: 사용자 인터랙션이 다이얼로그 내부로 제한됩니다. 포커스가 트랩되고, 문서 페이지 스크롤이 잠기며, 외부 요소에 대한 포인터 인터랙션이 비활성화됩니다.
- `false`: 문서 나머지 영역과의 사용자 인터랙션이 허용됩니다.
- `'trap-focus'`: 포커스가 다이얼로그 내부에 트랩되지만, 문서 페이지 스크롤은 잠기지 않으며 외부 포인터 인터랙션도 유지됩니다.

`modal`이 `true` 또는 `'trap-focus'`일 때, 터치 스크린 리더가 팝업에서 벗어날 수 있도록 `<Dialog.Popup>` 내부에 `<Dialog.Close>`를 렌더링하십시오. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 다이얼로그가 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러를 지정합니다. | | `triggerId` | `string`, `null` | - | 다이얼로그와 연결할 트리거의 ID를 지정합니다.
`open` prop과 함께 사용하면 제어 모드의 다이얼로그를 만들 때 유용합니다.
비제어 모드(즉, `open` prop을 설정하지 않은 경우)에서는 이 prop을 지정할 필요가 없습니다. | ### Dialog.Popup | Prop | Type | Default | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Dialog.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `overlayElement` | `ReactElement>` | - | 기본 `Dialog.OverlayPrimitive`를 교체합니다. 배경의 외형이나 동작을 커스터마이징할 때 사용합니다. | | `portalElement` | `ReactElement>` | - | 기본 `Dialog.PortalPrimitive`를 교체합니다. 포털 컨테이너의 동작을 커스터마이징할 때 사용합니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 닫힐 때 포커스를 이동할 요소를 지정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 열릴 때 포커스를 이동할 요소를 지정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 다이얼로그가 열린 경우에는 가상 키보드가 열리지 않도록 팝업 자체에 포커스가 설정됩니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Dialog.PortalPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Dialog.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Dialog.OverlayPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.OverlayPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `forceRender` | `boolean` | - | 중첩된 경우에도 배경을 강제로 렌더링할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Dialog.OverlayPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.OverlayPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Dialog.PopupPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Dialog.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 닫힐 때 포커스를 이동할 요소를 지정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 열릴 때 포커스를 이동할 요소를 지정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 다이얼로그가 열린 경우에는 가상 키보드가 열리지 않도록 팝업 자체에 포커스가 설정됩니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Trigger | Prop | Type | Default | Description | | -------------- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `handle` | `DialogHandle` | - | 트리거를 다이얼로그와 연결할 핸들을 지정합니다.
`Dialog.createHandle()` 메서드로 생성할 수 있습니다. | | `id` | `string` | - | 트리거의 ID를 지정합니다. 렌더링된 요소에 전달되는 것 외에도,
제어 모드에서 다이얼로그의 활성 트리거를 지정하는 데 사용됩니다(DialogRoot의 `triggerId` prop). | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `payload` | `unknown` | - | 다이얼로그가 열릴 때 전달할 payload를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Close | Prop | Type | Default | Description | | -------------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.Close.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Close.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Close.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Title | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.Title.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Title.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Title.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Description | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Dialog.Description.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Dialog.Description.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Dialog.Description.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Header | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogHeader.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogHeader.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Body | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogBody.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogBody.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Dialog.Footer | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogFooter.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogFooter.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Field URL: /docs/components/field Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/field.mdx Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다. *** title: Field site\_name: Field - Vapor Core description: Field는 폼 요소들을 감싸는 컨테이너 컴포넌트로, 라벨, 설명, 에러 메시지, 성공 메시지 등을 제공합니다. --------------------------------------------------------------------------- ```tsx 'use client'; import { Field, TextInput } from '@vapor-ui/core'; export default function DefaultField() { return ( Email We'll never share your email. ); } ``` ## Examples *** ### With Description Field에 대한 추가 설명을 표시합니다. ```tsx 'use client'; import { Field, TextInput, VStack } from '@vapor-ui/core'; export default function FieldDescription() { return ( Username Username This will be your public display name. ); } ``` ### Error and Success `Field.Error`와 `Field.Success`를 사용하여 유효성 검사 결과를 표시합니다. ```tsx 'use client'; import { Field, TextInput, VStack } from '@vapor-ui/core'; export default function FieldError() { return ( Email Please enter a valid email address. Email Email is valid. ); } ``` ### Required 필수 Field와 선택 Field를 구분하여 표시합니다. ```tsx 'use client'; import { Field, Text, TextInput, VStack } from '@vapor-ui/core'; export default function FieldRequired() { return ( 필수 입력 필드 * 이 필드는 반드시 입력해야 하는 필수 항목입니다. 이 필드는 필수 입력 항목입니다. 입력이 완료되었습니다. {/* Optional Field */} 선택 입력 필드{' '} (선택사항) 이 필드는 선택적으로 입력할 수 있습니다. ); } ``` ### Disabled disabled 속성을 사용하여 비활성화된 Field를 만들 수 있습니다. ```tsx 'use client'; import { Field, Text, TextInput, VStack } from '@vapor-ui/core'; export default function FieldDisabled() { return ( enabled Email Enter your email address. disabled Email Enter your email address. ); } ``` ### With RadioGroup RadioGroup과 Field를 함께 사용합니다. `Field.Item`을 사용하여 각 Radio 옵션을 라벨과 함께 그룹화할 수 있습니다. ```tsx 'use client'; import { Field, Radio, RadioGroup, VStack } from '@vapor-ui/core'; export default function FieldRadioGroup() { return ( 성별 남성 여성 기타 개인정보 보호를 위해 선택사항입니다. ); } ``` ### With Form Elements TextInput, Checkbox, Switch, Select 등 다양한 폼 요소와 함께 사용합니다. ```tsx 'use client'; import { Checkbox, Field, Select, Switch, TextInput, VStack } from '@vapor-ui/core'; export default function FieldWithInputs() { return ( Email Your primary contact email. Subscribe to newsletter Get the latest updates in your inbox. Push notifications Receive alerts on your device. 국가 {countries.map((country) => ( {country.label} ))} Select your country of residence. ); } const countries = [ { label: '대한민국', value: 'kr' }, { label: '미국', value: 'us' }, { label: '일본', value: 'jp' }, { label: '중국', value: 'cn' }, ]; ``` ## Property *** ### Validation `validationMode`를 통해 유효성 검사 타이밍을 설정합니다. `match` prop으로 특정 에러 타입에 대한 메시지를 표시합니다. ```tsx 'use client'; import { Field, TextInput, VStack } from '@vapor-ui/core'; export default function FieldValidation() { return ( Email Validated when you leave the field. Email is required. Please enter a valid email. Email looks good. Password Validated as you type. Minimum 8 characters. Password is required. Password must be at least 8 characters. Password is strong. ); } ``` ### Disabled Field의 비활성화 상태를 설정합니다. ```tsx 'use client'; import { Field, Text, TextInput, VStack } from '@vapor-ui/core'; export default function FieldDisabled() { return ( enabled Email Enter your email address. disabled Email Enter your email address. ); } ``` ## Props Table *** ### Field.Root | Prop | Type | Default | Description | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Field.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `validate`: 호출 시 필드의 유효성을 검사합니다. | | `dirty` | `boolean` | - | 필드의 값이 초기값에서 변경되었는지 여부를 지정합니다.
외부 라이브러리에서 필드 상태를 관리할 때 유용합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 인터랙션을 무시할지 여부를 지정합니다.
`<Field.Control>` 컴포넌트의 `disabled` prop보다 우선합니다. | | `invalid` | `boolean` | - | 필드가 유효하지 않은 상태인지 여부를 지정합니다.
외부 라이브러리에서 필드 상태를 관리할 때 유용합니다. | | `name` | `string` | - | 폼을 제출할 때 필드를 식별하는 이름을 지정합니다.
`<Field.Control>` 컴포넌트의 `name` prop보다 우선합니다. | | `style` | `React.CSSProperties \| ((state: Field.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `touched` | `boolean` | - | 필드가 터치된 상태인지 여부를 지정합니다.
외부 라이브러리에서 필드 상태를 관리할 때 유용합니다. | | `validate` | `(value: unknown, formValues: Record) => (string \| string[] \| Promise \| null)` | - | 커스텀 유효성 검사를 위한 함수입니다. 값이 유효하지 않으면 오류 메시지 문자열 또는 문자열 배열을 반환하고, 값이 유효하면 `null`을 반환합니다.
비동기 함수도 지원되지만, `validationMode="onSubmit"`을 사용하는 경우 폼 제출을 막지 않습니다. | | `validationDebounceTime` | `number` | - | `validationMode="onChange"`를 사용할 때 `validate` 콜백 사이의 대기 시간을 설정합니다. 밀리초 단위로 지정합니다. | | `validationMode` | `FormValidationMode` | - | 필드의 유효성 검사 시점을 설정합니다.
`<Form>`의 `validationMode` prop보다 이 값이 우선 적용됩니다.

- `onSubmit`: 폼이 제출될 때 유효성을 검사하며, 제출 후 변경 시 재검사합니다.
- `onBlur`: 컨트롤이 포커스를 잃을 때 유효성을 검사합니다.
- `onChange`: 컨트롤 값이 변경될 때마다 유효성을 검사합니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Field.Label | Prop | Type | Default | Description | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `foreground` | `white`, `inverse`, `primary-100`, `primary-200`, `secondary-100`, `success-100`, `success-200`, `warning-100`, `warning-200`, `danger-100`, `danger-200`, `hint-100`, `hint-200`, `contrast-100`, `contrast-200`, `secondary-200`, `normal-100`, `normal-200` | `normal-100` | | | `typography` | `body1`, `display1`, `display2`, `display3`, `display4`, `heading1`, `heading2`, `heading3`, `heading4`, `heading5`, `heading6`, `subtitle1`, `subtitle2`, `body2`, `body3`, `body4`, `code1`, `code2` | `body2` | | | `className` | `string \| ((state: Field.Label.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeLabel` | `boolean` | - | `render` prop으로 대체할 때 컴포넌트가 네이티브 `<label>` 요소를 렌더링할지 여부를 지정합니다.
렌더링되는 요소가 label이 아닌 경우(예: `<div>`) `false`로 설정하십시오.

이 옵션은 `<button>` 컨트롤(예: `<Select.Trigger>`, `<Combobox.Trigger>`)에서 label 동작이 상속되는 것을 방지할 때 유용합니다. 레이블에 호버할 때 버튼에 `:hover`가 적용되는 현상이나, 레이블 클릭이 버튼에 전달되는 현상을 방지할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Field.Label.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Label.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Field.Description | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Field.Description.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Field.Description.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Description.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Field.Error | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Field.Success.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `match` | `boolean`, `"badInput"`, `"customError"`, `"patternMismatch"`, `"rangeOverflow"`, `"rangeUnderflow"`, `"stepMismatch"`, `"tooLong"`, `"tooShort"`, `"typeMismatch"`, `"valueMissing"` | - | 필드의 [ValidityState](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState)에 따라 오류 메시지를 표시할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Field.Success.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Success.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Field.Success | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Field.Success.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `match` | `boolean`, `"valid"` | `valid` | 필드의 [ValidityState](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState)에 따라 성공 메시지 표시 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Field.Success.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Success.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Field.Item | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Field.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 래핑된 컨트롤이 사용자 인터랙션을 무시할지 여부를 지정합니다.
`<Field.Root>`의 `disabled` prop이 이 값보다 우선합니다. | | `style` | `React.CSSProperties \| ((state: Field.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Field.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # FloatingBar URL: /docs/components/floating-bar Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/floating-bar.mdx FloatingBar는 하단에 고정되어 주요 액션을 포함하는 컴포넌트입니다. *** title: 'FloatingBar' site\_name: 'FloatingBar - Vapor Core' description: 'FloatingBar는 하단에 고정되어 주요 액션을 포함하는 컴포넌트입니다.' --------------------------------------------------------- ```tsx import { FloatingBar } from '@vapor-ui/core'; export default function DefaultFloatingBar() { return ( Open Floating Bar This is the floating bar content. ); } ``` ## Examples *** ### Actions FloatingBar는 다양한 액션 요소를 담을 수 있습니다. ```tsx import { Box, Button, FloatingBar } from '@vapor-ui/core'; export default function FloatingBarWithActions() { return ( }>Open FloatingBar ); } ``` ### Controlled FloatingBar는 제어 형태로 사용되어, 여러 상태를 동시에 관리할 수 있습니다. ```tsx import { useState } from 'react'; import { Badge, Box, Button, Checkbox, Field, FloatingBar, IconButton, Text, VStack, } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; const options = [ { id: 'item1', label: 'First Item', defaultChecked: false }, { id: 'item2', label: 'Second Item', defaultChecked: false }, { id: 'item3', label: 'Third Item', defaultChecked: false }, ]; export default function FloatingBarControlled() { const [selectedItems, setSelectedItems] = useState(() => Object.fromEntries(options.map((option) => [option.id, option.defaultChecked])), ); const selectedCount = Object.values(selectedItems).filter(Boolean).length; const [open, setOpen] = useState(selectedCount > 0); const handleItemChange = (itemId: string, isChecked: boolean) => { setSelectedItems((prev) => { const newSelectedItems = { ...prev, [itemId]: isChecked }; const newSelectedCount = Object.values(newSelectedItems).filter(Boolean).length; setOpen(newSelectedCount > 0); return newSelectedItems; }); }; const handleSelectAll = () => { setSelectedItems(Object.fromEntries(options.map((option) => [option.id, true]))); setOpen(true); }; const handleClearAll = () => { setSelectedItems(Object.fromEntries(options.map((option) => [option.id, false]))); setOpen(false); }; return ( <> } $css={{ marginBottom: '$200' }}> Select options below to see the FloatingBar. {options.map((option) => ( handleItemChange(option.id, checked)} /> {option.label} ))} {selectedCount} Selected } > ); } ``` ## Props Table *** ### FloatingBar.Root | Prop | Type | Default | Description | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `defaultOpen` | `boolean` | - | 팝오버의 초기 열림 상태를 설정합니다.

제어 컴포넌트로 렌더링하려면 `open` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: FloatingBar.Root.ChangeEventDetails) => void` | - | 팝오버가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 팝오버가 현재 열려 있는지 여부를 지정합니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref입니다.
- `unmount`: 팝오버를 수동으로 언마운트합니다.
외부에서 제어하는 닫기 애니메이션이 완료된 후 호출하십시오.
- `close`: 호출 시 팝오버를 명령형으로 닫습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((arg: { payload: unknown; }) => ReactNode)` | - | 팝오버의 콘텐츠를 지정합니다.
일반 React 노드 또는 활성 트리거의 `payload`를 인수로 받는 렌더 함수를 사용할 수 있습니다. | | `defaultTriggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`defaultOpen` prop과 함께 사용하여 초기에 열린 상태의 팝오버를 만들 때 유용합니다. | | `handle` | `PopoverHandle` | - | 팝오버를 트리거와 연결하기 위한 핸들을 지정합니다.
지정하면 외부 트리거에서 팝오버의 열림 상태를 제어할 수 있습니다. | | `modal` | `boolean`, `"trap-focus"` | - | 팝오버가 열릴 때 모달 상태로 전환할지 여부를 설정합니다.
- `true`: 사용자 상호작용이 팝오버 내부로 제한됩니다. 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 상호작용이 비활성화됩니다.
- `false`: 문서의 나머지 영역과 상호작용할 수 있습니다.
- `'trap-focus'`: 포커스가 팝오버 내부에 갇히지만, 문서 페이지 스크롤은 잠기지 않으며 팝오버 외부의 포인터 상호작용도 유지됩니다.

`modal`이 `true`인 경우, `<Popover.Popup>` 내부에 `<Popover.Close>`가 렌더링될 때만 포커스 트래핑이 활성화됩니다. 필요하다면 Tailwind의 `sr-only` 유틸리티 등 직접 작성한 CSS로 시각적으로 숨길 수 있습니다.

`modal`이 `'trap-focus'`인 경우, 터치 스크린 리더가 팝업을 벗어날 수 있도록 `<Popover.Popup>` 내부에 `<Popover.Close>`를 렌더링하십시오. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 팝오버가 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `triggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`open` prop과 함께 사용하여 제어 팝오버를 만들 때 유용합니다.
비제어 팝오버(즉, `open` prop을 설정하지 않은 경우)에서는 이 prop을 지정할 필요가 없습니다. | ### FloatingBar.Trigger | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: FloatingBar.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeDelay` | `number` | - | 호버로 열린 팝오버를 닫기까지 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `delay` | `number` | - | 호버 시 팝오버가 열리기까지 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `handle` | `PopoverHandle` | - | 트리거를 팝오버와 연결하기 위한 핸들을 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링하는지 여부를 지정합니다.
렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하십시오. | | `openOnHover` | `boolean` | - | 트리거에 호버할 때 팝오버도 열릴지 여부를 지정합니다. | | `payload` | `unknown` | - | 팝오버가 열릴 때 전달할 페이로드를 지정합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### FloatingBar.Close | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: FloatingBar.Close.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.Close.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.Close.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### FloatingBar.Popup | Prop | Type | Default | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: FloatingBar.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | FloatingBar.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 FloatingBar.PortalPrimitive가 렌더링됩니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 열릴 때 포커스를 이동할 요소를 설정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 팝오버가 열린 경우에는 가상 키보드 열림을 방지하기 위해 팝업 자체에 포커스를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### FloatingBar.PortalPrimitive | Prop | Type | Default | Description | | ------------- | ----------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: FloatingBar.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### FloatingBar.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: FloatingBar.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | - | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | - | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### FloatingBar.PopupPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: FloatingBar.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 열릴 때 포커스를 이동할 요소를 설정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 팝오버가 열린 경우에는 가상 키보드 열림을 방지하기 위해 팝업 자체에 포커스를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: FloatingBar.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: FloatingBar.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Form URL: /docs/components/form Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/form.mdx Form은 사용자 입력을 수집하고 유효성 검사를 수행하는 폼 컨테이너입니다. *** title: 'Form' site\_name: 'Form - Vapor Core' description: 'Form은 사용자 입력을 수집하고 유효성 검사를 수행하는 폼 컨테이너입니다.' --------------------------------------------------------- ```tsx 'use client'; import { Button, Field, Form, TextInput, VStack } from '@vapor-ui/core'; export default function DefaultForm() { return (
{ event.preventDefault(); const formData = new FormData(event.currentTarget); console.log('Form submitted:', Object.fromEntries(formData)); }} > } $css={{ gap: '$050' }}> Username } $css={{ gap: '$050' }}> Email
); } ```
## Examples *** ### Validation HTML5 기본 유효성 검사를 활용하여 폼 필드를 검증합니다. ```tsx 'use client'; import { Button, Field, Form, TextInput, VStack } from '@vapor-ui/core'; export default function FormValidation() { return (
{ event.preventDefault(); const formData = new FormData(event.currentTarget); console.log('Form submitted:', Object.fromEntries(formData)); }} > } $css={{ gap: '$050' }}> Email Email is required Enter a valid email address } $css={{ gap: '$050' }}> Password Password is required Password must be at least 8 characters
); } ```
### With Field Components 다양한 입력 컴포넌트와 Field를 조합하여 완성된 폼을 구성합니다. ```tsx 'use client'; import { Button, Checkbox, Field, Form, HStack, Select, TextInput, VStack } from '@vapor-ui/core'; export default function FormWithField() { return (
{ event.preventDefault(); const formData = new FormData(event.currentTarget); console.log('Form submitted:', Object.fromEntries(formData)); }} > } $css={{ gap: '$050' }}> Full Name Name is required } $css={{ gap: '$050' }}> Email We'll send a confirmation to this email. Email is required Enter a valid email } $css={{ gap: '$050' }}> Role Developer Designer Manager } $css={{ gap: '$100', alignItems: 'center' }}> I agree to the terms and conditions You must accept the terms
); } ```
## Props Table *** ### Form | Prop | Type | Default | Description | | ---------------- | -------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Form.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref입니다.
- `validate`: 호출 시 모든 필드의 유효성을 검사합니다. 단일 필드만 검사하려면 필드 이름을 선택적으로 전달할 수 있습니다. | | `errors` | `Errors` | - | 외부에서 반환된 유효성 검사 오류를 지정합니다. 일반적으로 서버 또는 폼 액션의 제출 후 반환됩니다.
키는 `<Field.Root>`의 `name` 속성에 대응하고, 값은 해당 필드와 관련된 오류에 대응하는 객체여야 합니다. | | `onFormSubmit` | `(formValues: Form.SubmitEventDetails, eventDetails: Form.SubmitEventDetails) => void` | - | 폼이 제출될 때 호출되는 이벤트 핸들러입니다.
사용 시 네이티브 submit 이벤트에 `preventDefault()`가 호출됩니다. | | `style` | `React.CSSProperties \| ((state: Form.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `validationMode` | `FormValidationMode` | - | 폼의 유효성 검사 시점을 설정합니다.
`<Field.Root>`의 `validationMode` prop이 이 값보다 우선합니다.

- `onSubmit` (기본값): 폼 제출 시 필드의 유효성을 검사하며, 이후 변경 시마다 재검사합니다.
- `onBlur`: 필드가 포커스를 잃을 때 유효성을 검사합니다.
- `onChange`: 필드 값이 변경될 때마다 유효성을 검사합니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Form.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # IconButton URL: /docs/components/icon-button Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/icon-button.mdx IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다. *** title: 'IconButton' site\_name: 'IconButton - Vapor Core' description: 'IconButton은 특정 작업이나 기능을 나타내며, 텍스트 없이 아이콘만으로 명령을 전달하는 버튼입니다.' -------------------------------------------------------------------------- ```tsx import { IconButton } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function DefaultIconButton() { return ( ); } ``` ## Property *** ### Size IconButton의 크기를 설정합니다. ```tsx import { HStack, IconButton, Text, VStack } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function IconButtonSize() { return ( sm md lg xl ); } ``` ### ColorPalette IconButton의 색상을 설정합니다. ```tsx import { HStack, IconButton, Text, VStack } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function IconButtonColor() { return ( primary secondary success warning danger contrast ); } ``` ### Variant IconButton의 시각적 변형을 설정합니다. ```tsx import { HStack, IconButton, Text, VStack } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function IconButtonVariant() { return ( fill outline ghost ); } ``` ### Shape IconButton의 모양을 설정합니다. ```tsx import { HStack, IconButton, Text, VStack } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function IconButtonShape() { return ( square circle ); } ``` ### Disabled IconButton의 비활성화 상태를 설정합니다. ```tsx import { HStack, IconButton, Text, VStack } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function IconButtonDisabled() { return ( fill outline ghost ); } ``` ## Props Table *** ### IconButton | Prop | Type | Default | Description | | ----------------------- | ------------------------------------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `colorPalette` | `primary`, `secondary`, `success`, `warning`, `danger`, `contrast` | - | 버튼에 적용할 색상 팔레트를 지정합니다. 모든 시각적 variant의 배경, 텍스트, 테두리 색상을 설정합니다. 기본값: `'primary'` | | `shape` | `circle`, `square` | `square` | | | `size` | `sm`, `md`, `lg`, `xl` | - | 버튼의 크기를 지정합니다. 높이, 패딩, 타이포그래피를 설정합니다. 기본값: `'md'` | | `variant` | `fill`, `outline`, `ghost` | - | 버튼의 시각적 스타일을 지정합니다. 기본값: `'fill'` | | `className` | `string \| ((state: IconButton.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `focusableWhenDisabled` | `boolean` | - | 버튼이 비활성화 상태일 때 포커스 가능 여부를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: IconButton.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: IconButton.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # InputGroup URL: /docs/components/input-group Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/input-group.mdx InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다. *** title: 'InputGroup' site\_name: 'InputGroup - Vapor Core' description: 'InputGroup은 입력 필드(TextInput, Textarea)와 관련 요소들을 그룹화하여 문자 수 카운터와 같은 추가 기능을 제공합니다.' ----------------------------------------------------------------------------------------------- ```tsx 'use client'; import { InputGroup, TextInput, VStack } from '@vapor-ui/core'; export default function DefaultInputGroup() { return ( ); } ``` ## Examples *** ### Custom Counter 커스텀 카운터 UI를 구현합니다. ```tsx 'use client'; import { InputGroup, Text, TextInput, VStack } from '@vapor-ui/core'; export default function InputGroupCustomCounter() { return ( 커스텀 카운터 예시 1 {({ count, maxLength }) => `${count} of ${maxLength} characters`} 커스텀 카운터 예시 2 {({ count, maxLength, value }) => ( maxLength * 0.8 ? 'danger-100' : 'hint-100' } > {count}/{maxLength} {value.length > 50 && '(50자 초과)'} )} ); } ``` ## Props Table *** ### InputGroup.Root | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: InputGroupRoot.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: InputGroupRoot.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### InputGroup.Counter | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| ReactPortal \| Promise \| ((props: RenderProps) => ReactNode)` | - | | | `className` | `string \| ((state: InputGroupCounter.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: InputGroupCounter.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Menu URL: /docs/components/menu Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/menu.mdx 드롭다운 Menu와 컨텍스트 Menu를 제공하는 컴포넌트입니다 *** title: 'Menu' site\_name: 'Menu - Vapor Core' description: '드롭다운 Menu와 컨텍스트 Menu를 제공하는 컴포넌트입니다' ------------------------------------------------- ```tsx 'use client'; import { Button, Menu } from '@vapor-ui/core'; export default function DefaultMenu() { return ( 메뉴 열기} /> 새 파일 새 폴더 복사 붙여넣기 삭제 ); } ``` ## Property *** ### Disabled Menu의 비활성화 상태를 설정합니다. ```tsx 'use client'; import { Button, HStack, Menu, Text, VStack } from '@vapor-ui/core'; export default function MenuDisabled() { return ( disabled item 일반 메뉴} /> 활성 아이템 1 비활성 아이템 활성 아이템 2 비활성 아이템 2 활성 아이템 3 disabled menu 비활성 메뉴} /> 아이템 1 아이템 2 아이템 3 ); } ``` ## Examples *** ### Positioning Menu의 표시 위치를 설정합니다. ```tsx 'use client'; import { Button, HStack, Menu, Text, VStack } from '@vapor-ui/core'; export default function MenuPositioning() { return ( top 상단 메뉴} /> 상단 아이템 1 상단 아이템 2 상단 아이템 3 right 우측 메뉴} /> 우측 아이템 1 우측 아이템 2 우측 아이템 3 bottom 하단 메뉴} /> 하단 아이템 1 하단 아이템 2 하단 아이템 3 left 좌측 메뉴} /> 좌측 아이템 1 좌측 아이템 2 좌측 아이템 3 ); } ``` ### Groups Menu 아이템을 그룹화합니다. ```tsx 'use client'; import { Button, Menu } from '@vapor-ui/core'; export default function MenuGroups() { return ( 그룹 메뉴} /> 파일 새 파일 파일 열기 파일 저장 편집 복사 붙여넣기 잘라내기 도구 설정 도움말 ); } ``` ### With Checkbox Items Checkbox Item을 사용합니다. ```tsx 'use client'; import { useState } from 'react'; import { Button, Menu } from '@vapor-ui/core'; export default function MenuCheckbox() { const [showToolbar, setShowToolbar] = useState(true); const [showSidebar, setShowSidebar] = useState(false); const [showStatusbar, setShowStatusbar] = useState(true); return ( 보기 설정} /> 보기 옵션 툴바 표시 사이드바 표시 상태바 표시 ); } ``` ### With Radio Items Radio Item을 사용합니다. ```tsx 'use client'; import { useState } from 'react'; import { Button, Menu } from '@vapor-ui/core'; export default function MenuRadio() { const [fontSize, setFontSize] = useState('medium'); return ( 글꼴 크기} /> 글꼴 크기 선택 작게 (12px) 보통 (14px) 크게 (16px) 매우 크게 (18px) ); } ``` ### With Submenu Submenu를 구성할 수 있습니다. ```tsx 'use client'; import { Button, Menu } from '@vapor-ui/core'; export default function MenuSubmenu() { return ( 서브메뉴} /> 새 파일 파일 열기 최근 파일 document.txt presentation.pptx spreadsheet.xlsx 더 많은 파일... 내보내기 PDF로 내보내기 이미지로 내보내기 HTML로 내보내기 종료 ); } ``` ## Props Table *** ### Menu.Root | Prop | Type | Default | Description | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `defaultOpen` | `boolean` | - | 메뉴의 초기 열림 여부를 지정합니다.

제어 메뉴를 렌더링하려면 `open` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: Menu.RadioGroup.ChangeEventDetails) => void` | - | 메뉴가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 메뉴가 현재 열려 있는지 여부를 지정합니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `unmount`: 메뉴를 수동으로 언마운트합니다. 외부에서 제어하는 닫힘 애니메이션이 완료된 후 호출하십시오.
- `close`: 지정하면 메뉴를 명령형으로 닫을 수 있습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((arg: { payload: unknown; }) => ReactNode)` | - | 팝오버의 콘텐츠를 지정합니다.
일반 React 노드 또는 활성 트리거의 `payload`를 인수로 받는 렌더 함수를 사용할 수 있습니다. | | `closeParentOnEsc` | `boolean` | - | 서브메뉴에서 Escape 키를 눌렀을 때 전체 메뉴를 닫을지, 현재 자식 메뉴만 닫을지를 설정합니다. | | `defaultTriggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`defaultOpen` prop과 함께 사용하여 초기에 열린 상태의 팝오버를 만들 때 유용합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `handle` | `MenuHandle` | - | 메뉴를 트리거와 연결하는 핸들입니다.
지정하면 외부 트리거가 메뉴의 열림 상태를 설정할 수 있습니다. | | `highlightItemOnHover` | `boolean` | - | 포인터를 항목 위로 이동할 때 해당 항목을 강조 표시할지 여부를 설정합니다.
이 prop을 비활성화하면 CSS `:hover`와 `:focus`(`data-highlighted`) 상태를 구분할 수 있습니다. | | `loopFocus` | `boolean` | - | 화살표 키로 목록의 끝에 도달했을 때 키보드 포커스를 첫 번째 항목으로 순환할지 여부를 설정합니다. | | `modal` | `boolean` | - | 메뉴가 열릴 때 모달 상태로 진입할지 여부를 설정합니다.
- `true`: 사용자 상호작용이 메뉴로 제한되며, 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 상호작용이 비활성화됩니다.
- `false`: 문서의 나머지 부분과의 사용자 상호작용이 허용됩니다. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 메뉴가 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `orientation` | `MenuRootOrientation` | - | 메뉴의 시각적 방향을 설정합니다.
로빙 포커스가 위/아래 또는 왼쪽/오른쪽 화살표 키를 사용할지 결정합니다. | | `triggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`open` prop과 함께 사용하여 제어 팝오버를 만들 때 유용합니다.
비제어 팝오버(즉, `open` prop을 설정하지 않은 경우)에서는 이 prop을 지정할 필요가 없습니다. | ### Menu.Trigger | Prop | Type | Default | Description | | -------------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `closeDelay` | `number` | - | 호버로 열린 메뉴를 닫기 전에 대기할 시간을 지정합니다.
밀리초 단위로 설정합니다.

`openOnHover` prop이 필요합니다. | | `delay` | `number` | - | 호버 시 메뉴를 열기 전에 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `handle` | `MenuHandle` | - | 트리거를 메뉴와 연결하는 핸들을 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `openOnHover` | `boolean` | - | 트리거를 호버할 때도 메뉴를 열지 여부를 설정합니다. | | `payload` | `unknown` | - | 메뉴가 열릴 때 메뉴에 전달할 페이로드를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.Popup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.SubmenuPopup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | Menu.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Menu.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | Menu.PositionerPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Menu.PositionerPrimitive가 렌더링됩니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)을 인수로 받아 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `id` | `string` | - | | | `style` | `React.CSSProperties \| ((state: Menu.SubmenuPopup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuPopup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.PortalPrimitive | Prop | Type | Default | Description | | ------------- | ---------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | `start` | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | `bottom` | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | `4` | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.PopupPrimitive | Prop | Type | Default | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.SubmenuPopup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)을 인수로 받아 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `id` | `string` | - | | | `style` | `React.CSSProperties \| ((state: Menu.SubmenuPopup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuPopup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.Item | Prop | Type | Default | Description | | -------------- | ----------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeOnClick` | `boolean` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | 메뉴 항목의 클릭 핸들러를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.Separator | Prop | Type | Default | Description | | ------------- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.Separator.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `orientation` | `Orientation` | - | 구분선의 방향을 설정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.Separator.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.Separator.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.Group | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.Group.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | 컴포넌트의 콘텐츠를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.Group.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.Group.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.GroupLabel | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.GroupLabel.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Menu.GroupLabel.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.GroupLabel.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.SubmenuRoot | Prop | Type | Default | Description | | ---------------------- | ------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `defaultOpen` | `boolean` | - | 메뉴의 초기 열림 여부를 지정합니다.

제어 메뉴를 렌더링하려면 `open` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: Menu.RadioGroup.ChangeEventDetails) => void` | - | 메뉴가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 메뉴가 현재 열려 있는지 여부를 지정합니다. | | `className` | `string \| ((state: Menu.SubmenuRoot.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `CSSProperties \| ((state: Menu.SubmenuRoot.State) => (CSSProperties \| undefined))` | - | 요소에 적용할 스타일 객체, 또는 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수를 지정합니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `unmount`: 메뉴를 수동으로 언마운트합니다. 외부에서 제어하는 닫힘 애니메이션이 완료된 후 호출하십시오.
- `close`: 지정하면 메뉴를 명령형으로 닫을 수 있습니다. | | `children` | `ReactNode` | - | 서브메뉴의 콘텐츠를 지정합니다. | | `closeParentOnEsc` | `boolean` | `false` | 서브메뉴에서 Escape 키를 눌렀을 때 전체 메뉴를 닫을지, 현재 자식 메뉴만 닫을지를 설정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `highlightItemOnHover` | `boolean` | - | 포인터를 항목 위로 이동할 때 해당 항목을 강조 표시할지 여부를 설정합니다.
이 prop을 비활성화하면 CSS `:hover`와 `:focus`(`data-highlighted`) 상태를 구분할 수 있습니다. | | `loopFocus` | `boolean` | - | 화살표 키로 목록의 끝에 도달했을 때 키보드 포커스를 첫 번째 항목으로 순환할지 여부를 설정합니다. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 메뉴가 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `orientation` | `MenuRootOrientation` | - | 메뉴의 시각적 방향을 설정합니다.
로빙 포커스가 위/아래 또는 왼쪽/오른쪽 화살표 키를 사용할지 결정합니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuRoot.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.SubmenuTriggerItem | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.SubmenuTriggerItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeDelay` | `number` | - | 호버로 열린 메뉴를 닫기 전에 대기할 시간을 지정합니다.
밀리초 단위로 설정합니다.

`openOnHover` prop이 필요합니다. | | `delay` | `number` | - | 호버 시 메뉴를 열기 전에 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | | | `openOnHover` | `boolean` | - | 트리거를 호버할 때도 메뉴를 열지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.SubmenuTriggerItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuTriggerItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.SubmenuPopup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.SubmenuPopup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | Menu.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Menu.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | Menu.PositionerPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Menu.PositionerPrimitive가 렌더링됩니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)을 인수로 받아 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `id` | `string` | - | | | `style` | `React.CSSProperties \| ((state: Menu.SubmenuPopup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuPopup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.SubmenuPopupPrimitive | Prop | Type | Default | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Menu.SubmenuPopup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 메뉴가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)을 인수로 받아 호출됩니다. 포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `id` | `string` | - | | | `style` | `React.CSSProperties \| ((state: Menu.SubmenuPopup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.SubmenuPopup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.CheckboxItem | Prop | Type | Default | Description | | ----------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `checked` | `boolean` | - | 체크박스 항목이 현재 선택되어 있는지 여부를 지정합니다.

비제어 체크박스 항목을 렌더링하려면 `defaultChecked` prop을 사용하십시오. | | `defaultChecked` | `boolean` | - | 체크박스 항목의 초기 선택 여부를 지정합니다.

제어 체크박스 항목을 렌더링하려면 `checked` prop을 사용하십시오. | | `onCheckedChange` | `(checked: boolean, eventDetails: Menu.RadioGroup.ChangeEventDetails) => void` | - | 체크박스 항목이 선택되거나 해제될 때 호출되는 이벤트 핸들러입니다. | | `className` | `string \| ((state: Menu.CheckboxItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeOnClick` | `boolean` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | 메뉴 항목의 클릭 핸들러를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.CheckboxItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.CheckboxItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.CheckboxItemPrimitive | Prop | Type | Default | Description | | ----------------- | ------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `checked` | `boolean` | - | 체크박스 항목이 현재 선택되어 있는지 여부를 지정합니다.

비제어 체크박스 항목을 렌더링하려면 `defaultChecked` prop을 사용하십시오. | | `defaultChecked` | `boolean` | - | 체크박스 항목의 초기 선택 여부를 지정합니다.

제어 체크박스 항목을 렌더링하려면 `checked` prop을 사용하십시오. | | `onCheckedChange` | `(checked: boolean, eventDetails: Menu.RadioGroup.ChangeEventDetails) => void` | - | 체크박스 항목이 선택되거나 해제될 때 호출되는 이벤트 핸들러입니다. | | `className` | `string \| ((state: Menu.CheckboxItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeOnClick` | `boolean` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | 메뉴 항목의 클릭 핸들러를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.CheckboxItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.CheckboxItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.CheckboxItemIndicatorPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.CheckboxItemIndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | - | 체크박스 항목이 선택되지 않은 상태일 때 HTML 요소를 DOM에 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.CheckboxItemIndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.CheckboxItemIndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.RadioGroup | Prop | Type | Default | Description | | --------------- | ----------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `defaultValue` | `any` | - | 초기에 선택될 라디오 항목의 비제어 값을 지정합니다.

제어 라디오 그룹을 렌더링하려면 `value` prop을 사용하십시오. | | `onValueChange` | `(value: any, eventDetails: Menu.RadioGroup.ChangeEventDetails) => void` | - | 선택된 값이 변경될 때 호출되는 함수를 지정합니다. | | `value` | `any` | - | 현재 선택되어야 할 라디오 항목의 제어 값을 지정합니다.

비제어 라디오 그룹을 렌더링하려면 `defaultValue` prop을 사용하십시오. | | `className` | `string \| ((state: Menu.RadioGroup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | 컴포넌트의 콘텐츠를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.RadioGroup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.RadioGroup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Menu.RadioItem | Prop | Type | Default | Description | | -------------- | ---------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `any` | - | 라디오 항목의 값을 지정합니다.
항목이 선택될 때 MenuRadioGroup에 설정될 값입니다. | | `className` | `string \| ((state: Menu.RadioItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeOnClick` | `boolean` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | 메뉴 항목의 클릭 핸들러를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.RadioItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.RadioItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.RadioItemPrimitive | Prop | Type | Default | Description | | -------------- | ---------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `any` | - | 라디오 항목의 값을 지정합니다.
항목이 선택될 때 MenuRadioGroup에 설정될 값입니다. | | `className` | `string \| ((state: Menu.RadioItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeOnClick` | `boolean` | - | 항목을 클릭했을 때 메뉴를 닫을지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `id` | `string` | - | | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목을 매칭할 때 사용할 텍스트 레이블을 재정의합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `onClick` | `(event: BaseUIEvent>) => void` | - | 메뉴 항목의 클릭 핸들러를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.RadioItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.RadioItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Menu.RadioItemIndicatorPrimitive | Prop | Type | Default | Description | | ------------- | ---------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Menu.RadioItemIndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | - | 라디오 항목이 비활성 상태일 때 HTML 요소를 DOM에 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Menu.RadioItemIndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Menu.RadioItemIndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # MultiSelect URL: /docs/components/multi-select Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/multi-select.mdx MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다. *** title: 'MultiSelect' site\_name: 'MultiSelect - Vapor Core' description: 'MultiSelect는 사용자가 여러 옵션 중에서 다중 선택할 수 있는 드롭다운 컴포넌트입니다. 선택된 값들은 배지 형태로 표시되며, 태그 선택, 필터링, 카테고리 선택 등에 사용됩니다.' ----------------------------------------------------------------------------------------------------------------------- ```tsx import { MultiSelect } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; export default function DefaultMultiSelect() { return ( {fonts.map((font) => ( {font.label} ))} ); } ``` ## Property *** ### Size MultiSelect의 크기를 설정합니다. ```tsx import { HStack, MultiSelect, Text, VStack } from '@vapor-ui/core'; const options = [ { label: '옵션 1', value: 'option1' }, { label: '옵션 2', value: 'option2' }, { label: '옵션 3', value: 'option3' }, ]; export default function MultiSelectSize() { return ( sm md lg xl ); } const MultiSelectTemplate = (props: MultiSelect.Root.Props) => { return ( {options.map((option) => ( {option.label} ))} ); }; ``` ### Controlled State MultiSelect의 선택 상태를 제어합니다. ```tsx 'use client'; import { useState } from 'react'; import { Button, HStack, MultiSelect, Text, VStack } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; export default function MultiSelectControlled() { const [value, setValue] = useState([]); const handleValueChange = (newValue: unknown) => { setValue(newValue as string[]); }; return ( {fonts.map((font) => ( {font.label} ))} 선택된 값:{' '} {value.length > 0 ? value.join(', ') : '없음'} ); } ``` ### States MultiSelect의 다양한 상태를 설정합니다. ```tsx import { HStack, MultiSelect, Text, VStack } from '@vapor-ui/core'; const options = [ { label: '옵션 1', value: 'option1' }, { label: '옵션 2', value: 'option2' }, { label: '옵션 3', value: 'option3' }, ]; export default function MultiSelectStates() { return ( default disabled readOnly invalid ); } export const MultiSelectTemplate = (props: MultiSelect.Root.Props) => { return ( {options.map((option) => ( {option.label} ))} ); }; ``` ## Examples *** ### Items Configuration 다양한 형태의 아이템 데이터를 사용합니다. ```tsx import { MultiSelect, Text, VStack } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; const languages = { javascript: 'JavaScript', typescript: 'TypeScript', python: 'Python', java: 'Java', go: 'Go', }; export default function MultiSelectItems() { return ( 배열 형태의 아이템 {fonts.map((font) => ( {font.label} ))} 객체 형태의 아이템 {Object.entries(languages).map(([value, label]) => ( {label} ))} ); } ``` ### Grouping Options 옵션을 그룹으로 묶어 구조화합니다. ```tsx import { Box, MultiSelect } from '@vapor-ui/core'; export default function MultiSelectGrouping() { return ( } $css={{ width: '400px' }} /> 프론트엔드 React Vue Angular Svelte 백엔드 Node.js Python Java Go 데이터베이스 MySQL PostgreSQL MongoDB Redis ); } ``` ### Custom Value Display MultiSelect.Value에 함수형 children을 제공하여 선택된 값들의 표시 방법을 커스터마이징할 수 있습니다. 기본적으로는 배지 형태로 표시되지만, 문자열이나 커스텀 컴포넌트로 변경할 수 있습니다. ```tsx import { Badge, Flex, HStack, MultiSelect, Text, VStack } from '@vapor-ui/core'; const languages = { javascript: 'JavaScript', typescript: 'TypeScript', python: 'Python', java: 'Java', go: 'Go', rust: 'Rust', }; const renderRestValue = (value: string[]) => { if (!value.length) { return '언어 선택'; } const displayValues = value.slice(0, 2); const remainingCount = value.length - 2; return ( {displayValues.map((val) => ( {languages[val as keyof typeof languages]} ))} {remainingCount > 0 && ( +{remainingCount} more )} ); }; const renderStringValue = (value: string[]) => { if (!value.length) { return '언어 선택'; } return value.map((v) => languages[v as keyof typeof languages]).join(', '); }; export default function MultiSelectCustomValue() { return ( 커스텀 값 표시 (최대 2개 + 더보기) {renderRestValue} {Object.entries(languages).map(([value, label]) => ( {label} ))} 문자열 형태 표시 {renderStringValue} {Object.entries(languages).map(([value, label]) => ( {label} ))} ); } ``` ## Props Table *** ### MultiSelect.Root | Prop | Type | Default | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `invalid` | `boolean` | - | | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `defaultOpen` | `boolean` | - | 셀렉트 팝업의 초기 열림 여부를 지정합니다.

제어 방식으로 렌더링하려면 `open` prop을 사용하십시오. | | `defaultValue` | `Value[] \| null` | - | 셀렉트가 처음 렌더링될 때의 비제어 값을 지정합니다.

제어 방식으로 렌더링하려면 `value` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: MultiSelect.Root.ChangeEventDetails) => void` | - | 셀렉트 팝업이 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `onValueChange` | `(value: Value[], eventDetails: MultiSelect.Root.ChangeEventDetails) => void` | - | 셀렉트의 값이 변경될 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 셀렉트 팝업의 현재 열림 여부를 지정합니다. | | `value` | `Value[] \| null` | - | 셀렉트의 값을 지정합니다. 제어 방식으로 사용할 때 설정합니다. | | `placeholder` | `ReactNode` | - | | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `unmount`: 셀렉트를 수동으로 언마운트합니다.
외부에서 제어하는 닫힘 애니메이션이 완료된 후 호출하십시오. | | `autoComplete` | `string` | - | 브라우저 자동 완성에 대한 힌트를 제공합니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 숨겨진 input을 소유하는 폼을 식별합니다.
셀렉트가 폼 외부에 렌더링될 때 유용합니다. | | `highlightItemOnHover` | `boolean` | - | 포인터를 항목 위로 이동할 때 해당 항목을 강조 표시할지 여부를 설정합니다.
이 prop을 비활성화하면 CSS `:hover`와 `:focus`(`data-highlighted`) 상태를 구분할 수 있습니다. | | `id` | `string` | - | Select의 id를 지정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `isItemEqualToValue` | `(itemValue: Value, value: Value) => boolean` | - | 셀렉트 항목의 값이 현재 선택된 값과 일치하는지 판단하는 커스텀 비교 로직을 지정합니다. 항목 값이 참조가 일치하지 않는 객체일 때 유용합니다.
기본값은 `Object.is` 비교입니다. | | `items` | `Record \| readonly { label: React.ReactNode; value: any; }[] \| readonly Group[]` | - | 셀렉트 팝업에 렌더링되는 항목의 데이터 구조를 지정합니다.
지정하면 `<Select.Value>`가 원시 값 대신 선택된 항목의 레이블을 렌더링합니다. | | `itemToStringLabel` | `(itemValue: Value) => string` | - | 항목 값이 객체인 경우(`<Select.Item value={object}>`), 이 함수는 객체 값을 트리거에 표시할 문자열로 변환합니다.
객체의 형태가 `{ value, label }`이면 이 prop을 지정하지 않아도 label이 자동으로 사용됩니다. | | `itemToStringValue` | `(itemValue: Value) => string` | - | 항목 값이 객체인 경우(`<Select.Item value={object}>`), 이 함수는 객체 값을 폼 제출 시 사용할 문자열로 변환합니다.
객체의 형태가 `{ value, label }`이면 이 prop을 지정하지 않아도 value가 자동으로 사용됩니다. | | `modal` | `boolean` | - | 셀렉트가 열릴 때 모달 상태로 진입할지 여부를 설정합니다.
- `true`: 사용자 인터랙션이 셀렉트로 제한되며, 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 인터랙션이 비활성화됩니다.
- `false`: 나머지 문서와의 사용자 인터랙션이 허용됩니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 셀렉트 팝업이 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `readOnly` | `boolean` | - | 사용자가 셀렉트 팝업에서 다른 옵션을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | ### MultiSelect.Trigger | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.TriggerPrimitive | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `nativeButton` | `boolean` | `true` | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Trigger.State) => ReactElement)` | `<button />` | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.TriggerIconPrimitive | Prop | Type | Default | Description | | ----------- | ---------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.TriggerIconPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.TriggerIconPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.TriggerIconPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.ValuePrimitive | Prop | Type | Default | Description | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.ValuePrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((value: any) => ReactNode)` | - | 선택된 값을 형식화하는 `ReactNode`를 반환하는 함수를 지정합니다. | | `placeholder` | `ReactNode` | - | 값이 선택되지 않았을 때 표시할 플레이스홀더 값을 지정합니다.
`children`이 지정된 경우 또는 `items`의 null 항목 레이블이 있는 경우 해당 값으로 대체됩니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.ValuePrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.ValuePrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.PlaceholderPrimitive | Prop | Type | Default | Description | | ----------- | ---------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelectPlaceholderPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelectPlaceholderPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### MultiSelect.Popup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | MultiSelect.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 MultiSelect.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | MultiSelect.PositionerPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 MultiSelect.PositionerPrimitive가 렌더링됩니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 셀렉트 팝업이 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: 해당 ref 요소로 포커스를 이동합니다.
- `function`: 상호작용 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.PortalPrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: MultiSelect.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | `start` | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignItemWithTrigger` | `boolean` | `false` | 포지셔너가 트리거와 겹쳐서 선택된 항목의 텍스트가 트리거의 값 텍스트와 정렬되도록 할지 여부를 지정합니다. 이 옵션은 마우스 입력에만 적용되며, 공간이 충분하지 않으면 자동으로 비활성화됩니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | `bottom` | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | `4` | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.PopupPrimitive | Prop | Type | Default | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 셀렉트 팝업이 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: 해당 ref 요소로 포커스를 이동합니다.
- `function`: 상호작용 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### MultiSelect.Item | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------- | | `value` | `any` | - | 이 셀렉트 항목을 식별하는 고유한 값을 지정합니다. | | `className` | `string \| ((state: MultiSelect.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 매칭될 때 사용할 텍스트 레이블을 지정합니다.

제공하지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.ItemPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------- | | `value` | `any` | - | 이 셀렉트 항목을 식별하는 고유한 값을 지정합니다. | | `className` | `string \| ((state: MultiSelect.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 매칭될 때 사용할 텍스트 레이블을 지정합니다.

제공하지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### MultiSelect.ItemIndicatorPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.ItemIndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `keepMounted` | `boolean` | - | 항목이 선택되지 않은 상태에서도 HTML 요소를 DOM에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.ItemIndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.ItemIndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### MultiSelect.Separator | Prop | Type | Default | Description | | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Separator.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `orientation` | `Orientation` | - | 구분선의 방향을 설정합니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Separator.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Separator.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### MultiSelect.Group | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.Group.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.Group.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.Group.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### MultiSelect.GroupLabel | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: MultiSelect.GroupLabel.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: MultiSelect.GroupLabel.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: MultiSelect.GroupLabel.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # NavigationMenu URL: /docs/components/navigation-menu Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/navigation-menu.mdx 여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다. *** title: 'NavigationMenu' site\_name: 'NavigationMenu - Vapor Core' description: '여러 콘텐츠 섹션 간에 전환할 수 있도록 돕는 요소로 클릭 시 페이지가 이동합니다.' ------------------------------------------------------------- ```tsx import { NavigationMenu } from '@vapor-ui/core'; export default function DefaultNavigationMenu() { return ( Default Link Current Link Disabled Link ); } ``` ## Property *** ### Size NavigationMenu의 크기를 설정합니다. ```tsx import { HStack, NavigationMenu, Text, VStack } from '@vapor-ui/core'; export default function NavigationMenuSize() { return ( sm Home About md Home About lg Home About xl Home About ); } ``` ### Direction NavigationMenu의 방향을 설정합니다. ```tsx import { HStack, NavigationMenu, Text, VStack } from '@vapor-ui/core'; export default function NavigationMenuDirection() { return ( horizontal Home About Contact vertical Home About Contact ); } ``` ### Disabled NavigationMenu의 비활성화 상태를 설정합니다. ```tsx import { NavigationMenu } from '@vapor-ui/core'; export default function NavigationMenuDisabled() { return (

기본 상태와 비활성화 상태

활성 링크 비활성화 링크 다른 활성 링크

현재 페이지와 비활성화 상태

현재 페이지 비활성화 링크 연락처
); } ```
### Current NavigationMenu의 현재 페이지 상태를 설정합니다. ```tsx import { NavigationMenu } from '@vapor-ui/core'; export default function NavigationMenuCurrent() { return (

현재 페이지 표시

제품 (현재 페이지) 서비스 회사소개
); } ```
## Examples *** ### With Icons 아이콘과 함께 사용합니다. ```tsx import { NavigationMenu } from '@vapor-ui/core'; import { HomeIcon, SettingIcon, StarIcon, UserIcon } from '@vapor-ui/icons'; export default function NavigationMenuWithIcon() { return (

아이콘과 텍스트 조합

즐겨찾기 프로필 설정

아이콘만 사용

세로 방향에서의 아이콘

대시보드 즐겨찾기 사용자 관리 시스템 설정
); } ```
### With Popup 팝오버 형태로 사용합니다. ```tsx import { NavigationMenu, VStack } from '@vapor-ui/core'; export default function NavigationMenuSelected() { return (

선택된 상태 표시

아이템 1 내용물 1 아이템 2 내용물 2 아이템 3 내용물 3
); } ```
### Flexible Usage NavigationMenu의 모든 프리셋 컴포넌트를 분리하여 사용합니다. ```tsx import { NavigationMenu } from '@vapor-ui/core'; export default function NavigationMenuSelected() { return (
아이템 내용물
); } ```
## Props Table *** ### NavigationMenu.Root | Prop | Type | Default | Description | | ---------------------- | --------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `direction` | `horizontal`, `vertical` | - | | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `defaultValue` | `unknown` | - | 초기에 선택될 항목의 비제어 값을 지정합니다.

제어 내비게이션 메뉴를 렌더링하려면 `value` prop을 사용하십시오. | | `onValueChange` | `(value: unknown, eventDetails: NavigationMenu.Root.ChangeEventDetails) => void` | - | 값이 변경될 때 호출되는 콜백입니다. | | `value` | `unknown` | - | 현재 열려 있어야 하는 내비게이션 메뉴 항목의 제어 값을 지정합니다.
null이 아닌 값이면 메뉴가 열리고, null이면 메뉴가 닫힙니다.

비제어 내비게이션 메뉴를 렌더링하려면 `defaultValue` prop을 사용하십시오. | | `className` | `string \| ((state: NavigationMenu.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다. | | `closeDelay` | `number` | - | 내비게이션 팝업을 닫기 전에 대기할 시간을 지정합니다. 밀리초 단위로 설정합니다. | | `delay` | `number` | - | 내비게이션 팝업을 열기 전에 대기할 시간을 지정합니다. 밀리초 단위로 설정합니다. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 내비게이션 메뉴가 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `orientation` | `horizontal`, `vertical` | - | 내비게이션 메뉴의 방향을 지정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.List | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.List.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.List.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.List.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.Item | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `value` | `any` | - | 이 내비게이션 메뉴 항목을 식별하는 고유 값을 지정합니다.
값을 지정하지 않으면 고유 ID가 자동으로 생성됩니다.
내비게이션 메뉴를 프로그래밍 방식으로 조작할 때 사용합니다. | | `className` | `string \| ((state: NavigationMenu.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.Link | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenuLinkState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `current` | `boolean` | - | 링크가 현재 활성화된 페이지인지 여부를 지정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `closeOnClick` | `boolean` | - | 링크를 클릭했을 때 내비게이션 메뉴를 닫을지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenuLinkState) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenuLinkState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.Trigger | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.TriggerPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.TriggerIndicatorPrimitive | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.TriggerIndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.TriggerIndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.TriggerIndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.Content | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.Content.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | - | 팝업이 닫혀 있는 동안 콘텐츠를 DOM에 유지할지 여부를 지정합니다.
웹 크롤러를 위한 서버 사이드 렌더링 시 콘텐츠가 존재하도록 보장합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Content.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Content.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.PortalPrimitive | Prop | Type | Default | Description | | ------------- | -------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: NavigationMenu.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | `center` | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | `bottom` | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | `8` | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.PopupPrimitive | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.PopupPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.PopupPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.PopupPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### NavigationMenu.Viewport | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: NavigationMenu.Viewport.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `popupElement` | `ReactElement>` | - | NavigationMenu.PopupPrimitive에 사용할 커스텀 엘리먼트를 지정합니다. 지정하지 않으면 기본 NavigationMenu.PopupPrimitive가 렌더링됩니다. | | `portalElement` | `ReactElement>` | - | NavigationMenu.PortalPrimitive에 사용할 커스텀 엘리먼트를 지정합니다. 지정하지 않으면 기본 NavigationMenu.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | NavigationMenu.PositionerPrimitive에 사용할 커스텀 엘리먼트를 지정합니다. 지정하지 않으면 기본 NavigationMenu.PositionerPrimitive가 렌더링됩니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Viewport.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Viewport.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### NavigationMenu.ViewportPrimitive | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: NavigationMenu.Viewport.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: NavigationMenu.Viewport.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: NavigationMenu.Viewport.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Pagination URL: /docs/components/pagination Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/pagination.mdx Pagination은 콘텐츠를 페이지 단위로 탐색할 수 있도록 돕는 네비게이션 컴포넌트입니다. *** title: 'Pagination' site\_name: 'Pagination - Vapor Core' description: 'Pagination은 콘텐츠를 페이지 단위로 탐색할 수 있도록 돕는 네비게이션 컴포넌트입니다.' ------------------------------------------------------------------- ```tsx import { Pagination } from '@vapor-ui/core'; export default function DefaultPagination() { return ( ); } ``` ## Property ### Sibling Count Pagination에서 현재 페이지 주변에 표시할 페이지 번호의 개수를 설정합니다. ```tsx import { Pagination, Text, VStack } from '@vapor-ui/core'; export default function PaginationSiblingCount() { return ( 1 Sibling 3 Sibling ); } ``` ### Boundary Count Pagination의 시작과 끝에 항상 표시할 페이지 번호의 개수를 설정합니다. ```tsx import { Pagination, Text, VStack } from '@vapor-ui/core'; export default function PaginationBoundaryCount() { return ( 1 Boundary 3 Boundary ); } ``` ### Disabled Pagination 버튼들의 비활성화 여부를 결정하는 옵션입니다. ```tsx import { Pagination } from '@vapor-ui/core'; export default function PaginationDisabled() { return ( ); } ``` ### Size Pagination의 크기를 설정합니다. ```tsx import { HStack, Pagination, Text, VStack } from '@vapor-ui/core'; export default function PaginationSize() { return ( sm md lg xl ); } ``` ## Examples ### Controlled Pagination 컴포넌트를 제어 컴포넌트로 사용하는 예시입니다. ```tsx import { useState } from 'react'; import { Button, HStack, Pagination, Text, VStack } from '@vapor-ui/core'; export default function PaginationControlled() { const [page, setPage] = useState(7); return ( Current Page is, {page} ); } ``` *** ### Pagination.Root | Prop | Type | Default | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | **totalPages** | `number` | - | 전체 페이지 수를 지정합니다. | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `onPageChange` | `(page: number, eventDetails: { reason: "item-press"; event: KeyboardEvent \| globalThis.MouseEvent \| PointerEvent; cancel: () => void; allowPropagation: () => void; isCanceled: boolean; isPropagationAllowed: boolean; trigger: HTMLElement \| undefined; }) => void` | - | 페이지네이션의 선택된 페이지가 변경될 때 호출되는 이벤트 핸들러입니다. | | `boundaryCount` | `number` | - | 시작 및 끝 페이지에 표시할 페이지 항목 수를 지정합니다. | | `className` | `string \| ((state: PaginationRootPrimitiveState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `defaultPage` | `number` | - | 페이지네이션의 기본 선택 페이지를 지정합니다. 비제어 방식으로 사용할 때 설정합니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `page` | `number` | - | 페이지네이션의 선택된 페이지를 지정합니다. 제어 방식으로 사용할 때 설정합니다. | | `siblingCount` | `number` | - | 현재 페이지 항목 양쪽에 표시할 페이지 항목 수를 지정합니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: PaginationRootPrimitiveState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Popover URL: /docs/components/popover Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/popover.mdx Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다. *** title: 'Popover' site\_name: 'Popover - Vapor Core' description: 'Popover는 트리거 요소 근처에 부가 정보나 상호작용 콘텐츠를 표시하는 오버레이 컴포넌트입니다. 툴팁, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.' ------------------------------------------------------------------------------------------------------- ```tsx 'use client'; import { Button, Popover } from '@vapor-ui/core'; export default function DefaultPopover() { return ( }>팝오버 열기 알림 새로운 메시지 3개와 알림 1개가 있습니다. ); } ``` ## Property *** ### PositionerProps Popover가 나타날 위치와 정렬을 설정합니다. ```tsx 'use client'; import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core'; export default function PopoverPositioning() { return ( Side top }> 상단 팝오버 상단 팝오버 트리거 위쪽에 표시되는 팝오버입니다. right }> 우측 팝오버 우측 팝오버 트리거 오른쪽에 표시되는 팝오버입니다. bottom }> 하단 팝오버 하단 팝오버 트리거 아래쪽에 표시되는 팝오버입니다. left }> 좌측 팝오버 좌측 팝오버 트리거 왼쪽에 표시되는 팝오버입니다. Alignment start }> 시작점 정렬 시작점 정렬 트리거의 시작점에 정렬된 팝오버입니다. center }> 중앙 정렬 중앙 정렬 트리거의 중앙에 정렬된 팝오버입니다. end }> 끝점 정렬 끝점 정렬 트리거의 끝점에 정렬된 팝오버입니다. ); } ``` ### Offset Popover와 트리거 간의 거리를 조정합니다. ```tsx 'use client'; import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core'; export default function PopoverOffset() { return ( default }> 기본 오프셋 기본 오프셋 기본 8px 오프셋이 적용된 팝오버입니다. sideOffset 16 }> 사이드 오프셋 16px 사이드 오프셋 16px 트리거로부터 16px 떨어진 팝오버입니다. alignOffset 100 }> 정렬 오프셋 100px 정렬 오프셋 100px 정렬 축에서 100px 이동한 팝오버입니다. combined }> 복합 오프셋 복합 오프셋 사이드 24px, 정렬 -100px 오프셋이 적용된 팝오버입니다. ); } ``` ## Examples *** ### Content Variations 간단한 텍스트부터 복잡한 상호작용 요소까지 다양한 콘텐츠를 표시합니다. ```tsx 'use client'; import { Button, HStack, Popover, Text, VStack } from '@vapor-ui/core'; export default function PopoverPopup() { return ( text }> 간단한 텍스트 간단한 팝오버 메시지입니다. title + desc }> 제목과 설명 알림 새로운 업데이트가 있습니다. 확인해보세요. interactive }> 상호작용 콘텐츠 설정 원하는 설정을 선택하세요. 옵션 1 } /> 옵션 2 } /> ); } ``` ## Props Table *** ### Popover.Root | Prop | Type | Default | Description | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `defaultOpen` | `boolean` | - | 팝오버의 초기 열림 상태를 설정합니다.

제어 컴포넌트로 렌더링하려면 `open` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: Popover.Root.ChangeEventDetails) => void` | - | 팝오버가 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 팝오버가 현재 열려 있는지 여부를 지정합니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref입니다.
- `unmount`: 팝오버를 수동으로 언마운트합니다.
외부에서 제어하는 닫기 애니메이션이 완료된 후 호출하십시오.
- `close`: 호출 시 팝오버를 명령형으로 닫습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((arg: { payload: unknown; }) => ReactNode)` | - | 팝오버의 콘텐츠를 지정합니다.
일반 React 노드 또는 활성 트리거의 `payload`를 인수로 받는 렌더 함수를 사용할 수 있습니다. | | `defaultTriggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`defaultOpen` prop과 함께 사용하여 초기에 열린 상태의 팝오버를 만들 때 유용합니다. | | `handle` | `PopoverHandle` | - | 팝오버를 트리거와 연결하기 위한 핸들을 지정합니다.
지정하면 외부 트리거에서 팝오버의 열림 상태를 제어할 수 있습니다. | | `modal` | `boolean`, `"trap-focus"` | - | 팝오버가 열릴 때 모달 상태로 전환할지 여부를 설정합니다.
- `true`: 사용자 상호작용이 팝오버 내부로 제한됩니다. 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 상호작용이 비활성화됩니다.
- `false`: 문서의 나머지 영역과 상호작용할 수 있습니다.
- `'trap-focus'`: 포커스가 팝오버 내부에 갇히지만, 문서 페이지 스크롤은 잠기지 않으며 팝오버 외부의 포인터 상호작용도 유지됩니다.

`modal`이 `true`인 경우, `<Popover.Popup>` 내부에 `<Popover.Close>`가 렌더링될 때만 포커스 트래핑이 활성화됩니다. 필요하다면 Tailwind의 `sr-only` 유틸리티 등 직접 작성한 CSS로 시각적으로 숨길 수 있습니다.

`modal`이 `'trap-focus'`인 경우, 터치 스크린 리더가 팝업을 벗어날 수 있도록 `<Popover.Popup>` 내부에 `<Popover.Close>`를 렌더링하십시오. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 팝오버가 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `triggerId` | `string`, `null` | - | 팝오버와 연결할 트리거의 ID를 지정합니다.
`open` prop과 함께 사용하여 제어 팝오버를 만들 때 유용합니다.
비제어 팝오버(즉, `open` prop을 설정하지 않은 경우)에서는 이 prop을 지정할 필요가 없습니다. | ### Popover.Trigger | Prop | Type | Default | Description | | -------------- | ----------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Popover.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `closeDelay` | `number` | - | 호버로 열린 팝오버를 닫기까지 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `delay` | `number` | - | 호버 시 팝오버가 열리기까지 대기할 시간을 밀리초 단위로 지정합니다.

`openOnHover` prop이 필요합니다. | | `handle` | `PopoverHandle` | - | 트리거를 팝오버와 연결하기 위한 핸들을 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링하는지 여부를 지정합니다.
렌더링되는 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정하십시오. | | `openOnHover` | `boolean` | - | 트리거에 호버할 때 팝오버도 열릴지 여부를 지정합니다. | | `payload` | `unknown` | - | 팝오버가 열릴 때 전달할 페이로드를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Popover.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Popover.Popup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Popover.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | Popover.PortalPrimitive에 사용할 커스텀 엘리먼트를 지정합니다. 지정하지 않으면 기본 Popover.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | Popover.PositionerPrimitive에 사용할 커스텀 엘리먼트를 지정합니다. 지정하지 않으면 기본 Popover.PositionerPrimitive가 렌더링됩니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 열릴 때 포커스를 이동할 요소를 설정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 팝오버가 열린 경우에는 가상 키보드 열림을 방지하기 위해 팝업 자체에 포커스를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: Popover.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Popover.PortalPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Popover.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Popover.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Popover.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Popover.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | `center` | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | `bottom` | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | `8` | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Popover.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Popover.PopupPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Popover.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 팝오버가 열릴 때 포커스를 이동할 요소를 설정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 팝오버가 열린 경우에는 가상 키보드 열림을 방지하기 위해 팝업 자체에 포커스를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`, 기본 동작으로 폴백하려면 `null`, 아무 작업도 하지 않으려면 `false`/`undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: Popover.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Popover.Title | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Popover.Title.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Popover.Title.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Title.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Popover.Description | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Popover.Description.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Popover.Description.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Description.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Popover.Close | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Popover.Close.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Popover.Close.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Popover.Close.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # RadioCard URL: /docs/components/radio-card Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/radio-card.mdx RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다. *** title: 'RadioCard' site\_name: 'RadioCard - Vapor Core' description: 'RadioCard는 RadioGroup과 함께 사용하는 카드 형태의 라디오 버튼 컴포넌트입니다. 선택 가능한 옵션을 카드 UI로 표현하여 더 직관적인 사용자 경험을 제공합니다.' ----------------------------------------------------------------------------------------------------------------- ```tsx import { HStack, RadioCard, RadioGroup } from '@vapor-ui/core'; export default function DefaultRadioCard() { return ( Light Theme Dark Theme System (Disabled) ); } ``` ## Property *** ### Disabled 사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다. ```tsx import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioCardDisabled() { return ( group disabled Option 1 Option 2 Option 3 individual card disabled Enabled Option Disabled Option Another Enabled Option ); } ``` ### Read Only 읽기 전용 상태로, 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다. ```tsx import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioCardReadonly() { return ( readOnly Unselected Option Selected Option (Read Only) Another Option normal Unselected Option Selected Option (Editable) Another Option ); } ``` ## Examples *** ### Simple Usage RadioGroup.Root와 함께 사용합니다. ```tsx import { useState } from 'react'; import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioCardSimple() { const [value, setValue] = useState('option1'); return ( Selected: {value} setValue(newValue as string)} > First Option Second Option Third Option ); } ``` ### Direction VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치합니다. ```tsx import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioCardDirection() { return ( vertical Option 1 Option 2 Option 3 horizontal Option 1 Option 2 Option 3 ); } ``` ### With Rich Content RadioCard는 고정된 높이가 없어 다양한 콘텐츠를 포함할 수 있습니다. 텍스트, 아이콘, 가격 정보 등 복잡한 레이아웃을 자유롭게 구성할 수 있습니다. ```tsx import { useState } from 'react'; import { HStack, RadioCard, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioCardWithContent() { const [value, setValue] = useState('basic'); return (
선택된 플랜: {value} setValue(newValue as string)} > Basic $9/month 5 projects included Pro $29/month Unlimited projects Enterprise Custom pricing Advanced features
); } ```
## Props Table *** ### RadioCard | Prop | Type | Default | Description | | -------------- | ----------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `unknown` | - | 그룹 내에서 라디오를 고유하게 식별하는 값을 지정합니다. | | `invalid` | `boolean` | `false` | | | `className` | `string \| ((state: RadioCard.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `readOnly` | `boolean` | - | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: RadioCard.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: RadioCard.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Radio URL: /docs/components/radio Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/radio.mdx Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다. *** title: 'Radio' site\_name: 'Radio - Vapor Core' description: 'Radio는 여러 옵션 중 하나만 선택할 수 있는 입력 컴포넌트입니다. RadioGroup과 함께 사용하여 라디오 버튼 그룹을 구성할 수 있습니다.' ------------------------------------------------------------------------------------------------- ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function DefaultRadioGroup() { return ( } typography="body2"> Apple } typography="body2"> Orange } typography="body2"> Banana (Disabled) ); } ``` ## Property *** ### Size RadioGroup의 크기를 설정합니다. ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioGroupSize() { return ( md } typography="body2"> Medium Option 1 } typography="body2"> Medium Option 2 lg } typography="body2"> Large Option 1 } typography="body2"> Large Option 2 ); } ``` ### Disabled RadioGroup의 비활성화 상태를 설정합니다. ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioGroupDisabled() { return ( individual item disabled } typography="body2"> Option 1 (Default) } typography="body2"> Option 2 (Default) } typography="body2"> Option 3 (Disabled) group disabled } typography="body2"> Group 1 } typography="body2"> Group 2 } typography="body2"> Group 3 ); } ``` ### Read Only RadioGroup의 읽기 전용 상태입니다. 사용자가 값을 변경할 수 없지만 현재 선택된 상태를 확인할 수 있습니다. ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioReadOnly() { return ( } typography="body2"> Read Only (Selected) } typography="body2"> Read Only (Unselected) ); } ``` ## Examples *** ### Direction Radio 그룹의 방향을 조절할 수 있습니다. VStack과 HStack을 사용하여 세로 및 가로 방향으로 배치할 수 있습니다. ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function RadioDirection() { return ( vertical } typography="body2"> Option 1 } typography="body2"> Option 2 } typography="body2"> Option 3 horizontal } typography="body2"> Option 1 } typography="body2"> Option 2 } typography="body2"> Option 3 ); } ``` ### Flexible Radio의 유연한 사용예시입니다. ```tsx import { HStack, Radio, RadioGroup, Text, VStack } from '@vapor-ui/core'; export default function Flexible() { return ( Vertical } typography="body2"> Option 1 } typography="body2"> Option 2 } typography="body2"> Option 3 ); } ``` ## Props Table *** ### RadioGroup.Root | Prop | Type | Default | Description | | --------------- | ----------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `size` | `md`, `lg` | `md` | | | `defaultValue` | `unknown` | - | 초기에 선택될 라디오 버튼의 비제어 값을 지정합니다.

제어 방식의 라디오 그룹을 렌더링하려면 `value` prop을 사용하십시오. | | `onValueChange` | `(value: unknown, eventDetails: RadioGroup.Root.ChangeEventDetails) => void` | - | 값이 변경될 때 호출되는 콜백입니다. | | `value` | `unknown` | - | 현재 선택되어야 할 라디오 항목의 제어 값을 지정합니다.

비제어 라디오 그룹을 렌더링하려면 `defaultValue` prop을 사용하십시오. | | `className` | `string \| ((state: RadioGroup.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `invalid` | `boolean` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 라디오 입력을 소유하는 폼을 식별합니다.
라디오 그룹이 폼 외부에 렌더링될 때 유용합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `readOnly` | `boolean` | - | 사용자가 그룹 내에서 다른 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: RadioGroup.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: RadioGroup.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### RadioGroup.Label | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: RadioGroupLabelState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: RadioGroupLabelState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Radio.Root | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `unknown` | - | 그룹 내에서 라디오를 고유하게 식별하는 값을 지정합니다. | | `invalid` | `boolean` | `false` | | | `size` | `md`, `lg` | `md` | | | `className` | `string \| ((state: Radio.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `readOnly` | `boolean` | - | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Radio.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Radio.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Radio.IndicatorPrimitive | Prop | Type | Default | Description | | ------------- | -------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Radio.IndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | `true` | 라디오 버튼이 비활성 상태일 때 HTML 엘리먼트를 DOM에 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Radio.IndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Radio.IndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # SegmentedControl URL: /docs/components/segmented-control Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/segmented-control.mdx 같은 콘텐츠 영역 내에서 화면의 보기 방식이나 필터를 제어합니다. *** title: 'SegmentedControl' site\_name: 'SegmentedControl - Vapor Core' description: '같은 콘텐츠 영역 내에서 화면의 보기 방식이나 필터를 제어합니다.' --------------------------------------------------- ```tsx import { SegmentedControl } from '@vapor-ui/core'; export default function DefaultSegmentedControl() { return ( 전체 진행 중 완료 예정 ); } ``` 주의! * `SegmentedControl.Root`의 `defaultValue`를 지정하지 않으면 첫 번째 아이템이 자동 선택됩니다. * `SegmentedControl.Item`의 `value=""` 속성에는 **반드시 아이템의 역할을 설명할 수 있는 이름**을 사용하세요. ## Property *** ### Size SegmentedControl의 크기를 설정합니다. ```tsx import { SegmentedControl, VStack } from '@vapor-ui/core'; export default function SegmentedControlSize() { return ( SM Test MD Test LG Test ); } ``` ### Controlled State SegmentedControl의 선택 상태를 외부에서 제어합니다. ```tsx import { useState } from 'react'; import { Button, HStack, SegmentedControl, VStack } from '@vapor-ui/core'; import { DarkIcon, LightIcon, PcIcon } from '@vapor-ui/icons'; export default function DefaultSegmentedControl() { const [mode, setMode] = useState('light'); return ( 현재 모드: {mode} Light Dark System ); } ``` ### Disabled SegmentedControl의 비활성 상태를 설정합니다. ```tsx import { SegmentedControl } from '@vapor-ui/core'; export default function DefaultSegmentedControl() { return ( 전체 진행 중 완료 예정 ); } ``` ## Examples *** ### Icon Item `SegmentedControl.IconItem`을 이용하여 아이콘만 포함하는 아이템을 사용할 수 있습니다. 이 경우, 각 아이템에 `aria-label`로 접근 가능한 이름을 제공하거나, 툴팁으로 보조 설명을 추가하는 것을 권장합니다. ```tsx import { SegmentedControl, Tooltip, VStack } from '@vapor-ui/core'; import { DarkIcon, LightIcon, PcIcon } from '@vapor-ui/icons'; export default function DefaultSegmentedControl() { return ( } /> 라이트 모드 } /> 다크 모드 } /> 시스템 모드 ); } ``` ## Props Table *** ### SegmentedControl.Root | Prop | Type | Default | Description | | ------------------ | ----------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | | `size` | `sm`, `md`, `lg` | - | | | `defaultValue` | `string` | - | SegmentedControl의 기본값을 지정합니다. SegmentedControl이 자체적으로 상태를 관리하도록 할 때 사용하며, SegmentedControl.Item 컴포넌트 중 하나의 값이어야 합니다. | | `onValueChange` | `(value: string, eventDetails: SegmentedControl.RootPrimitive.ChangeEventDetails) => void` | - | SegmentedControl의 값이 변경될 때 호출되는 콜백입니다. 새 값과 하위 RadioGroup 컴포넌트의 원래 변경 이벤트 정보를 전달받습니다. 사용자가 다른 세그먼트를 선택할 때 부수 효과를 처리할 때 유용합니다. | | `value` | `string` | - | SegmentedControl의 제어 값을 지정합니다. 사용자가 SegmentedControl과 상호작용할 때 값을 업데이트하려면 `onValueChange`와 함께 사용해야 합니다. | | `className` | `string \| ((state: SegmentedControl.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `indicatorElement` | `ReactElement>` | - | SegmentedControl.IndicatorPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 SegmentedControl.IndicatorPrimitive가 렌더링됩니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 라디오 입력을 소유하는 폼을 식별합니다.
라디오 그룹이 폼 외부에 렌더링될 때 유용합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `readOnly` | `boolean` | - | 사용자가 그룹 내에서 다른 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: SegmentedControl.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### SegmentedControl.RootPrimitive | Prop | Type | Default | Description | | --------------- | ----------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | | `size` | `sm`, `md`, `lg` | `md` | | | `defaultValue` | `string` | - | SegmentedControl의 기본값을 지정합니다. SegmentedControl이 자체적으로 상태를 관리하도록 할 때 사용하며, SegmentedControl.Item 컴포넌트 중 하나의 값이어야 합니다. | | `onValueChange` | `(value: string, eventDetails: SegmentedControl.RootPrimitive.ChangeEventDetails) => void` | - | SegmentedControl의 값이 변경될 때 호출되는 콜백입니다. 새 값과 하위 RadioGroup 컴포넌트의 원래 변경 이벤트 정보를 전달받습니다. 사용자가 다른 세그먼트를 선택할 때 부수 효과를 처리할 때 유용합니다. | | `value` | `string` | - | SegmentedControl의 제어 값을 지정합니다. 사용자가 SegmentedControl과 상호작용할 때 값을 업데이트하려면 `onValueChange`와 함께 사용해야 합니다. | | `className` | `string \| ((state: SegmentedControl.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 라디오 입력을 소유하는 폼을 식별합니다.
라디오 그룹이 폼 외부에 렌더링될 때 유용합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `readOnly` | `boolean` | - | 사용자가 그룹 내에서 다른 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: SegmentedControl.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### SegmentedControl.IndicatorPrimitive | Prop | Type | Default | Description | | ----------- | ---------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: SegmentedControl.RootPrimitive.ChangeEventDetails) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.RootPrimitive.ChangeEventDetails) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### SegmentedControl.Item | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `string` | - | 항목의 값을 지정합니다. 어떤 항목이 선택되었는지 판단하는 데 사용되며, SegmentedControl 내에서 고유해야 합니다. | | `className` | `string \| ((state: SegmentedControl.IconItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `readOnly` | `boolean` | - | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: SegmentedControl.IconItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.IconItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### SegmentedControl.IconItem | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | **value** | `string` | - | 항목의 값을 지정합니다. 어떤 항목이 선택되었는지 판단하는 데 사용되며, SegmentedControl 내에서 고유해야 합니다. | | `className` | `string \| ((state: SegmentedControl.IconItem.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `readOnly` | `boolean` | - | 사용자가 라디오 버튼을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: SegmentedControl.IconItem.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SegmentedControl.IconItem.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Select URL: /docs/components/select Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/select.mdx Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다. *** title: 'Select' site\_name: 'Select - Vapor Core' description: 'Select는 사용자가 여러 옵션 중에서 하나를 선택할 수 있는 드롭다운 컴포넌트입니다. 폼 입력, 설정 선택, 필터링 등에 사용되며, 키보드 내비게이션과 접근성을 완벽하게 지원합니다.' ---------------------------------------------------------------------------------------------------------------------- ```tsx import { Select } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans-serif' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; export default function DefaultSelect() { return ( 폰트 {fonts.map((font) => ( {font.label} ))} ); } ``` ## Property *** ### Size Select의 크기를 설정합니다. ```tsx import { HStack, Select, Text, VStack } from '@vapor-ui/core'; export default function SelectSize() { return ( sm md lg xl ); } const SelectTemplate = (props: Select.Root.Props) => { return ( 옵션 1 옵션 2 ); }; ``` ### Positioning Select 드롭다운이 나타날 위치를 설정합니다. 기본값은 'bottom'입니다. ```tsx import { HStack, Select } from '@vapor-ui/core'; export default function SelectPositioning() { return ( 옵션 1 옵션 2 옵션 1 옵션 2 옵션 1 옵션 2 옵션 1 옵션 2 ); } ``` ### Controlled State Select의 선택 상태를 외부에서 제어합니다. ```tsx 'use client'; import { useState } from 'react'; import { Button, HStack, Select, Text, VStack } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans-serif' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; export default function SelectControlled() { const [value, setValue] = useState(fonts[0].value); const handleValueChange = (newValue: unknown) => { setValue(newValue as string); }; return ( 폰트 {fonts.map((font) => ( {font.label} ))} 선택된 값: {value || '없음'} ); } ``` ### States Select의 다양한 상태(비활성화, 읽기 전용, 오류)를 설정합니다. ```tsx import { HStack, Select, Text, VStack } from '@vapor-ui/core'; export default function SelectStates() { return ( default disabled readOnly invalid ); } const SelectTemplate = (props: Select.Root.Props) => { return ( 옵션 1 옵션 2 ); }; ``` ## Examples *** ### Items Configuration 배열 형태와 객체 형태의 아이템 데이터를 모두 지원합니다. ```tsx import { Select, Text, VStack } from '@vapor-ui/core'; const fonts = [ { label: 'Sans-serif', value: 'sans' }, { label: 'Serif', value: 'serif' }, { label: 'Monospace', value: 'mono' }, { label: 'Cursive', value: 'cursive' }, ]; const languages = { javascript: 'JavaScript', typescript: 'TypeScript', python: 'Python', java: 'Java', go: 'Go', }; export default function SelectItems() { return ( 배열 형태의 아이템 폰트 {fonts.map((font) => ( {font.label} ))} 객체 형태의 아이템 프로그래밍 언어 {Object.entries(languages).map(([value, label]) => ( {label} ))} ); } ``` ### Grouping Options 관련된 옵션들을 그룹으로 묶어 구조화할 수 있습니다. Group과 GroupLabel, Separator를 사용하여 명확한 구조를 만들 수 있습니다. ```tsx import { Select, VStack } from '@vapor-ui/core'; export default function SelectGrouping() { return ( 프론트엔드 React Vue Angular 백엔드 Node.js Python Java 데이터베이스 MySQL PostgreSQL MongoDB ); } ``` ### Custom Value Display Select.Value에 함수형 children을 제공하여 선택된 값을 커스터마이징할 수 있습니다. ```tsx import { Select, Text, VStack } from '@vapor-ui/core'; const fonts = { sans: 'Sans-serif', serif: 'Serif', mono: 'Monospace', cursive: 'Cursive', }; const renderValue = (value: string) => { if (!value) return '선택된 폰트 없음'; return {fonts[value as keyof typeof fonts]}; }; export default function SelectCustomValue() { return ( 커스텀 값 표시 {renderValue} {Object.entries(fonts).map(([value, label]) => ( {label} ))} ); } ``` ## Props Table *** ### Select.Root | Prop | Type | Default | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `invalid` | `boolean` | - | | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `defaultOpen` | `boolean` | - | 셀렉트 팝업의 초기 열림 여부를 지정합니다.

제어 방식으로 렌더링하려면 `open` prop을 사용하십시오. | | `defaultValue` | `Value`, `null` | - | 셀렉트가 처음 렌더링될 때의 비제어 값을 지정합니다.

제어 방식으로 렌더링하려면 `value` prop을 사용하십시오. | | `onOpenChange` | `(open: boolean, eventDetails: Select.Root.ChangeEventDetails) => void` | - | 셀렉트 팝업이 열리거나 닫힐 때 호출되는 이벤트 핸들러입니다. | | `onValueChange` | `(value: Value \| null, eventDetails: Select.Root.ChangeEventDetails) => void` | - | 셀렉트의 값이 변경될 때 호출되는 이벤트 핸들러입니다. | | `open` | `boolean` | - | 셀렉트 팝업의 현재 열림 여부를 지정합니다. | | `value` | `Value`, `null` | - | 셀렉트의 값을 지정합니다. 제어 방식으로 사용할 때 설정합니다. | | `placeholder` | `ReactNode` | - | 값이 선택되지 않은 경우 표시할 플레이스홀더 값을 설정합니다.
Select.Value의 `children`이 지정된 경우 또는 `items`에서 null 항목의 레이블이 지정된 경우 이 값은 무시됩니다. | | `actionsRef` | `React.RefObject` | - | 명령형 액션에 대한 ref를 지정합니다.
- `unmount`: 셀렉트를 수동으로 언마운트합니다.
외부에서 제어하는 닫힘 애니메이션이 완료된 후 호출하십시오. | | `autoComplete` | `string` | - | 브라우저 자동 완성에 대한 힌트를 제공합니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 숨겨진 input을 소유하는 폼을 식별합니다.
셀렉트가 폼 외부에 렌더링될 때 유용합니다. | | `highlightItemOnHover` | `boolean` | - | 포인터를 항목 위로 이동할 때 해당 항목을 강조 표시할지 여부를 설정합니다.
이 prop을 비활성화하면 CSS `:hover`와 `:focus`(`data-highlighted`) 상태를 구분할 수 있습니다. | | `id` | `string` | - | Select의 id를 지정합니다. | | `inputRef` | `Ref` | - | 숨겨진 input 요소에 접근하기 위한 ref를 지정합니다. | | `isItemEqualToValue` | `(itemValue: Value, value: Value) => boolean` | - | 셀렉트 항목의 값이 현재 선택된 값과 일치하는지 판단하는 커스텀 비교 로직을 지정합니다. 항목 값이 참조가 일치하지 않는 객체일 때 유용합니다.
기본값은 `Object.is` 비교입니다. | | `items` | `Record \| readonly { label: React.ReactNode; value: any; }[] \| readonly Group[]` | - | 셀렉트 팝업에 렌더링되는 항목의 데이터 구조를 지정합니다.
지정하면 `<Select.Value>`가 원시 값 대신 선택된 항목의 레이블을 렌더링합니다. | | `itemToStringLabel` | `(itemValue: Value) => string` | - | 항목 값이 객체인 경우(`<Select.Item value={object}>`), 이 함수는 객체 값을 트리거에 표시할 문자열로 변환합니다.
객체의 형태가 `{ value, label }`이면 이 prop을 지정하지 않아도 label이 자동으로 사용됩니다. | | `itemToStringValue` | `(itemValue: Value) => string` | - | 항목 값이 객체인 경우(`<Select.Item value={object}>`), 이 함수는 객체 값을 폼 제출 시 사용할 문자열로 변환합니다.
객체의 형태가 `{ value, label }`이면 이 prop을 지정하지 않아도 value가 자동으로 사용됩니다. | | `modal` | `boolean` | - | 셀렉트가 열릴 때 모달 상태로 진입할지 여부를 설정합니다.
- `true`: 사용자 인터랙션이 셀렉트로 제한되며, 문서 페이지 스크롤이 잠기고 외부 요소에 대한 포인터 인터랙션이 비활성화됩니다.
- `false`: 나머지 문서와의 사용자 인터랙션이 허용됩니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `onOpenChangeComplete` | `(open: boolean) => void` | - | 셀렉트 팝업이 열리거나 닫힐 때 모든 애니메이션이 완료된 후 호출되는 이벤트 핸들러입니다. | | `readOnly` | `boolean` | - | 사용자가 셀렉트 팝업에서 다른 옵션을 선택할 수 없도록 할지 여부를 지정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 반드시 값을 선택해야 하는지 여부를 지정합니다. | ### Select.Trigger | Prop | Type | Default | Description | | -------------- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.ValuePrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.ValuePrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `null \| string \| number \| bigint \| false \| true \| ReactElement \| Iterable \| React.ReactPortal \| Promise \| ((value: any) => ReactNode)` | - | 선택된 값을 형식화하는 `ReactNode`를 반환하는 함수를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Select.ValuePrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.ValuePrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.PlaceholderPrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: SelectPlaceholderPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: SelectPlaceholderPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.TriggerIconPrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.TriggerIconPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Select.TriggerIconPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.TriggerIconPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Select.Popup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `portalElement` | `ReactElement>` | - | Select.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Select.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | Select.PositionerPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Select.PositionerPrimitive가 렌더링됩니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 셀렉트 팝업이 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: 해당 ref 요소로 포커스를 이동합니다.
- `function`: 상호작용 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: Select.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.PositionerPrimitive | Prop | Type | Default | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Select.PositionerPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `align` | `Align` | `start` | 지정된 side를 기준으로 팝업의 정렬 방식을 설정합니다. | | `alignItemWithTrigger` | `boolean` | `false` | 포지셔너가 트리거와 겹쳐서 선택된 항목의 텍스트가 트리거의 값 텍스트와 정렬되도록 할지 여부를 지정합니다. 이 옵션은 마우스 입력에만 적용되며, 공간이 충분하지 않으면 자동으로 비활성화됩니다. | | `alignOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | - | 정렬 축 방향의 추가 오프셋을 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 오프셋을 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `anchor` | `null \| Element \| VirtualElement \| React.RefObject \| (() => (Element \| VirtualElement \| null))` | - | 팝업을 배치할 기준 요소를 설정합니다.
기본적으로 트리거를 기준으로 팝업이 배치됩니다. | | `arrowPadding` | `number` | - | 화살표와 팝업 모서리 사이의 최소 거리를 설정합니다.

팝업의 둥근 모서리 바깥으로 화살표 요소가 벗어나지 않도록 할 때 사용합니다. | | `collisionAvoidance` | `CollisionAvoidance` | - | 팝업을 배치할 때 충돌을 처리하는 방식을 설정합니다.

`side`는 선호하는 배치 축(`top`/`bottom` 또는 `left`/`right`)의 오버플로를 처리합니다:
- `'flip'`: 요청한 side가 맞으면 유지하고, 맞지 않으면 반대 side(`top`과 `bottom`, 또는 `left`와 `right`)를 시도합니다.
- `'shift'`: side를 변경하지 않고 요청한 side를 유지하면서 클리핑 경계 내에서 팝업을 이동시켜 보이도록 합니다.
- `'none'`: side 축 오버플로를 보정하지 않습니다.

`align`은 정렬 축(`start`/`center`/`end`)의 오버플로를 처리합니다:
- `'flip'`: side는 유지하되, 요청한 정렬이 오버플로되면 `start`와 `end`를 교체합니다.
- `'shift'`: side와 요청한 정렬을 유지하면서 팝업을 정렬 축을 따라 조금씩 이동시켜 맞춥니다.
- `'none'`: 정렬 축 오버플로를 보정하지 않습니다.

`fallbackAxisSide`는 선호 축이 맞지 않을 때 수직 축의 폴백 동작을 처리합니다:
- `'start'`: 수직 축 폴백을 허용하고 논리적 시작 side를 먼저 시도합니다(LTR에서 `bottom` 전에 `top`, 또는 `right` 전에 `left`).
- `'end'`: 수직 축 폴백을 허용하고 논리적 끝 side를 먼저 시도합니다(LTR에서 `top` 전에 `bottom`, 또는 `left` 전에 `right`).
- `'none'`: 수직 축으로 폴백하지 않습니다.

`side`가 `'shift'`인 경우, `align`을 명시적으로 설정하면 `'shift'` 또는 `'none'`만 지원됩니다.
`align`을 생략하면 기본값은 `'flip'`입니다. | | `collisionBoundary` | `Boundary` | - | 팝업이 벗어나지 않도록 제한할 영역을 나타내는 요소 또는 사각형을 설정합니다. | | `collisionPadding` | `Padding` | - | 충돌 경계 모서리로부터 유지할 추가 여백을 설정합니다. | | `disableAnchorTracking` | `boolean` | - | 팝업이 배치 앵커의 레이아웃 변화를 추적하지 않도록 설정할지 여부를 지정합니다. | | `positionMethod` | `fixed`, `absolute` | - | 사용할 CSS `position` 속성을 설정합니다. | | `side` | `Side` | `bottom` | 팝업을 앵커 요소의 어느 side에 배치할지 설정합니다.
충돌을 피하기 위해 자동으로 변경될 수 있습니다. | | `sideOffset` | `number \| ((data: { side: Side; align: Align; anchor: { width: number; height: number; }; positioner: { width: number; height: number; }; }) => number)` | `4` | 앵커와 팝업 사이의 거리를 픽셀 단위로 설정합니다.
앵커 및 포지셔너 요소의 크기와 side, align 정보를 읽어 거리를 반환하는 함수도 허용합니다.

함수는 다음 프로퍼티를 가진 `data` 객체를 매개변수로 받습니다:
- `data.anchor`: 앵커 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.positioner`: 포지셔너 요소의 크기로, `width`와 `height` 프로퍼티를 포함합니다.
- `data.side`: 포지셔너가 정렬된 앵커 요소의 side를 나타냅니다.
- `data.align`: 지정된 side를 기준으로 포지셔너가 정렬된 방식을 나타냅니다. | | `sticky` | `boolean` | - | 앵커 요소가 스크롤되어 뷰포트 밖으로 벗어난 후에도 팝업을 뷰포트 내에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.PositionerPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.PositionerPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.PopupPrimitive | Prop | Type | Default | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 셀렉트 팝업이 닫힐 때 포커스를 이동할 요소를 설정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: 해당 ref 요소로 포커스를 이동합니다.
- `function`: 상호작용 유형(`mouse`, `touch`, `pen`, `keyboard`)과 함께 호출됩니다.
포커스할 요소를 반환하거나, 기본 동작을 사용하려면 `true`를, 아무 작업도 하지 않으려면 `false` 또는 `undefined`를 반환합니다. | | `style` | `React.CSSProperties \| ((state: Select.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Select.Item | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `value` | `any` | - | 이 셀렉트 항목을 식별하는 고유한 값을 지정합니다. | | `className` | `string \| ((state: Select.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 매칭될 때 사용할 텍스트 레이블을 지정합니다.

제공하지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.ItemPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `value` | `any` | - | 이 셀렉트 항목을 식별하는 고유한 값을 지정합니다. | | `className` | `string \| ((state: Select.Item.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `label` | `string` | - | 키보드 텍스트 탐색 중 항목이 매칭될 때 사용할 텍스트 레이블을 지정합니다.

제공하지 않으면 항목의 텍스트 콘텐츠가 기본값으로 사용됩니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.Item.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Item.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Select.ItemIndicatorPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.ItemIndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `children` | `ReactNode` | - | | | `keepMounted` | `boolean` | - | 항목이 선택되지 않은 상태에서도 HTML 요소를 DOM에 유지할지 여부를 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.ItemIndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.ItemIndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Select.Group | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.Group.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Select.Group.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Group.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Select.GroupLabel | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.GroupLabel.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Select.GroupLabel.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.GroupLabel.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Select.Separator | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Select.Separator.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `orientation` | `Orientation` | - | 구분선의 방향을 설정합니다. | | `style` | `React.CSSProperties \| ((state: Select.Separator.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Select.Separator.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Sheet URL: /docs/components/sheet Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/sheet.mdx Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다. *** title: 'Sheet' site\_name: 'Sheet - Vapor Core' description: 'Sheet는 화면의 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 사이드바, 메뉴, 폼, 상세 정보 등을 표시할 때 사용합니다.' --------------------------------------------------------------------------------------------- ```tsx 'use client'; import { Box, Button, Sheet } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; export default function DefaultSheet() { return ( }>Open Sheet 알림 Sheet는 화면 가장자리에서 슬라이드되어 나타나는 오버레이 컴포넌트입니다. 추가 정보나 작업을 위한 공간을 제공합니다. }>닫기 확인} /> ); } ``` ## Property *** ### Side Sheet가 나타날 위치를 설정합니다. 기본값은 'right'입니다. ```tsx 'use client'; import { Box, Button, HStack, Sheet, Text, VStack } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; export default function SheetSide() { return ( right }>Right 우측 Sheet 화면 우측에서 슬라이드됩니다. (기본값) left }>Left 좌측 Sheet 화면 좌측에서 슬라이드됩니다. top }>Top 상단 Sheet 화면 상단에서 슬라이드됩니다. bottom }>Bottom 하단 Sheet 화면 하단에서 슬라이드됩니다. ); } ``` ### Controlled State Sheet의 열림/닫힘 상태를 외부에서 제어합니다. ```tsx 'use client'; import { useEffect, useState } from 'react'; import { Box, Button, Sheet, Text, VStack } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; export default function SheetControlled() { const [isOpen, setIsOpen] = useState(false); const [count, setCount] = useState(3); useEffect(() => { let timer: NodeJS.Timeout; if (isOpen && count > 0) { timer = setTimeout(() => { setCount((prev) => prev - 1); }, 1000); } else if (isOpen && count === 0) { setIsOpen(false); setCount(3); // 초기화 } return () => { if (timer) clearTimeout(timer); }; }, [count, isOpen]); return ( 현재 상태: {isOpen ? '열림' : '닫힘'} 제어된 Sheet 외부에 의해{' '} {count} 초 후 상태가 제어됩니다.
프로그래밍 방식으로 열림/닫힘을 관리할 수 있습니다.
}>닫기
); } ```
### Keep Mounted Sheet가 닫혀도 DOM에서 제거되지 않고 유지되도록 설정합니다. ```tsx 'use client'; import { Box, Button, HStack, Sheet, Text, TextInput, VStack } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; export default function SheetKeepMounted() { return ( normal }>일반 Sheet 일반 Sheet 이 Sheet는 닫힐 때 DOM에서 제거됩니다. 다시 열 때마다 내용이 새로 생성됩니다. keepMounted }> 유지 Sheet 유지되는 Sheet 이 Sheet는 닫혀도 DOM에 유지됩니다. 입력한 내용이 보존되는 것을 확인해보세요. ); } ``` ## Examples *** ### Custom Usage 유연하게 Sheet를 사용합니다. ```tsx 'use client'; import { Box, Button, Sheet } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; export default function Flexible() { return ( }>유연한 Sheet 간단한 Sheet 이 Sheet는 Vapor UI의 Primitive 컴포넌트를 사용하여 유연하게 구성되었습니다. ); } ``` ### Resizable Sheet의 크기를 자유자재로 조절하길 원한다면 ``을 사용하세요. 조절 가능 영역을 제한하고 싶다면 `` 컴포넌트에 `min/max-height`, `min/max-width` 속성을 적용하세요. ```tsx 'use client'; import type { CSSProperties } from 'react'; import { Box, Button, HStack, Sheet, Text, VStack } from '@vapor-ui/core'; import { CloseOutlineIcon } from '@vapor-ui/icons'; type Side = 'right' | 'left' | 'top' | 'bottom'; type Case = { side: Side; label: string; description: string; /** Resize bounds live in CSS: min/max of the resized axis on the Popup. */ bounds: CSSProperties; }; const CASES: Case[] = [ { side: 'right', label: 'right', description: '우측 Sheet입니다. 왼쪽 가장자리 핸들을 잡고 좌우로 끌어 너비를 조절하세요.', bounds: { minWidth: 300, maxWidth: '80vw' }, }, { side: 'left', label: 'left', description: '좌측 Sheet입니다. 오른쪽 가장자리 핸들을 잡고 좌우로 끌어 너비를 조절하세요.', bounds: { minWidth: 300, maxWidth: '80vw' }, }, { side: 'top', label: 'top', description: '상단 Sheet입니다. 아래쪽 가장자리 핸들을 잡고 위아래로 끌어 높이를 조절하세요.', bounds: { height: 360, minHeight: 200, maxHeight: '80svh' }, }, { side: 'bottom', label: 'bottom', description: '하단 Sheet입니다. 위쪽 가장자리 핸들을 잡고 위아래로 끌어 높이를 조절하세요.', bounds: { height: 360, minHeight: 200, maxHeight: '80svh' }, }, ]; export default function ResizableSheet() { return ( {CASES.map(({ side, label, description, bounds }) => ( {label} }>{label} 크기 조절 가능한 Sheet ({label}) {description} ))} ); } ``` ## Props Table *** ### Sheet.Root > ⚠️ Spec file not found: `sheet-root.json` ### Sheet.Trigger | Prop | Type | Default | Description | | -------------- | --------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.Trigger.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `handle` | `DialogHandle` | - | 트리거를 다이얼로그와 연결할 핸들을 지정합니다.
`Dialog.createHandle()` 메서드로 생성할 수 있습니다. | | `id` | `string` | - | 트리거의 ID를 지정합니다. 렌더링된 요소에 전달되는 것 외에도,
제어 모드에서 다이얼로그의 활성 트리거를 지정하는 데 사용됩니다(DialogRoot의 `triggerId` prop). | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `payload` | `unknown` | - | 다이얼로그가 열릴 때 전달할 payload를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Trigger.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Trigger.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Popup | Prop | Type | Default | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Sheet.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `overlayElement` | `ReactElement>` | - | Sheet.OverlayPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Sheet.OverlayPrimitive가 렌더링됩니다. | | `portalElement` | `ReactElement>` | - | Sheet.PortalPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Sheet.PortalPrimitive가 렌더링됩니다. | | `positionerElement` | `ReactElement>` | - | Sheet.PositionerPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Sheet.PositionerPrimitive가 렌더링됩니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 닫힐 때 포커스를 이동할 요소를 지정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 열릴 때 포커스를 이동할 요소를 지정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 다이얼로그가 열린 경우에는 가상 키보드가 열리지 않도록 팝업 자체에 포커스가 설정됩니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Sheet.PortalPrimitive | Prop | Type | Default | Description | | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.PortalPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `container` | `HTMLElement \| ShadowRoot \| React.RefObject \| null` | - | 포털 요소를 렌더링할 부모 요소를 지정합니다. | | `keepMounted` | `boolean` | - | 팝업이 숨겨진 동안 포털을 DOM에 마운트된 상태로 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Sheet.PortalPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.PortalPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Sheet.OverlayPrimitive | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.OverlayPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `forceRender` | `boolean` | - | 중첩된 경우에도 배경을 강제로 렌더링할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Sheet.OverlayPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.OverlayPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Sheet.PopupPrimitive | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `className` | `string \| ((state: Sheet.Popup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `finalFocus` | `false \| true \| React.RefObject \| ((closeType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 닫힐 때 포커스를 이동할 요소를 지정합니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(트리거 또는 이전에 포커스된 요소)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `initialFocus` | `false \| true \| React.RefObject \| ((openType: InteractionType) => (boolean \| void \| HTMLElement \| null))` | - | 다이얼로그가 열릴 때 포커스를 이동할 요소를 지정합니다.
기본적으로 팝업 내부의 첫 번째 탭 가능한 요소로 포커스가 이동하지만, 터치로 다이얼로그가 열린 경우에는 가상 키보드가 열리지 않도록 팝업 자체에 포커스가 설정됩니다.

- `false`: 포커스를 이동하지 않습니다.
- `true`: 기본 동작(첫 번째 탭 가능한 요소 또는 팝업)에 따라 포커스를 이동합니다.
- `RefObject`: ref 요소로 포커스를 이동합니다.
- `function`: 인터랙션 타입(`mouse`, `touch`, `pen`, `keyboard`)을 인자로 호출합니다.
포커스할 요소를 반환하거나, `true`를 반환하면 기본 동작을 사용하고, `null`을 반환하면 기본 동작으로 폴백하며, `false`/`undefined`를 반환하면 아무것도 하지 않습니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Popup.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Popup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Sheet.PositionerPrimitive | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: SheetPositionerPrimitiveState) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `side` | `left`, `right`, `bottom`, `top` | `right` | | | `render` | `ReactElement \| ((props: HTMLProps, state: SheetPositionerPrimitiveState) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.ResizeHandle > ⚠️ Spec file not found: `sheet-resize-handle.json` ### Sheet.Header | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogHeader.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogHeader.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Body | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogBody.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogBody.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Footer | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: DialogFooter.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: DialogFooter.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Title | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.Title.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Title.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Title.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Description | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.Description.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Description.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Description.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Sheet.Close | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Sheet.Close.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Sheet.Close.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Sheet.Close.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Skeleton URL: /docs/components/skeleton Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/skeleton.mdx 콘텐츠가 로딩 중임을 나타내는 플레이스홀더 요소입니다. *** title: 'Skeleton' site\_name: 'Skeleton - Vapor Core' description: '콘텐츠가 로딩 중임을 나타내는 플레이스홀더 요소입니다.' --------------------------------------------- ```tsx import { Skeleton } from '@vapor-ui/core'; export default function DefaultSkeleton() { return ; } ``` ## Property *** ### Shape Skeleton의 모서리 둥글기를 설정합니다. ```tsx import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core'; export default function SkeletonShape() { return ( rounded square ); } ``` ### Animation Skeleton의 애니메이션 스타일을 설정합니다. ```tsx import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core'; export default function SkeletonAnimation() { return ( shimmer pulse none ); } ``` ### Size Skeleton의 높이를 설정합니다. ```tsx import { HStack, Skeleton, Text, VStack } from '@vapor-ui/core'; export default function SkeletonSize() { return ( sm md lg xl ); } ``` ## Examples *** ### Profile Card 여러 Skeleton 요소를 조합하여 프로필 카드 플레이스홀더를 구성하는 예제입니다. ```tsx import { Box, HStack, Skeleton, VStack } from '@vapor-ui/core'; export default function SkeletonComposition() { return ( ); } ``` ## Props Table *** ### Skeleton | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------ | | `animation` | `none`, `shimmer`, `pulse` | `shimmer` | Skeleton의 애니메이션 스타일을 설정합니다. | | `shape` | `square`, `rounded` | `rounded` | Skeleton의 테두리 반경을 설정합니다. | | `size` | `sm`, `md`, `lg`, `xl` | `md` | Skeleton의 높이를 설정합니다. | | `className` | `string \| ((state: Skeleton.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Skeleton.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Spinner URL: /docs/components/spinner Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/spinner.mdx 콘텐츠나 데이터 로딩 시 대기 상태를 표시합니다. *** title: 'Spinner' site\_name: 'Spinner - Vapor Core' description: '콘텐츠나 데이터 로딩 시 대기 상태를 표시합니다.' ------------------------------------------ ```tsx import { Spinner } from '@vapor-ui/core'; export default function DefaultSpinner() { return ; } ``` ## Property *** ### Size Spinner의 크기를 설정합니다. ```tsx import { HStack, Spinner, VStack } from '@vapor-ui/core'; export default function SpinnerSize() { return ( md lg xl ); } ``` ### Color Palette Spinner의 색상을 설정합니다. 다른 요소와 함께 사용될 때, `inverse` 속성을 사용하여 요소의 글자색과 통일하세요. ```tsx import { Button, HStack, Spinner } from '@vapor-ui/core'; export default function SpinnerColor() { return ( ); } ``` ## Props Table *** ### Spinner | Prop | Type | Default | Description | | -------------- | ---------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------- | | `colorPalette` | `inherit`, `primary` | - | 스피너 호(arc)의 획 색상을 설정합니다. 색상이 있거나 채워진 배경 위에 스피너를 배치할 때는 `inherit`을 사용하십시오. 이 경우 획 색상은 부모 요소의 `color` 속성을 상속합니다. | | `size` | `md`, `lg`, `xl` | `md` | Spinner의 전체 크기를 설정합니다. | | `className` | `string \| ((state: Spinner.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Spinner.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Switch URL: /docs/components/switch Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/switch.mdx Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다. *** title: 'Switch' site\_name: 'Switch - Vapor Core' description: 'Switch는 사용자가 설정을 on/off로 전환할 수 있게 돕는 토글 컴포넌트입니다.' --------------------------------------------------------------- ```tsx import { Switch } from '@vapor-ui/core'; export default function DefaultSwitch() { return ; } ``` ## Property *** ### Size Switch의 크기를 설정합니다. ```tsx import { HStack, Switch, Text, VStack } from '@vapor-ui/core'; export default function SwitchSize() { return ( sm md lg ); } ``` ### Checked Switch의 체크 상태를 설정합니다. ```tsx import { HStack, Switch, Text, VStack } from '@vapor-ui/core'; export default function SwitchChecked() { return ( unchecked checked ); } ``` ### Disabled Switch의 비활성화 상태를 설정합니다. ```tsx import { HStack, Switch, Text, VStack } from '@vapor-ui/core'; export default function SwitchDisabled() { return ( unchecked checked ); } ``` ### Read Only 사용자는 스위치 상태를 변경할 수 없지만, 현재 상태를 확인할 수 있도록 허용하는 상태입니다. ```tsx import { HStack, Switch, Text, VStack } from '@vapor-ui/core'; export default function SwitchReadOnly() { return ( checked unchecked ); } ``` ## Examples *** ### Controlled 제어되는 Switch 컴포넌트의 사용 예시입니다. ```tsx 'use client'; import { useState } from 'react'; import { HStack, Switch, Text, VStack } from '@vapor-ui/core'; export default function SwitchControlled() { const [checked, setChecked] = useState(false); return ( State: {checked ? 'On' : 'Off'} ); } ``` ### Custom Thumb `children`으로 `Switch.ThumbPrimitive`를 전달하면 내부 파트를 직접 제어할 수 있습니다. 아이콘을 삽입하거나 다른 요소로 교체할 수 있습니다. ```tsx import { Switch } from '@vapor-ui/core'; import { HeartIcon } from '@vapor-ui/icons'; export default function SwitchCustomThumb() { return ( ); } ``` ## Props Table *** ### Switch.Root | Prop | Type | Default | Description | | ----------------- | ------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------- | | `invalid` | `boolean` | `false` | | | `size` | `sm`, `md`, `lg` | `md` | | | `checked` | `boolean` | - | 스위치의 현재 활성화 여부를 설정합니다.

비제어 스위치를 렌더링하려면 `defaultChecked` prop을 사용하십시오. | | `defaultChecked` | `boolean` | - | 스위치의 초기 활성화 여부를 설정합니다.

제어 스위치를 렌더링하려면 `checked` prop을 사용하십시오. | | `onCheckedChange` | `(checked: boolean, eventDetails: Switch.Root.ChangeEventDetails) => void` | - | 스위치가 활성화되거나 비활성화될 때 호출되는 이벤트 핸들러입니다. | | `value` | `string` | - | 스위치가 켜진 상태일 때 폼과 함께 제출되는 값을 설정합니다.
기본적으로 네이티브 체크박스 동작과 동일하게 `"on"` 값을 제출합니다. | | `className` | `string \| ((state: Switch.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | 컴포넌트가 사용자 상호작용을 무시할지 여부를 설정합니다. | | `form` | `string` | - | 숨겨진 input을 소유하는 폼을 식별합니다.
스위치가 폼 외부에 렌더링될 때 유용합니다. | | `id` | `string` | - | 숨겨진 input 요소의 id를 지정합니다.

`nativeButton`이 `true`이면 id는 루트 요소에 적용됩니다. | | `inputRef` | `Ref` | - | 숨겨진 `<input>` 요소에 접근하기 위한 ref를 지정합니다. | | `name` | `string` | - | 폼이 제출될 때 필드를 식별하는 이름을 지정합니다. | | `nativeButton` | `boolean` | - | `render` prop으로 컴포넌트를 교체할 때 네이티브 `<button>` 요소를 렌더링할지 여부를 설정합니다.
렌더링되는 요소가 네이티브 버튼인 경우 `true`로 설정합니다. | | `readOnly` | `boolean` | - | 사용자가 스위치를 활성화하거나 비활성화할 수 없도록 설정합니다. | | `required` | `boolean` | - | 폼을 제출하기 전에 사용자가 스위치를 반드시 활성화해야 하는지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Switch.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `uncheckedValue` | `string` | - | 스위치가 꺼진 상태일 때 폼과 함께 제출할 값을 지정합니다.
기본적으로 체크되지 않은 스위치는 네이티브 체크박스 동작과 동일하게 아무 값도 제출하지 않습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Switch.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Switch.ThumbPrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Switch.ThumbPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Switch.ThumbPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Switch.ThumbPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Table URL: /docs/components/table Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/table.mdx Table는 데이터를 행과 열로 구성하여 구조화된 방식으로 표시하는 컴포넌트입니다. *** title: 'Table' site\_name: Table - Vapor Core description: 'Table는 데이터를 행과 열로 구성하여 구조화된 방식으로 표시하는 컴포넌트입니다.' ------------------------------------------------------------- Table 컴포넌트는 순수한 뷰(View) 역할에 집중하여 기본적인 구조와 스타일만을 제공합니다. 복잡한 상태 관리와 로직을 바탕으로 대량의 데이터를 다루는 Data Table을 구현하려면 [Table Block 문서](/docs/components/patterns/table)를 참고해주세요.
```tsx import { Badge, Table } from '@vapor-ui/core'; const datas = [ { name: 'Olivia Park', status: 'active', role: 'designer', 'last-active': '2 hours ago' }, { name: 'Ethan Kim', status: 'active', role: 'developer', 'last-active': '3 days ago' }, { name: 'Mia Choi', status: 'inactive', role: 'developer', 'last-active': '10 minutes ago' }, { name: 'Noah Lee', status: 'active', role: 'designer', 'last-active': '1 day ago' }, { name: 'Ava Jung', status: 'active', role: 'developer', 'last-active': '5 days ago' }, { name: 'Liam Han', status: 'inactive', role: 'developer', 'last-active': '5 days ago' }, { name: 'Emma Seo', status: 'active', role: 'designer', 'last-active': '7 days ago' }, { name: 'Mason Yoo', status: 'active', role: 'designer', 'last-active': '30 minutes ago' }, { name: 'Sophia Lim', status: 'inactive', role: 'designer', 'last-active': '4 hours ago' }, { name: 'Lucas Park', status: 'active', role: 'developer', 'last-active': '1 hour ago' }, ]; const activeness: Record = { active: 'success', inactive: 'hint', }; export default function Basic() { return ( Name Status Role Last Active {datas.map((data, index) => ( {data.name} {data.status.toUpperCase()} {data.role} {data['last-active']} ))} ); } ``` ## Props Table *** ### Table.Root | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableRoot.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableRoot.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Header | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableHeader.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableHeader.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Body | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableBody.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableBody.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Footer | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableFooter.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableFooter.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Row | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableRow.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableRow.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Heading | Prop | Type | Default | Description | | ----------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableHeading.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableHeading.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Cell | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableCell.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableCell.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.ColumnGroup | Prop | Type | Default | Description | | ----------- | ------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableColumnGroup.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableColumnGroup.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Table.Column | Prop | Type | Default | Description | | ----------- | -------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: TableColumn.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TableColumn.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Tabs URL: /docs/components/tabs Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/tabs.mdx Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다. *** title: 'Tabs' site\_name: 'Tabs - Vapor Core' description: 'Tabs는 관련된 콘텐츠를 탭 형태로 구성하여 사용자가 쉽게 전환할 수 있도록 하는 컴포넌트입니다. 키보드 내비게이션, 접근성, 다양한 스타일 변형을 지원합니다.' --------------------------------------------------------------------------------------------------------- ```tsx import { Tabs } from '@vapor-ui/core'; import { AiSmartieIcon, AssignmentIcon, ListIcon } from '@vapor-ui/icons'; export default function DefaultTabs() { return ( 개요 기능 예시 ); } ``` ## Property *** ### Size Tabs의 크기를 지정합니다. `sm`, `md`, `lg`, `xl` 네 가지 크기를 제공합니다. ```tsx import { HStack, Tabs, Text, VStack } from '@vapor-ui/core'; export default function TabsSize() { return ( sm Tab 1 Tab 2 Tab 3 md Tab 1 Tab 2 Tab 3 lg Tab 1 Tab 2 Tab 3 xl Tab 1 Tab 2 Tab 3 ); } ``` ### Variant Tabs의 스타일 변형을 설정합니다. `line`과 `fill` 두 가지 스타일을 제공합니다. ```tsx import { HStack, Tabs, Text, VStack } from '@vapor-ui/core'; export default function TabsVariant() { return ( line Home About Services fill Home About Services ); } ``` ### Orientation 수평(horizontal)과 수직(vertical) 방향을 설정합니다. ```tsx import { HStack, Tabs, Text, VStack } from '@vapor-ui/core'; export default function TabsOrientation() { return ( horizontal Tab 1 Tab 2 Tab 3 vertical Tab 1 Tab 2 Tab 3 ); } ``` ### Controlled State Tabs의 활성 상태를 외부에서 제어합니다. ```tsx 'use client'; import { useState } from 'react'; import { Button, Tabs, VStack } from '@vapor-ui/core'; export default function TabsControlled() { const [activeTab, setActiveTab] = useState('profile'); return ( 프로필 계정 보안 알림
현재 선택된 탭: {activeTab}
); } ```
### States 개별 탭 또는 전체 탭 그룹을 비활성화할 수 있습니다. ```tsx import { HStack, Tabs, Text, VStack } from '@vapor-ui/core'; export default function TabsStates() { return ( tab disabled Enabled Disabled Normal group disabled Enabled Disabled Normal ); } ``` ## Examples *** ### Keyboard Navigation `activateOnFocus`와 `loopFocus` props를 사용하여 키보드 내비게이션 동작을 세밀하게 제어할 수 있습니다. ```tsx import { Tabs, VStack } from '@vapor-ui/core'; export default function TabsKeyboard() { return (

포커스 시 활성화 (activateOnFocus: true)

탭 1 탭 2 탭 3

엔터/스페이스로 활성화 (activateOnFocus: false)

탭 1 탭 2 탭 3

비순환 내비게이션 (loopFocus: false)

탭 1 탭 2 탭 3
); } ```
### Custom Indicator `Tabs.ListPrimitive`와 `Tabs.IndicatorPrimitive`를 직접 조합하면 인디케이터의 스타일을 제어할 수 있습니다. ```tsx import { Tabs } from '@vapor-ui/core'; export default function TabsCustomIndicator() { return ( 소개 서비스 ); } ``` ## Props Table *** ### Tabs.Root | Prop | Type | Default | Description | | ----------------- | ----------------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `size` | `sm`, `md`, `lg`, `xl` | - | | | `variant` | `line`, `fill` | - | | | `defaultValue` | `any` | - | 기본값을 지정합니다. 비제어 컴포넌트로 사용할 때 설정합니다.
값이 `null`이면 활성화된 Tab이 없습니다. | | `onValueChange` | `(value: any, eventDetails: Tabs.Root.ChangeEventDetails) => void` | - | 새 값이 설정될 때 호출되는 콜백입니다.

이벤트 `reason`은 클릭이나 키보드 탐색 등 사용자가 직접 변경한 경우 `'none'`, 비제어 루트에서 `defaultValue`가 생략되거나 `undefined`일 때의 최초 자동 선택 또는 폴백(암묵적 초기값이 비활성화되었거나 존재하지 않는 경우 포함)인 경우 `'initial'`, 비제어 루트에서 선택된 탭이 비활성화되어 자동 폴백이 발생한 경우 `'disabled'`, 선택된 탭이 제거되었거나 비제어 루트에서 명시적인 `defaultValue`가 마운트된 탭과 일치하지 않는 경우 `'missing'`입니다.

자동 변경 시 활성화할 수 있는 Tab이 없으면 선택된 값이 `null`일 수 있습니다.

자동 변경은 취소할 수 없으며, `'initial'`, `'disabled'`, `'missing'`에 대해 `eventDetails.cancel()`을 호출해도 효과가 없습니다. | | `value` | `any` | - | 현재 활성화된 `Tab`의 값을 지정합니다. 제어 컴포넌트로 사용할 때 설정합니다.
값이 `null`이면 활성화된 Tab이 없습니다. | | `className` | `string \| ((state: Tabs.Root.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `activateOnFocus` | `boolean` | - | 방향키로 포커스를 이동할 때 활성 탭을 자동으로 변경할지 여부를 지정합니다.
이 옵션을 사용하지 않으면 \Enter\ 또는 \Space\ 키를 눌러 탭을 활성화합니다. | | `disabled` | `boolean` | - | Tab의 비활성화 여부를 지정합니다.

`<Tabs.List>`의 첫 번째 Tab이 비활성화된 경우 초기에 선택되지 않으며, 다음 활성화된 Tab이 선택됩니다.
단, 서버 사이드 렌더링 중에는 사전 렌더링 시점에 어떤 Tab이 비활성화되어 있는지 알 수 없으므로 이 방식이 적용되지 않습니다.
이 문제를 해결하려면 `<Tabs.Root>`의 `defaultValue` 또는 `value`를 활성화된 Tab의 값으로 설정하십시오. | | `loopFocus` | `boolean` | - | 화살표 키로 목록의 끝에 도달했을 때 키보드 포커스를 첫 번째 항목으로 순환할지 여부를 설정합니다. | | `orientation` | `horizontal`, `vertical` | `horizontal` | 컴포넌트의 방향(레이아웃 흐름 방향)을 지정합니다. | | `style` | `React.CSSProperties \| ((state: Tabs.Root.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.Root.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Tabs.List | Prop | Type | Default | Description | | ------------------ | ----------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Tabs.List.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `indicatorElement` | `ReactElement>` | - | Tabs.IndicatorPrimitive에 사용할 커스텀 요소를 지정합니다. 제공하지 않으면 기본 Tabs.IndicatorPrimitive가 렌더링됩니다. | | `style` | `React.CSSProperties \| ((state: Tabs.List.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.List.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Tabs.ListPrimitive | Prop | Type | Default | Description | | ----------- | ----------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Tabs.List.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `style` | `React.CSSProperties \| ((state: Tabs.List.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.List.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | #### Tabs.IndicatorPrimitive | Prop | Type | Default | Description | | ----------------------- | ------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `className` | `string \| ((state: Tabs.IndicatorPrimitive.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `renderBeforeHydration` | `boolean` | - | React 하이드레이션 전에 렌더링할지 여부를 지정합니다.
이 옵션을 사용하면 서버 사이드 렌더링 후 인디케이터가 표시되지 않는 시간을 최소화합니다. | | `style` | `React.CSSProperties \| ((state: Tabs.IndicatorPrimitive.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.IndicatorPrimitive.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Tabs.Button | Prop | Type | Default | Description | | -------------- | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **value** | `any` | - | Tab의 값을 지정합니다. | | `className` | `string \| ((state: Tabs.Button.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `disabled` | `boolean` | - | Tab의 비활성화 여부를 지정합니다.

`<Tabs.List>`의 첫 번째 Tab이 비활성화된 경우 초기에 선택되지 않으며, 다음 활성화된 Tab이 선택됩니다.
단, 서버 사이드 렌더링 중에는 사전 렌더링 시점에 어떤 Tab이 비활성화되어 있는지 알 수 없으므로 이 방식이 적용되지 않습니다.
이 문제를 해결하려면 `<Tabs.Root>`의 `defaultValue` 또는 `value`를 활성화된 Tab의 값으로 설정하십시오. | | `nativeButton` | `boolean` | - | `render` prop으로 요소를 교체할 때 컴포넌트가 네이티브 `<button>` 요소를 렌더링할지 여부를 지정합니다.
렌더링할 요소가 버튼이 아닌 경우(예: `<div>`) `false`로 설정합니다. | | `style` | `React.CSSProperties \| ((state: Tabs.Button.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.Button.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | ### Tabs.Panel | Prop | Type | Default | Description | | ------------- | ------------------------------------------------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------ | | **value** | `any` | - | TabPanel의 값을 지정합니다. 대응하는 값을 가진 Tab이 활성화될 때 표시됩니다. | | `className` | `string \| ((state: Tabs.Panel.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `keepMounted` | `boolean` | - | 패널이 숨겨진 상태에서도 HTML 요소를 DOM에 유지할지 여부를 지정합니다. | | `style` | `React.CSSProperties \| ((state: Tabs.Panel.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Tabs.Panel.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # TextInput URL: /docs/components/text-input Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/text-input.mdx TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다. *** title: 'TextInput' site\_name: 'TextInput - Vapor Core' description: 'TextInput은 사용자가 데이터를 입력할 수 있도록 텍스트, 숫자 등 다양한 형식의 입력 필드를 제공합니다.' ----------------------------------------------------------------------------- ```tsx import { TextInput } from '@vapor-ui/core'; export default function DefaultTextInput() { return ; } ``` ## Property *** ### Size TextInput의 크기를 설정합니다. ```tsx import { HStack, Text, TextInput, VStack } from '@vapor-ui/core'; export default function TextInputSize() { return ( sm md lg xl ); } ``` ### Type TextInput의 타입을 설정합니다. ```tsx import { HStack, Text, TextInput, VStack } from '@vapor-ui/core'; export default function TextInputType() { return ( text email password ); } ``` ### Disabled 사용자가 상호작용할 수 없는 상태입니다. 액션을 수행하기 위한 특정 조건을 충족하지 않았거나 일시적으로 기능을 제한하려는 상황에서 사용합니다. ```tsx import { TextInput, VStack } from '@vapor-ui/core'; export default function TextInputDisabled() { return ( ); } ``` ### Invalid 유효하지 않은 상태(필수 항목 누락, 잘못된 입력 등)를 표시하여 올바른 입력을 유도합니다. ```tsx import { TextInput, VStack } from '@vapor-ui/core'; export default function TextInputInvalid() { return ( ); } ``` ### Read Only 값을 수정할 수 없지만, 텍스트를 복사하거나 읽을 수 있는 상태입니다. ```tsx import { TextInput, VStack } from '@vapor-ui/core'; export default function TextInputReadOnly() { return ( ); } ``` ## Examples *** ### States TextInput의 다양한 상태를 보여줍니다. ```tsx import { HStack, Text, TextInput, VStack } from '@vapor-ui/core'; export default function TextInputStates() { return ( default disabled invalid readOnly ); } ``` ## Props Table *** ### TextInput | Prop | Type | Default | Description | | --------------- | ----------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | | `invalid` | `boolean` | `false` | | | `size` | `sm`, `md`, `lg`, `xl` | `md` | | | `defaultValue` | `string` | \`\` | input의 기본값을 지정합니다. 비제어 방식으로 사용할 때 설정합니다. | | `onValueChange` | `(value: string, event: TextInput.ChangeEventDetails) => void` | - | input의 선택된 값이 변경될 때 호출되는 이벤트 핸들러입니다. | | `value` | `string` | - | input의 값을 지정합니다. 제어 방식으로 사용할 때 설정합니다. | | `className` | `string \| ((state: TextInput.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `type` | `search`, `text`, `tel`, `url`, `email`, `password` | - | input 요소의 타입을 지정합니다. 입력할 수 있는 데이터의 종류를 결정합니다. | | `style` | `React.CSSProperties \| ((state: TextInput.State) => (React.CSSProperties \| undefined))` | - | 요소에 적용할 스타일을 지정합니다. 컴포넌트의 상태를 기반으로 스타일 객체를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: TextInput.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Text URL: /docs/components/text Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/text.mdx Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다. *** title: 'Text' site\_name: 'Text - Vapor Core' description: 'Text 컴포넌트는 시멘틱 태그와 타이포그래피·색상 토큰을 조합하여 텍스트 스타일을 설정합니다.' -------------------------------------------------------------------- ```tsx import { Text } from '@vapor-ui/core'; export default function DefaultText() { return Hello World; } ``` ## Property *** ### Typography 텍스트의 타이포그래피 스타일을 설정합니다. ```tsx import { Text, VStack } from '@vapor-ui/core'; export default function TextTypography() { return ( Display1 Heading1 Subtitle1 Body1 ); } ``` ### Foreground 텍스트의 색상을 설정합니다. ```tsx import { HStack, Text } from '@vapor-ui/core'; export default function TextForeground() { return ( Primary Secondary Success Warning Danger Hint ); } ``` ## Props Table *** ### Text | Prop | Type | Default | Description | | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------ | | `foreground` | `white`, `inverse`, `primary-100`, `primary-200`, `secondary-100`, `success-100`, `success-200`, `warning-100`, `warning-200`, `danger-100`, `danger-200`, `hint-100`, `hint-200`, `contrast-100`, `contrast-200`, `secondary-200`, `normal-100`, `normal-200` | `normal-200` | | | `typography` | `body1`, `display1`, `display2`, `display3`, `display4`, `heading1`, `heading2`, `heading3`, `heading4`, `heading5`, `heading6`, `subtitle1`, `subtitle2`, `body2`, `body3`, `body4`, `code1`, `code2` | `body1` | | | `className` | `string \| ((state: Text.State) => (string \| undefined))` | - | 요소에 적용할 CSS 클래스를 지정합니다. 컴포넌트의 상태를 기반으로 클래스를 반환하는 함수도 사용할 수 있습니다. | | `render` | `ReactElement \| ((props: HTMLProps, state: Text.State) => ReactElement)` | - | 컴포넌트의 HTML 요소를 다른 태그로 교체하거나 다른 컴포넌트와 합성할 때 사용합니다.

`ReactElement` 또는 렌더링할 요소를 반환하는 함수를 전달할 수 있습니다. | # Textarea URL: /docs/components/textarea Source: https://raw.githubusercontent.com/goorm-dev/vapor-ui/refs/heads/main/apps/website/content/docs/components/(components)/textarea.mdx Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다. *** title: 'Textarea' site\_name: 'Textarea - Vapor Core' description: 'Textarea는 사용자가 여러 줄의 텍스트를 입력할 수 있도록 하는 텍스트 입력 필드를 제공합니다.' ----------------------------------------------------------------------- ```tsx import { Box, Textarea } from '@vapor-ui/core'; export default function DefaultTextarea() { return (