@iamfiro/design 0.0.0-stage → 0.3.0

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 (416) hide show
  1. package/AGENTS.md +82 -0
  2. package/README.md +15 -2
  3. package/agents/INDEX.md +157 -0
  4. package/agents/accordion/AGENTS.md +279 -0
  5. package/agents/action-bar/AGENTS.md +90 -0
  6. package/agents/alert/AGENTS.md +212 -0
  7. package/agents/alert-dialog/AGENTS.md +193 -0
  8. package/agents/app-shell/AGENTS.md +409 -0
  9. package/agents/area-chart/AGENTS.md +183 -0
  10. package/agents/aspect-ratio/AGENTS.md +143 -0
  11. package/agents/avatar/AGENTS.md +130 -0
  12. package/agents/badge/AGENTS.md +217 -0
  13. package/agents/bar-chart/AGENTS.md +386 -0
  14. package/agents/bar-list/AGENTS.md +223 -0
  15. package/agents/brand-icon/AGENTS.md +82 -0
  16. package/agents/breadcrumb/AGENTS.md +133 -0
  17. package/agents/button/AGENTS.md +195 -0
  18. package/agents/card/AGENTS.md +141 -0
  19. package/agents/card-frame/AGENTS.md +227 -0
  20. package/agents/chat-bubble/AGENTS.md +266 -0
  21. package/agents/chat-composer/AGENTS.md +251 -0
  22. package/agents/checkbox/AGENTS.md +113 -0
  23. package/agents/code-block/AGENTS.md +144 -0
  24. package/agents/color-dot/AGENTS.md +120 -0
  25. package/agents/color-picker/AGENTS.md +224 -0
  26. package/agents/colors/AGENTS.md +168 -0
  27. package/agents/combobox/AGENTS.md +218 -0
  28. package/agents/command-menu/AGENTS.md +169 -0
  29. package/agents/comment/AGENTS.md +206 -0
  30. package/agents/context-menu/AGENTS.md +303 -0
  31. package/agents/copy-button/AGENTS.md +84 -0
  32. package/agents/count-badge/AGENTS.md +115 -0
  33. package/agents/countdown/AGENTS.md +101 -0
  34. package/agents/data-grid/AGENTS.md +460 -0
  35. package/agents/date-picker/AGENTS.md +197 -0
  36. package/agents/delta/AGENTS.md +114 -0
  37. package/agents/description-list/AGENTS.md +251 -0
  38. package/agents/dialog/AGENTS.md +391 -0
  39. package/agents/drawer/AGENTS.md +471 -0
  40. package/agents/dropdown-menu/AGENTS.md +322 -0
  41. package/agents/dropzone/AGENTS.md +116 -0
  42. package/agents/elapsed/AGENTS.md +160 -0
  43. package/agents/empty-state/AGENTS.md +203 -0
  44. package/agents/file-chip/AGENTS.md +79 -0
  45. package/agents/file-icon/AGENTS.md +66 -0
  46. package/agents/file-upload/AGENTS.md +168 -0
  47. package/agents/filter-chips/AGENTS.md +167 -0
  48. package/agents/flag/AGENTS.md +67 -0
  49. package/agents/funnel-chart/AGENTS.md +131 -0
  50. package/agents/highlight/AGENTS.md +119 -0
  51. package/agents/hover-card/AGENTS.md +271 -0
  52. package/agents/icon-stack/AGENTS.md +120 -0
  53. package/agents/icon-tile/AGENTS.md +94 -0
  54. package/agents/inline-diff/AGENTS.md +211 -0
  55. package/agents/input/AGENTS.md +261 -0
  56. package/agents/kanban/AGENTS.md +352 -0
  57. package/agents/kbd/AGENTS.md +160 -0
  58. package/agents/layout/AGENTS.md +351 -0
  59. package/agents/line-chart/AGENTS.md +393 -0
  60. package/agents/link/AGENTS.md +53 -0
  61. package/agents/list/AGENTS.md +392 -0
  62. package/agents/marker/AGENTS.md +142 -0
  63. package/agents/masked-text/AGENTS.md +127 -0
  64. package/agents/menubar/AGENTS.md +276 -0
  65. package/agents/multi-select/AGENTS.md +159 -0
  66. package/agents/navigation-menu/AGENTS.md +315 -0
  67. package/agents/notice-stack/AGENTS.md +101 -0
  68. package/agents/number-stepper/AGENTS.md +96 -0
  69. package/agents/otp-input/AGENTS.md +162 -0
  70. package/agents/pagination/AGENTS.md +189 -0
  71. package/agents/phone-input/AGENTS.md +131 -0
  72. package/agents/pie-chart/AGENTS.md +243 -0
  73. package/agents/popover/AGENTS.md +190 -0
  74. package/agents/progress/AGENTS.md +273 -0
  75. package/agents/progress-tracker/AGENTS.md +305 -0
  76. package/agents/rating/AGENTS.md +165 -0
  77. package/agents/relative-time/AGENTS.md +103 -0
  78. package/agents/resizable/AGENTS.md +390 -0
  79. package/agents/scaled-preview/AGENTS.md +111 -0
  80. package/agents/scatter-chart/AGENTS.md +160 -0
  81. package/agents/scroll-area/AGENTS.md +271 -0
  82. package/agents/search-input/AGENTS.md +105 -0
  83. package/agents/segmented-control/AGENTS.md +153 -0
  84. package/agents/select/AGENTS.md +159 -0
  85. package/agents/selector-button/AGENTS.md +122 -0
  86. package/agents/sidebar/AGENTS.md +201 -0
  87. package/agents/skeleton/AGENTS.md +166 -0
  88. package/agents/slider/AGENTS.md +181 -0
  89. package/agents/social-login-button/AGENTS.md +156 -0
  90. package/agents/spark-chart/AGENTS.md +257 -0
  91. package/agents/sparkbar/AGENTS.md +92 -0
  92. package/agents/spinner/AGENTS.md +123 -0
  93. package/agents/split-view/AGENTS.md +290 -0
  94. package/agents/stat/AGENTS.md +138 -0
  95. package/agents/status-icon/AGENTS.md +243 -0
  96. package/agents/step-list/AGENTS.md +313 -0
  97. package/agents/table/AGENTS.md +286 -0
  98. package/agents/tabs/AGENTS.md +305 -0
  99. package/agents/tag-input/AGENTS.md +246 -0
  100. package/agents/time-picker/AGENTS.md +228 -0
  101. package/agents/timeline/AGENTS.md +1018 -0
  102. package/agents/toast/AGENTS.md +266 -0
  103. package/agents/toggle-group/AGENTS.md +216 -0
  104. package/agents/toolbar/AGENTS.md +277 -0
  105. package/agents/tooltip/AGENTS.md +154 -0
  106. package/agents/tracker/AGENTS.md +158 -0
  107. package/agents/tree-diagram/AGENTS.md +260 -0
  108. package/agents/tree-view/AGENTS.md +329 -0
  109. package/agents/typography/AGENTS.md +396 -0
  110. package/lib/components/Accordion/Accordion2.js +135 -0
  111. package/lib/components/ActionBar/ActionBar2.js +65 -0
  112. package/lib/components/Alert/Alert2.js +131 -0
  113. package/lib/components/AppShell/AppShell2.js +94 -0
  114. package/lib/components/AreaChart/AreaChart.js +59 -0
  115. package/lib/components/BarChart/BarChart2.js +243 -0
  116. package/lib/components/BarList/BarList2.js +172 -0
  117. package/lib/components/Breadcrumb/Breadcrumb2.js +87 -0
  118. package/lib/components/Calendar/Calendar2.js +309 -0
  119. package/lib/components/Calendar/DatePicker2.js +229 -0
  120. package/lib/components/Calendar/date.js +121 -0
  121. package/lib/components/Card/Card2.js +104 -0
  122. package/lib/components/CardFrame/CardFrame2.js +72 -0
  123. package/lib/components/Chart/ChartParts.js +150 -0
  124. package/lib/components/Chart/chart2.js +96 -0
  125. package/lib/components/Chart/useChartInteraction.js +94 -0
  126. package/lib/components/ChatBubble/ChatBubble2.js +174 -0
  127. package/lib/components/ChatBubble/formatChatTime.js +53 -0
  128. package/lib/components/ChatComposer/ChatComposer2.js +153 -0
  129. package/lib/components/CodeBlock/CodeBlock2.js +93 -0
  130. package/lib/components/CodeBlock/highlight.js +114 -0
  131. package/lib/components/ColorPicker/ColorPicker2.js +610 -0
  132. package/lib/components/ColorPicker/color.js +180 -0
  133. package/lib/components/ColorPicker/presets.js +75 -0
  134. package/lib/components/Combobox/Combobox2.js +229 -0
  135. package/lib/components/CommandMenu/CommandMenu.js +267 -0
  136. package/lib/components/Comment/Comment2.js +134 -0
  137. package/lib/components/ContextMenu/ContextMenu2.js +168 -0
  138. package/lib/components/DataGrid/DataGrid2.js +1996 -0
  139. package/lib/components/DataGrid/GridPopover.js +154 -0
  140. package/lib/components/DataGrid/anchor.js +50 -0
  141. package/lib/components/DataGrid/model.js +558 -0
  142. package/lib/components/DataGrid/panels.js +703 -0
  143. package/lib/components/DataGrid/typeMeta.js +76 -0
  144. package/lib/components/DataGrid/types.js +54 -0
  145. package/lib/components/DescriptionList/DescriptionList2.js +180 -0
  146. package/lib/components/Dialog/AlertDialog.js +118 -0
  147. package/lib/components/Dialog/Dialog2.js +109 -0
  148. package/lib/components/Dialog/modal.js +92 -0
  149. package/lib/components/Drawer/Drawer2.js +244 -0
  150. package/lib/components/DropdownMenu/DropdownMenu2.js +394 -0
  151. package/lib/components/DropdownMenu/menuCore.js +63 -0
  152. package/lib/components/Dropzone/Dropzone2.js +144 -0
  153. package/lib/components/EmptyState/EmptyState2.js +72 -0
  154. package/lib/components/FileChip/FileChip2.js +118 -0
  155. package/lib/components/FileUpload/FileUpload.js +258 -0
  156. package/lib/components/FilterChips/FilterChips2.js +101 -0
  157. package/lib/components/FunnelChart/FunnelChart2.js +283 -0
  158. package/lib/components/FunnelChart/funnel.js +69 -0
  159. package/lib/components/Highlight/Highlight2.js +100 -0
  160. package/lib/components/HoverCard/HoverCard.js +134 -0
  161. package/lib/components/InlineDiff/InlineDiff2.js +215 -0
  162. package/lib/components/InlineDiff/diff.js +126 -0
  163. package/lib/components/InlineDiff/useDiffReview.js +109 -0
  164. package/lib/components/Kanban/Kanban2.js +691 -0
  165. package/lib/components/Kanban/KanbanCard.js +159 -0
  166. package/lib/components/Kanban/move.js +69 -0
  167. package/lib/components/LineChart/LineChart2.js +342 -0
  168. package/lib/components/List/List2.js +133 -0
  169. package/lib/components/Listbox/Listbox2.js +163 -0
  170. package/lib/components/Marker/Marker2.js +82 -0
  171. package/lib/components/Menubar/Menubar2.js +223 -0
  172. package/lib/components/MultiSelect/MultiSelect2.js +204 -0
  173. package/lib/components/NavigationMenu/NavigationMenu2.js +481 -0
  174. package/lib/components/NoticeStack/NoticeStack2.js +178 -0
  175. package/lib/components/NumberStepper/NumberStepper2.js +129 -0
  176. package/lib/components/OtpInput/OtpInput2.js +122 -0
  177. package/lib/components/Pagination/Pagination2.js +210 -0
  178. package/lib/components/Pagination/paginationRange.js +53 -0
  179. package/lib/components/PhoneInput/PhoneInput.js +175 -0
  180. package/lib/components/PieChart/PieChart2.js +246 -0
  181. package/lib/components/PieChart/arc.js +66 -0
  182. package/lib/components/PieChart/useArcTween.js +94 -0
  183. package/lib/components/Popover/Popover2.js +112 -0
  184. package/lib/components/ProgressTracker/ProgressTracker2.js +226 -0
  185. package/lib/components/Rating/Rating2.js +186 -0
  186. package/lib/components/Resizable/Resizable2.js +236 -0
  187. package/lib/components/Resizable/layout.js +115 -0
  188. package/lib/components/ScaledPreview/ScaledPreview2.js +100 -0
  189. package/lib/components/ScatterChart/ScatterChart2.js +356 -0
  190. package/lib/components/ScatterChart/scatter.js +83 -0
  191. package/lib/components/ScrollArea/ScrollArea2.js +218 -0
  192. package/lib/components/Select/Select2.js +153 -0
  193. package/lib/components/Sidebar/Sidebar2.js +127 -0
  194. package/lib/components/Skeleton/Skeleton2.js +91 -0
  195. package/lib/components/Slider/Slider2.js +142 -0
  196. package/lib/components/SocialLoginButton/SocialLoginButton.js +85 -0
  197. package/lib/components/SparkChart/SparkChart2.js +217 -0
  198. package/lib/components/SparkChart/spark.js +76 -0
  199. package/lib/components/Sparkbar/Sparkbar2.js +111 -0
  200. package/lib/components/SplitView/SplitView2.js +95 -0
  201. package/lib/components/Stat/Stat2.js +164 -0
  202. package/lib/components/StepList/StepList2.js +131 -0
  203. package/lib/components/Table/Table2.js +104 -0
  204. package/lib/components/Tabs/Tabs2.js +131 -0
  205. package/lib/components/TagInput/TagInput2.js +360 -0
  206. package/lib/components/TimePicker/TimePicker2.js +388 -0
  207. package/lib/components/TimePicker/time.js +83 -0
  208. package/lib/components/Timeline/Timeline2.js +369 -0
  209. package/lib/components/Timeline/scale.js +83 -0
  210. package/lib/components/Toast/Toaster.js +212 -0
  211. package/lib/components/Toast/store.js +129 -0
  212. package/lib/components/ToggleGroup/ToggleGroup2.js +125 -0
  213. package/lib/components/Toolbar/Toolbar2.js +281 -0
  214. package/lib/components/Tracker/Tracker2.js +172 -0
  215. package/lib/components/TreeDiagram/TreeDiagram2.js +223 -0
  216. package/lib/components/TreeView/TreeView2.js +284 -0
  217. package/lib/hooks/timing.js +55 -0
  218. package/lib/hooks/useControllableState.js +49 -0
  219. package/lib/hooks/useCountdown.js +80 -0
  220. package/lib/hooks/useDigitInput.js +105 -0
  221. package/lib/hooks/useDismiss.js +71 -0
  222. package/lib/hooks/useElapsed.js +83 -0
  223. package/lib/hooks/useFloating.js +70 -0
  224. package/lib/hooks/useFocusTrap.js +61 -0
  225. package/lib/hooks/usePresence.js +60 -0
  226. package/lib/hooks/usePressToOpen.js +69 -0
  227. package/lib/hooks/useScrollLock.js +70 -0
  228. package/lib/hooks/useSelection.js +68 -0
  229. package/lib/index.js +178 -0
  230. package/lib/primitives/AspectRatio2.js +80 -0
  231. package/lib/primitives/BrandIcon.js +245 -0
  232. package/lib/primitives/ColorDot2.js +70 -0
  233. package/lib/primitives/CopyButton2.js +85 -0
  234. package/lib/primitives/CountBadge2.js +78 -0
  235. package/lib/primitives/Countdown2.js +65 -0
  236. package/lib/primitives/Delta2.js +67 -0
  237. package/lib/primitives/Elapsed.js +62 -0
  238. package/lib/primitives/FileIcon2.js +125 -0
  239. package/lib/primitives/Flag2.js +263 -0
  240. package/lib/primitives/IconStack2.js +85 -0
  241. package/lib/primitives/IconTile2.js +68 -0
  242. package/lib/primitives/Kbd2.js +88 -0
  243. package/lib/primitives/Layout2.js +118 -0
  244. package/lib/primitives/Link2.js +53 -0
  245. package/lib/primitives/MaskedText2.js +120 -0
  246. package/lib/primitives/Progress2.js +137 -0
  247. package/lib/primitives/RelativeTime.js +84 -0
  248. package/lib/primitives/SearchInput2.js +84 -0
  249. package/lib/primitives/SelectorButton2.js +97 -0
  250. package/lib/primitives/Spinner2.js +98 -0
  251. package/lib/primitives/StatusIcon2.js +126 -0
  252. package/lib/primitives/Swatch2.js +79 -0
  253. package/lib/primitives/Tooltip2.js +132 -0
  254. package/lib/primitives/Typography2.js +97 -0
  255. package/lib/primitives/formatCountdown.js +51 -0
  256. package/lib/primitives/formatElapsed.js +66 -0
  257. package/lib/primitives/formatRelativeTime.js +64 -0
  258. package/lib/primitives/hotkey.js +94 -0
  259. package/lib/primitives/index.js +352 -0
  260. package/lib/primitives/maskValue.js +65 -0
  261. package/lib/style.css +2 -0
  262. package/lib/types/components/Accordion/Accordion.d.ts +57 -0
  263. package/lib/types/components/ActionBar/ActionBar.d.ts +24 -0
  264. package/lib/types/components/Alert/Alert.d.ts +36 -0
  265. package/lib/types/components/AppShell/AppShell.d.ts +38 -0
  266. package/lib/types/components/AreaChart/AreaChart.d.ts +17 -0
  267. package/lib/types/components/BarChart/BarChart.d.ts +57 -0
  268. package/lib/types/components/BarList/BarList.d.ts +56 -0
  269. package/lib/types/components/Breadcrumb/Breadcrumb.d.ts +15 -0
  270. package/lib/types/components/Calendar/Calendar.d.ts +34 -0
  271. package/lib/types/components/Calendar/DatePicker.d.ts +45 -0
  272. package/lib/types/components/Calendar/date.d.ts +32 -0
  273. package/lib/types/components/Card/Card.d.ts +64 -0
  274. package/lib/types/components/CardFrame/CardFrame.d.ts +15 -0
  275. package/lib/types/components/Chart/ChartParts.d.ts +38 -0
  276. package/lib/types/components/Chart/chart.d.ts +46 -0
  277. package/lib/types/components/Chart/useChartInteraction.d.ts +39 -0
  278. package/lib/types/components/ChatBubble/ChatBubble.d.ts +61 -0
  279. package/lib/types/components/ChatBubble/formatChatTime.d.ts +2 -0
  280. package/lib/types/components/ChatComposer/ChatComposer.d.ts +42 -0
  281. package/lib/types/components/CodeBlock/CodeBlock.d.ts +18 -0
  282. package/lib/types/components/CodeBlock/highlight.d.ts +10 -0
  283. package/lib/types/components/ColorPicker/ColorPicker.d.ts +61 -0
  284. package/lib/types/components/ColorPicker/color.d.ts +48 -0
  285. package/lib/types/components/ColorPicker/presets.d.ts +7 -0
  286. package/lib/types/components/Combobox/Combobox.d.ts +48 -0
  287. package/lib/types/components/CommandMenu/CommandMenu.d.ts +51 -0
  288. package/lib/types/components/Comment/Comment.d.ts +45 -0
  289. package/lib/types/components/ContextMenu/ContextMenu.d.ts +40 -0
  290. package/lib/types/components/DataGrid/DataGrid.d.ts +43 -0
  291. package/lib/types/components/DataGrid/GridPopover.d.ts +43 -0
  292. package/lib/types/components/DataGrid/anchor.d.ts +5 -0
  293. package/lib/types/components/DataGrid/model.d.ts +61 -0
  294. package/lib/types/components/DataGrid/panels.d.ts +63 -0
  295. package/lib/types/components/DataGrid/typeMeta.d.ts +6 -0
  296. package/lib/types/components/DataGrid/types.d.ts +77 -0
  297. package/lib/types/components/DescriptionList/DescriptionList.d.ts +77 -0
  298. package/lib/types/components/Dialog/AlertDialog.d.ts +26 -0
  299. package/lib/types/components/Dialog/Dialog.d.ts +42 -0
  300. package/lib/types/components/Dialog/modal.d.ts +38 -0
  301. package/lib/types/components/Drawer/Drawer.d.ts +62 -0
  302. package/lib/types/components/DropdownMenu/DropdownMenu.d.ts +97 -0
  303. package/lib/types/components/DropdownMenu/menuCore.d.ts +23 -0
  304. package/lib/types/components/Dropzone/Dropzone.d.ts +30 -0
  305. package/lib/types/components/EmptyState/EmptyState.d.ts +26 -0
  306. package/lib/types/components/FileChip/FileChip.d.ts +32 -0
  307. package/lib/types/components/FileUpload/FileUpload.d.ts +52 -0
  308. package/lib/types/components/FilterChips/FilterChips.d.ts +37 -0
  309. package/lib/types/components/FunnelChart/FunnelChart.d.ts +38 -0
  310. package/lib/types/components/FunnelChart/funnel.d.ts +25 -0
  311. package/lib/types/components/Highlight/Highlight.d.ts +35 -0
  312. package/lib/types/components/HoverCard/HoverCard.d.ts +47 -0
  313. package/lib/types/components/InlineDiff/InlineDiff.d.ts +36 -0
  314. package/lib/types/components/InlineDiff/diff.d.ts +42 -0
  315. package/lib/types/components/InlineDiff/useDiffReview.d.ts +57 -0
  316. package/lib/types/components/Kanban/Kanban.d.ts +64 -0
  317. package/lib/types/components/Kanban/KanbanCard.d.ts +35 -0
  318. package/lib/types/components/Kanban/move.d.ts +25 -0
  319. package/lib/types/components/LineChart/LineChart.d.ts +85 -0
  320. package/lib/types/components/List/List.d.ts +62 -0
  321. package/lib/types/components/Listbox/Listbox.d.ts +60 -0
  322. package/lib/types/components/Marker/Marker.d.ts +28 -0
  323. package/lib/types/components/Menubar/Menubar.d.ts +50 -0
  324. package/lib/types/components/MultiSelect/MultiSelect.d.ts +38 -0
  325. package/lib/types/components/NavigationMenu/NavigationMenu.d.ts +101 -0
  326. package/lib/types/components/NoticeStack/NoticeStack.d.ts +41 -0
  327. package/lib/types/components/NumberStepper/NumberStepper.d.ts +32 -0
  328. package/lib/types/components/OtpInput/OtpInput.d.ts +31 -0
  329. package/lib/types/components/Pagination/Pagination.d.ts +54 -0
  330. package/lib/types/components/Pagination/paginationRange.d.ts +7 -0
  331. package/lib/types/components/PhoneInput/PhoneInput.d.ts +47 -0
  332. package/lib/types/components/PieChart/PieChart.d.ts +67 -0
  333. package/lib/types/components/PieChart/arc.d.ts +26 -0
  334. package/lib/types/components/PieChart/useArcTween.d.ts +15 -0
  335. package/lib/types/components/Popover/Popover.d.ts +28 -0
  336. package/lib/types/components/ProgressTracker/ProgressTracker.d.ts +64 -0
  337. package/lib/types/components/Rating/Rating.d.ts +42 -0
  338. package/lib/types/components/Resizable/Resizable.d.ts +50 -0
  339. package/lib/types/components/Resizable/layout.d.ts +31 -0
  340. package/lib/types/components/ScaledPreview/ScaledPreview.d.ts +38 -0
  341. package/lib/types/components/ScatterChart/ScatterChart.d.ts +81 -0
  342. package/lib/types/components/ScatterChart/scatter.d.ts +14 -0
  343. package/lib/types/components/ScrollArea/ScrollArea.d.ts +34 -0
  344. package/lib/types/components/Select/Select.d.ts +39 -0
  345. package/lib/types/components/Sidebar/Sidebar.d.ts +39 -0
  346. package/lib/types/components/Skeleton/Skeleton.d.ts +47 -0
  347. package/lib/types/components/Slider/Slider.d.ts +36 -0
  348. package/lib/types/components/SocialLoginButton/SocialLoginButton.d.ts +10 -0
  349. package/lib/types/components/SparkChart/SparkChart.d.ts +55 -0
  350. package/lib/types/components/SparkChart/spark.d.ts +16 -0
  351. package/lib/types/components/Sparkbar/Sparkbar.d.ts +39 -0
  352. package/lib/types/components/SplitView/SplitView.d.ts +31 -0
  353. package/lib/types/components/Stat/Stat.d.ts +58 -0
  354. package/lib/types/components/StepList/StepList.d.ts +61 -0
  355. package/lib/types/components/Table/Table.d.ts +39 -0
  356. package/lib/types/components/Tabs/Tabs.d.ts +47 -0
  357. package/lib/types/components/TagInput/TagInput.d.ts +46 -0
  358. package/lib/types/components/TimePicker/TimePicker.d.ts +43 -0
  359. package/lib/types/components/TimePicker/time.d.ts +15 -0
  360. package/lib/types/components/Timeline/Timeline.d.ts +154 -0
  361. package/lib/types/components/Timeline/scale.d.ts +22 -0
  362. package/lib/types/components/Toast/Toaster.d.ts +19 -0
  363. package/lib/types/components/Toast/index.d.ts +4 -0
  364. package/lib/types/components/Toast/store.d.ts +75 -0
  365. package/lib/types/components/ToggleGroup/ToggleGroup.d.ts +28 -0
  366. package/lib/types/components/Toolbar/Toolbar.d.ts +70 -0
  367. package/lib/types/components/Tracker/Tracker.d.ts +43 -0
  368. package/lib/types/components/TreeDiagram/TreeDiagram.d.ts +68 -0
  369. package/lib/types/components/TreeView/TreeView.d.ts +107 -0
  370. package/lib/types/components/index.d.ts +188 -0
  371. package/lib/types/hooks/index.d.ts +17 -0
  372. package/lib/types/hooks/timing.d.ts +29 -0
  373. package/lib/types/hooks/useControllableState.d.ts +5 -0
  374. package/lib/types/hooks/useCountdown.d.ts +19 -0
  375. package/lib/types/hooks/useDigitInput.d.ts +24 -0
  376. package/lib/types/hooks/useDismiss.d.ts +3 -0
  377. package/lib/types/hooks/useElapsed.d.ts +28 -0
  378. package/lib/types/hooks/useFloating.d.ts +21 -0
  379. package/lib/types/hooks/useFocusTrap.d.ts +7 -0
  380. package/lib/types/hooks/usePresence.d.ts +8 -0
  381. package/lib/types/hooks/usePressToOpen.d.ts +20 -0
  382. package/lib/types/hooks/useScrollLock.d.ts +2 -0
  383. package/lib/types/hooks/useSelection.d.ts +29 -0
  384. package/lib/types/index.d.ts +5 -0
  385. package/lib/types/primitives/AspectRatio.d.ts +14 -0
  386. package/lib/types/primitives/BrandIcon.d.ts +12 -0
  387. package/lib/types/primitives/ColorDot.d.ts +20 -0
  388. package/lib/types/primitives/CopyButton.d.ts +12 -0
  389. package/lib/types/primitives/CountBadge.d.ts +28 -0
  390. package/lib/types/primitives/Countdown.d.ts +21 -0
  391. package/lib/types/primitives/Delta.d.ts +33 -0
  392. package/lib/types/primitives/Elapsed.d.ts +23 -0
  393. package/lib/types/primitives/FileIcon.d.ts +17 -0
  394. package/lib/types/primitives/Flag.d.ts +15 -0
  395. package/lib/types/primitives/IconStack.d.ts +27 -0
  396. package/lib/types/primitives/IconTile.d.ts +24 -0
  397. package/lib/types/primitives/Kbd.d.ts +19 -0
  398. package/lib/types/primitives/Layout.d.ts +64 -0
  399. package/lib/types/primitives/Link.d.ts +12 -0
  400. package/lib/types/primitives/MaskedText.d.ts +28 -0
  401. package/lib/types/primitives/Progress.d.ts +52 -0
  402. package/lib/types/primitives/RelativeTime.d.ts +22 -0
  403. package/lib/types/primitives/SearchInput.d.ts +8 -0
  404. package/lib/types/primitives/SelectorButton.d.ts +23 -0
  405. package/lib/types/primitives/Spinner.d.ts +15 -0
  406. package/lib/types/primitives/StatusIcon.d.ts +40 -0
  407. package/lib/types/primitives/Swatch.d.ts +11 -0
  408. package/lib/types/primitives/Tooltip.d.ts +17 -0
  409. package/lib/types/primitives/Typography.d.ts +48 -0
  410. package/lib/types/primitives/formatCountdown.d.ts +2 -0
  411. package/lib/types/primitives/formatElapsed.d.ts +8 -0
  412. package/lib/types/primitives/formatRelativeTime.d.ts +16 -0
  413. package/lib/types/primitives/hotkey.d.ts +10 -0
  414. package/lib/types/primitives/index.d.ts +188 -0
  415. package/lib/types/primitives/maskValue.d.ts +24 -0
  416. package/package.json +55 -4
@@ -0,0 +1,166 @@
1
+ # Skeleton
2
+
3
+ > 진행 표시 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 내용이 들어올 자리를 미리 보여 주는 회색 자리 표시. 실제 레이아웃과 같은 크기로 그려 두면 내용이 들어올 때 화면이 덜컹거리지 않아요. SkeletonGroup으로 감싸면 로딩이 끝날 때 실제 내용으로 부드럽게 바뀌어요.
6
+
7
+ ```tsx
8
+ import { Skeleton, SkeletonText, SkeletonCircle, SkeletonGroup } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## API
12
+
13
+ ### Skeleton
14
+
15
+ | prop | 타입 | 기본값 | 설명 |
16
+ | --- | --- | --- | --- |
17
+ | `width` | `number \| string` | `'100%'` | 너비. 숫자는 px. |
18
+ | `height` | `number \| string` | `16` | 높이. 숫자는 px. |
19
+ | `radius` | `'none' \| 'sm' \| 'md' \| 'lg' \| 'full' \| number` | `'sm'` | 모서리(0 / 6 / 10 / 16px / 원형). |
20
+ | `animation` | `'shimmer' \| 'pulse' \| 'none'` | `'shimmer'` | 움직임. shimmer는 빛이 지나가고, pulse는 깜빡여요. |
21
+ | `className / style` | `string / CSSProperties` | | 블록에 적용돼요. |
22
+
23
+ ### SkeletonText
24
+
25
+ | prop | 타입 | 기본값 | 설명 |
26
+ | --- | --- | --- | --- |
27
+ | `lines` | `number` | `3` | 줄 수. |
28
+ | `lastLineWidth` | `string` | `'62%'` | 마지막 줄 너비(2줄 이상일 때). 문단처럼 보이게 해요. |
29
+ | `variant` | `TextVariant` | `'body-md'` | 맞출 글자 역할. 줄 높이가 실제 Text와 같아져요. |
30
+ | `animation` | `'shimmer' \| 'pulse' \| 'none'` | `'shimmer'` | 움직임. shimmer는 빛이 지나가고, pulse는 깜빡여요. |
31
+ | `className` | `string` | | 루트에 붙일 클래스. |
32
+
33
+ ### SkeletonCircle
34
+
35
+ | prop | 타입 | 기본값 | 설명 |
36
+ | --- | --- | --- | --- |
37
+ | `size` | `number` | `36` | 지름(px). |
38
+ | `animation` | `'shimmer' \| 'pulse' \| 'none'` | `'shimmer'` | 움직임. shimmer는 빛이 지나가고, pulse는 깜빡여요. |
39
+
40
+ ### SkeletonGroup
41
+
42
+ | prop | 타입 | 기본값 | 설명 |
43
+ | --- | --- | --- | --- |
44
+ | `loading` (필수) | `boolean` | | true면 fallback, false면 children을 보여 줘요. |
45
+ | `fallback` (필수) | `ReactNode` | | 로딩 중에 보여 줄 스켈레톤. |
46
+ | `children` (필수) | `ReactNode` | | 실제 내용. |
47
+ | `label` | `string` | `'불러오는 중'` | 로딩 중 스크린 리더가 읽는 이름. |
48
+ | `className` | `string` | | 루트에 붙일 클래스. |
49
+
50
+ ## 예제
51
+
52
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
53
+
54
+ ### 기본 모양
55
+
56
+ Skeleton은 크기와 모서리를 정하는 블록, SkeletonCircle은 아바타 자리, SkeletonText는 글자 역할(variant)의 줄 높이에 맞춘 문단이에요.
57
+
58
+ ```tsx
59
+ import { Skeleton, SkeletonCircle, SkeletonText } from '@iamfiro/design'
60
+
61
+ export default function Example() {
62
+ return (
63
+ <div style={{ display: 'grid', gap: 20, width: 360 }}>
64
+ <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
65
+ <SkeletonCircle size={40} />
66
+ <div style={{ display: 'grid', gap: 8, flex: 1 }}>
67
+ <Skeleton width="40%" height={14} />
68
+ <Skeleton width="65%" height={12} />
69
+ </div>
70
+ </div>
71
+ <Skeleton height={180} radius="lg" />
72
+ <div style={{ display: 'grid', gap: 6 }}>
73
+ <div style={{ width: '70%' }}>
74
+ <SkeletonText variant="heading-sm" lines={1} />
75
+ </div>
76
+ <SkeletonText lines={3} lastLineWidth="45%" />
77
+ </div>
78
+ </div>
79
+ )
80
+ }
81
+ ```
82
+
83
+ ### 애니메이션
84
+
85
+ 여러 줄이면 줄마다 조금씩 늦게 시작해서 물결처럼 보여요.
86
+
87
+ ```tsx
88
+ import { Text, SkeletonCircle, SkeletonText, type SkeletonAnimation } from '@iamfiro/design'
89
+
90
+ const ANIMATIONS: Array<[SkeletonAnimation, string]> = [
91
+ ['shimmer', '빛이 지나가요 (기본)'],
92
+ ['pulse', '천천히 깜빡여요'],
93
+ ['none', '움직이지 않아요'],
94
+ ]
95
+
96
+ export default function Example() {
97
+ return (
98
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))', gap: 28, width: '100%', maxWidth: 640 }}>
99
+ {ANIMATIONS.map(([animation, label]) => (
100
+ <div key={animation} style={{ display: 'grid', gap: 12 }}>
101
+ <SkeletonCircle size={32} animation={animation} />
102
+ <SkeletonText lines={3} animation={animation} />
103
+ <Text variant="caption" tone="tertiary">
104
+ {animation} · {label}
105
+ </Text>
106
+ </div>
107
+ ))}
108
+ </div>
109
+ )
110
+ }
111
+ ```
112
+
113
+ ### 실제 내용으로 바꾸기
114
+
115
+ SkeletonGroup은 loading 동안 fallback을 보여 주고, 끝나면 children을 서서히 나타내요. 로딩 중에는 aria-busy가 붙어요.
116
+
117
+ ```tsx
118
+ import { useState } from 'react'
119
+ import { FolderKanban } from 'lucide-react'
120
+ import { AvatarGroup, Switch, Card, CardBody, CardFooter, CardHeader, Skeleton, SkeletonGroup, SkeletonText } from '@iamfiro/design'
121
+
122
+ function ProjectCardSkeleton() {
123
+ return (
124
+ <Card style={{ width: 360 }}>
125
+ <CardHeader
126
+ icon={<Skeleton width={40} height={40} radius="md" />}
127
+ title={
128
+ <div style={{ width: '55%' }}>
129
+ <SkeletonText variant="heading-sm" lines={1} />
130
+ </div>
131
+ }
132
+ description={
133
+ <div style={{ width: '80%' }}>
134
+ <SkeletonText variant="body-sm" lines={1} />
135
+ </div>
136
+ }
137
+ />
138
+ <CardBody>
139
+ <SkeletonText lines={2} />
140
+ </CardBody>
141
+ <CardFooter align="start">
142
+ <Skeleton width={84} height={24} radius="full" />
143
+ </CardFooter>
144
+ </Card>
145
+ )
146
+ }
147
+
148
+ export default function Example() {
149
+ const [loading, setLoading] = useState(true)
150
+
151
+ return (
152
+ <div style={{ display: 'grid', justifyItems: 'center', gap: 20 }}>
153
+ <Switch label="불러오는 중" checked={loading} onChange={(e) => setLoading(e.target.checked)} />
154
+ <SkeletonGroup loading={loading} fallback={<ProjectCardSkeleton />}>
155
+ <Card style={{ width: 360 }}>
156
+ <CardHeader icon={<FolderKanban />} title="웹사이트 리뉴얼" description="김민지 외 3명 · 2분 전 수정" />
157
+ <CardBody>새 랜딩 페이지 시안을 검토하고 있어요. 금요일까지 피드백을 남겨 주세요.</CardBody>
158
+ <CardFooter align="start">
159
+ <AvatarGroup names={['김민지', '이도현', '박서연', '최준호']} />
160
+ </CardFooter>
161
+ </Card>
162
+ </SkeletonGroup>
163
+ </div>
164
+ )
165
+ }
166
+ ```
@@ -0,0 +1,181 @@
1
+ # Slider
2
+
3
+ > 선택 컨트롤 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 끌어서 값을 고르는 슬라이더. 숫자 하나를 주면 단일 값, [시작, 끝]을 주면 범위가 돼요. 끄는 동안은 미리보기(onValueChange), 손을 놓을 때 확정(onValueCommit)하고, 끄는 중에 Esc를 누르면 원래 값으로 돌아가요.
6
+
7
+ ```tsx
8
+ import { Slider } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## API
12
+
13
+ ### Slider
14
+
15
+ | prop | 타입 | 기본값 | 설명 |
16
+ | --- | --- | --- | --- |
17
+ | `value` | `number \| [number, number]` | | 값(제어). 튜플이면 범위 슬라이더. |
18
+ | `defaultValue` | `number \| [number, number]` | `min` | 처음 값(비제어). 범위는 반드시 튜플로 주세요. |
19
+ | `onValueChange` | `(value) => void` | | 끄는 동안·키 입력마다 호출(미리보기). |
20
+ | `onValueCommit` | `(value) => void` | | 손을 놓을 때 / 키를 누를 때 한 번 호출(확정). Esc로 취소하면 호출되지 않아요. |
21
+ | `min` | `number` | `0` | 최솟값. |
22
+ | `max` | `number` | `100` | 최댓값. |
23
+ | `step` | `number` | `1` | 단위. 소수(0.1 등)도 돼요. |
24
+ | `minDistance` | `number` | `0` | 범위 전용. 두 손잡이 사이 최소 간격. |
25
+ | `marks` | `Array<number \| { value: number; label?: ReactNode }>` | | 트랙 아래 눈금. label이 있으면 글자도 표시. |
26
+ | `formatValue` | `(value: number) => string` | `String` | 말풍선과 스크린 리더(aria-valuetext)에 쓰는 표시 형식. |
27
+ | `showValue` | `'auto' \| 'always' \| 'never'` | `'auto'` | 값 말풍선: 조작할 때만 / 항상 / 안 보임. |
28
+ | `size` | `'sm' \| 'md'` | `'md'` | 손잡이 18 / 14px. |
29
+ | `disabled` | `boolean` | | 비활성. |
30
+ | `name` | `string` | | 폼 제출용 hidden input 이름. 범위는 name[0], name[1]. |
31
+ | `aria-label` | `string` | | 손잡이 이름. |
32
+ | `getThumbLabel` | `(index: number) => string` | | 범위에서 손잡이별 이름. 예: (i) => (i === 0 ? '최소 가격' : '최대 가격'). |
33
+
34
+ ## 예제
35
+
36
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
37
+
38
+ ### 기본
39
+
40
+ 트랙 어디를 눌러도 그 위치로 옮겨가요. 끄는 동안 위에 값 말풍선이 뜨고, formatValue로 단위를 붙여요. ←→ 한 칸, PageUp/PageDown 크게, Home/End 끝으로.
41
+
42
+ ```tsx
43
+ import { useState } from 'react'
44
+ import { Volume1, Volume2 } from 'lucide-react'
45
+ import { Slider } from '@iamfiro/design'
46
+
47
+ export default function Example() {
48
+ const [volume, setVolume] = useState(60)
49
+ return (
50
+ <div style={{ display: 'flex', alignItems: 'center', gap: 12, width: 340 }}>
51
+ <Volume1 size={18} color="var(--text-3)" />
52
+ <div style={{ flex: 1 }}>
53
+ <Slider value={volume} onValueChange={setVolume} formatValue={(v) => `${v}%`} aria-label="볼륨" />
54
+ </div>
55
+ <Volume2 size={18} color="var(--text-3)" />
56
+ </div>
57
+ )
58
+ }
59
+ ```
60
+
61
+ ### 범위
62
+
63
+ 눌린 위치에서 가까운 손잡이가 움직여요. minDistance로 두 손잡이 사이 최소 간격을, getThumbLabel로 손잡이별 이름을 정해요.
64
+
65
+ ```tsx
66
+ import { useState } from 'react'
67
+ import { Text, Slider } from '@iamfiro/design'
68
+
69
+ const won = (v: number) => (v >= 10000 ? `${(v / 10000).toLocaleString('ko-KR')}만원` : `${v.toLocaleString('ko-KR')}원`)
70
+
71
+ export default function Example() {
72
+ const [price, setPrice] = useState<[number, number]>([100000, 350000])
73
+ return (
74
+ <div style={{ display: 'grid', gap: 12, width: 360 }}>
75
+ <Text variant="label-md" numeric>
76
+ 가격 {won(price[0])} – {won(price[1])}
77
+ </Text>
78
+ <Slider
79
+ value={price}
80
+ onValueChange={setPrice}
81
+ min={0}
82
+ max={500000}
83
+ step={10000}
84
+ minDistance={50000}
85
+ formatValue={won}
86
+ getThumbLabel={(i) => (i === 0 ? '최소 가격' : '최대 가격')}
87
+ />
88
+ </div>
89
+ )
90
+ }
91
+ ```
92
+
93
+ ### 눈금
94
+
95
+ marks에 label을 넣으면 트랙 아래에 글자가 찍혀요. 숫자만 넣으면 눈금만 그려요. showValue로 말풍선을 항상 / 끄기 할 수 있어요.
96
+
97
+ ```tsx
98
+ import { useState } from 'react'
99
+ import { Slider } from '@iamfiro/design'
100
+
101
+ const QUALITY = ['낮음', '보통', '높음', '최고']
102
+
103
+ export default function Example() {
104
+ const [quality, setQuality] = useState(2)
105
+ return (
106
+ <div style={{ display: 'grid', gap: 32, width: 360 }}>
107
+ <Slider
108
+ value={quality}
109
+ onValueChange={setQuality}
110
+ min={0}
111
+ max={3}
112
+ marks={QUALITY.map((label, value) => ({ value, label }))}
113
+ formatValue={(v) => QUALITY[v]}
114
+ showValue="never"
115
+ aria-label="화질"
116
+ />
117
+ <Slider defaultValue={40} step={20} marks={[0, 20, 40, 60, 80, 100]} formatValue={(v) => `${v}%`} showValue="always" aria-label="투명도" />
118
+ </div>
119
+ )
120
+ }
121
+ ```
122
+
123
+ ### 미리보기와 확정
124
+
125
+ 저장이나 서버 요청은 onValueCommit에서 하세요. 끄는 중 Esc를 누르면 미리보기가 취소되고 아무것도 확정되지 않아요.
126
+
127
+ ```tsx
128
+ import { useState } from 'react'
129
+ import { Text, Slider } from '@iamfiro/design'
130
+
131
+ export default function Example() {
132
+ const [preview, setPreview] = useState(120)
133
+ const [saved, setSaved] = useState(120)
134
+ return (
135
+ <div style={{ display: 'grid', gap: 12, width: 360 }}>
136
+ <Slider
137
+ value={preview}
138
+ onValueChange={setPreview}
139
+ onValueCommit={setSaved}
140
+ min={30}
141
+ max={300}
142
+ step={10}
143
+ formatValue={(v) => `${v}분`}
144
+ aria-label="자동 잠금 시간"
145
+ />
146
+ <div style={{ display: 'flex', justifyContent: 'space-between' }}>
147
+ <Text variant="body-sm" tone="secondary" numeric>
148
+ 미리보기 {preview}분
149
+ </Text>
150
+ <Text variant="body-sm" weight="semibold" numeric>
151
+ 저장됨 {saved}분
152
+ </Text>
153
+ </div>
154
+ </div>
155
+ )
156
+ }
157
+ ```
158
+
159
+ ### 크기와 비활성
160
+
161
+ size sm / md, disabled.
162
+
163
+ ```tsx
164
+ import { Field, Slider } from '@iamfiro/design'
165
+
166
+ export default function Example() {
167
+ return (
168
+ <div style={{ display: 'grid', gap: 20, width: 340 }}>
169
+ <Field label="작게 (sm)">
170
+ <Slider size="sm" defaultValue={40} aria-label="밝기" />
171
+ </Field>
172
+ <Field label="작게 (sm) · 범위">
173
+ <Slider size="sm" defaultValue={[20, 70]} getThumbLabel={(i) => (i === 0 ? '최소 온도' : '최대 온도')} />
174
+ </Field>
175
+ <Field label="비활성">
176
+ <Slider defaultValue={30} disabled aria-label="비활성 슬라이더" />
177
+ </Field>
178
+ </div>
179
+ )
180
+ }
181
+ ```
@@ -0,0 +1,156 @@
1
+ # SocialLoginButton
2
+
3
+ > 버튼 & 링크 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ Google · Apple 계정으로 로그인하는 버튼. 각 브랜드 가이드대로 Google은 흰 바탕 + 옅은 윤곽 + 색 G 로고, Apple은 검정 바탕 + 흰 로고예요. 문구는 action으로 고르고, 나머지 props는 Button과 같아요.
6
+
7
+ ```tsx
8
+ import { SocialLoginButton } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## API
12
+
13
+ ### SocialLoginButton
14
+
15
+ variant · icon은 provider가 정해요. 나머지 props(size · block · loading · disabled · onClick…)는 Button에 그대로 전달돼요.
16
+
17
+ | prop | 타입 | 기본값 | 설명 |
18
+ | --- | --- | --- | --- |
19
+ | `provider` (필수) | `'google' \| 'apple'` | | 로그인 제공자. 색 · 로고 · 이름이 정해져요. |
20
+ | `action` | `'continue' \| 'signin' \| 'signup'` | `'continue'` | "Google로 계속하기" · "Google로 로그인" · "Google로 가입하기". |
21
+ | `children` | `ReactNode` | | 문구를 직접 바꿀 때. |
22
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | 높이 28 / 34 / 40px. 로고는 14 / 16 / 18px. |
23
+ | `iconOnly` | `boolean` | | 로고만 보이는 정사각형 버튼. aria-label은 문구로 붙어요. |
24
+ | `block` | `boolean` | | 너비 100%. |
25
+ | `loading` | `boolean` | | 로고 자리에 스피너, 클릭 막음. 인증 창으로 넘어가는 동안 써요. |
26
+
27
+ ## 예제
28
+
29
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
30
+
31
+ ### 기본
32
+
33
+ 로그인 화면에선 block으로 폭을 채워 위아래로 쌓아요. 순서는 보통 Google → Apple.
34
+
35
+ ```tsx
36
+ import { SocialLoginButton, Stack } from '@iamfiro/design'
37
+
38
+ export default function Example() {
39
+ return (
40
+ <Stack gap={2} style={{ width: 320 }}>
41
+ <SocialLoginButton provider="google" size="lg" block />
42
+ <SocialLoginButton provider="apple" size="lg" block />
43
+ </Stack>
44
+ )
45
+ }
46
+ ```
47
+
48
+ ### 문구
49
+
50
+ action='continue'(기본) · 'signin' · 'signup'. 로그인과 가입을 한 화면에서 받으면 continue를 써요.
51
+
52
+ ```tsx
53
+ import { SocialLoginButton, Inline, Stack } from '@iamfiro/design'
54
+
55
+ export default function Example() {
56
+ return (
57
+ <Stack gap={3}>
58
+ <Inline gap={2}>
59
+ <SocialLoginButton provider="google" action="continue" />
60
+ <SocialLoginButton provider="google" action="signin" />
61
+ <SocialLoginButton provider="google" action="signup" />
62
+ </Inline>
63
+ <Inline gap={2}>
64
+ <SocialLoginButton provider="apple" action="continue" />
65
+ <SocialLoginButton provider="apple" action="signin" />
66
+ <SocialLoginButton provider="apple" action="signup" />
67
+ </Inline>
68
+ </Stack>
69
+ )
70
+ }
71
+ ```
72
+
73
+ ### 크기 · 아이콘만
74
+
75
+ sm · md · lg는 Button과 같은 높이. iconOnly면 로고만 보이고 aria-label은 문구로 자동으로 붙어요.
76
+
77
+ ```tsx
78
+ import { SocialLoginButton, Inline, Stack } from '@iamfiro/design'
79
+
80
+ export default function Example() {
81
+ return (
82
+ <Stack gap={3}>
83
+ <Inline gap={2}>
84
+ <SocialLoginButton provider="google" size="sm" />
85
+ <SocialLoginButton provider="google" />
86
+ <SocialLoginButton provider="google" size="lg" />
87
+ </Inline>
88
+ <Inline gap={2}>
89
+ <SocialLoginButton provider="google" iconOnly />
90
+ <SocialLoginButton provider="apple" iconOnly />
91
+ <SocialLoginButton provider="google" size="lg" iconOnly />
92
+ <SocialLoginButton provider="apple" size="lg" iconOnly />
93
+ </Inline>
94
+ </Stack>
95
+ )
96
+ }
97
+ ```
98
+
99
+ ### 로그인 카드
100
+
101
+ Card 안에 소셜 버튼 → "또는" Separator → 이메일 입력. 누르면 loading으로 잠가 두 번 눌리지 않게 해요.
102
+
103
+ ```tsx
104
+ import { useState } from 'react'
105
+ import { Card, CardBody, CardHeader, SocialLoginButton, type SocialProvider, Button, Field, Input, Separator, Stack, Text } from '@iamfiro/design'
106
+
107
+ export default function Example() {
108
+ const [pending, setPending] = useState<SocialProvider | null>(null)
109
+
110
+ // 실제 앱에선 여기서 OAuth 창으로 넘어가요. 예제는 2초 뒤 풀어요.
111
+ const signIn = (provider: SocialProvider) => {
112
+ setPending(provider)
113
+ window.setTimeout(() => setPending(null), 2000)
114
+ }
115
+
116
+ return (
117
+ <Card style={{ width: 360 }}>
118
+ <CardHeader title="Lumen에 로그인" description="팀 워크스페이스로 계속하려면 로그인하세요." />
119
+ <CardBody>
120
+ <Stack gap={4}>
121
+ <Stack gap={2}>
122
+ <SocialLoginButton
123
+ provider="google"
124
+ size="lg"
125
+ block
126
+ loading={pending === 'google'}
127
+ disabled={pending !== null}
128
+ onClick={() => signIn('google')}
129
+ />
130
+ <SocialLoginButton
131
+ provider="apple"
132
+ size="lg"
133
+ block
134
+ loading={pending === 'apple'}
135
+ disabled={pending !== null}
136
+ onClick={() => signIn('apple')}
137
+ />
138
+ </Stack>
139
+ <Separator label="또는" />
140
+ <Stack gap={3}>
141
+ <Field label="이메일" htmlFor="login-email">
142
+ <Input id="login-email" type="email" placeholder="minji@lumen.co" />
143
+ </Field>
144
+ <Button variant="secondary" size="lg" block>
145
+ 이메일로 계속하기
146
+ </Button>
147
+ </Stack>
148
+ <Text variant="caption" tone="secondary">
149
+ 계속하면 서비스 약관과 개인정보 처리방침에 동의하게 돼요.
150
+ </Text>
151
+ </Stack>
152
+ </CardBody>
153
+ </Card>
154
+ )
155
+ }
156
+ ```