@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,82 @@
1
+ # BrandIcon
2
+
3
+ > 아이콘 & 아바타 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 연동 앱의 원래 색 로고. 앱 연결 줄, 연동 목록에서 써요. 버튼 안에 넣어도 버튼 아이콘 크기 규칙에 줄어들지 않고 size 그대로 보여요.
6
+
7
+ ```tsx
8
+ import { BrandIcon, BRAND_NAMES } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## API
12
+
13
+ ### BrandIcon
14
+
15
+ | prop | 타입 | 기본값 | 설명 |
16
+ | --- | --- | --- | --- |
17
+ | `name` (필수) | `'gmail' \| 'slack' \| 'clickup' \| 'figma' \| 'github' \| 'hubspot' \| 'notion' \| 'google-calendar' \| 'google' \| 'apple'` | | 앱. |
18
+ | `size` | `number` | `18` | 가로·세로(px). |
19
+ | `title` | `string` | | 접근성 이름. 없으면 장식으로 취급해요(옆에 글자가 있을 때). |
20
+ | `className` | `string` | | svg에 붙일 클래스. |
21
+
22
+ ## 예제
23
+
24
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
25
+
26
+ ### 로고 목록
27
+
28
+ 지금 들어 있는 로고 10개(Gmail, Slack, ClickUp, Figma, GitHub, HubSpot, Notion, Google Calendar, Google, Apple). Apple은 한 색 로고라 글자색을 따라요. 새 앱은 BrandIcon.tsx의 MARKS에 추가해요.
29
+
30
+ ```tsx
31
+ import { BRAND_NAMES, BrandIcon, Inline, Stack, Text } from '@iamfiro/design'
32
+
33
+ export default function Example() {
34
+ return (
35
+ <Inline gap={8}>
36
+ {BRAND_NAMES.map((name) => (
37
+ <Stack key={name} gap={2} align="center">
38
+ <BrandIcon name={name} size={28} title={name} />
39
+ <Text variant="caption" tone="secondary">
40
+ {name}
41
+ </Text>
42
+ </Stack>
43
+ ))}
44
+ </Inline>
45
+ )
46
+ }
47
+ ```
48
+
49
+ ### 앱 연결
50
+
51
+ 로고 몇 개 + 글자를 ghost 버튼의 icon으로. ChatComposer footer에 쓰는 모양이에요.
52
+
53
+ ```tsx
54
+ import { BrandIcon, Button, Inline } from '@iamfiro/design'
55
+
56
+ export default function Example() {
57
+ return (
58
+ <Inline gap={3}>
59
+ <Button
60
+ variant="ghost"
61
+ size="sm"
62
+ icon={
63
+ <Inline gap={1} wrap={false}>
64
+ <BrandIcon name="gmail" size={16} />
65
+ <BrandIcon name="slack" size={16} />
66
+ <BrandIcon name="clickup" size={16} />
67
+ <BrandIcon name="notion" size={16} />
68
+ <BrandIcon name="google-calendar" size={16} />
69
+ <BrandIcon name="hubspot" size={16} />
70
+ </Inline>
71
+ }
72
+ >
73
+ 앱 연결
74
+ </Button>
75
+ <Button icon={<BrandIcon name="figma" size={16} />}>Figma에서 가져오기</Button>
76
+ <Button variant="primary" icon={<BrandIcon name="github" size={16} />}>
77
+ GitHub로 계속하기
78
+ </Button>
79
+ </Inline>
80
+ )
81
+ }
82
+ ```
@@ -0,0 +1,133 @@
1
+ # Breadcrumb
2
+
3
+ > 내비게이션 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 지금 페이지가 어디에 있는지 보여 주는 경로. 마지막 항목이 현재 페이지(aria-current="page")이고, 나머지는 위 단계로 돌아가는 링크예요. 길어지면 다음 줄로 자연스럽게 넘어가요.
6
+
7
+ ```tsx
8
+ import { Breadcrumb, type BreadcrumbItem } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## 디자인 규칙
12
+
13
+ - 사이드바 머리 = `SelectorButton`(앱 이름) + 검색 · 접기 아이콘 버튼. 접으면(`sidebarCollapsed`) 헤더 왼쪽에 여는 버튼이 나타난다. 본문 헤더 = 왼쪽 `Breadcrumb`, 오른쪽 작은 ghost 액션.
14
+
15
+ ## API
16
+
17
+ ### Breadcrumb
18
+
19
+ | prop | 타입 | 기본값 | 설명 |
20
+ | --- | --- | --- | --- |
21
+ | `items` (필수) | `BreadcrumbItem[]` | | 경로. 마지막 항목이 현재 페이지예요. |
22
+ | `separator` | `ReactNode` | `<ChevronRight />` | 항목 사이 구분 기호. |
23
+ | `className` | `string` | | 루트 <nav>에 붙일 클래스. |
24
+
25
+ ### BreadcrumbItem
26
+
27
+ | prop | 타입 | 기본값 | 설명 |
28
+ | --- | --- | --- | --- |
29
+ | `label` (필수) | `ReactNode` | | 표시 이름. |
30
+ | `href` | `string` | | 링크 주소. |
31
+ | `onClick` | `() => void` | | 클릭 처리(라우터 이동 등). 있으면 기본 링크 이동을 막아요. |
32
+
33
+ ## 예제
34
+
35
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
36
+
37
+ ### 기본
38
+
39
+ items 배열만 넘기면 돼요. 링크 항목에는 href나 onClick을 주세요(onClick이 있으면 기본 이동을 막아요).
40
+
41
+ ```tsx
42
+ import { Breadcrumb, toast } from '@iamfiro/design'
43
+
44
+ // 실제 앱에서는 href를 주거나, onClick에서 라우터로 이동해요.
45
+ const go = (label: string) => () => toast(`‘${label}’ 페이지로 이동`)
46
+
47
+ export default function Example() {
48
+ return (
49
+ <Breadcrumb
50
+ items={[
51
+ { label: '홈', onClick: go('홈') },
52
+ { label: '프로젝트', onClick: go('프로젝트') },
53
+ { label: '웹사이트 리뉴얼', onClick: go('웹사이트 리뉴얼') },
54
+ { label: '디자인 검토' },
55
+ ]}
56
+ />
57
+ )
58
+ }
59
+ ```
60
+
61
+ ### 폴더 탐색
62
+
63
+ 경로를 상태로 들고, 위 단계를 누르면 그 지점까지 잘라 내요.
64
+
65
+ ```tsx
66
+ import { useState } from 'react'
67
+ import { Folder } from 'lucide-react'
68
+ import { Button, Text, Breadcrumb } from '@iamfiro/design'
69
+
70
+ const FOLDERS: Record<string, string[]> = {
71
+ '내 드라이브': ['디자인', '마케팅'],
72
+ 디자인: ['2026', '아카이브'],
73
+ '2026': ['10월 리뷰', '11월 리뷰'],
74
+ 마케팅: ['연말 캠페인'],
75
+ }
76
+
77
+ export default function Example() {
78
+ const [path, setPath] = useState(['내 드라이브', '디자인'])
79
+ const children = FOLDERS[path[path.length - 1]] ?? []
80
+
81
+ return (
82
+ <div style={{ display: 'grid', gap: 16, width: 360 }}>
83
+ <Breadcrumb items={path.map((label, i) => ({ label, onClick: () => setPath(path.slice(0, i + 1)) }))} />
84
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
85
+ {children.map((name) => (
86
+ <Button key={name} size="sm" icon={<Folder />} onClick={() => setPath([...path, name])}>
87
+ {name}
88
+ </Button>
89
+ ))}
90
+ {!children.length && (
91
+ <Text variant="body-sm" tone="tertiary">
92
+ 하위 폴더가 없어요.
93
+ </Text>
94
+ )}
95
+ </div>
96
+ </div>
97
+ )
98
+ }
99
+ ```
100
+
101
+ ### 구분자 · 아이콘
102
+
103
+ separator로 구분 기호를 바꾸고, label에 아이콘을 함께 넣을 수 있어요. href와 onClick이 모두 없는 항목은 링크가 아닌 글자로 보여요.
104
+
105
+ ```tsx
106
+ import { House, Slash } from 'lucide-react'
107
+ import { Breadcrumb, toast } from '@iamfiro/design'
108
+
109
+ const go = (label: string) => () => toast(`‘${label}’ 페이지로 이동`)
110
+
111
+ export default function Example() {
112
+ return (
113
+ <div style={{ display: 'grid', gap: 20 }}>
114
+ <Breadcrumb
115
+ separator={<Slash />}
116
+ items={[
117
+ {
118
+ label: (
119
+ <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>
120
+ <House size={14} />홈
121
+ </span>
122
+ ),
123
+ onClick: go('홈'),
124
+ },
125
+ { label: '설정', onClick: go('설정') },
126
+ { label: '알림' },
127
+ ]}
128
+ />
129
+ <Breadcrumb separator="·" items={[{ label: '도움말', onClick: go('도움말') }, { label: '결제' }, { label: '환불 정책' }]} />
130
+ </div>
131
+ )
132
+ }
133
+ ```
@@ -0,0 +1,195 @@
1
+ # Button
2
+
3
+ > 버튼 & 링크 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 동작을 실행하는 기본 버튼. 화면에서 가장 중요한 동작 하나에 primary를, 나머지는 secondary · ghost를 써요. 클릭은 누른 버튼을 놓는 순간 확정되고, 누른 채 밖으로 나가면 취소돼요.
6
+
7
+ ```tsx
8
+ import { Button } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## 디자인 규칙
12
+
13
+ - 단축키가 있는 버튼은 `Button shortcut`(힌트만) + `hotkey`(듣기: 입력 중 글자 키 · IME 조합 · 비활성은 무시). 여러 개는 `ActionBar`(흰 바탕 + 위 그림자, `pending`이면 fieldset으로 한꺼번에 잠금).
14
+ - 글 속 변경 내용(추적된 변경)은 `InlineDiff`: 삭제 = 빨간 취소선 + `--danger-soft`, 추가 = 초록 + `--success-soft`, 진짜 `<del>` · `<ins>` + 화면 읽기 "삭제" · "추가". 검토(수락 · 거절)는 `reviewable`, 툴바(남은 개수 `CountBadge variant="soft" tone="success"`, 이전 · 다음 `Button iconOnly`, 모두 거절 · 모두 수락)는 `useDiffReview` 상태를 함께 써서 조립한다. 검토 카드는 `CardFrame header`(회색 판 위 아이콘 + 문서 이름) 안에 `Card raised` — 회색 Box를 카드 안 제목줄로 넣으면 입력창처럼 보인다. 본문 줄 간격은 넉넉하게(위아래 줄의 색 배경이 닿지 않게). 모두 수락 · 거절은 확인 대신 `toast.undo`. 두 문자열 비교는 `diffWords`, 결과 글은 `applyDiffDecisions`.
15
+
16
+ ## API
17
+
18
+ ### Button
19
+
20
+ 나머지 props는 <button>에 그대로 전달돼요. type 기본값은 "button"이에요.
21
+
22
+ | prop | 타입 | 기본값 | 설명 |
23
+ | --- | --- | --- | --- |
24
+ | `variant` | `'primary' \| 'accent' \| 'secondary' \| 'outline' \| 'ghost' \| 'danger'` | `'secondary'` | 버튼 스타일. |
25
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | 높이 28 / 34 / 40px. |
26
+ | `icon` | `ReactNode` | | 글자 앞 아이콘. |
27
+ | `iconRight` | `ReactNode` | | 글자 뒤 아이콘. |
28
+ | `iconOnly` | `boolean` | | icon만 보이는 정사각형 버튼. children은 그리지 않으니 aria-label을 넣어 주세요. |
29
+ | `loading` | `boolean` | | icon 자리에 스피너를 보이고 클릭을 막아요(aria-busy). |
30
+ | `disabled` | `boolean` | | 비활성. |
31
+ | `block` | `boolean` | | 너비 100%. |
32
+ | `shortcut` | `string \| string[]` | | 글자 뒤의 단축키 힌트(Kbd 키 이름: "A", ["mod", "enter"]). 버튼 색에 맞춘 납작한 키캡으로 보여요. 보여 주기만 하고, 듣는 건 hotkey. |
33
+ | `hotkey` | `boolean` | | shortcut을 페이지 어디서 눌러도 버튼을 눌러요(잠깐 눌린 모양 + click). 입력 칸에서 글자 키 · IME 조합 중 · 길게 누른 반복 입력은 무시하고(⌘/Ctrl/Alt 조합은 동작), disabled · loading · 비활성 fieldset(ActionBar pending) · inert 안이면 무시해요. 한글 자판이어도 같은 자리의 키로 동작해요. |
34
+
35
+ ## 예제
36
+
37
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
38
+
39
+ ### 종류
40
+
41
+ primary는 검정 단색, accent는 파랑, secondary는 흰 바탕 + 옅은 윤곽, ghost는 글자만, danger는 연한 빨강이에요.
42
+
43
+ ```tsx
44
+ import { Trash2 } from 'lucide-react'
45
+ import { Button } from '@iamfiro/design'
46
+
47
+ export default function Example() {
48
+ return (
49
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
50
+ <Button variant="primary">변경사항 저장</Button>
51
+ <Button variant="accent">업그레이드</Button>
52
+ <Button variant="secondary">취소</Button>
53
+ <Button variant="outline">내보내기</Button>
54
+ <Button variant="ghost">건너뛰기</Button>
55
+ <Button variant="danger" icon={<Trash2 />}>
56
+ 삭제
57
+ </Button>
58
+ </div>
59
+ )
60
+ }
61
+ ```
62
+
63
+ ### 크기
64
+
65
+ sm · md · lg는 높이 28 / 34 / 40px. iconOnly 버튼은 높이와 같은 정사각형이 돼요.
66
+
67
+ ```tsx
68
+ import { Plus } from 'lucide-react'
69
+ import { Button } from '@iamfiro/design'
70
+
71
+ export default function Example() {
72
+ return (
73
+ <div style={{ display: 'grid', gap: 12, justifyItems: 'start' }}>
74
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
75
+ <Button size="sm" variant="primary">
76
+ 작게
77
+ </Button>
78
+ <Button variant="primary">기본</Button>
79
+ <Button size="lg" variant="primary">
80
+ 크게
81
+ </Button>
82
+ </div>
83
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
84
+ <Button size="sm" iconOnly icon={<Plus />} aria-label="추가" />
85
+ <Button iconOnly icon={<Plus />} aria-label="추가" />
86
+ <Button size="lg" iconOnly icon={<Plus />} aria-label="추가" />
87
+ </div>
88
+ </div>
89
+ )
90
+ }
91
+ ```
92
+
93
+ ### 아이콘
94
+
95
+ icon은 글자 앞, iconRight는 글자 뒤에 붙어요. 아이콘만 있는 버튼은 aria-label을 꼭 넣고 Tooltip으로 설명을 보여 주세요.
96
+
97
+ ```tsx
98
+ import { ArrowRight, Download, MoreHorizontal, Pencil, Share2 } from 'lucide-react'
99
+ import { Button, Tooltip } from '@iamfiro/design'
100
+
101
+ export default function Example() {
102
+ return (
103
+ <div style={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 8 }}>
104
+ <Button icon={<Download />}>다운로드</Button>
105
+ <Button variant="primary" iconRight={<ArrowRight />}>
106
+ 계속하기
107
+ </Button>
108
+ <Tooltip content="수정">
109
+ <Button variant="ghost" iconOnly icon={<Pencil />} aria-label="수정" />
110
+ </Tooltip>
111
+ <Tooltip content="공유">
112
+ <Button variant="ghost" iconOnly icon={<Share2 />} aria-label="공유" />
113
+ </Tooltip>
114
+ <Tooltip content="더보기">
115
+ <Button variant="ghost" iconOnly icon={<MoreHorizontal />} aria-label="더보기" />
116
+ </Tooltip>
117
+ </div>
118
+ )
119
+ }
120
+ ```
121
+
122
+ ### 로딩 · 비활성 · 꽉 채우기
123
+
124
+ loading이면 아이콘이 스피너로 바뀌고 클릭이 막혀요. block은 부모 너비를 채워요.
125
+
126
+ ```tsx
127
+ import { useState } from 'react'
128
+ import { Upload } from 'lucide-react'
129
+ import { Button } from '@iamfiro/design'
130
+
131
+ export default function Example() {
132
+ const [uploading, setUploading] = useState(false)
133
+
134
+ const upload = () => {
135
+ setUploading(true)
136
+ setTimeout(() => setUploading(false), 2000)
137
+ }
138
+
139
+ return (
140
+ <div style={{ display: 'grid', gap: 12, width: 320 }}>
141
+ <div style={{ display: 'flex', gap: 8 }}>
142
+ <Button variant="primary" icon={<Upload />} loading={uploading} onClick={upload}>
143
+ {uploading ? '업로드 중' : '파일 업로드'}
144
+ </Button>
145
+ <Button disabled>보관하기</Button>
146
+ </div>
147
+ <Button variant="primary" size="lg" block>
148
+ 가입하기
149
+ </Button>
150
+ </div>
151
+ )
152
+ }
153
+ ```
154
+
155
+ ### 단축키 (shortcut · hotkey)
156
+
157
+ shortcut은 글자 뒤에 키캡 힌트를(글자와 6px), hotkey는 그 키로 버튼을 눌러요. 입력 칸 안에선 글자 키를 무시하고 ⌘/Ctrl 조합만 받아요. 비활성 버튼은 단축키도 무시해요. 여러 개를 모아 두는 바는 ActionBar.
158
+
159
+ ```tsx
160
+ import { useState } from 'react'
161
+ import { Check, Send } from 'lucide-react'
162
+ import { Button, Inline, Input, Stack, Text } from '@iamfiro/design'
163
+
164
+ export default function Example() {
165
+ const [log, setLog] = useState('A · S를 누르거나 버튼을 눌러 보세요.')
166
+ return (
167
+ <Stack gap={4} align="start">
168
+ <Inline gap={2}>
169
+ <Button variant="primary" icon={<Check />} shortcut="A" hotkey onClick={() => setLog('승인했어요 (A)')}>
170
+ 승인
171
+ </Button>
172
+ <Button shortcut="S" hotkey onClick={() => setLog('건너뛰었어요 (S)')}>
173
+ 건너뛰기
174
+ </Button>
175
+ <Button variant="ghost" shortcut="D" disabled>
176
+ 보류
177
+ </Button>
178
+ <Button variant="danger" shortcut={['shift', 'R']} hotkey onClick={() => setLog('거절했어요 (Shift + R)')}>
179
+ 거절
180
+ </Button>
181
+ </Inline>
182
+ {/* 입력 칸 안에서는 글자 단축키가 무시되고, ⌘/Ctrl 조합은 그대로 동작해요. */}
183
+ <Inline gap={2} wrap={false}>
184
+ <Input placeholder="여기서 A를 눌러도 승인되지 않아요" wrapperStyle={{ width: 280 }} />
185
+ <Button variant="accent" size="sm" icon={<Send />} shortcut={['mod', 'enter']} hotkey onClick={() => setLog('보냈어요 (⌘/Ctrl + Enter)')}>
186
+ 보내기
187
+ </Button>
188
+ </Inline>
189
+ <Text variant="body-sm" tone="secondary" aria-live="polite">
190
+ {log}
191
+ </Text>
192
+ </Stack>
193
+ )
194
+ }
195
+ ```
@@ -0,0 +1,141 @@
1
+ # Card
2
+
3
+ > 컨테이너 · `@iamfiro/design` · 직접 만들지 말고 이 컴포넌트를 쓴다.
4
+
5
+ 관련 내용을 한 덩어리로 묶는 흰 표면. 테두리 대신 아주 옅은 윤곽과 그림자로 구분해요. Header · Body · Footer · Media를 조합하고, interactive로 클릭 가능한 카드를 만들어요.
6
+
7
+ ```tsx
8
+ import { Card, CardHeader, CardBody, CardFooter, CardMedia } from '@iamfiro/design'
9
+ ```
10
+
11
+ ## 디자인 규칙
12
+
13
+ - 차트: 시리즈 색은 `--chart-1…6`을 순서대로, 그리드는 `--chart-grid`로 아주 옅게(세로선·축선 없음). 범례·툴팁의 색 표시는 `ColorDot`, 툴팁은 `Card raised` + `Separator`로 조립. 축·툴팁·범례·호버/키보드는 `components/Chart/`의 공용 조각(`ChartTooltip`, `ChartLegend`, `useChartInteraction`)을 쓴다. → `LineChart` · `BarChart` · `PieChart` · `Sparkbar`
14
+ - 카드: `Card` 하나로. 테두리 대신 `default`(옅은 윤곽+그림자) · `raised` · `plain`(여백만). 클릭 카드는 `interactive`(떠오름+눌림). 선택 카드는 테두리 링 대신 오른쪽 위 체크(빈 원 → 파랗게 채움) + 아이콘 파란 톤.
15
+ - 파운데이션보다 **이미 있는 조합 컴포넌트를 먼저** 쓴다: 카드 제목줄은 `CardHeader`(오른쪽은 `actions`), 행 목록은 `List` + `ListItem`(`leading` · `trailing`). Stack/Inline으로 같은 것을 다시 짜지 않는다. List를 카드 안에 넣을 땐 `Card padding="sm"`(12px)이면 행 안쪽 여백(12px)과 왼쪽 끝이 맞는다.
16
+ - 읽기 전용 단계 타임라인(계획 · 활동 기록 · 승인 흐름)은 `StepList`(`ol`, 마커 + 연결선, `meta` 시간, 아래 내용엔 Collapsible inline). 번호 원은 `StatusIcon number`(`persistNumber`면 모든 상태에서 번호). 사용자가 체크하는 목록은 `ProgressTracker`. 카드 아래 상태 띠는 `CardFooter band`.
17
+ - 카드를 회색 판으로 한 번 더 감싸고 맥락(몇 단계 · 어떤 도구 · 진행 상태)을 카드 바깥에 둘 땐 `CardFrame`(`header` 캡션 / `footer` 상태 줄, `--surface-active` 판 + 4px 테두리 + 바깥 모서리 20px로 카드 16px와 겹치지 않게). 카드 안쪽 아래 띠는 여전히 `CardFooter band`.
18
+ - 글 속 변경 내용(추적된 변경)은 `InlineDiff`: 삭제 = 빨간 취소선 + `--danger-soft`, 추가 = 초록 + `--success-soft`, 진짜 `<del>` · `<ins>` + 화면 읽기 "삭제" · "추가". 검토(수락 · 거절)는 `reviewable`, 툴바(남은 개수 `CountBadge variant="soft" tone="success"`, 이전 · 다음 `Button iconOnly`, 모두 거절 · 모두 수락)는 `useDiffReview` 상태를 함께 써서 조립한다. 검토 카드는 `CardFrame header`(회색 판 위 아이콘 + 문서 이름) 안에 `Card raised` — 회색 Box를 카드 안 제목줄로 넣으면 입력창처럼 보인다. 본문 줄 간격은 넉넉하게(위아래 줄의 색 배경이 닿지 않게). 모두 수락 · 거절은 확인 대신 `toast.undo`. 두 문자열 비교는 `diffWords`, 결과 글은 `applyDiffDecisions`.
19
+
20
+ ## API
21
+
22
+ ### Card
23
+
24
+ | prop | 타입 | 기본값 | 설명 |
25
+ | --- | --- | --- | --- |
26
+ | `variant` | `'default' \| 'raised' \| 'plain'` | `'default'` | 표면 스타일. |
27
+ | `padding` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'md'` | 안쪽 여백(14 / 20 / 28px). Header·Body·Footer가 함께 따라요. |
28
+ | `interactive` | `boolean` | | 호버 시 떠오름 + 누름 피드백. |
29
+ | `selected` | `boolean` | | 선택 카드. false여도 빈 체크가 보이고, true면 체크가 채워져요. |
30
+ | `as` | `ElementType` | `'div'` | 렌더할 요소. 예: 'a', 'button', Link. |
31
+
32
+ ### CardHeader
33
+
34
+ | prop | 타입 | 기본값 | 설명 |
35
+ | --- | --- | --- | --- |
36
+ | `title` | `ReactNode` | | 제목. |
37
+ | `description` | `ReactNode` | | 제목 아래 설명. |
38
+ | `eyebrow` | `ReactNode` | | 제목 위 작은 글씨(분류, 날짜). |
39
+ | `icon` | `ReactNode` | | 앞 아이콘 또는 아바타. |
40
+ | `actions` | `ReactNode` | | 오른쪽 버튼·배지·메뉴. |
41
+
42
+ ### CardFooter
43
+
44
+ | prop | 타입 | 기본값 | 설명 |
45
+ | --- | --- | --- | --- |
46
+ | `align` | `'start' \| 'end' \| 'between'` | `'end'` | 정렬. |
47
+ | `divided` | `boolean` | | 본문과의 사이에 얇은 구분선. |
48
+ | `band` | `boolean` | | 아래 가장자리를 꽉 채우는 옅은 회색 띠(상태 줄 + 경과 시간). 선 대신 채움으로 구분해요. |
49
+
50
+ ### CardMedia
51
+
52
+ | prop | 타입 | 기본값 | 설명 |
53
+ | --- | --- | --- | --- |
54
+ | `ratio` | `number \| string` | | 가로세로 비율. 예: 16 / 9, '16/9'. 주면 AspectRatio로 감싸 자식이 틀을 채워요. |
55
+
56
+ ## 예제
57
+
58
+ 예제를 감싼 `style={{ ... }}` div는 미리보기 배치용이다. 실제 화면 배치는 `Stack` · `Inline` · `Grid`로 한다.
59
+
60
+ ### 기본
61
+
62
+ Header(제목·설명·액션) + Body + Footer.
63
+
64
+ ```tsx
65
+ import { CreditCard, MoreHorizontal } from 'lucide-react'
66
+ import { Button, Card, CardBody, CardFooter, CardHeader } from '@iamfiro/design'
67
+
68
+ export default function Example() {
69
+ return (
70
+ <Card style={{ width: 380 }}>
71
+ <CardHeader
72
+ icon={<CreditCard />}
73
+ title="결제 수단"
74
+ description="매월 1일에 자동 결제돼요."
75
+ actions={<Button iconOnly variant="ghost" size="sm" icon={<MoreHorizontal />} aria-label="더보기" />}
76
+ />
77
+ <CardBody>신한카드 •••• 4821 · 2028년 4월 만료</CardBody>
78
+ <CardFooter>
79
+ <Button variant="ghost">삭제</Button>
80
+ <Button variant="secondary">변경</Button>
81
+ </CardFooter>
82
+ </Card>
83
+ )
84
+ }
85
+ ```
86
+
87
+ ### 표면
88
+
89
+ default는 옅은 윤곽, raised는 더 떠 보이고, plain은 그림자 없이 여백으로만 묶어요.
90
+
91
+ ```tsx
92
+ import { Card, CardBody, CardHeader, type CardVariant } from '@iamfiro/design'
93
+
94
+ const VARIANTS: Array<[CardVariant, string]> = [
95
+ ['default', '옅은 윤곽 + 그림자'],
96
+ ['raised', '더 떠 보이는 카드'],
97
+ ['plain', '그림자 없이 여백으로'],
98
+ ]
99
+
100
+ export default function Example() {
101
+ return (
102
+ <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 200px)', gap: 16 }}>
103
+ {VARIANTS.map(([variant, text]) => (
104
+ <Card key={variant} variant={variant}>
105
+ <CardHeader title={variant} />
106
+ <CardBody>{text}</CardBody>
107
+ </Card>
108
+ ))}
109
+ </div>
110
+ )
111
+ }
112
+ ```
113
+
114
+ ### 클릭 가능한 카드
115
+
116
+ interactive는 마우스를 올리면 살짝 떠오르고 누르면 눌려요. as로 a / button을 지정하세요. selected를 주면 오른쪽 위에 체크가 생기고, 선택되면 파랗게 채워지며 아이콘도 파란 톤이 돼요.
117
+
118
+ ```tsx
119
+ import { useState } from 'react'
120
+ import { Building2, User, Users } from 'lucide-react'
121
+ import { Card, CardHeader } from '@iamfiro/design'
122
+
123
+ const PLANS = [
124
+ { id: 'solo', icon: <User />, title: '개인', description: '혼자 쓰는 프로젝트' },
125
+ { id: 'team', icon: <Users />, title: '팀', description: '최대 20명까지' },
126
+ { id: 'org', icon: <Building2 />, title: '조직', description: 'SSO · 감사 로그 포함' },
127
+ ]
128
+
129
+ export default function Example() {
130
+ const [plan, setPlan] = useState('team')
131
+ return (
132
+ <div role="radiogroup" aria-label="플랜" style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 190px)', gap: 12 }}>
133
+ {PLANS.map((p) => (
134
+ <Card key={p.id} as="button" type="button" role="radio" aria-checked={plan === p.id} interactive selected={plan === p.id} padding="sm" onClick={() => setPlan(p.id)}>
135
+ <CardHeader icon={p.icon} title={p.title} description={p.description} />
136
+ </Card>
137
+ ))}
138
+ </div>
139
+ )
140
+ }
141
+ ```