@reco-inc/upbox-ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/FigmaConnect.md +1963 -0
  2. package/README.md +217 -0
  3. package/dist/FigmaConnect.md +1963 -0
  4. package/dist/components/accordion/Accordion.d.ts +23 -0
  5. package/dist/components/accordion/Accordion.stories.d.ts +38 -0
  6. package/dist/components/accordion/AccordionContent.d.ts +22 -0
  7. package/dist/components/accordion/AccordionItem.d.ts +22 -0
  8. package/dist/components/accordion/AccordionTrigger.d.ts +23 -0
  9. package/dist/components/accordion/index.d.ts +4 -0
  10. package/dist/components/avatar/Avatar.d.ts +21 -0
  11. package/dist/components/avatar/Avatar.stories.d.ts +46 -0
  12. package/dist/components/avatar/AvatarFallback.d.ts +18 -0
  13. package/dist/components/avatar/AvatarImage.d.ts +18 -0
  14. package/dist/components/avatar/index.d.ts +14 -0
  15. package/dist/components/badge/Badge.d.ts +20 -0
  16. package/dist/components/badge/Badge.stories.d.ts +52 -0
  17. package/dist/components/badge/index.d.ts +20 -0
  18. package/dist/components/badge-divider/BadgeDivider.d.ts +18 -0
  19. package/dist/components/badge-divider/BadgeDivider.stories.d.ts +38 -0
  20. package/dist/components/badge-divider/index.d.ts +12 -0
  21. package/dist/components/breadcrumb/Breadcrumb.d.ts +21 -0
  22. package/dist/components/breadcrumb/Breadcrumb.stories.d.ts +33 -0
  23. package/dist/components/breadcrumb/BreadcrumbEllipsis.d.ts +21 -0
  24. package/dist/components/breadcrumb/BreadcrumbItem.d.ts +21 -0
  25. package/dist/components/breadcrumb/BreadcrumbLink.d.ts +24 -0
  26. package/dist/components/breadcrumb/BreadcrumbList.d.ts +21 -0
  27. package/dist/components/breadcrumb/BreadcrumbPage.d.ts +21 -0
  28. package/dist/components/breadcrumb/BreadcrumbSeparator.d.ts +21 -0
  29. package/dist/components/breadcrumb/index.d.ts +7 -0
  30. package/dist/components/button/Button.d.ts +39 -0
  31. package/dist/components/button/Button.stories.d.ts +109 -0
  32. package/dist/components/button/index.d.ts +9 -0
  33. package/dist/components/calendar/CalendarCell.d.ts +22 -0
  34. package/dist/components/calendar/CalendarCellTrigger.d.ts +22 -0
  35. package/dist/components/calendar/CalendarDateGrid.d.ts +58 -0
  36. package/dist/components/calendar/CalendarFooter.d.ts +32 -0
  37. package/dist/components/calendar/CalendarGrid.d.ts +22 -0
  38. package/dist/components/calendar/CalendarGridBody.d.ts +18 -0
  39. package/dist/components/calendar/CalendarGridHead.d.ts +22 -0
  40. package/dist/components/calendar/CalendarGridRow.d.ts +22 -0
  41. package/dist/components/calendar/CalendarHeadCell.d.ts +22 -0
  42. package/dist/components/calendar/CalendarHeader.d.ts +32 -0
  43. package/dist/components/calendar/CalendarHeading.d.ts +35 -0
  44. package/dist/components/calendar/CalendarMonthGrid.d.ts +19 -0
  45. package/dist/components/calendar/CalendarNextButton.d.ts +22 -0
  46. package/dist/components/calendar/CalendarPrevButton.d.ts +22 -0
  47. package/dist/components/calendar/CalendarRangeDateGrid.d.ts +73 -0
  48. package/dist/components/calendar/CalendarRangeHeader.d.ts +13 -0
  49. package/dist/components/calendar/CalendarShortcut.d.ts +41 -0
  50. package/dist/components/calendar/CalendarTimeSelect.d.ts +27 -0
  51. package/dist/components/calendar/CalendarYearGrid.d.ts +16 -0
  52. package/dist/components/calendar/DateCalendar.d.ts +50 -0
  53. package/dist/components/calendar/DateCalendar.stories.d.ts +69 -0
  54. package/dist/components/calendar/MobileDateCalendar.d.ts +44 -0
  55. package/dist/components/calendar/MobileDateCalendar.stories.d.ts +63 -0
  56. package/dist/components/calendar/MobilePeriodCalendar.d.ts +53 -0
  57. package/dist/components/calendar/MobilePeriodCalendar.stories.d.ts +88 -0
  58. package/dist/components/calendar/MonthCalendar.d.ts +16 -0
  59. package/dist/components/calendar/MonthCalendar.stories.d.ts +24 -0
  60. package/dist/components/calendar/PeriodCalendar.d.ts +22 -0
  61. package/dist/components/calendar/PeriodCalendar.stories.d.ts +31 -0
  62. package/dist/components/calendar/RangeCalendar.d.ts +65 -0
  63. package/dist/components/calendar/RangeCalendarNextButton.d.ts +22 -0
  64. package/dist/components/calendar/RangeCalendarPrevButton.d.ts +22 -0
  65. package/dist/components/calendar/calendarDateCellClasses.d.ts +3 -0
  66. package/dist/components/calendar/calendarShortcutItems.d.ts +16 -0
  67. package/dist/components/calendar/calendarWeek.d.ts +12 -0
  68. package/dist/components/calendar/index.d.ts +27 -0
  69. package/dist/components/card/Card.d.ts +21 -0
  70. package/dist/components/card/Card.stories.d.ts +32 -0
  71. package/dist/components/card/CardContent.d.ts +21 -0
  72. package/dist/components/card/CardDescription.d.ts +21 -0
  73. package/dist/components/card/CardFooter.d.ts +21 -0
  74. package/dist/components/card/CardHeader.d.ts +21 -0
  75. package/dist/components/card/CardTitle.d.ts +21 -0
  76. package/dist/components/card/index.d.ts +6 -0
  77. package/dist/components/checkbox/Checkbox.d.ts +33 -0
  78. package/dist/components/checkbox/Checkbox.stories.d.ts +75 -0
  79. package/dist/components/checkbox/CheckboxGroupField.d.ts +27 -0
  80. package/dist/components/checkbox/CheckboxGroupField.stories.d.ts +35 -0
  81. package/dist/components/checkbox/index.d.ts +20 -0
  82. package/dist/components/date-move/DateMove.d.ts +30 -0
  83. package/dist/components/date-move/DateMove.stories.d.ts +59 -0
  84. package/dist/components/date-move/dateMoveContext.d.ts +3 -0
  85. package/dist/components/date-move/index.d.ts +1 -0
  86. package/dist/components/date-period-picker/DatePeriodInput.d.ts +23 -0
  87. package/dist/components/date-period-picker/DatePeriodPicker.d.ts +42 -0
  88. package/dist/components/date-period-picker/DatePeriodPicker.stories.d.ts +91 -0
  89. package/dist/components/date-period-picker/DatePeriodTrigger.d.ts +16 -0
  90. package/dist/components/date-period-picker/datePeriodTypes.d.ts +7 -0
  91. package/dist/components/date-period-picker/index.d.ts +4 -0
  92. package/dist/components/date-picker/DateInput.d.ts +43 -0
  93. package/dist/components/date-picker/DatePicker.d.ts +46 -0
  94. package/dist/components/date-picker/DatePicker.stories.d.ts +117 -0
  95. package/dist/components/date-picker/DateTrigger.d.ts +23 -0
  96. package/dist/components/date-picker/datePickerContext.d.ts +14 -0
  97. package/dist/components/date-picker/index.d.ts +3 -0
  98. package/dist/components/dialog/Dialog.d.ts +22 -0
  99. package/dist/components/dialog/Dialog.stories.d.ts +37 -0
  100. package/dist/components/dialog/DialogClose.d.ts +18 -0
  101. package/dist/components/dialog/DialogContent.d.ts +60 -0
  102. package/dist/components/dialog/DialogDescription.d.ts +22 -0
  103. package/dist/components/dialog/DialogFooter.d.ts +21 -0
  104. package/dist/components/dialog/DialogHeader.d.ts +21 -0
  105. package/dist/components/dialog/DialogScrollContent.d.ts +36 -0
  106. package/dist/components/dialog/DialogTitle.d.ts +22 -0
  107. package/dist/components/dialog/DialogTrigger.d.ts +18 -0
  108. package/dist/components/dialog/index.d.ts +10 -0
  109. package/dist/components/drawer/Drawer.d.ts +34 -0
  110. package/dist/components/drawer/Drawer.stories.d.ts +67 -0
  111. package/dist/components/drawer/DrawerContent.d.ts +36 -0
  112. package/dist/components/drawer/DrawerDescription.d.ts +22 -0
  113. package/dist/components/drawer/DrawerFooter.d.ts +21 -0
  114. package/dist/components/drawer/DrawerHeader.d.ts +21 -0
  115. package/dist/components/drawer/DrawerOverlay.d.ts +7 -0
  116. package/dist/components/drawer/DrawerTitle.d.ts +22 -0
  117. package/dist/components/drawer/index.d.ts +8 -0
  118. package/dist/components/dropdown-filter/DropdownFilter.d.ts +59 -0
  119. package/dist/components/dropdown-filter/DropdownFilter.stories.d.ts +41 -0
  120. package/dist/components/dropdown-filter/index.d.ts +2 -0
  121. package/dist/components/dropdown-menu/DropdownMenu.d.ts +22 -0
  122. package/dist/components/dropdown-menu/DropdownMenu.stories.d.ts +39 -0
  123. package/dist/components/dropdown-menu/DropdownMenuCheckboxItem.d.ts +28 -0
  124. package/dist/components/dropdown-menu/DropdownMenuContent.d.ts +36 -0
  125. package/dist/components/dropdown-menu/DropdownMenuGroup.d.ts +18 -0
  126. package/dist/components/dropdown-menu/DropdownMenuItem.d.ts +23 -0
  127. package/dist/components/dropdown-menu/DropdownMenuLabel.d.ts +23 -0
  128. package/dist/components/dropdown-menu/DropdownMenuRadioGroup.d.ts +22 -0
  129. package/dist/components/dropdown-menu/DropdownMenuRadioItem.d.ts +26 -0
  130. package/dist/components/dropdown-menu/DropdownMenuSeparator.d.ts +7 -0
  131. package/dist/components/dropdown-menu/DropdownMenuShortcut.d.ts +21 -0
  132. package/dist/components/dropdown-menu/DropdownMenuSub.d.ts +22 -0
  133. package/dist/components/dropdown-menu/DropdownMenuSubContent.d.ts +38 -0
  134. package/dist/components/dropdown-menu/DropdownMenuSubTrigger.d.ts +22 -0
  135. package/dist/components/dropdown-menu/DropdownMenuTrigger.d.ts +18 -0
  136. package/dist/components/dropdown-menu/index.d.ts +15 -0
  137. package/dist/components/empty/Empty.d.ts +21 -0
  138. package/dist/components/empty/Empty.stories.d.ts +26 -0
  139. package/dist/components/empty/EmptyState.d.ts +29 -0
  140. package/dist/components/empty/EmptyState.stories.d.ts +43 -0
  141. package/dist/components/empty/index.d.ts +4 -0
  142. package/dist/components/fab/Fab.d.ts +33 -0
  143. package/dist/components/fab/Fab.stories.d.ts +70 -0
  144. package/dist/components/fab/index.d.ts +7 -0
  145. package/dist/components/file-uploader/FileItem.d.ts +52 -0
  146. package/dist/components/file-uploader/FileUploader.d.ts +65 -0
  147. package/dist/components/file-uploader/FileUploader.stories.d.ts +122 -0
  148. package/dist/components/file-uploader/index.d.ts +3 -0
  149. package/dist/components/file-uploader/types.d.ts +33 -0
  150. package/dist/components/filter-chip/FilterChip.d.ts +24 -0
  151. package/dist/components/filter-chip/FilterChip.stories.d.ts +70 -0
  152. package/dist/components/filter-chip/index.d.ts +30 -0
  153. package/dist/components/form/FieldContainer.d.ts +51 -0
  154. package/dist/components/form/FieldContainer.stories.d.ts +77 -0
  155. package/dist/components/form/FieldControlProvider.d.ts +21 -0
  156. package/dist/components/form/FormControl.d.ts +17 -0
  157. package/dist/components/form/FormDescription.d.ts +21 -0
  158. package/dist/components/form/FormItem.d.ts +21 -0
  159. package/dist/components/form/FormLabel.d.ts +22 -0
  160. package/dist/components/form/FormMessage.d.ts +2 -0
  161. package/dist/components/form/index.d.ts +8 -0
  162. package/dist/components/form/injectionKeys.d.ts +11 -0
  163. package/dist/components/form/useFormField.d.ts +11 -0
  164. package/dist/components/icon-button/IconButton.d.ts +31 -0
  165. package/dist/components/icon-button/IconButton.stories.d.ts +67 -0
  166. package/dist/components/icon-button/index.d.ts +7 -0
  167. package/dist/components/input-frame/InputFrame.d.ts +32 -0
  168. package/dist/components/input-frame/InputFrame.stories.d.ts +75 -0
  169. package/dist/components/input-frame/InputIcon.d.ts +21 -0
  170. package/dist/components/input-frame/index.d.ts +4 -0
  171. package/dist/components/input-frame/inputFrameContext.d.ts +35 -0
  172. package/dist/components/input-frame/inputFrameVariants.d.ts +26 -0
  173. package/dist/components/input-group/InputGroup.d.ts +29 -0
  174. package/dist/components/input-group/InputGroup.stories.d.ts +47 -0
  175. package/dist/components/input-group/InputGroupAddon.d.ts +20 -0
  176. package/dist/components/input-group/InputGroupButton.d.ts +21 -0
  177. package/dist/components/input-group/InputGroupInput.d.ts +6 -0
  178. package/dist/components/input-group/InputGroupText.d.ts +21 -0
  179. package/dist/components/input-group/InputGroupTextarea.d.ts +7 -0
  180. package/dist/components/input-group/index.d.ts +27 -0
  181. package/dist/components/label/Label.d.ts +22 -0
  182. package/dist/components/label/Label.stories.d.ts +41 -0
  183. package/dist/components/label/index.d.ts +1 -0
  184. package/dist/components/logo/Logo.d.ts +5 -0
  185. package/dist/components/logo/Logo.stories.d.ts +20 -0
  186. package/dist/components/logo/index.d.ts +5 -0
  187. package/dist/components/mobile-date-period-picker/MobileDatePeriodPicker.d.ts +62 -0
  188. package/dist/components/mobile-date-period-picker/MobileDatePeriodPicker.stories.d.ts +123 -0
  189. package/dist/components/mobile-date-period-picker/MobileDatePeriodTrigger.d.ts +36 -0
  190. package/dist/components/mobile-date-period-picker/index.d.ts +2 -0
  191. package/dist/components/mobile-date-period-selector/MobileDatePeriodSelector.d.ts +49 -0
  192. package/dist/components/mobile-date-period-selector/MobileDatePeriodSelector.stories.d.ts +69 -0
  193. package/dist/components/mobile-date-period-selector/index.d.ts +2 -0
  194. package/dist/components/mobile-date-picker/MobileDatePicker.d.ts +45 -0
  195. package/dist/components/mobile-date-picker/MobileDatePicker.stories.d.ts +91 -0
  196. package/dist/components/mobile-date-picker/MobileDateTrigger.d.ts +23 -0
  197. package/dist/components/mobile-date-picker/index.d.ts +2 -0
  198. package/dist/components/mobile-time-picker/MobileTimeDial.d.ts +26 -0
  199. package/dist/components/mobile-time-picker/MobileTimeDial.stories.d.ts +37 -0
  200. package/dist/components/mobile-time-picker/MobileTimePicker.d.ts +39 -0
  201. package/dist/components/mobile-time-picker/MobileTimePicker.stories.d.ts +95 -0
  202. package/dist/components/mobile-time-picker/index.d.ts +2 -0
  203. package/dist/components/modal/Modal.d.ts +60 -0
  204. package/dist/components/modal/Modal.stories.d.ts +53 -0
  205. package/dist/components/modal/index.d.ts +2 -0
  206. package/dist/components/modal/modalProps.d.ts +57 -0
  207. package/dist/components/number-field/NumberField.d.ts +12 -0
  208. package/dist/components/number-field/NumberField.stories.d.ts +43 -0
  209. package/dist/components/number-field/NumberFieldContent.d.ts +21 -0
  210. package/dist/components/number-field/NumberFieldDecrement.d.ts +22 -0
  211. package/dist/components/number-field/NumberFieldIncrement.d.ts +22 -0
  212. package/dist/components/number-field/NumberFieldInput.d.ts +7 -0
  213. package/dist/components/number-field/NumberFieldRoot.d.ts +37 -0
  214. package/dist/components/number-field/index.d.ts +25 -0
  215. package/dist/components/page-header/PageHeader.d.ts +64 -0
  216. package/dist/components/page-header/PageHeader.stories.d.ts +27 -0
  217. package/dist/components/page-header/index.d.ts +1 -0
  218. package/dist/components/pagination/Pagination.d.ts +29 -0
  219. package/dist/components/pagination/Pagination.stories.d.ts +50 -0
  220. package/dist/components/pagination/PaginationContent.d.ts +29 -0
  221. package/dist/components/pagination/PaginationEllipsis.d.ts +22 -0
  222. package/dist/components/pagination/PaginationFirst.d.ts +22 -0
  223. package/dist/components/pagination/PaginationItem.d.ts +22 -0
  224. package/dist/components/pagination/PaginationLast.d.ts +22 -0
  225. package/dist/components/pagination/PaginationNext.d.ts +22 -0
  226. package/dist/components/pagination/PaginationPrevious.d.ts +22 -0
  227. package/dist/components/pagination/index.d.ts +13 -0
  228. package/dist/components/panel/Panel.d.ts +23 -0
  229. package/dist/components/panel/Panel.stories.d.ts +59 -0
  230. package/dist/components/panel/PanelIcon.d.ts +7 -0
  231. package/dist/components/panel/index.d.ts +17 -0
  232. package/dist/components/panel/panelContext.d.ts +8 -0
  233. package/dist/components/panel/panelVariants.d.ts +13 -0
  234. package/dist/components/popover/Popover.d.ts +22 -0
  235. package/dist/components/popover/Popover.stories.d.ts +38 -0
  236. package/dist/components/popover/PopoverContent.d.ts +39 -0
  237. package/dist/components/popover/PopoverTrigger.d.ts +18 -0
  238. package/dist/components/popover/index.d.ts +5 -0
  239. package/dist/components/radio-group/RadioGroup.d.ts +26 -0
  240. package/dist/components/radio-group/RadioGroup.stories.d.ts +48 -0
  241. package/dist/components/radio-group/RadioGroupField.d.ts +28 -0
  242. package/dist/components/radio-group/RadioGroupField.stories.d.ts +31 -0
  243. package/dist/components/radio-group/RadioGroupItem.d.ts +12 -0
  244. package/dist/components/radio-group/index.d.ts +9 -0
  245. package/dist/components/search-field/SearchField.d.ts +33 -0
  246. package/dist/components/search-field/SearchField.stories.d.ts +94 -0
  247. package/dist/components/search-field/index.d.ts +17 -0
  248. package/dist/components/select/Select.d.ts +33 -0
  249. package/dist/components/select/Select.stories.d.ts +54 -0
  250. package/dist/components/select/SelectClearIcon.d.ts +2 -0
  251. package/dist/components/select/SelectContent.d.ts +33 -0
  252. package/dist/components/select/SelectField.d.ts +16 -0
  253. package/dist/components/select/SelectField.stories.d.ts +43 -0
  254. package/dist/components/select/SelectFieldValue.d.ts +26 -0
  255. package/dist/components/select/SelectGroup.d.ts +22 -0
  256. package/dist/components/select/SelectItem.d.ts +22 -0
  257. package/dist/components/select/SelectItemText.d.ts +18 -0
  258. package/dist/components/select/SelectLabel.d.ts +22 -0
  259. package/dist/components/select/SelectScrollDownButton.d.ts +22 -0
  260. package/dist/components/select/SelectScrollUpButton.d.ts +22 -0
  261. package/dist/components/select/SelectSeparator.d.ts +7 -0
  262. package/dist/components/select/SelectTrigger.d.ts +52 -0
  263. package/dist/components/select/SelectValue.d.ts +18 -0
  264. package/dist/components/select/index.d.ts +14 -0
  265. package/dist/components/select/selectContext.d.ts +3 -0
  266. package/dist/components/select/selectFieldProps.d.ts +38 -0
  267. package/dist/components/separator/Separator.d.ts +6 -0
  268. package/dist/components/separator/Separator.stories.d.ts +13 -0
  269. package/dist/components/separator/index.d.ts +6 -0
  270. package/dist/components/sheet/Sheet.d.ts +22 -0
  271. package/dist/components/sheet/Sheet.stories.d.ts +40 -0
  272. package/dist/components/sheet/SheetClose.d.ts +18 -0
  273. package/dist/components/sheet/SheetContent.d.ts +35 -0
  274. package/dist/components/sheet/SheetDescription.d.ts +22 -0
  275. package/dist/components/sheet/SheetFooter.d.ts +21 -0
  276. package/dist/components/sheet/SheetHeader.d.ts +21 -0
  277. package/dist/components/sheet/SheetTitle.d.ts +22 -0
  278. package/dist/components/sheet/SheetTrigger.d.ts +18 -0
  279. package/dist/components/sheet/index.d.ts +17 -0
  280. package/dist/components/sidebar/Sidebar.d.ts +24 -0
  281. package/dist/components/sidebar/Sidebar.stories.d.ts +45 -0
  282. package/dist/components/sidebar/SidebarContent.d.ts +21 -0
  283. package/dist/components/sidebar/SidebarFooter.d.ts +21 -0
  284. package/dist/components/sidebar/SidebarGroup.d.ts +21 -0
  285. package/dist/components/sidebar/SidebarGroupAction.d.ts +22 -0
  286. package/dist/components/sidebar/SidebarGroupContent.d.ts +21 -0
  287. package/dist/components/sidebar/SidebarGroupLabel.d.ts +22 -0
  288. package/dist/components/sidebar/SidebarHeader.d.ts +21 -0
  289. package/dist/components/sidebar/SidebarInput.d.ts +21 -0
  290. package/dist/components/sidebar/SidebarInset.d.ts +21 -0
  291. package/dist/components/sidebar/SidebarMenu.d.ts +21 -0
  292. package/dist/components/sidebar/SidebarMenuAction.d.ts +25 -0
  293. package/dist/components/sidebar/SidebarMenuBadge.d.ts +21 -0
  294. package/dist/components/sidebar/SidebarMenuButton.d.ts +27 -0
  295. package/dist/components/sidebar/SidebarMenuButtonChild.d.ts +25 -0
  296. package/dist/components/sidebar/SidebarMenuItem.d.ts +21 -0
  297. package/dist/components/sidebar/SidebarMenuSkeleton.d.ts +7 -0
  298. package/dist/components/sidebar/SidebarMenuSub.d.ts +24 -0
  299. package/dist/components/sidebar/SidebarMenuSubButton.d.ts +27 -0
  300. package/dist/components/sidebar/SidebarMenuSubItem.d.ts +17 -0
  301. package/dist/components/sidebar/SidebarProvider.d.ts +33 -0
  302. package/dist/components/sidebar/SidebarRail.d.ts +21 -0
  303. package/dist/components/sidebar/SidebarSeparator.d.ts +21 -0
  304. package/dist/components/sidebar/SidebarTrigger.d.ts +6 -0
  305. package/dist/components/sidebar/index.d.ts +43 -0
  306. package/dist/components/sidebar/utils.d.ts +62 -0
  307. package/dist/components/skeleton/Skeleton.d.ts +6 -0
  308. package/dist/components/skeleton/Skeleton.stories.d.ts +10 -0
  309. package/dist/components/skeleton/index.d.ts +1 -0
  310. package/dist/components/spinner/Spinner.d.ts +6 -0
  311. package/dist/components/spinner/Spinner.stories.d.ts +15 -0
  312. package/dist/components/spinner/index.d.ts +1 -0
  313. package/dist/components/stepper/Stepper.d.ts +24 -0
  314. package/dist/components/stepper/Stepper.stories.d.ts +18 -0
  315. package/dist/components/stepper/index.d.ts +2 -0
  316. package/dist/components/table/DataTable.d.ts +46 -0
  317. package/dist/components/table/DataTable.stories.d.ts +24 -0
  318. package/dist/components/table/Table.d.ts +28 -0
  319. package/dist/components/table/Table.stories.d.ts +52 -0
  320. package/dist/components/table/TableBody.d.ts +21 -0
  321. package/dist/components/table/TableCaption.d.ts +21 -0
  322. package/dist/components/table/TableCell.d.ts +46 -0
  323. package/dist/components/table/TableEmpty.d.ts +24 -0
  324. package/dist/components/table/TableFooter.d.ts +21 -0
  325. package/dist/components/table/TableHead.d.ts +24 -0
  326. package/dist/components/table/TableHeader.d.ts +21 -0
  327. package/dist/components/table/TableRow.d.ts +21 -0
  328. package/dist/components/table/dataTableTypes.d.ts +19 -0
  329. package/dist/components/table/index.d.ts +11 -0
  330. package/dist/components/tabs/Tabs.d.ts +22 -0
  331. package/dist/components/tabs/Tabs.stories.d.ts +41 -0
  332. package/dist/components/tabs/TabsBar.d.ts +41 -0
  333. package/dist/components/tabs/TabsBar.stories.d.ts +27 -0
  334. package/dist/components/tabs/TabsContent.d.ts +22 -0
  335. package/dist/components/tabs/TabsList.d.ts +25 -0
  336. package/dist/components/tabs/TabsTrigger.d.ts +25 -0
  337. package/dist/components/tabs/index.d.ts +45 -0
  338. package/dist/components/tag/Tag.d.ts +27 -0
  339. package/dist/components/tag/Tag.stories.d.ts +66 -0
  340. package/dist/components/tag/index.d.ts +14 -0
  341. package/dist/components/text-button/TextButton.d.ts +32 -0
  342. package/dist/components/text-button/TextButton.stories.d.ts +67 -0
  343. package/dist/components/text-button/index.d.ts +7 -0
  344. package/dist/components/text-field/TextField.d.ts +47 -0
  345. package/dist/components/text-field/TextField.stories.d.ts +123 -0
  346. package/dist/components/text-field/TextFieldCount.d.ts +12 -0
  347. package/dist/components/text-field/TextFieldUnit.d.ts +21 -0
  348. package/dist/components/text-field/index.d.ts +6 -0
  349. package/dist/components/text-field/textFieldContext.d.ts +8 -0
  350. package/dist/components/textarea/Textarea.d.ts +59 -0
  351. package/dist/components/textarea/Textarea.stories.d.ts +112 -0
  352. package/dist/components/textarea/TextareaCount.d.ts +12 -0
  353. package/dist/components/textarea/index.d.ts +5 -0
  354. package/dist/components/textarea/textareaContext.d.ts +8 -0
  355. package/dist/components/time-picker/TimeInput.d.ts +28 -0
  356. package/dist/components/time-picker/TimePanel.d.ts +22 -0
  357. package/dist/components/time-picker/TimePicker.d.ts +37 -0
  358. package/dist/components/time-picker/TimePicker.stories.d.ts +94 -0
  359. package/dist/components/time-picker/TimeTrigger.d.ts +23 -0
  360. package/dist/components/time-picker/index.d.ts +4 -0
  361. package/dist/components/time-picker/timePickerContext.d.ts +7 -0
  362. package/dist/components/toast/Toast.d.ts +5 -0
  363. package/dist/components/toast/Toast.stories.d.ts +24 -0
  364. package/dist/components/toast/index.d.ts +3 -0
  365. package/dist/components/toggle/Toggle.d.ts +25 -0
  366. package/dist/components/toggle/Toggle.stories.d.ts +64 -0
  367. package/dist/components/toggle/index.d.ts +30 -0
  368. package/dist/components/toolbar/Toolbar.d.ts +41 -0
  369. package/dist/components/toolbar/Toolbar.stories.d.ts +87 -0
  370. package/dist/components/toolbar/index.d.ts +2 -0
  371. package/dist/components/tooltip/Tooltip.d.ts +22 -0
  372. package/dist/components/tooltip/Tooltip.stories.d.ts +36 -0
  373. package/dist/components/tooltip/TooltipContent.d.ts +30 -0
  374. package/dist/components/tooltip/TooltipProvider.d.ts +18 -0
  375. package/dist/components/tooltip/TooltipTrigger.d.ts +18 -0
  376. package/dist/components/tooltip/index.d.ts +5 -0
  377. package/dist/docs/AllComponents.d.ts +2 -0
  378. package/dist/docs/AllComponents.stories.d.ts +6 -0
  379. package/dist/docs/ColourTokens.d.ts +2 -0
  380. package/dist/docs/ColourTokens.stories.d.ts +6 -0
  381. package/dist/docs/ShadowTokens.d.ts +2 -0
  382. package/dist/docs/ShadowTokens.stories.d.ts +6 -0
  383. package/dist/docs/SpacingTokens.d.ts +2 -0
  384. package/dist/docs/SpacingTokens.stories.d.ts +6 -0
  385. package/dist/docs/TypographyTokens.d.ts +2 -0
  386. package/dist/docs/TypographyTokens.stories.d.ts +6 -0
  387. package/dist/global.d.ts +192 -0
  388. package/dist/i18n.d.ts +2 -0
  389. package/dist/i18n.mjs +93 -0
  390. package/dist/index.d.ts +59 -0
  391. package/dist/index.mjs +11834 -0
  392. package/dist/lib/options.d.ts +12 -0
  393. package/dist/lib/useDialogAriaModal.d.ts +22 -0
  394. package/dist/lib/utils.d.ts +2 -0
  395. package/dist/locales/en.d.ts +39 -0
  396. package/dist/locales/index.d.ts +104 -0
  397. package/dist/locales/ko.d.ts +43 -0
  398. package/dist/upbox-ui.css +1 -0
  399. package/package.json +99 -0
  400. package/src/style.css +458 -0
  401. package/tailwind-theme.css +379 -0
@@ -0,0 +1,1963 @@
1
+ # Figma / upbox-ui 속성 매핑
2
+
3
+ 피그마 속성(변형 이름)과 Vue `prop` / `event` / `slot` / `v-model`을 일치시킨다. 동작·구현 설명은 넣지 않는다.
4
+
5
+ | 항목 | 값 |
6
+ |------|-----|
7
+ | Figma 파일 | [최종 Component _v02](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/-%EC%B5%9C%EC%A2%85-Component-_v02) |
8
+ | 파일 키 | `4eyRu4lbq9068LACdI8HMp` |
9
+ | 라이브러리 | Vue 3 / `@reco-inc/upbox-ui` |
10
+
11
+ ## 인덱스
12
+
13
+ 노드 ID 오름차순. 합성 컴포넌트는 아래 합성 표 참고.
14
+
15
+ | 피그마 노드 ID | 피그마 컴포넌트 | Vue 컴포넌트 |
16
+ |----------------|----------------|--------------|
17
+ | [3220:15782](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3220-15782) | [standardButton](#standardbutton) | `Button` |
18
+ | [3223:13667](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3223-13667) | [textButton](#textbutton) | `TextButton` |
19
+ | [3228:14621](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3228-14621) | [iconButton](#iconbutton) | `IconButton` |
20
+ | [3429:16714](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3429-16714) | [textField](#textfield) | `TextField` |
21
+ | [3429:25321](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3429-25321) | [textArea](#textarea) | `Textarea` |
22
+ | [3498:25583](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3498-25583) | [searchField](#searchfield) | `SearchField` |
23
+ | [3540:25866](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3540-25866) | [badge](#badge) | `Badge` |
24
+ | [3570:25359](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3570-25359) | [tag](#tag) | `Tag` |
25
+ | [4012:24597](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4012-24597) | [filterChips](#filterchips) | `FilterChip` |
26
+ | [3619:27807](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3619-27807) | [dateInput](#dateinput) | `DateInput` / `DatePeriodInput` (Picker 내부) |
27
+ | [3623:26811](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3623-26811) | [timeInput](#timeinput) | `TimeInput` (Picker 내부) |
28
+ | [3837:27148](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3837-27148) | [select](#select) | `Select` / `SelectTrigger` |
29
+ | [4038:38723](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4038-38723) | [toast](#toast) | `Toast` |
30
+ | [4507:36564](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4507-36564) | [Empty state](#empty-state) | `EmptyState` |
31
+ | [4957:26039](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4957-26039) | [Pannel](#pannel) | `Panel` |
32
+ | [11726:2034](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=11726-2034) | [fieldContainer](#fieldcontainer) | `FieldContainer` |
33
+ | [12247:7978](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-7978) | [mobileDatePeriodSelector](#mobiledateperiodselector) | `MobileDatePeriodSelector` |
34
+ | [12247:8094](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8094) | [periodCalendar (mobile)](#periodcalendar-mobile) | `MobilePeriodCalendar` |
35
+ | [12247:8592](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8592) | [dateCalendar (mobile)](#datecalendar-mobile) | `MobileDateCalendar` |
36
+ | [12247:8598](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8598) | [timePicker (mobile)](#timepicker-mobile) | `MobileTimeDial` |
37
+ | [12247:8599](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8599) | [monthPicker](#monthpicker) | `MonthCalendar` |
38
+ | [12247:8602](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8602) | [dateCalendar](#datecalendar) | `DateCalendar` |
39
+ | [12247:8603](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8603) | [periodCalendar](#periodcalendar) | `PeriodCalendar` |
40
+ | [12266:7051](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12266-7051) | [time (panel)](#time-panel) | `TimePanel` |
41
+ | [12381:8083](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12381-8083) | [moveContainer](#movecontainer) | `DateMove` |
42
+ | [12405:9022](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12405-9022) | [toggle](#toggle) | `Toggle` |
43
+
44
+ ### 합성
45
+
46
+ | 합성 이름 | 구성 | Vue 컴포넌트 |
47
+ |---|---|---|
48
+ | `datePicker` | `dateInput` + `dateCalendar` | [DatePicker](#datepicker) |
49
+ | `datePeriodPicker` | `dateInput(period)` + `periodCalendar` | [DatePeriodPicker](#dateperiodpicker) |
50
+ | `timePicker` | `timeInput` + `time` (panel) | [TimePicker](#timepicker) |
51
+ | `mobileDatePicker` | `dateInput` + `dateCalendar(mobile)` | [MobileDatePicker](#mobiledatepicker) |
52
+ | `mobileDatePeriodPicker` | `dateInput(period)` + `periodCalendar(mobile)` | [MobileDatePeriodPicker](#mobiledateperiodpicker) |
53
+ | `mobileTimePicker` | `timeInput` + `timePicker(mobile)` | [MobileTimePicker](#mobiletimepicker) |
54
+ | `numberField` | `inputFrame` + `−` / `+` 버튼 | [NumberField](#numberfield) |
55
+ | `inputGroup` | `inputFrame` + addon 슬롯 묶음 | [InputGroup](#inputgroup) |
56
+
57
+ ---
58
+
59
+ ## Figma 변수 매핑
60
+
61
+ 피그마 Variable은 upbox-ui CSS 변수 / Tailwind와 1:1이다. 아래 전역 표를 따른다.
62
+
63
+ ### 색상
64
+
65
+ | Figma 변수 | upbox-ui 토큰 (CSS 변수) | Tailwind 유틸 예시 |
66
+ |------------|---------------------------|---------------------|
67
+ | `primitive/grey-{10..100}` | `--color-grey-{10..100}` | `bg-grey-80`, `text-grey-90`, `border-grey-40` |
68
+ | `primitive/navy-{20..100}` | `--color-navy-{20..100}` | `bg-navy-80`, `text-navy-100` |
69
+ | `primitive/blue-{20..100}` | `--color-blue-{20..100}` | `bg-blue-30`, `text-blue-80` |
70
+ | `primitive/green-{20..100}` | `--color-green-{20..100}` | `bg-green-30`, `text-green-80` |
71
+ | `primitive/red-{20..100}` | `--color-red-{20..100}` | `bg-red-30`, `text-red-80` |
72
+ | `primitive/orange-{20..100}` | `--color-orange-{20..100}` | `bg-orange-30`, `text-orange-80` |
73
+ | `border-colour` (`#d3d6de`) | `--color-grey-40` | `border-grey-40` |
74
+ | `CTA/primary` (`#264870`) | `--color-cta-primary` (= navy-80) | `bg-cta-primary` |
75
+ | `CTA/destructive` | `--color-cta-destructive` (= red-80) | `bg-cta-destructive` |
76
+ | `CTA/secondary` | `--color-cta-secondary` (= grey-60) | `bg-cta-secondary` |
77
+ | `CTA/tertiary` | `--color-cta-tertiary` (= grey-30) | `bg-cta-tertiary` |
78
+ | `status/processing, informative` | `--color-status-informative` (= blue-80) | `text-status-informative` |
79
+ | `status/success, positive` | `--color-status-positive` (= green-80) | `text-status-positive` |
80
+ | `status/fail, nagative` | `--color-status-negative` (= red-80) | `text-status-negative` |
81
+ | `status/warning, temporary` | `--color-status-warning` (= orange-80) | `text-status-warning` |
82
+
83
+ > 피그마 변수명에 `nagative`(오타), `regualr`(오타) 등이 그대로 남아있어도 코드 토큰명은 `negative`, `regular` 로 정정해 사용한다.
84
+
85
+ ### 타이포그래피
86
+
87
+ | Figma 변수 | upbox-ui 표현 |
88
+ |------------|----------------|
89
+ | `font/family/Pretendard` | `font-family: Pretendard` (전역) |
90
+ | `font/weight/Regular` | `font-normal` (`400`) |
91
+ | `font/weight/SemiBold` | `font-semibold` (`600`) |
92
+ | `font/fontSize/font-4xs(8)` | `--text-size-8` (없으면 `text-[8px]`) |
93
+ | `font/fontSize/font-3xs(10)` | `--text-size-10` / `text-size-10` |
94
+ | `font/fontSize/font-2xs(12)` | `--text-size-12` / `text-size-12` |
95
+ | `font/fontSize/font-sm(14)` | `--text-size-14` / `text-size-14` |
96
+ | `font/fontSize/font-base(16)` | `--text-size-16` / `text-size-16` |
97
+ | `font/lineHeight/{N}` | `leading-[{N}px]` |
98
+ | `Body/body1` | `text-size-16 leading-[24px] font-normal` |
99
+ | `Body/body3` | `text-size-14 leading-[20px] font-normal` |
100
+ | `Body/body3-sb` | `text-size-14 leading-[20px] font-semibold` |
101
+ | `Body/body5` | `text-size-12 leading-[16px] font-normal` |
102
+ | `Body/body5-sb` | `text-size-12 leading-[16px] font-semibold` |
103
+ | `Caption/caption2` | `text-size-12 leading-[16px] font-normal` |
104
+ | `Caption/caption3` | `text-size-10 leading-[16px] font-normal` |
105
+ | `Caption/caption4` | `text-size-8 leading-[12px] font-normal` |
106
+
107
+ ### 간격 / 사이즈
108
+
109
+ | Figma 변수 | upbox-ui 표현 |
110
+ |------------|----------------|
111
+ | `padding/padding-{N}`, `margin/margin-{N}` | `--space-{N}` 또는 `p-[{N}px]` / `m-[{N}px]` (`N` = 2, 4, 6, 8, 12, 16, ...) |
112
+ | 사이즈 alias `3xsmall=16`, `2xsmall=20`, `xsmall=24`, `small=32`, `regualr(=regular)=40`, `large=48`, `48px=48` | InputFrame / Button / Tag / Badge 등 컴포넌트의 `size` prop 토큰 (height = `h-[{N}px]`) |
113
+
114
+ ---
115
+
116
+ ## standardButton
117
+
118
+ | 항목 | 값 |
119
+ |------|-----|
120
+ | Figma 노드 | [3220:15782](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3220-15782) |
121
+ | Vue 컴포넌트 | `Button.vue` |
122
+
123
+ ### Props 매핑
124
+
125
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
126
+ |---|---|---|---|
127
+ | `Variant` | `variant` | `primary / destructive / secondary / tertiary` | `primary` |
128
+ | `Theme` (Filled / Outline) | `theme` | `filled / outlined` | `filled` |
129
+ | `Size` | `size` | `xsmall / small / regular / large / xlarge` | `regular` |
130
+ | `Disabled` | `disabled` | `boolean` | `false` |
131
+ | `state` (Enabled / Hovered / Pressed) | CSS `:hover` / `:active` 자동 | - | - |
132
+ | 본문 텍스트 | `default` slot | `VNode` / `string` | - |
133
+
134
+ ### Vue 전용 Props
135
+
136
+ | Vue Prop | 타입 | 기본값 | 설명 |
137
+ |---|---|---|---|
138
+ | `loading` | `boolean` | `false` | 로딩 스피너 자동 노출, 클릭 무시 |
139
+ | `block` | `boolean` | `false` | 가로 100% |
140
+ | `type` | `button / submit / reset` | `button` | 네이티브 `type` |
141
+ | `class` | `string` | - | 추가 클래스 |
142
+
143
+ ### Events
144
+
145
+ | 이벤트 | 페이로드 |
146
+ |---|---|
147
+ | `click` | `MouseEvent` |
148
+
149
+ ### Slots
150
+
151
+ | Slot | 설명 |
152
+ |---|---|
153
+ | `default` | 본문 텍스트. 좌·우 아이콘은 슬롯 안에 `<lucide />` 직접 배치 |
154
+
155
+ ### Code Example
156
+
157
+ ```vue
158
+ <Button variant="primary" theme="filled" size="regular" @click="onSave">
159
+ 저장
160
+ </Button>
161
+ ```
162
+
163
+ ### 하위 구조
164
+
165
+ | 피그마 노드 | Vue 구조 |
166
+ |---|---|
167
+ | `wrapper` (텍스트·아이콘 컨테이너) | `<button>` |
168
+ | 본문 텍스트 | `default` slot |
169
+ | `front icon` / `end icon` (boolean) | 슬롯 안에 `<lucide />` 직접 |
170
+ | 로딩 스피너 | `loading=true` 시 `Spinner` 자동 |
171
+
172
+ ---
173
+
174
+ ## textButton
175
+
176
+ | 항목 | 값 |
177
+ |------|-----|
178
+ | Figma 노드 | [3223:13667](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3223-13667) |
179
+ | Vue 컴포넌트 | `TextButton.vue` |
180
+
181
+ ### Props 매핑
182
+
183
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
184
+ |---|---|---|---|
185
+ | `Variant` | `variant` | `destructive / secondary / information` (`information` 은 임시) | `secondary` |
186
+ | `Size` | `size` | `2xsmall / xsmall / small` | `small` |
187
+ | `Status=disabled` | `disabled` | `boolean` | `false` |
188
+ | `Status=enabled` / `hovered` | CSS `:hover` 자동 | - | - |
189
+ | 본문 텍스트 | `default` slot | `VNode` / `string` | - |
190
+
191
+ ### Vue 전용 Props
192
+
193
+ | Vue Prop | 타입 | 기본값 | 설명 |
194
+ |---|---|---|---|
195
+ | `class` | `string` | - | 추가 클래스 |
196
+
197
+ ### Events
198
+
199
+ | 이벤트 | 페이로드 |
200
+ |---|---|
201
+ | `click` | `MouseEvent` |
202
+
203
+ ### Slots
204
+
205
+ | Slot | 설명 |
206
+ |---|---|
207
+ | `default` | 본문 텍스트. 좌·우 아이콘은 슬롯 안에 `<lucide />` 직접 (사이즈 자동) |
208
+
209
+ ### Code Example
210
+
211
+ ```vue
212
+ <TextButton variant="destructive" size="xsmall" @click="onDelete">
213
+ 삭제
214
+ </TextButton>
215
+ ```
216
+
217
+ ### 하위 구조
218
+
219
+ | 피그마 노드 | Vue 구조 |
220
+ |---|---|
221
+ | 외곽 (텍스트만, 배경 hover 전용) | `<button>` (`textButtonVariants`) |
222
+ | 본문 텍스트 | `default` slot |
223
+ | 좌·우 아이콘 | 슬롯 내부에 직접 배치 |
224
+
225
+ ---
226
+
227
+ ## iconButton
228
+
229
+ | 항목 | 값 |
230
+ |------|-----|
231
+ | Figma 노드 | [3228:14621](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3228-14621) |
232
+ | Vue 컴포넌트 | `IconButton.vue` |
233
+
234
+ ### Props 매핑
235
+
236
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
237
+ |---|---|---|---|
238
+ | `Variant` | `variant` | `primary / destructive / secondary / tertiary` | `primary` |
239
+ | `Size` | `size` | `2xsmall / xsmall / small / regular / large / xlarge` | `regular` |
240
+ | `Disabled` | `disabled` | `boolean` | `false` |
241
+ | 아이콘 | `default` slot | `<lucide />` (사이즈 토큰 자동) | - |
242
+
243
+ ### Vue 전용 Props
244
+
245
+ | Vue Prop | 타입 | 기본값 | 설명 |
246
+ |---|---|---|---|
247
+ | `class` | `string` | - | 추가 클래스 |
248
+
249
+ ### Events
250
+
251
+ | 이벤트 | 페이로드 |
252
+ |---|---|
253
+ | `click` | `MouseEvent` |
254
+
255
+ ### Slots
256
+
257
+ | Slot | 설명 |
258
+ |---|---|
259
+ | `default` | 아이콘 자리. svg 사이즈는 `size` 에 맞춰 자동 적용 |
260
+
261
+ ### Code Example
262
+
263
+ ```vue
264
+ <IconButton variant="tertiary" size="small" @click="onClose">
265
+ <X />
266
+ </IconButton>
267
+ ```
268
+
269
+ ### 하위 구조
270
+
271
+ | 피그마 노드 | Vue 구조 |
272
+ |---|---|
273
+ | 외곽 (정사각형 + 배경 + radius) | `<button>` (`iconButtonVariants`) |
274
+ | 중앙 아이콘 자리 | `default` slot (`size-[12/16/20/24]px` 자동) |
275
+
276
+ ---
277
+
278
+ ## badge
279
+
280
+ | 항목 | 값 |
281
+ |------|-----|
282
+ | Figma 노드 | [3540:25866](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3540-25866) |
283
+ | Vue 컴포넌트 | `Badge.vue` |
284
+
285
+ ### Props 매핑
286
+
287
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
288
+ |---|---|---|---|
289
+ | `Variant` | `variant` | `neutral / negative / positive / informative / warning` | `neutral` |
290
+ | `Tone` (filled 50% / filled 100% / outline) | `tone` | `soft / solid / outline` | `soft` |
291
+ | `Size` | `size` | `3xsmall / 2xsmall / xsmall` | `2xsmall` |
292
+ | 모서리 둥글기 (pill) | `round` | `boolean` (`true` → `rounded-full`, `false` → `rounded-[3px]`) | `false` |
293
+ | 본문 텍스트 | `default` slot | `string` / `VNode` | - |
294
+ | 좌측 아이콘 (`size>=2xsmall`) | `icon` slot | `VNode` | - |
295
+ | 우측 카운트 칩 | `count` slot | `VNode` | - |
296
+
297
+ ### Vue 전용 Props
298
+
299
+ | Vue Prop | 타입 | 기본값 | 설명 |
300
+ |---|---|---|---|
301
+ | `class` | `string` | - | 추가 클래스 |
302
+
303
+ ### Slots
304
+
305
+ | Slot | 설명 |
306
+ |---|---|
307
+ | `default` | 본문 텍스트 |
308
+ | `icon` | 좌측 아이콘 (size `xsmall`/`2xsmall` 만) |
309
+ | `count` | 우측 숫자 카운트 (원형 칩) |
310
+
311
+ ### Code Example
312
+
313
+ ```vue
314
+ <Badge variant="positive" tone="soft" size="xsmall">
315
+ <template #icon><Check /></template>
316
+ 완료
317
+ </Badge>
318
+ ```
319
+
320
+ ### 하위 구조
321
+
322
+ | 피그마 노드 | Vue 구조 |
323
+ |---|---|
324
+ | 외곽 (border + bg + radius + padding) | `<div>` (`badgeVariants`) |
325
+ | 좌측 아이콘 자리 (`size-[16px]`) | `icon` slot |
326
+ | 본문 텍스트 | `default` slot |
327
+ | 우측 숫자 카운트 (원형 칩) | `count` slot (`badgeCountVariants`) |
328
+
329
+ ---
330
+
331
+ ## tag
332
+
333
+ | 항목 | 값 |
334
+ |------|-----|
335
+ | Figma 노드 | [3570:25359](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3570-25359) |
336
+ | Vue 컴포넌트 | `Tag.vue` |
337
+
338
+ ### Props 매핑
339
+
340
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
341
+ |---|---|---|---|
342
+ | `State` | `state` | `enabled / disabled / error` | `enabled` |
343
+ | `Size` | `size` | `3xsmall / 2xsmall / xsmall / small` | `small` |
344
+ | 닫기(X) 버튼 노출 | `closable` | `boolean` | `false` |
345
+ | 본문 텍스트 | `default` slot | `string` / `VNode` | - |
346
+ | 좌측 배지 | `badge` slot | `VNode` | - |
347
+
348
+ ### Vue 전용 Props
349
+
350
+ | Vue Prop | 타입 | 기본값 | 설명 |
351
+ |---|---|---|---|
352
+ | `class` | `string` | - | 추가 클래스 |
353
+
354
+ ### Events
355
+
356
+ | 이벤트 | 페이로드 |
357
+ |---|---|
358
+ | `close` | `void` (닫기 버튼 클릭 시) |
359
+
360
+ ### Slots
361
+
362
+ | Slot | 설명 |
363
+ |---|---|
364
+ | `default` | 본문 텍스트 |
365
+ | `badge` | 좌측 배지 (`<Badge>` 등) |
366
+
367
+ ### Code Example
368
+
369
+ ```vue
370
+ <Tag state="enabled" size="small" closable @close="onClose">
371
+ <template #badge><Badge variant="positive" size="3xsmall">N</Badge></template>
372
+ 검토중
373
+ </Tag>
374
+ ```
375
+
376
+ ### 하위 구조
377
+
378
+ | 피그마 노드 | Vue 구조 |
379
+ |---|---|
380
+ | 외곽 (border + bg + padding) | `<div>` (`tagVariants`) |
381
+ | 좌측 배지 | `badge` slot |
382
+ | 본문 텍스트 | `default` slot |
383
+ | 우측 X 닫기 | `closable=true && state!=='disabled'` 시 자동 (`X` lucide) |
384
+
385
+ ---
386
+
387
+ ## Empty state
388
+
389
+ | 항목 | 값 |
390
+ |------|-----|
391
+ | Figma 노드 | [4507:36564](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4507-36564) |
392
+ | Vue 컴포넌트 | `EmptyState.vue` |
393
+
394
+ ### Props 매핑
395
+
396
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
397
+ |---|---|---|---|
398
+ | `variant=vertical` | `orientation` | `vertical` | `vertical` |
399
+ | `variant=horizontal` | `orientation` | `horizontal` | `vertical` |
400
+ | `bg=fill` | `fill` | `boolean` | `false` |
401
+ | `bg=no fill` | `fill` | `false` | `false` |
402
+ | 말풍선 아이콘 | `icon` | `boolean` | `true` |
403
+ | 본문 텍스트 | `default` slot | `string` / `VNode` | `t("ui.empty")` |
404
+ | 버튼 | `action` slot | `VNode` | 슬롯 있으면 그림 |
405
+
406
+ ### Vue 전용 Props
407
+
408
+ | Vue Prop | 타입 | 기본값 | 설명 |
409
+ |---|---|---|---|
410
+ | `class` | `string` | - | 추가 클래스 |
411
+
412
+ `Empty.vue` 는 Figma 전용 노드가 아니다. `EmptyState fill :icon=false` 와 같다.
413
+
414
+ ### Slots
415
+
416
+ | Slot | 설명 |
417
+ |---|---|
418
+ | `default` | 본문 텍스트 |
419
+ | `icon` | 말풍선 자리. 기본 내장 SVG |
420
+ | `action` | 하단(세로) / 문구 아래(가로) 버튼 |
421
+
422
+ ### Code Example
423
+
424
+ ```vue
425
+ <EmptyState fill :icon="false">등록된 정보가 없습니다</EmptyState>
426
+
427
+ <EmptyState orientation="horizontal">
428
+ 컨텐츠가 없습니다.
429
+ <template #action>
430
+ <Button variant="tertiary" theme="outlined" size="small">버튼명</Button>
431
+ </template>
432
+ </EmptyState>
433
+ ```
434
+
435
+ ### 하위 구조
436
+
437
+ | 피그마 노드 | Vue 구조 |
438
+ |---|---|
439
+ | 외곽 (fill 배경 / padding / 정렬) | `<div>` (`fill` / `orientation`) |
440
+ | 말풍선 아이콘 | `icon` slot (기본 SVG) |
441
+ | 본문 텍스트 | `default` slot |
442
+ | 버튼 | `action` slot |
443
+
444
+ ---
445
+
446
+ ## Pannel
447
+
448
+ | 항목 | 값 |
449
+ |------|-----|
450
+ | Figma 노드 | [4957:26039](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4957-26039) (이름 `Pannel`) |
451
+ | Vue 컴포넌트 | `Panel.vue` / `PanelIcon.vue` |
452
+
453
+ ### Props 매핑
454
+
455
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
456
+ |---|---|---|---|
457
+ | `Type=base` | `variant` | `base` | `base` |
458
+ | `Type=primary` | `variant` | `primary` | `base` |
459
+ | `Type=error` / `fail` | `variant` | `negative` | `base` |
460
+ | `Type=warning` | `variant` | `warning` | `base` |
461
+ | `Type=info` / `processing` | `variant` | `informative` | `base` |
462
+ | `Type=success` | `variant` | `positive` | `base` |
463
+ | `Size` | `size` | `small / medium / large` | `small` |
464
+ | 아이콘 노출 | `icon` | `boolean` | `true` (`base` 는 기본 글리프 없음) |
465
+ | 본문 텍스트 | `default` slot | `string` / `VNode` | - |
466
+
467
+ ### Vue 전용 Props
468
+
469
+ | Vue Prop | 타입 | 기본값 | 설명 |
470
+ |---|---|---|---|
471
+ | `iconSrc` | `string` | - | 글리프 경로만. 크기·색은 `variant`/`size` |
472
+ | `class` | `string` | - | 추가 클래스 |
473
+
474
+ `base` / `primary` 색·아이콘은 시안 세트에 없어 앱 토큰(`grey-20` / `navy-20`)을 임시로 쓴다.
475
+
476
+ ### Slots
477
+
478
+ | Slot | 설명 |
479
+ |---|---|
480
+ | `default` | 본문. 블록(목록·설명)도 허용 |
481
+ | `icon` | 좌측 아이콘. 기본 `<PanelIcon :src=iconSrc />` |
482
+
483
+ ### Code Example
484
+
485
+ ```vue
486
+ <Panel variant="informative" size="medium">공지, 일반적인 안내에 사용</Panel>
487
+
488
+ <Panel variant="warning" size="medium" icon-src="filled/warning.svg">
489
+ 글리프만 src로 바꾼다
490
+ </Panel>
491
+
492
+ <Panel variant="informative" size="medium" :icon="false">아이콘 없이 안내만</Panel>
493
+ ```
494
+
495
+ ### 하위 구조
496
+
497
+ | 피그마 노드 | Vue 구조 |
498
+ |---|---|
499
+ | 외곽 (bg + radius + padding + gap) | `<div>` (`panelVariants`) |
500
+ | 좌측 아이콘 | `icon` slot → `PanelIcon` (`panelIconVariants`) |
501
+ | 본문 텍스트 | `default` slot (`panelTextVariants`, `flex`) |
502
+
503
+ ---
504
+
505
+ ## textField
506
+
507
+ | 항목 | 값 |
508
+ |------|-----|
509
+ | Figma 노드 | [3429:16714](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3429-16714) |
510
+ | Vue 컴포넌트 | `TextField.vue` |
511
+
512
+ ### Props 매핑
513
+
514
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
515
+ |---|---|---|---|
516
+ | `Variant` (default / filled / bottomline) | `variant` | `default / filled / bottomline` | `default` |
517
+ | `Size` | `size` | `small / regular / large` | `regular` |
518
+ | `State=placeholder` | 빈 `v-model` + `placeholder` | - | - |
519
+ | `State=typed` | `v-model` 보유 | - | - |
520
+ | `State=focused` | 내부 focus 자동 | - | - |
521
+ | `State=error` | `error` | `boolean` | form context fallback |
522
+ | `State=disabled` | `disabled` | `boolean` | `false` |
523
+ | `State=readonly` | `readonly` | `boolean` | `false` |
524
+ | 값 | `v-model` | `string / number` | - |
525
+ | 비밀번호 토글 (eye/eyeOff) | `password` | `boolean` | `false` |
526
+ | 우측 X 클리어 | `clearable` | `boolean` | `false` |
527
+ | 글자수 카운터 (`현재/최대`) | `default` slot 내부에 `<TextFieldCount>` | - | - |
528
+ | `<input maxlength>` | `maxLength` | `number` | - |
529
+
530
+ ### Vue 전용 Props
531
+
532
+ | Vue Prop | 타입 | 기본값 | 설명 |
533
+ |---|---|---|---|
534
+ | `byteMode` | `boolean` | `false` | 카운터 byte 모드 |
535
+ | `type` | `string` | `text` | 네이티브 input type |
536
+ | `placeholder` | `string` | - | placeholder 텍스트 |
537
+ | `class` | `string` | - | 외곽 클래스 |
538
+
539
+ ### Events
540
+
541
+ | 이벤트 | 페이로드 |
542
+ |---|---|
543
+ | `update:modelValue` | `string / number` |
544
+
545
+ ### Slots
546
+
547
+ | Slot | 설명 |
548
+ |---|---|
549
+ | `default` | trailing 영역 (`<TextFieldUnit>`, `<TextFieldCount>` 등 자식 배치) |
550
+
551
+ ### Code Example
552
+
553
+ ```vue
554
+ <TextField v-model="text" size="regular" :maxLength="50" clearable placeholder="이름">
555
+ <TextFieldCount />
556
+ </TextField>
557
+ ```
558
+
559
+ ### 하위 구조
560
+
561
+ | 피그마 노드 | Vue 구조 |
562
+ |---|---|
563
+ | frame (border + bg + padding) | `InputFrame` |
564
+ | 본문 입력 영역 | 내부 `<input>` (`flex-1 bg-transparent outline-none`) |
565
+ | 좌·우 아이콘 | `InputIcon` 슬롯 (자식으로 직접 배치) |
566
+ | 우측 X 클리어 버튼 | `clearable=true` 시 자동 (`X` lucide) |
567
+ | 우측 eye 토글 버튼 | `password=true` 시 자동 (`Eye` / `EyeOff` lucide) |
568
+ | 우측 카운터 자리 | `<TextFieldCount>` (자식 슬롯) |
569
+
570
+ ---
571
+
572
+ ## textArea
573
+
574
+ | 항목 | 값 |
575
+ |------|-----|
576
+ | Figma 노드 | [3429:25321](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3429-25321) |
577
+ | Vue 컴포넌트 | `Textarea.vue` |
578
+
579
+ ### Props 매핑
580
+
581
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
582
+ |---|---|---|---|
583
+ | `Variant` (코드 한정) | `variant` | `default / filled / bottomline` | `default` |
584
+ | `Size` | `size` | `small / regular / large` | - |
585
+ | `State=placeholder` | 빈 `v-model` + `placeholder` | - | - |
586
+ | `State=typed` | `v-model` 보유 | - | - |
587
+ | `State=focused` | 내부 `focus-within` 자동 | - | - |
588
+ | `State=error` | `error` | `boolean` | - |
589
+ | `State=disabled` | `disabled` | `boolean` | - |
590
+ | `State=readonly` | `readonly` | `boolean` | - |
591
+ | 우하단 카운터 (`0/N`) | `counter` + `maxLength` | `boolean` / `number` | `counter=false` |
592
+ | 값 | `v-model` | `string / number` | - |
593
+
594
+ > Figma 노드는 `default` variant 만 정의. 코드에는 `TextField` 와의 일관성을 위해 `filled` / `bottomline` variant 도 유지.
595
+
596
+ ### Vue 전용 Props
597
+
598
+ | Vue Prop | 타입 | 기본값 | 설명 |
599
+ |---|---|---|---|
600
+ | `byteMode` | `boolean` | `false` | 카운터 byte 모드 |
601
+ | `autoResize` | `boolean` | `true` | 자동 높이 |
602
+ | `minHeight` | `number` | size 별 기본 (`small=72` / `regular=92` / `large=104`) | 최소 높이 (px) |
603
+ | `maxHeight` | `number` | `300` | 최대 높이 (px) |
604
+ | `rows` | `number` | `3` | `autoResize=false` 시 행 수 |
605
+ | `placeholder` | `string` | - | placeholder 텍스트 |
606
+ | `class` | `string` | - | 외곽 클래스 |
607
+
608
+ ### Events
609
+
610
+ | 이벤트 | 페이로드 |
611
+ |---|---|
612
+ | `update:modelValue` | `string / number` |
613
+
614
+ ### Slots
615
+
616
+ | Slot | 설명 |
617
+ |---|---|
618
+ | `footer` | 카운터 자리(footer) 커스터마이즈 |
619
+ | `default` | 그 외 추가 자식 |
620
+
621
+ ### Code Example
622
+
623
+ ```vue
624
+ <Textarea v-model="memo" size="regular" counter :maxLength="200" autoResize />
625
+ ```
626
+
627
+ ### 하위 구조
628
+
629
+ | 피그마 노드 | Vue 구조 |
630
+ |---|---|
631
+ | frame (border + bg + padding) | `Textarea` 외곽 `<div>` (`textareaFrameVariants`) |
632
+ | 본문 입력 영역 | 내부 `<textarea>` (`block flex-1 resize-none`) |
633
+ | 우하단 카운터 | `TextareaCount` (`TEXTAREA_TRAILING_CONTEXT_KEY` inject) |
634
+ | 카운터 자리(footer) 커스터마이즈 | `footer` slot |
635
+
636
+ ---
637
+
638
+ ## searchField
639
+
640
+ | 항목 | 값 |
641
+ |------|-----|
642
+ | Figma 노드 | [3498:25583](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3498-25583) |
643
+ | Vue 컴포넌트 | `SearchField.vue` |
644
+
645
+ ### Props 매핑
646
+
647
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
648
+ |---|---|---|---|
649
+ | `Variant` (basic / filter) | `variant` | `basic / filter` | `basic` |
650
+ | `Size` | `size` | `small / regular / large` | `regular` |
651
+ | `State=placeholder` | 빈 `v-model` + `placeholder` | - | - |
652
+ | `State=typed` | `v-model` 보유 | - | - |
653
+ | `State=focused` | 내부 focus 자동 | - | - |
654
+ | `State=error` | `error` | `boolean` | `false` |
655
+ | `State=disabled` | `disabled` | `boolean` | `false` |
656
+ | `State=readonly` | `readonly` | `boolean` | `false` |
657
+ | 값 | `v-model` | `string` | - |
658
+ | 좌측 필터 영역 (`variant=filter`) | `filter` slot | `VNode` | - |
659
+ | 우측 X 클리어 (`variant=basic`) | `clearable` | `boolean` | `true` |
660
+
661
+ ### Vue 전용 Props
662
+
663
+ | Vue Prop | 타입 | 기본값 | 설명 |
664
+ |---|---|---|---|
665
+ | `placeholder` | `string` | - | placeholder 텍스트 |
666
+ | `name` / `id` | `string` | - | 네이티브 input 속성 |
667
+ | `autofocus` | `boolean` | - | 마운트 시 포커스 |
668
+ | `class` | `string` | - | 외곽 클래스 |
669
+
670
+ ### Events
671
+
672
+ | 이벤트 | 페이로드 |
673
+ |---|---|
674
+ | `update:modelValue` | `string` |
675
+ | `submit` | `string` (Enter 시 현재 값) |
676
+ | `clear` | `void` (X 클리어 시) |
677
+
678
+ ### Slots
679
+
680
+ | Slot | 설명 |
681
+ |---|---|
682
+ | `filter` | `variant=filter` 일 때 좌측 슬롯 (예: `<Select>` + `<SelectTrigger inline>`) |
683
+
684
+ ### Code Example
685
+
686
+ ```vue
687
+ <SearchField v-model="q" variant="filter" size="regular" @submit="search">
688
+ <template #filter>
689
+ <Select v-model="scope">
690
+ <SelectTrigger inline><SelectValue placeholder="전체" /></SelectTrigger>
691
+ <SelectContent>…</SelectContent>
692
+ </Select>
693
+ </template>
694
+ </SearchField>
695
+ ```
696
+
697
+ ### 하위 구조
698
+
699
+ | 피그마 노드 | Vue 구조 |
700
+ |---|---|
701
+ | frame (border + bg + padding) | `InputFrame` |
702
+ | 좌측 search 아이콘 (`variant=basic`) | `InputIcon` + `Search` lucide |
703
+ | 좌측 필터 영역 (`variant=filter`) | `filter` slot + 세로 `bg-grey-40` 구분선 |
704
+ | 본문 입력 영역 | 내부 `<input type=search>` (`flex-1 bg-transparent outline-none`) |
705
+ | 우측 X 클리어 (`variant=basic`) | `X` lucide 아이콘 버튼 (`clearable && value`) |
706
+ | 우측 search 아이콘 (`variant=filter`) | `InputIcon` + `Search` lucide |
707
+
708
+ ---
709
+
710
+ ## numberField
711
+
712
+ | 항목 | 값 |
713
+ |------|-----|
714
+ | Figma 노드 | 합성: input frame + `−` / `+` 버튼 |
715
+ | Vue 컴포넌트 | `NumberField.vue` (monolithic) / `NumberFieldRoot` + 자식 (compound) |
716
+
717
+ ### Props 매핑
718
+
719
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
720
+ |---|---|---|---|
721
+ | `Variant=center` (좌·우에 −/+ 분할) | `variant` | `center` | `center` |
722
+ | `Variant=side` (우측에 −/+ 묶음) | `variant` | `side` | - |
723
+ | `Size` | `size` | `small / regular / large` | `regular` |
724
+ | `State=placeholder` | 빈 `v-model` + `placeholder` | - | - |
725
+ | `State=typed` | `v-model` 보유 | - | - |
726
+ | `State=focused` | 내부 focus 자동 | - | - |
727
+ | `State=error` | `error` | `boolean` | - |
728
+ | `State=disabled` | `disabled` | `boolean` | `false` |
729
+ | `State=readonly` | `readonly` | `boolean` | `false` |
730
+ | 값 | `v-model` | `number` | - |
731
+ | 최소·최대·step | `min` / `max` / `step` | `number` | - |
732
+
733
+ ### Vue 전용 Props
734
+
735
+ | Vue Prop | 타입 | 기본값 | 설명 |
736
+ |---|---|---|---|
737
+ | `formatOptions` | `Intl.NumberFormatOptions` | - | 소수·단위·통화 등 포맷 |
738
+ | `placeholder` / `name` / `id` / `required` | - | - | 네이티브 input 속성 |
739
+ | `class` | `string` | - | 외곽 클래스 |
740
+
741
+ ### Events
742
+
743
+ | 이벤트 | 페이로드 |
744
+ |---|---|
745
+ | `update:modelValue` | `number` |
746
+
747
+ ### Slots
748
+
749
+ | Slot | 설명 |
750
+ |---|---|
751
+ | `default` | compound 사용 시 `NumberFieldInput` / `NumberFieldIncrement` / `NumberFieldDecrement` 직접 배치 |
752
+
753
+ ### Code Example
754
+
755
+ ```vue
756
+ <!-- monolithic (기본) -->
757
+ <NumberField v-model="count" variant="center" size="regular" :min="0" :max="99" />
758
+
759
+ <!-- compound (특수 합성용) -->
760
+ <NumberFieldRoot v-model="count" :min="0" :max="99">
761
+ <NumberFieldContent>
762
+ <NumberFieldDecrement />
763
+ <NumberFieldInput />
764
+ <NumberFieldIncrement />
765
+ </NumberFieldContent>
766
+ </NumberFieldRoot>
767
+ ```
768
+
769
+ ### 하위 구조
770
+
771
+ | 피그마 노드 | Vue 구조 |
772
+ |---|---|
773
+ | 외곽 root | `NumberFieldRoot` (reka-ui) |
774
+ | frame (border + bg) | `InputFrame` (`px-0 overflow-hidden`) |
775
+ | `−` 버튼 | `NumberFieldDecrement` (`Minus` lucide) |
776
+ | 숫자 입력 | `NumberFieldInput` |
777
+ | `+` 버튼 | `NumberFieldIncrement` (`Plus` lucide) |
778
+ | `−` / `+` 사이의 세로 구분선 | `border-grey-40` (error 시 `border-red-80`) |
779
+
780
+ ---
781
+
782
+ ## inputGroup
783
+
784
+ | 항목 | 값 |
785
+ |------|-----|
786
+ | Figma 노드 | 합성: input frame + addon 묶음 |
787
+ | Vue 컴포넌트 | `InputGroup.vue` |
788
+
789
+ > `inputGroup` 은 단일 입력 컴포넌트가 아니라 input + addon (아이콘·버튼·텍스트) 조합용 외곽 frame 이다. addon 위치는 `InputGroupAddon` 의 `align` prop 으로 지정.
790
+
791
+ ### Props 매핑
792
+
793
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
794
+ |---|---|---|---|
795
+ | `Size` | `size` | `small / regular / large` | `regular` |
796
+ | `State=error` | `error` | `boolean` | `false` |
797
+ | `State=disabled` | `disabled` | `boolean` | `false` |
798
+ | `State=readonly` | `readonly` | `boolean` | `false` |
799
+
800
+ ### Vue 전용 Props (`InputGroupAddon`)
801
+
802
+ | Prop | 타입 | 기본값 | 설명 |
803
+ |---|---|---|---|
804
+ | `align` | `inline-start / inline-end / block-start / block-end` | `inline-start` | addon 배치 위치 |
805
+ | `class` | `string` | - | 추가 클래스 |
806
+
807
+ ### Slots
808
+
809
+ | Slot | 설명 |
810
+ |---|---|
811
+ | `default` | `InputGroupAddon` / `InputGroupInput` / `InputGroupTextarea` / `InputGroupButton` / `InputGroupText` 자유 배치 |
812
+
813
+ ### Code Example
814
+
815
+ ```vue
816
+ <InputGroup size="regular">
817
+ <InputGroupAddon align="inline-start"><Search /></InputGroupAddon>
818
+ <InputGroupInput v-model="q" placeholder="검색어" />
819
+ <InputGroupAddon align="inline-end">
820
+ <InputGroupButton variant="primary">검색</InputGroupButton>
821
+ </InputGroupAddon>
822
+ </InputGroup>
823
+ ```
824
+
825
+ ### 하위 구조
826
+
827
+ | 피그마 노드 | Vue 구조 |
828
+ |---|---|
829
+ | frame (border + bg + padding) | `InputGroup` |
830
+ | 좌측 addon | `InputGroupAddon align=inline-start` |
831
+ | 우측 addon | `InputGroupAddon align=inline-end` |
832
+ | 상단 addon | `InputGroupAddon align=block-start` |
833
+ | 하단 addon | `InputGroupAddon align=block-end` |
834
+ | 본문 입력 (single line) | `InputGroupInput` (`<input>` raw) |
835
+ | 본문 입력 (multi line) | `InputGroupTextarea` (`<textarea>` raw) |
836
+ | addon 내부 텍스트 | `InputGroupText` |
837
+ | addon 내부 버튼 | `InputGroupButton` (variant·size 별도) |
838
+
839
+ ---
840
+
841
+ ## select
842
+
843
+ | 항목 | 값 |
844
+ |------|-----|
845
+ | Figma 노드 | [3837:27148](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3837-27148) |
846
+ | Vue 컴포넌트 | `Select.vue` (root) + `SelectTrigger.vue` |
847
+
848
+ ### Props 매핑
849
+
850
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
851
+ |---|---|---|---|
852
+ | `Size` | `size` | `small / regular / large` (현재 코드는 `regular` 만 노출) | - |
853
+ | `State=placeholder` | 빈 `v-model` + `<SelectValue placeholder="…">` | - | - |
854
+ | `State=typed` | `v-model` 보유 | - | - |
855
+ | `State=focused` | Picker 열림 시 자동 | - | - |
856
+ | `State=error` | (외곽 `InputFrame` 의 `error`) | `boolean` | - |
857
+ | `State=disabled` | `disabled` | `boolean` | - |
858
+ | `State=readonly` | 현재 미노출 | - | - |
859
+ | 우측 X 클리어 | `clearable` | `boolean` | `false` |
860
+ | 값 | `v-model` | `AcceptableValue` (reka-ui) | - |
861
+
862
+ ### Vue 전용 Props (`SelectTrigger`)
863
+
864
+ | Prop | 타입 | 기본값 | 설명 |
865
+ |---|---|---|---|
866
+ | `inline` | `boolean` | `false` | 외부 frame(`SearchField` filter 슬롯, `InputGroup`) 안에서 이중 border 방지용 transparent 트리거 |
867
+ | `clearable` | `boolean` | Select root provide / `false` | 선택값 X 클리어. 미지정 시 `Select` 의 `clearable` provide 를 따름 |
868
+ | `class` | `string` | - | 추가 클래스 |
869
+
870
+ ### Events
871
+
872
+ | 이벤트 | 페이로드 |
873
+ |---|---|
874
+ | `update:modelValue` | `AcceptableValue` |
875
+
876
+ ### Slots
877
+
878
+ | Slot | 설명 |
879
+ |---|---|
880
+ | `default` (`Select`) | `SelectTrigger`, `SelectContent` 등 자식 배치 |
881
+ | `default` (`SelectTrigger`) | 트리거 본문 + `SelectValue` |
882
+
883
+ ### Code Example
884
+
885
+ ```vue
886
+ <Select v-model="value" clearable>
887
+ <SelectTrigger><SelectValue placeholder="옵션 선택" /></SelectTrigger>
888
+ <SelectContent>
889
+ <SelectItem value="a">A</SelectItem>
890
+ <SelectItem value="b">B</SelectItem>
891
+ </SelectContent>
892
+ </Select>
893
+ ```
894
+
895
+ ### 하위 구조
896
+
897
+ | 피그마 노드 | Vue 구조 |
898
+ |---|---|
899
+ | 외곽 root | `Select` (reka-ui `SelectRoot` 래핑) |
900
+ | input frame | `SelectTrigger` 내부 `InputFrame` (`inline=false`) |
901
+ | 트리거 본문 + chevron | `SelectTrigger` (`SelectIcon` + `ChevronDown`) |
902
+ | 선택값 텍스트 | `SelectValue` |
903
+ | 드롭다운 패널 | `SelectContent` |
904
+ | 그룹 / 라벨 / 항목 / 구분선 | `SelectGroup` / `SelectLabel` / `SelectItem` / `SelectSeparator` |
905
+
906
+ ---
907
+
908
+ ## fieldContainer
909
+
910
+ | 항목 | 값 |
911
+ |------|-----|
912
+ | Figma 노드 | [11726:2034](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=11726-2034) |
913
+ | Vue 컴포넌트 | `FieldContainer.vue` |
914
+
915
+ 라벨 / 필수 표시 / 입력 컨트롤 / 에러/도움말을 묶는 vee-validate 필드 래퍼. 입력 컨트롤 자체(`TextField`, `Select` 등)는 `default` slot 으로 주입한다.
916
+
917
+ ### Props 매핑
918
+
919
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
920
+ |---|---|---|---|
921
+ | `Variant size` (small / regular / large) | `size` | `small / regular / large` | `regular` |
922
+ | 라벨 텍스트 | `label` | `string` | - |
923
+ | 라벨 앞 필수 표시 `*` (red) | `required` | `boolean` | `false` |
924
+ | 하단 도움말 텍스트 | `description` | `string` | - |
925
+ | 에러 메세지 (검증 실패 시 도움말 대체) | vee-validate 자동, `FormMessage` | - | - |
926
+ | 입력 컨트롤 자리 (중첩 인스턴스) | `default` slot | - | - |
927
+
928
+ ### Vue 전용 Props
929
+
930
+ | Vue Prop | 타입 | 기본값 | 설명 |
931
+ |---|---|---|---|
932
+ | `name` | `string` | - | vee-validate 필드 이름 (필수) |
933
+ | `rules` | `unknown` | - | 검증 규칙 (함수 / 스키마) |
934
+ | `modelValue` | `unknown` | - | 제어형 값 바인딩 |
935
+ | `initialValue` | `unknown` | - | 초기값 |
936
+ | `validateOnMount` | `boolean` | `false` | 마운트 시 즉시 검증 |
937
+ | `class` | `string` | - | 외곽(`FormItem`) 클래스 |
938
+
939
+ ### Slots
940
+
941
+ | Slot | 설명 |
942
+ |---|---|
943
+ | `default` | 입력 컨트롤 (`v-slot` 로 `field` / `componentField` 바인딩 노출) |
944
+ | `tooltip` | 라벨 우측 툴팁/아이콘 자리 |
945
+
946
+ ### Code Example
947
+
948
+ ```vue
949
+ <Form class="w-full max-w-sm">
950
+ <FieldContainer name="email" label="이메일" description="등록된 주소를 입력하세요" required>
951
+ <TextField type="email" placeholder="you@example.com" />
952
+ </FieldContainer>
953
+ </Form>
954
+ ```
955
+
956
+ ### 하위 구조
957
+
958
+ | 피그마 노드 | Vue 구조 |
959
+ |---|---|
960
+ | 라벨 행 (`*` + Label + tooltip) | `required` `*` span + `FormLabel` + `#tooltip` slot |
961
+ | 입력 컨트롤 | `FieldControlProvider` → `FormControl` → `default` slot |
962
+ | 에러 메세지 | `FormMessage` (검증 실패 시 자동) |
963
+ | 도움말 | `FormDescription` (`description` 있을 때) |
964
+
965
+ ---
966
+
967
+ ## toggle
968
+
969
+ | 항목 | 값 |
970
+ |------|-----|
971
+ | Figma 노드 | [12405:9022](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12405-9022) |
972
+ | Vue 컴포넌트 | `Toggle.vue` (reka-ui `SwitchRoot` + `SwitchThumb`) |
973
+
974
+ ### Props 매핑
975
+
976
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
977
+ |---|---|---|---|
978
+ | `Size` | `size` | `4xsmall / 3xsmall / 2xsmall` | `2xsmall` |
979
+ | `State=on` | `v-model=true` (`data-state=checked`) | `boolean` | - |
980
+ | `State=off` | `v-model=false` (`data-state=unchecked`) | `boolean` | - |
981
+ | `State=disabled` | `disabled` | `boolean` | `false` |
982
+ | 값 | `v-model` | `boolean` | - |
983
+ | 라벨 텍스트 | `label` 또는 `label` slot | `string` | - |
984
+
985
+ > 이전의 별개 `Switch` 컴포넌트와 segmented 형태의 `Toggle` / `ToggleGroup` 은 모두 제거됨. on/off 시각화는 모두 `Toggle` 로 통합. N중 1택이 필요하면 `Tabs variant="box"` 사용.
986
+
987
+ ### Vue 전용 Props
988
+
989
+ | Vue Prop | 타입 | 기본값 | 설명 |
990
+ |---|---|---|---|
991
+ | `name` / `value` / `id` / `required` | - | - | 네이티브 form 속성 |
992
+ | `asChild` / `as` | - | - | reka-ui slot 변환 |
993
+ | `class` | `string` | - | 외곽 클래스 |
994
+
995
+ ### Events
996
+
997
+ | 이벤트 | 페이로드 |
998
+ |---|---|
999
+ | `update:modelValue` | `boolean` |
1000
+
1001
+ ### Slots
1002
+
1003
+ | Slot | 설명 |
1004
+ |---|---|
1005
+ | `label` | 커스텀 라벨 (string `label` prop 대체) |
1006
+
1007
+ ### Code Example
1008
+
1009
+ ```vue
1010
+ <Toggle v-model="enabled" size="2xsmall" label="알림 받기" />
1011
+ ```
1012
+
1013
+ ### 하위 구조
1014
+
1015
+ | 피그마 노드 | Vue 구조 |
1016
+ |---|---|
1017
+ | track (pill 배경) | `SwitchRoot` (`toggleTrackVariants`) |
1018
+ | thumb (원형) | `SwitchThumb` (`toggleThumbVariants`) |
1019
+ | 라벨 (선택) | `<span>` (`toggleLabelVariants`) |
1020
+
1021
+ ---
1022
+
1023
+ ## datePicker
1024
+
1025
+ | 항목 | 값 |
1026
+ |------|-----|
1027
+ | Figma 합성 | `dateInput` ([3619:27807](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3619-27807), `variant=date`) + `dateCalendar` ([12247:8602](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8602)) |
1028
+ | Vue 컴포넌트 | `DatePicker.vue` |
1029
+
1030
+ ### Props 매핑
1031
+
1032
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1033
+ |---|---|---|---|
1034
+ | `Variant` (input frame) | `variant` | `default / filled / bottomline` | - |
1035
+ | `Size` | `size` | `small / regular / large` | - |
1036
+ | `State=placeholder` | 빈 `v-model` | - | - |
1037
+ | `State=typed` | `v-model` 보유 | - | - |
1038
+ | `State=focused` | 내부 focus 자동 | - | - |
1039
+ | `State=error` | `error` (또는 `DateInput` draft error) | `boolean` | - |
1040
+ | `State=disabled` | `disabled` | `boolean` | - |
1041
+ | `State=readonly` | `readonly` | `boolean` | - |
1042
+ | 날짜 값 | `v-model` | `CalendarDate / null` | - |
1043
+
1044
+ ### Vue 전용 Props
1045
+
1046
+ | Vue Prop | 타입 | 기본값 | 설명 |
1047
+ |---|---|---|---|
1048
+ | `class` | `string` | - | 입력 영역 외곽 클래스 |
1049
+ | `popoverContentClass` | `string` | - | 팝업 영역 클래스 |
1050
+ | `weekStartsOn` | `0-6` | `0` (일요일) | 주 시작 요일. 내부 캘린더로 관통 |
1051
+
1052
+ ### Events
1053
+
1054
+ | 이벤트 | 페이로드 |
1055
+ |---|---|
1056
+ | `update:modelValue` | `CalendarDate / null` |
1057
+
1058
+ ### Slots
1059
+
1060
+ | Slot | 설명 |
1061
+ |---|---|
1062
+ | `default` | 트리거 안 입력 영역. 미지정 시 `DateInput` 자동 |
1063
+
1064
+ ### Code Example
1065
+
1066
+ ```vue
1067
+ <DatePicker v-model="date" size="regular" />
1068
+ ```
1069
+
1070
+ ### 하위 구조
1071
+
1072
+ | 피그마 노드 | Vue 구조 |
1073
+ |---|---|
1074
+ | input frame | `DateTrigger` |
1075
+ | date input text | `default` slot → `DateInput` |
1076
+ | calendar icon | `DateTrigger` 내부 `PopoverTrigger` 버튼 |
1077
+ | calendar popup | `PopoverContent` |
1078
+ | date calendar panel | `DateCalendar` |
1079
+
1080
+ ---
1081
+
1082
+ ## filterChips
1083
+ 조회용 드롭다운 필터 칩. 생성·수정용 선택 UI 는 `selectbox`(SelectField) 를 쓴다.
1084
+
1085
+ | Figma 노드 | Vue 컴포넌트 |
1086
+ |------------|--------------|
1087
+ | [4012:24597](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=4012-24597) (`viewFilter` frame, `filterChips` set) | `FilterChip.vue` |
1088
+
1089
+ ### Props 매핑
1090
+
1091
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1092
+ |----------------|----------|---------------|--------|
1093
+ | `variant=square` / `variant=circle` | `round` | `boolean` (square=`false`, circle=`true`) | `false` |
1094
+ | `device=web` / `device=mobile` | `device` | `web / mobile` | `web` |
1095
+ | `state=placeholder` / `state=typed` | `state` | `placeholder / typed` | `placeholder` |
1096
+ | `+N` (typed 라벨 옆 숫자) | `count` | `number / string` (`+` 접두는 자동) | - |
1097
+ | 우측 chevron | `chevron` | `boolean` | `true` |
1098
+ | 본문 텍스트 | 기본 슬롯 | children | - |
1099
+ | inner badge (3xsmall) | `#badge` 슬롯 | instance (`Badge`) | - |
1100
+
1101
+ ### Slots
1102
+
1103
+ | Slot | 설명 |
1104
+ |------|------|
1105
+ | default | 라벨 텍스트 |
1106
+ | badge | 좌측 inner badge (`Badge` 컴포넌트) |
1107
+
1108
+ ### Code Example
1109
+
1110
+ ```vue
1111
+ <!-- web 필터 트리거: 값 있으면 typed + count -->
1112
+ <Chip :state="count > 0 ? 'typed' : 'placeholder'" :count="count || undefined">사이즈</Chip>
1113
+
1114
+ <!-- mobile -->
1115
+ <Chip device="mobile" state="typed" :count="2">소형</Chip>
1116
+ ```
1117
+
1118
+ ### 하위 구조
1119
+
1120
+ | 피그마 노드 | Vue 구조 |
1121
+ |-------------|----------|
1122
+ | 외곽 (bg + border + radius + padding) | `FilterChip` 외곽 `<div>` (`filterChipVariants`) |
1123
+ | 좌측 inner badge | `#badge` 슬롯 |
1124
+ | 본문 텍스트 (`pl-4`) | 기본 슬롯 (`<span>`, device×state 별 색) |
1125
+ | typed 의 `+N` | `count` prop (`font-semibold text-status-informative`) |
1126
+ | 우측 Action/Chevron `16` | `chevron=true` 시 `ChevronDown` lucide (`size-[16px]`) |
1127
+
1128
+ > 기존 `select=unselected/selected_single/selected_multi` / `size=xsmall/small` 모델은 Figma 재설계(`filterChips`, state=placeholder/typed / device=web/mobile)로 폐기됨. 선택 pill·삭제(X) 용도는 `Tag`(`closable`) 사용.
1129
+
1130
+ ---
1131
+
1132
+ ## toast
1133
+
1134
+ | 피그마 | Vue |
1135
+ |--------|-----|
1136
+ | 노드 `4038:38723` (Toast 페이지) | - |
1137
+ | 컴포넌트 | `Toast.vue` (vue-sonner Toaster wrapper) |
1138
+ | `state=success` | `toast.success(...)` |
1139
+ | `state=error` | `toast.error(...)` |
1140
+ | `state=infrom` (info) | `toast.info(...)` |
1141
+ | `state=warning` | `toast.warning(...)` |
1142
+ | 제목 (16/Bold 24 leading) | 첫 인자 string |
1143
+ | 부연 설명 (13/Regular 20 leading) | `{ description }` 옵션 |
1144
+ | 액션 버튼 (Bold 16, 밑줄, white) | `{ action: { label, onClick } }` 옵션 |
1145
+ | 닫기 X (24px) | `{ closeButton: true }` 또는 자동 dismiss |
1146
+
1147
+ ### 하위 구조
1148
+
1149
+ | 피그마 구조 | Vue 구조 |
1150
+ |-------------|----------|
1151
+ | 컨테이너 (앱 루트 한 번) | `<Toast />` 마운트 |
1152
+ | 토스트 카드 (396px 폭, rounded-8, px16/py8, drop-shadow) | `toastOptions.classes.toast` |
1153
+ | 좌측 24px 아이콘 (check_circle / cancel / info) | sonner 자동 + `toastOptions.classes.icon` |
1154
+ | 제목 행 (Bold 16/24, 흰색) | `toastOptions.classes.title` |
1155
+ | 설명 행 (Regular 13/20, 흰색) | `toastOptions.classes.description` |
1156
+ | 액션 텍스트 버튼 (밑줄) | `toastOptions.classes.actionButton` |
1157
+
1158
+ ---
1159
+
1160
+ ## datePeriodPicker
1161
+
1162
+ | 항목 | 값 |
1163
+ |------|-----|
1164
+ | Figma 합성 | `dateInput` (`variant=period`) + `periodCalendar` ([12247:8603](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8603)) |
1165
+ | Vue 컴포넌트 | `DatePeriodPicker.vue` |
1166
+
1167
+ ### Props 매핑
1168
+
1169
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1170
+ |---|---|---|---|
1171
+ | `Variant` | `variant` | `default / filled / bottomline` | - |
1172
+ | `Size` | `size` | `small / regular / large` | - |
1173
+ | `State=error` | `error` (또는 `DatePeriodInput` draft error) | `boolean` | - |
1174
+ | `State=disabled` | `disabled` | `boolean` | - |
1175
+ | `State=readonly` | `readonly` | `boolean` | - |
1176
+ | 시작 placeholder | `startPlaceholder` | `string` | `YYYY-MM-DD` |
1177
+ | 종료 placeholder | `endPlaceholder` | `string` | `YYYY-MM-DD` |
1178
+ | 기간 값 | `v-model` | `{ start: CalendarDate / null, end: CalendarDate / null }` | - |
1179
+
1180
+ ### Vue 전용 Props
1181
+
1182
+ | Vue Prop | 타입 | 기본값 | 설명 |
1183
+ |---|---|---|---|
1184
+ | `class` | `string` | - | 입력 영역 외곽 클래스 |
1185
+ | `popoverContentClass` | `string` | - | 팝업 영역 클래스 |
1186
+ | `weekStartsOn` | `0-6` | `0` (일요일) | 주 시작 요일. 내부 캘린더로 관통 |
1187
+
1188
+ ### Events
1189
+
1190
+ | 이벤트 | 페이로드 |
1191
+ |---|---|
1192
+ | `update:modelValue` | `DatePeriodValue / null` |
1193
+
1194
+ ### Slots
1195
+
1196
+ | Slot | 설명 |
1197
+ |---|---|
1198
+ | `default` | 트리거 영역. 미지정 시 `DatePeriodInput` 자동 |
1199
+
1200
+ ### Code Example
1201
+
1202
+ ```vue
1203
+ <DatePeriodPicker v-model="range" size="regular" />
1204
+ ```
1205
+
1206
+ ### 하위 구조
1207
+
1208
+ | 피그마 노드 | Vue 구조 |
1209
+ |---|---|
1210
+ | period input frame | `DatePeriodTrigger` |
1211
+ | start / arrow `→` / end | `DatePeriodInput` |
1212
+ | calendar icon | `DatePeriodTrigger` 내부 `PopoverTrigger` 버튼 |
1213
+ | calendar popup | `PopoverContent` |
1214
+ | period calendar panel | `PeriodCalendar` |
1215
+
1216
+ ---
1217
+
1218
+ ## dateInput
1219
+
1220
+ | 항목 | 값 |
1221
+ |------|-----|
1222
+ | Figma 노드 | [3619:27807](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3619-27807) |
1223
+ | Vue 컴포넌트 | `DateInput` / `DatePeriodInput` (Picker 내부에 자동 포함) |
1224
+
1225
+ > 피그마의 `dateInput` 은 코드에서 항상 Picker (`DatePicker` / `DatePeriodPicker` / 모바일 변형) 로 매핑된다. 단독 `DateInput` / `DatePeriodInput` 은 Picker 의 슬롯 커스터마이즈가 필요할 때만 직접 사용.
1226
+
1227
+ ### Props 매핑
1228
+
1229
+ | Figma 프로퍼티 | Vue 매핑 | 타입 / 허용값 | 기본값 |
1230
+ |---|---|---|---|
1231
+ | `Variant=date` | `DatePicker` / `MobileDatePicker` (기본 슬롯에 `DateInput`) | - | - |
1232
+ | `Variant=period` | `DatePeriodPicker` / `MobileDatePeriodPicker` (내부에 `DatePeriodInput`) | - | - |
1233
+ | `Size` | (Picker `size`) `small / regular / large` | - | - |
1234
+ | `State=*` | (Picker 와 동일) | - | - |
1235
+ | date 입력 폭 (기준) | - | `160px` | - |
1236
+ | period 입력 폭 (기준) | - | `340px` | - |
1237
+
1238
+ ### 하위 구조
1239
+
1240
+ | 피그마 노드 | Vue 구조 |
1241
+ |---|---|
1242
+ | date input text | `DatePicker` 기본 슬롯 → `DateInput` |
1243
+ | period start text | `DatePeriodInput` → 첫 번째 `DateInput` |
1244
+ | period arrow | `DatePeriodInput` → 구분 텍스트 `→` |
1245
+ | period end text | `DatePeriodInput` → 두 번째 `DateInput` |
1246
+
1247
+ ---
1248
+
1249
+ ## moveContainer
1250
+
1251
+ | 항목 | 값 |
1252
+ |------|-----|
1253
+ | Figma 노드 | [12381:8083](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12381-8083) |
1254
+ | Vue 컴포넌트 | `DateMove.vue` |
1255
+
1256
+ ### Props 매핑
1257
+
1258
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1259
+ |---|---|---|---|
1260
+ | `Size` | `size` | `small / regular / large` | - |
1261
+ | `Variant` | `variant` | `default / filled / bottomline` | - |
1262
+ | `State=error` | `error` | `boolean` | - |
1263
+ | `State=disabled` | `disabled` | `boolean` | - |
1264
+ | `State=readonly` | `readonly` | `boolean` | - |
1265
+ | 이동 대상 값 | `v-model` | `CalendarDate / DatePeriodValue / null` | - |
1266
+
1267
+ ### Vue 전용 Props
1268
+
1269
+ | Vue Prop | 타입 | 기본값 | 설명 |
1270
+ |---|---|---|---|
1271
+ | `class` | `string` | - | 외곽 클래스 |
1272
+
1273
+ ### Events
1274
+
1275
+ | 이벤트 | 페이로드 |
1276
+ |---|---|
1277
+ | `update:modelValue` | `CalendarDate / DatePeriodValue / null` |
1278
+
1279
+ ### Slots
1280
+
1281
+ | Slot | 설명 |
1282
+ |---|---|
1283
+ | `default` | 중앙 입력 영역. 미지정 시 `DatePicker`, 필요 시 `DatePeriodPicker` 직접 배치 |
1284
+
1285
+ ### Code Example
1286
+
1287
+ ```vue
1288
+ <DateMove v-model="d" size="regular">
1289
+ <DatePicker v-model="d" />
1290
+ </DateMove>
1291
+ ```
1292
+
1293
+ ### 하위 구조
1294
+
1295
+ | 피그마 노드 | Vue 구조 |
1296
+ |---|---|
1297
+ | 이전 연 | `IconButton` + `ChevronsLeft` |
1298
+ | 이전 월 | `IconButton` + `ChevronLeft` |
1299
+ | 중앙 입력 | `default` slot |
1300
+ | 다음 월 | `IconButton` + `ChevronRight` |
1301
+ | 다음 연 | `IconButton` + `ChevronsRight` |
1302
+
1303
+ ---
1304
+
1305
+ ## dateCalendar
1306
+
1307
+ | 항목 | 값 |
1308
+ |------|-----|
1309
+ | Figma 노드 | [12247:8602](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8602) |
1310
+ | Vue 컴포넌트 | `DateCalendar.vue` (`Calendar` 는 동일 파일 별칭) |
1311
+ | 웹 기준 크기 | `256 × 360` |
1312
+
1313
+ ### Props 매핑
1314
+
1315
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1316
+ |---|---|---|---|
1317
+ | 날짜 값 | `v-model` | `CalendarDate / null` | - |
1318
+ | 빠른 기간 (1·3·6개월·1년) | `showQuickPresets` | `boolean` | `true` |
1319
+ | 푸터 (초기화·완료) | `showFooter` | `boolean` | `true` |
1320
+ | 로케일 / 주 시작 등 | `locale` / `weekStartsOn` / 기타 `CalendarRootProps` | `string` / `number` / … | `ko-KR` / `0` |
1321
+
1322
+ ### Vue 전용 Props
1323
+
1324
+ | Vue Prop | 타입 | 기본값 | 설명 |
1325
+ |---|---|---|---|
1326
+ | `placeholder` | `CalendarDate` | - | 초기 표시 월 |
1327
+ | `class` | `string` | - | 외곽 클래스 |
1328
+
1329
+ ### Events
1330
+
1331
+ | 이벤트 | 페이로드 |
1332
+ |---|---|
1333
+ | `update:modelValue` | `CalendarDate / null` |
1334
+ | `update:placeholder` | `CalendarDate` |
1335
+ | `change` | `Date / null` |
1336
+ | `reset` | `void` |
1337
+
1338
+ ### Slots
1339
+
1340
+ | Slot | 설명 |
1341
+ |---|---|
1342
+ | `reset` | 초기화 영역 (기본 footer 의 reset 버튼 자리) |
1343
+ | `done` | 완료 영역 (기본 footer 의 done 버튼 자리) |
1344
+
1345
+ ### Code Example
1346
+
1347
+ ```vue
1348
+ <DateCalendar v-model="d" :showQuickPresets="false" />
1349
+ ```
1350
+
1351
+ ### 하위 구조
1352
+
1353
+ | 피그마 노드 | Vue 구조 |
1354
+ |---|---|
1355
+ | header / month move | `CalendarHeader` |
1356
+ | date grid | `CalendarDateGrid` → `CalendarGrid` |
1357
+ | day cell | `CalendarCell` + `CalendarCellTrigger` (`32px`) |
1358
+ | selected day cell | `date` 노드 `12242:5467` → `variant=selected, size=small` → `getCalendarDateCellTriggerClass()` |
1359
+ | quick preset | `CalendarShortcut` |
1360
+ | footer | `CalendarFooter` |
1361
+
1362
+ ---
1363
+
1364
+ ## periodCalendar
1365
+
1366
+ | 항목 | 값 |
1367
+ |------|-----|
1368
+ | Figma 노드 | [12247:8603](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8603) |
1369
+ | Vue 컴포넌트 | `PeriodCalendar.vue` |
1370
+ | 웹 기준 크기 | `512 × 408` |
1371
+
1372
+ ### Props 매핑
1373
+
1374
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1375
+ |---|---|---|---|
1376
+ | 범위 값 | `v-model` | `DateRange` (reka-ui) | - |
1377
+ | 한 화면에 보이는 달 개수 | `numberOfMonths` | `number` | `2` |
1378
+ | 빠른 기간 | `showQuickPresets` | `boolean` | `true` |
1379
+ | 푸터 | `showFooter` | `boolean` | `true` |
1380
+ | 로케일 / 주 시작 등 | `locale` / `weekStartsOn` / 기타 `RangeCalendarRootProps` | `string` / `number` / … | `ko-KR` / `0` |
1381
+
1382
+ ### Events
1383
+
1384
+ | 이벤트 | 페이로드 |
1385
+ |---|---|
1386
+ | `update:modelValue` | `DateRange` |
1387
+ | `change` | `{ first: Date / null; last: Date / null }` |
1388
+ | `reset` | `void` |
1389
+
1390
+ ### Slots
1391
+
1392
+ | Slot | 설명 |
1393
+ |---|---|
1394
+ | `reset` | `{ onReset }` 스코프 - 커스텀 초기화 버튼 |
1395
+ | `done` | `{ onDone }` 스코프 - 커스텀 완료 버튼 |
1396
+
1397
+ ### Code Example
1398
+
1399
+ ```vue
1400
+ <PeriodCalendar v-model="range" :numberOfMonths="2" />
1401
+ ```
1402
+
1403
+ ### 하위 구조
1404
+
1405
+ | 피그마 노드 | Vue 구조 |
1406
+ |---|---|
1407
+ | range root | `RangeCalendar.vue` |
1408
+ | month panel | `CalendarRangeDateGrid` 내부 월 컬럼 |
1409
+ | panel header | 각 월 컬럼의 `CalendarRangeHeader` |
1410
+ | date grid | 각 월 컬럼의 `RangeCalendarGrid` |
1411
+ | day cell | `RangeCalendarCell` + `RangeCalendarCellTrigger` (`32px`) |
1412
+ | start/end selected cell | `date` 노드 `12242:5467` → `variant=selected, size=small` → `getCalendarRangeDateCellTriggerClass()` |
1413
+ | range middle cell | `date` 노드 `12242:5467` → `variant=durationDate, size=small` → `getCalendarRangeDateCellTriggerClass()` |
1414
+ | quick preset | `CalendarShortcut` |
1415
+ | footer | `CalendarFooter` |
1416
+
1417
+ ---
1418
+
1419
+ ## monthPicker
1420
+
1421
+ | 항목 | 값 |
1422
+ |------|-----|
1423
+ | Figma 노드 | [12247:8599](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8599) |
1424
+ | Vue 컴포넌트 | `MonthCalendar.vue` |
1425
+ | 웹 기준 크기 | `256 × 184` |
1426
+
1427
+ ### Props 매핑
1428
+
1429
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1430
+ |---|---|---|---|
1431
+ | 월 값 | `v-model` | `CalendarDate / null` (일은 항상 1) | - |
1432
+
1433
+ ### Vue 전용 Props
1434
+
1435
+ | Vue Prop | 타입 | 기본값 | 설명 |
1436
+ |---|---|---|---|
1437
+ | `class` | `string` | - | 패널 클래스 |
1438
+
1439
+ ### Events
1440
+
1441
+ | 이벤트 | 페이로드 |
1442
+ |---|---|
1443
+ | `update:modelValue` | `CalendarDate / null` |
1444
+ | `done` | `void` |
1445
+
1446
+ ### Code Example
1447
+
1448
+ ```vue
1449
+ <MonthCalendar v-model="month" @done="onPick" />
1450
+ ```
1451
+
1452
+ ### 하위 구조
1453
+
1454
+ | 피그마 노드 | Vue 구조 |
1455
+ |---|---|
1456
+ | year header / year move | `CalendarMonthGrid` |
1457
+ | month grid | `CalendarMonthGrid` |
1458
+ | this month / done footer | `MonthCalendar` 내부 footer |
1459
+ | year picker view | `CalendarYearGrid` |
1460
+
1461
+ ---
1462
+
1463
+ ## timePicker
1464
+
1465
+ | 항목 | 값 |
1466
+ |------|-----|
1467
+ | Figma 합성 | `timeInput` ([3623:26811](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3623-26811)) + `time` panel ([12266:7051](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12266-7051)) |
1468
+ | Vue 컴포넌트 | `TimePicker.vue` |
1469
+
1470
+ ### Props 매핑
1471
+
1472
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1473
+ |---|---|---|---|
1474
+ | `Variant` (input frame) | `variant` | `default / filled / bottomline` | - |
1475
+ | `Size` | `size` | `small / regular / large` | - |
1476
+ | `State=error` | `error` (또는 `TimeInput` draft error) | `boolean` | - |
1477
+ | `State=disabled` | `disabled` | `boolean` | - |
1478
+ | `State=readonly` | `readonly` | `boolean` | - |
1479
+ | 시각 값 | `v-model` | `Time / null` | - |
1480
+
1481
+ ### Vue 전용 Props
1482
+
1483
+ | Vue Prop | 타입 | 기본값 | 설명 |
1484
+ |---|---|---|---|
1485
+ | `class` | `string` | - | 입력 영역 외곽 클래스 |
1486
+ | `popoverContentClass` | `string` | - | 팝업 영역 클래스 |
1487
+
1488
+ ### Events
1489
+
1490
+ | 이벤트 | 페이로드 |
1491
+ |---|---|
1492
+ | `update:modelValue` | `Time / null` |
1493
+
1494
+ ### Slots
1495
+
1496
+ | Slot | 설명 |
1497
+ |---|---|
1498
+ | `default` | 트리거 영역. 미지정 시 `TimeInput` 자동 |
1499
+
1500
+ ### Code Example
1501
+
1502
+ ```vue
1503
+ <TimePicker v-model="t" size="regular" />
1504
+ ```
1505
+
1506
+ ### 하위 구조
1507
+
1508
+ | 피그마 노드 | Vue 구조 |
1509
+ |---|---|
1510
+ | input frame | `TimeTrigger` |
1511
+ | time input | `default` slot → `TimeInput` |
1512
+ | clock icon | `TimeTrigger` 내부 `PopoverTrigger` 버튼 |
1513
+ | time popup | `PopoverContent` |
1514
+ | time panel | `TimePanel` |
1515
+
1516
+ ---
1517
+
1518
+ ## timeInput
1519
+
1520
+ | 항목 | 값 |
1521
+ |------|-----|
1522
+ | Figma 노드 | [3623:26811](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=3623-26811) |
1523
+ | Vue 컴포넌트 | `TimeInput` (Picker 내부) |
1524
+
1525
+ > 피그마의 `timeInput` 은 코드에서 항상 Picker (`TimePicker` / `MobileTimePicker`) 로 매핑된다. 단독 `TimeInput` 은 Picker 슬롯 커스터마이즈가 필요할 때만.
1526
+
1527
+ ### Props 매핑
1528
+
1529
+ | Figma 프로퍼티 | Vue 매핑 | 타입 / 허용값 | 기본값 |
1530
+ |---|---|---|---|
1531
+ | `Variant=time` | `TimePicker` / `MobileTimePicker` (기본 슬롯에 `TimeInput`) | - | - |
1532
+ | `Variant=timeRange` | (미구현 - 추후 `TimePeriodPicker.vue`) | - | - |
1533
+ | `Size=32px / 40px / 48px` | (Picker `size`) `small / regular / large` | - | - |
1534
+ | `State=*` | (Picker 와 동일) | - | - |
1535
+ | time 입력 폭 (기준) | - | `160px` | - |
1536
+
1537
+ ### 하위 구조
1538
+
1539
+ | 피그마 노드 | Vue 구조 |
1540
+ |---|---|
1541
+ | time input text (`오전 09:00`) | `TimePicker` 기본 슬롯 → `TimeInput` |
1542
+ | clock icon | `TimeTrigger` 내부 `PopoverTrigger` 버튼 |
1543
+
1544
+ ---
1545
+
1546
+ ## time (panel)
1547
+
1548
+ | 항목 | 값 |
1549
+ |------|-----|
1550
+ | Figma 노드 | [12266:7051](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12266-7051) |
1551
+ | Vue 컴포넌트 | `TimePanel.vue` |
1552
+
1553
+ ### Props 매핑
1554
+
1555
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1556
+ |---|---|---|---|
1557
+ | `State=placeholder` | 빈 `modelValue` | - | - |
1558
+ | `State=focused` | 입력 중 자동 | - | - |
1559
+ | `State=disabled` | `선택 안함` 체크 시 시·분·AM/PM 비활성 | - | - |
1560
+ | 선택 안함 체크박스 노출 | `showSkip` | `boolean` | `true` |
1561
+ | 완료 버튼 노출 | `showFooter` | `boolean` | `true` |
1562
+ | 시각 값 | `v-model` | `Time / null` | `null` |
1563
+
1564
+ ### Vue 전용 Props
1565
+
1566
+ | Vue Prop | 타입 | 기본값 | 설명 |
1567
+ |---|---|---|---|
1568
+ | `class` | `string` | - | 패널 클래스 |
1569
+
1570
+ ### Events
1571
+
1572
+ | 이벤트 | 페이로드 |
1573
+ |---|---|
1574
+ | `update:modelValue` | `Time / null` |
1575
+ | `change` | `Time / null` (완료 시) |
1576
+
1577
+ ### Code Example
1578
+
1579
+ ```vue
1580
+ <TimePanel v-model="t" :showSkip="false" />
1581
+ ```
1582
+
1583
+ ### 하위 구조
1584
+
1585
+ | 피그마 노드 | Vue 구조 |
1586
+ |---|---|
1587
+ | 시 입력 | 직접 `<input>` (panel 내부, 12h `1~12`) |
1588
+ | `:` 구분 | 텍스트 |
1589
+ | 분 입력 | 직접 `<input>` (panel 내부, `0~59`) |
1590
+ | AM/PM 세로 토글 | 직접 `<button>` 2개 (panel 내부) |
1591
+ | 선택 안함 | `Checkbox` (size=small) |
1592
+ | 완료 | `Button` (variant=primary, size=small) |
1593
+
1594
+ ---
1595
+
1596
+ ## mobileDatePicker
1597
+
1598
+ | 항목 | 값 |
1599
+ |------|-----|
1600
+ | Figma 합성 | `dateInput(variant=date)` + `dateCalendar` (mobile) ([12247:8592](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8592)) |
1601
+ | Vue 컴포넌트 | `MobileDatePicker.vue` |
1602
+
1603
+ ### Props 매핑
1604
+
1605
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1606
+ |---|---|---|---|
1607
+ | `Variant` | `variant` | `default / filled / bottomline` | - |
1608
+ | `Size` | `size` | `small / regular / large` | - |
1609
+ | `State=error` | `error` (또는 `DateInput` draft error) | `boolean` | - |
1610
+ | `State=disabled` | `disabled` | `boolean` | - |
1611
+ | `State=readonly` | `readonly` | `boolean` | - |
1612
+ | 날짜 값 | `v-model` | `CalendarDate / null` | - |
1613
+
1614
+ ### Vue 전용 Props
1615
+
1616
+ | Vue Prop | 타입 | 기본값 | 설명 |
1617
+ |---|---|---|---|
1618
+ | `class` | `string` | - | 외곽 클래스 |
1619
+ | `weekStartsOn` | `0-6` | `0` (일요일) | 주 시작 요일. 내부 캘린더로 관통 |
1620
+
1621
+ ### Events
1622
+
1623
+ | 이벤트 | 페이로드 |
1624
+ |---|---|
1625
+ | `update:modelValue` | `CalendarDate / null` |
1626
+
1627
+ ### Slots
1628
+
1629
+ | Slot | 설명 |
1630
+ |---|---|
1631
+ | `default` | 트리거 영역. 미지정 시 `DateInput` 자동 |
1632
+
1633
+ ### Code Example
1634
+
1635
+ ```vue
1636
+ <MobileDatePicker v-model="d" size="regular" />
1637
+ ```
1638
+
1639
+ ### 하위 구조
1640
+
1641
+ | 피그마 노드 | Vue 구조 |
1642
+ |---|---|
1643
+ | input frame | `MobileDateTrigger` |
1644
+ | date input | `default` slot → `DateInput` |
1645
+ | calendar icon | `MobileDateTrigger` 내부 `DrawerTrigger` 버튼 |
1646
+ | calendar popup | `Drawer` + `DrawerContent` |
1647
+ | date calendar panel | `MobileDateCalendar` |
1648
+
1649
+ ---
1650
+
1651
+ ## mobileDatePeriodPicker
1652
+
1653
+ | 항목 | 값 |
1654
+ |------|-----|
1655
+ | Figma 합성 | `dateInput(variant=period)` + `periodCalendar` (mobile) ([12247:8094](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8094)) |
1656
+ | Vue 컴포넌트 | `MobileDatePeriodPicker.vue` |
1657
+
1658
+ ### Props 매핑
1659
+
1660
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1661
+ |---|---|---|---|
1662
+ | `Variant` | `variant` | `default / filled / bottomline` | - |
1663
+ | `Size` | `size` | `small / regular / large` | - |
1664
+ | `State=error` | `error` (또는 `DatePeriodInput` draft error) | `boolean` | - |
1665
+ | `State=disabled` | `disabled` | `boolean` | - |
1666
+ | `State=readonly` | `readonly` | `boolean` | - |
1667
+ | 시작 placeholder | `startPlaceholder` | `string` | `YYYY-MM-DD` |
1668
+ | 종료 placeholder | `endPlaceholder` | `string` | `YYYY-MM-DD` |
1669
+ | 기간 값 | `v-model` | `DatePeriodValue / null` | - |
1670
+
1671
+ ### Vue 전용 Props
1672
+
1673
+ | Vue Prop | 타입 | 기본값 | 설명 |
1674
+ |---|---|---|---|
1675
+ | `class` | `string` | - | 외곽 클래스 |
1676
+ | `weekStartsOn` | `0-6` | `0` (일요일) | 주 시작 요일. 내부 캘린더로 관통 |
1677
+
1678
+ ### Events
1679
+
1680
+ | 이벤트 | 페이로드 |
1681
+ |---|---|
1682
+ | `update:modelValue` | `DatePeriodValue / null` |
1683
+
1684
+ ### Code Example
1685
+
1686
+ ```vue
1687
+ <MobileDatePeriodPicker v-model="range" size="regular" />
1688
+ ```
1689
+
1690
+ ### 하위 구조
1691
+
1692
+ | 피그마 노드 | Vue 구조 |
1693
+ |---|---|
1694
+ | period input frame | `MobileDatePeriodTrigger` |
1695
+ | start / arrow / end | `DatePeriodInput` |
1696
+ | calendar icon | `MobileDatePeriodTrigger` 내부 `DrawerTrigger` 버튼 |
1697
+ | calendar popup | `Drawer` + `DrawerContent` |
1698
+ | period calendar panel | `MobilePeriodCalendar` |
1699
+ | 저장 (validation 필요) | `#done` slot - `Button variant=primary size=xlarge` (`saveDisabled` 시 비활성) |
1700
+
1701
+ ---
1702
+
1703
+ ## mobileTimePicker
1704
+
1705
+ | 항목 | 값 |
1706
+ |------|-----|
1707
+ | Figma 합성 | `timeInput` + `timePicker(mobile)` ([12247:8598](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8598)) |
1708
+ | Vue 컴포넌트 | `MobileTimePicker.vue` |
1709
+
1710
+ ### Props 매핑
1711
+
1712
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1713
+ |---|---|---|---|
1714
+ | `Variant` | `variant` | `default / filled / bottomline` | - |
1715
+ | `Size` | `size` | `small / regular / large` | - |
1716
+ | `State=error` | `error` (또는 `TimeInput` draft error) | `boolean` | - |
1717
+ | `State=disabled` | `disabled` | `boolean` | - |
1718
+ | `State=readonly` | `readonly` | `boolean` | - |
1719
+ | 드로어 제목 | `title` | `string` | `"시간 선택"` |
1720
+ | 시각 값 | `v-model` | `Time / null` | - |
1721
+
1722
+ ### Vue 전용 Props
1723
+
1724
+ | Vue Prop | 타입 | 기본값 | 설명 |
1725
+ |---|---|---|---|
1726
+ | `class` | `string` | - | 입력 영역 외곽 클래스 |
1727
+ | `drawerContentClass` | `string` | - | 드로어 클래스 |
1728
+
1729
+ ### Events
1730
+
1731
+ | 이벤트 | 페이로드 |
1732
+ |---|---|
1733
+ | `update:modelValue` | `Time / null` |
1734
+
1735
+ ### Slots
1736
+
1737
+ | Slot | 설명 |
1738
+ |---|---|
1739
+ | `default` | 트리거 영역. 미지정 시 `TimeInput` 자동 |
1740
+
1741
+ ### Code Example
1742
+
1743
+ ```vue
1744
+ <MobileTimePicker v-model="t" />
1745
+ ```
1746
+
1747
+ ### 하위 구조
1748
+
1749
+ | 피그마 노드 | Vue 구조 |
1750
+ |---|---|
1751
+ | input frame | `MobileTimePicker` 외곽 `InputFrame` |
1752
+ | time input | `default` slot → `TimeInput` |
1753
+ | clock icon | 외곽 `<button>` + `Clock` (드로어 트리거) |
1754
+ | time popup | `Drawer` + `DrawerContent` |
1755
+ | time dial | `MobileTimeDial` |
1756
+
1757
+ ---
1758
+
1759
+ ## dateCalendar (mobile)
1760
+
1761
+ | 항목 | 값 |
1762
+ |------|-----|
1763
+ | Figma 노드 | [12247:8592](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8592) |
1764
+ | Vue 컴포넌트 | `MobileDateCalendar.vue` |
1765
+ | 모바일 기준 크기 | `360 × 464` (상단 라운드 `16/16/0/0`) |
1766
+
1767
+ ### Props 매핑
1768
+
1769
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1770
+ |---|---|---|---|
1771
+ | 날짜 값 | `v-model` | `CalendarDate / null` | - |
1772
+ | 푸터 (초기화·저장) | `showFooter` | `boolean` | `true` |
1773
+ | 로케일 / 주 시작 등 | `locale` / `weekStartsOn` / 기타 `CalendarRootProps` | `string` / `number` / … | `ko-KR` / `0` |
1774
+
1775
+ ### Vue 전용 Props
1776
+
1777
+ | Vue Prop | 타입 | 기본값 | 설명 |
1778
+ |---|---|---|---|
1779
+ | `placeholder` | `CalendarDate` | - | 초기 표시 월 |
1780
+ | `class` | `string` | - | 외곽 클래스 |
1781
+
1782
+ ### Events
1783
+
1784
+ | 이벤트 | 페이로드 |
1785
+ |---|---|
1786
+ | `update:modelValue` | `CalendarDate / null` |
1787
+ | `update:placeholder` | `CalendarDate` |
1788
+ | `change` | `Date / null` |
1789
+ | `reset` | `void` |
1790
+
1791
+ ### Slots
1792
+
1793
+ | Slot | 설명 |
1794
+ |---|---|
1795
+ | `reset` | 초기화 영역 |
1796
+ | `done` | 저장 영역 |
1797
+
1798
+ ### 하위 구조
1799
+
1800
+ | 피그마 노드 | Vue 구조 |
1801
+ |---|---|
1802
+ | `Title` (월 텍스트 + 좌·우 chevron 2쌍) | 인라인 헤더 (`IconButton size=small variant=tertiary` × 4) |
1803
+ | `month` 텍스트 | `headingLabel` 버튼 (`label1` 16/24/Bold) |
1804
+ | `Frame 2895` 주·일자 | `<table>` + `CalendarGridHead` / `CalendarGridBody` |
1805
+ | `week` 행 | `<th>` (`label2` 15/24/Bold, `flex-1`, 일=`red-80`) |
1806
+ | `day` 슬롯 (6 × `02 line`) | `CalendarCell` × 7 (`flex-1 h-[48px]`) |
1807
+ | day 셀 트리거 | `CalendarCellTrigger` (`40 × 40` 라운드 `8`) |
1808
+ | selected day cell | `date` 노드 → `variant=selected, size=small` → `getCalendarDateCellTriggerClass()` |
1809
+ | `Frame 2530` 푸터 | 인라인 푸터 (`Button` × 2, `flex-1`) |
1810
+ | 초기화 (tertiary, xlarge, front icon) | `Button variant=tertiary theme=filled size=xlarge` + `RotateCcw` |
1811
+ | 저장 (primary, xlarge) | `Button variant=primary theme=filled size=xlarge` |
1812
+
1813
+ ---
1814
+
1815
+ ## periodCalendar (mobile)
1816
+
1817
+ | 항목 | 값 |
1818
+ |------|-----|
1819
+ | Figma 노드 | [12247:8094](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8094) |
1820
+ | Vue 컴포넌트 | `MobilePeriodCalendar.vue` |
1821
+ | 모바일 기준 크기 | `360 × 824` (상단 라운드 `16/16/0/0`, 두 달 세로 스택) |
1822
+
1823
+ ### Props 매핑
1824
+
1825
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1826
+ |---|---|---|---|
1827
+ | 범위 값 | `v-model` | `DateRange` (reka-ui) | - |
1828
+ | 한 화면에 보이는 달 개수 | `numberOfMonths` | `number` | `2` |
1829
+ | 푸터 (초기화·저장) | `showFooter` | `boolean` | `true` |
1830
+ | 로케일 / 주 시작 등 | `locale` / `weekStartsOn` / 기타 `RangeCalendarRootProps` | `string` / `number` / … | `ko-KR` / `0` |
1831
+
1832
+ ### Events
1833
+
1834
+ | 이벤트 | 페이로드 |
1835
+ |---|---|
1836
+ | `update:modelValue` | `DateRange` |
1837
+ | `update:placeholder` | `DateValue` |
1838
+ | `update:startValue` | `DateValue / undefined` |
1839
+ | `change` | `{ first: Date / null; last: Date / null }` |
1840
+ | `reset` | `void` |
1841
+
1842
+ ### Slots
1843
+
1844
+ | Slot | 설명 |
1845
+ |---|---|
1846
+ | `reset` | 초기화 영역 |
1847
+ | `done` | 저장 영역 |
1848
+
1849
+ ### 하위 구조
1850
+
1851
+ | 피그마 노드 | Vue 구조 |
1852
+ |---|---|
1853
+ | `Title` (월별 좌·우 chevron 2쌍) | 인라인 헤더 (`IconButton size=small variant=tertiary` × 4, 월 패널마다) |
1854
+ | `month` 텍스트 | 일반 `<div>` (`label1` 16/24/Bold) |
1855
+ | `week` 행 | `<th>` (`label2` 15/24/Bold, `flex-1`, 일=`red-80`) |
1856
+ | `day` 행 | `RangeCalendarCell` × 7 (`flex-1 h-[48px]`) |
1857
+ | day 셀 트리거 | `RangeCalendarCellTrigger` (`40 × 40` 라운드 `8`) |
1858
+ | start/end selected cell | `date` 노드 → `variant=selected, size=small` → `getCalendarRangeDateCellTriggerClass()` |
1859
+ | range middle cell | `date` 노드 → `variant=durationDate, size=small` → 셀 `bg-blue-20` |
1860
+ | 초기화 (tertiary, xlarge, front icon) | `Button variant=tertiary theme=filled size=xlarge` + `RotateCcw` |
1861
+ | 저장 (primary, xlarge) | `Button variant=primary theme=filled size=xlarge` |
1862
+
1863
+ ---
1864
+
1865
+ ## timePicker (mobile)
1866
+
1867
+ | 항목 | 값 |
1868
+ |------|-----|
1869
+ | Figma 노드 | [12247:8598](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-8598) |
1870
+ | Vue 컴포넌트 | `MobileTimeDial.vue` |
1871
+ | 모바일 기준 크기 | `360 × 320` (상단 라운드 `16/16/0/0`) |
1872
+
1873
+ ### Props 매핑
1874
+
1875
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1876
+ |---|---|---|---|
1877
+ | 시각 값 | `v-model` | `Time / null` | `null` |
1878
+ | 헤더 제목 | `title` | `string` | `"시간 선택"` |
1879
+ | 닫기 버튼 노출 | `showClose` | `boolean` | `true` |
1880
+
1881
+ ### Vue 전용 Props
1882
+
1883
+ | Vue Prop | 타입 | 기본값 | 설명 |
1884
+ |---|---|---|---|
1885
+ | `class` | `string` | - | 패널 클래스 |
1886
+
1887
+ ### Events
1888
+
1889
+ | 이벤트 | 페이로드 |
1890
+ |---|---|
1891
+ | `update:modelValue` | `Time / null` |
1892
+ | `change` | `Time / null` (저장 / 선택 안함 양쪽) |
1893
+ | `close` | `void` |
1894
+
1895
+ ### 하위 구조
1896
+
1897
+ | 피그마 노드 | Vue 구조 |
1898
+ |---|---|
1899
+ | 헤더 제목 + 닫기 X | 인라인 `<header>` + `X` 아이콘 버튼 |
1900
+ | AM/PM 컬럼 (오전·오후) | 휠 컬럼 #1 (스크롤 스냅) |
1901
+ | 시 컬럼 (1~12, 12h 표기) | 휠 컬럼 #2 (스크롤 스냅) |
1902
+ | 분 컬럼 (00~59) | 휠 컬럼 #3 (스크롤 스냅) |
1903
+ | 선택 행 강조 배경 | 가운데 절대 배치 `bg-blue-20` |
1904
+ | 선택 안함 (tertiary outlined) | `Button variant=tertiary theme=outlined size=xlarge` |
1905
+ | 저장 (primary) | `Button variant=primary theme=filled size=xlarge` |
1906
+
1907
+ ---
1908
+
1909
+ ## mobileDatePeriodSelector
1910
+
1911
+ | 항목 | 값 |
1912
+ |------|-----|
1913
+ | Figma 노드 | [12247:7978](https://www.figma.com/design/4eyRu4lbq9068LACdI8HMp/?node-id=12247-7978) (`periodInput`, mobile) |
1914
+ | Vue 컴포넌트 | `MobileDatePeriodSelector.vue` |
1915
+
1916
+ ### Props 매핑
1917
+
1918
+ | Figma 프로퍼티 | Vue Prop | 타입 / 허용값 | 기본값 |
1919
+ |---|---|---|---|
1920
+ | `Variant=fixed` (1·3개월·1년) | `preset` | `1m / 3m / 1y` (또는 `modelValue` 자동 감지) | - |
1921
+ | `Variant=select` (직접 설정) | `preset` | `custom` | - |
1922
+ | 기간 값 | `v-model` | `DatePeriodValue / null` | `null` |
1923
+ | 토글 활성 프리셋 | `v-model:preset` | `1m / 3m / 1y / custom` | - |
1924
+ | 헤더 제목 | `title` | `string` | `"조회기간 설정"` |
1925
+ | 닫기 버튼 노출 | `showClose` | `boolean` | `true` |
1926
+ | 시작 placeholder (`select`) | `startPlaceholder` | `string` | `"시작일 선택"` |
1927
+ | 종료 placeholder (`select`) | `endPlaceholder` | `string` | `"종료일 선택"` |
1928
+ | 완료 버튼 텍스트 | `doneText` | `string` | `"선택 완료"` |
1929
+
1930
+ ### Vue 전용 Props
1931
+
1932
+ | Vue Prop | 타입 | 기본값 | 설명 |
1933
+ |---|---|---|---|
1934
+ | `class` | `string` | - | 패널 클래스 |
1935
+
1936
+ ### Events
1937
+
1938
+ | 이벤트 | 페이로드 |
1939
+ |---|---|
1940
+ | `update:modelValue` | `DatePeriodValue / null` |
1941
+ | `update:preset` | `DatePeriodPreset` |
1942
+ | `done` | `DatePeriodValue` |
1943
+ | `close` | `void` |
1944
+
1945
+ ### Code Example
1946
+
1947
+ ```vue
1948
+ <MobileDatePeriodSelector v-model="range" v-model:preset="preset" @done="apply" />
1949
+ ```
1950
+
1951
+ ### 하위 구조
1952
+
1953
+ | 피그마 노드 | Vue 구조 |
1954
+ |---|---|
1955
+ | 헤더 제목 + 닫기 X | 인라인 `<header>` + `X` 아이콘 버튼 |
1956
+ | 프리셋 토글 (1·3개월·1년·직접 설정) | `ToggleGroup` (`type=single`) + `ToggleGroupItem` × 4 (세그먼티드) |
1957
+ | 합본 기간 표시 (`variant=fixed`) | `InputFrame size=large readonly` + `시작 → 종료` 텍스트 + `Calendar` 아이콘 |
1958
+ | 두 입력 필드 (`variant=select`) | `MobileDatePicker` × 2 (각각 `DateInput` 슬롯) |
1959
+ | 완료 버튼 | `Button variant=primary size=large block` |
1960
+
1961
+ ---
1962
+
1963
+ 피그마 열은 Properties / 변형 이름을 그대로 옮긴다. 디자인이 바뀌면 같은 행만 갱신한다.