@neynar/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 (364) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/components/ui/accordion.d.ts +229 -0
  4. package/dist/components/ui/accordion.d.ts.map +1 -0
  5. package/dist/components/ui/alert-dialog.d.ts +247 -0
  6. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  7. package/dist/components/ui/alert.d.ts +187 -0
  8. package/dist/components/ui/alert.d.ts.map +1 -0
  9. package/dist/components/ui/aspect-ratio.d.ts +94 -0
  10. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  11. package/dist/components/ui/avatar.d.ts +244 -0
  12. package/dist/components/ui/avatar.d.ts.map +1 -0
  13. package/dist/components/ui/badge.d.ts +163 -0
  14. package/dist/components/ui/badge.d.ts.map +1 -0
  15. package/dist/components/ui/breadcrumb.d.ts +281 -0
  16. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  17. package/dist/components/ui/button.d.ts +129 -0
  18. package/dist/components/ui/button.d.ts.map +1 -0
  19. package/dist/components/ui/calendar.d.ts +169 -0
  20. package/dist/components/ui/calendar.d.ts.map +1 -0
  21. package/dist/components/ui/card.d.ts +365 -0
  22. package/dist/components/ui/card.d.ts.map +1 -0
  23. package/dist/components/ui/carousel.d.ts +369 -0
  24. package/dist/components/ui/carousel.d.ts.map +1 -0
  25. package/dist/components/ui/chart.d.ts +442 -0
  26. package/dist/components/ui/chart.d.ts.map +1 -0
  27. package/dist/components/ui/checkbox.d.ts +88 -0
  28. package/dist/components/ui/checkbox.d.ts.map +1 -0
  29. package/dist/components/ui/collapsible.d.ts +182 -0
  30. package/dist/components/ui/collapsible.d.ts.map +1 -0
  31. package/dist/components/ui/combobox.d.ts +270 -0
  32. package/dist/components/ui/combobox.d.ts.map +1 -0
  33. package/dist/components/ui/command.d.ts +355 -0
  34. package/dist/components/ui/command.d.ts.map +1 -0
  35. package/dist/components/ui/container.d.ts +102 -0
  36. package/dist/components/ui/container.d.ts.map +1 -0
  37. package/dist/components/ui/context-menu.d.ts +339 -0
  38. package/dist/components/ui/context-menu.d.ts.map +1 -0
  39. package/dist/components/ui/date-picker.d.ts +145 -0
  40. package/dist/components/ui/date-picker.d.ts.map +1 -0
  41. package/dist/components/ui/dialog.d.ts +322 -0
  42. package/dist/components/ui/dialog.d.ts.map +1 -0
  43. package/dist/components/ui/drawer.d.ts +154 -0
  44. package/dist/components/ui/drawer.d.ts.map +1 -0
  45. package/dist/components/ui/dropdown-menu.d.ts +349 -0
  46. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  47. package/dist/components/ui/empty-state.d.ts +133 -0
  48. package/dist/components/ui/empty-state.d.ts.map +1 -0
  49. package/dist/components/ui/hover-card.d.ts +109 -0
  50. package/dist/components/ui/hover-card.d.ts.map +1 -0
  51. package/dist/components/ui/input.d.ts +89 -0
  52. package/dist/components/ui/input.d.ts.map +1 -0
  53. package/dist/components/ui/label.d.ts +93 -0
  54. package/dist/components/ui/label.d.ts.map +1 -0
  55. package/dist/components/ui/menubar.d.ts +306 -0
  56. package/dist/components/ui/menubar.d.ts.map +1 -0
  57. package/dist/components/ui/navigation-menu.d.ts +318 -0
  58. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  59. package/dist/components/ui/pagination.d.ts +343 -0
  60. package/dist/components/ui/pagination.d.ts.map +1 -0
  61. package/dist/components/ui/popover.d.ts +178 -0
  62. package/dist/components/ui/popover.d.ts.map +1 -0
  63. package/dist/components/ui/progress.d.ts +64 -0
  64. package/dist/components/ui/progress.d.ts.map +1 -0
  65. package/dist/components/ui/radio-group.d.ts +144 -0
  66. package/dist/components/ui/radio-group.d.ts.map +1 -0
  67. package/dist/components/ui/resizable.d.ts +164 -0
  68. package/dist/components/ui/resizable.d.ts.map +1 -0
  69. package/dist/components/ui/scroll-area.d.ts +82 -0
  70. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  71. package/dist/components/ui/select.d.ts +316 -0
  72. package/dist/components/ui/select.d.ts.map +1 -0
  73. package/dist/components/ui/separator.d.ts +80 -0
  74. package/dist/components/ui/separator.d.ts.map +1 -0
  75. package/dist/components/ui/sheet.d.ts +346 -0
  76. package/dist/components/ui/sheet.d.ts.map +1 -0
  77. package/dist/components/ui/sidebar.d.ts +1561 -0
  78. package/dist/components/ui/sidebar.d.ts.map +1 -0
  79. package/dist/components/ui/skeleton.d.ts +66 -0
  80. package/dist/components/ui/skeleton.d.ts.map +1 -0
  81. package/dist/components/ui/slider.d.ts +95 -0
  82. package/dist/components/ui/slider.d.ts.map +1 -0
  83. package/dist/components/ui/sonner.d.ts +101 -0
  84. package/dist/components/ui/sonner.d.ts.map +1 -0
  85. package/dist/components/ui/stack.d.ts +192 -0
  86. package/dist/components/ui/stack.d.ts.map +1 -0
  87. package/dist/components/ui/stories/accordion.stories.d.ts +71 -0
  88. package/dist/components/ui/stories/accordion.stories.d.ts.map +1 -0
  89. package/dist/components/ui/stories/alert-dialog.stories.d.ts +39 -0
  90. package/dist/components/ui/stories/alert-dialog.stories.d.ts.map +1 -0
  91. package/dist/components/ui/stories/alert.stories.d.ts +48 -0
  92. package/dist/components/ui/stories/alert.stories.d.ts.map +1 -0
  93. package/dist/components/ui/stories/aspect-ratio.stories.d.ts +53 -0
  94. package/dist/components/ui/stories/aspect-ratio.stories.d.ts.map +1 -0
  95. package/dist/components/ui/stories/avatar.stories.d.ts +49 -0
  96. package/dist/components/ui/stories/avatar.stories.d.ts.map +1 -0
  97. package/dist/components/ui/stories/badge.stories.d.ts +64 -0
  98. package/dist/components/ui/stories/badge.stories.d.ts.map +1 -0
  99. package/dist/components/ui/stories/breadcrumb.stories.d.ts +27 -0
  100. package/dist/components/ui/stories/breadcrumb.stories.d.ts.map +1 -0
  101. package/dist/components/ui/stories/button.stories.d.ts +92 -0
  102. package/dist/components/ui/stories/button.stories.d.ts.map +1 -0
  103. package/dist/components/ui/stories/calendar.stories.d.ts +94 -0
  104. package/dist/components/ui/stories/calendar.stories.d.ts.map +1 -0
  105. package/dist/components/ui/stories/card.stories.d.ts +29 -0
  106. package/dist/components/ui/stories/card.stories.d.ts.map +1 -0
  107. package/dist/components/ui/stories/carousel.stories.d.ts +42 -0
  108. package/dist/components/ui/stories/carousel.stories.d.ts.map +1 -0
  109. package/dist/components/ui/stories/chart.stories.d.ts +51 -0
  110. package/dist/components/ui/stories/chart.stories.d.ts.map +1 -0
  111. package/dist/components/ui/stories/checkbox.stories.d.ts +72 -0
  112. package/dist/components/ui/stories/checkbox.stories.d.ts.map +1 -0
  113. package/dist/components/ui/stories/cn.stories.d.ts +19 -0
  114. package/dist/components/ui/stories/cn.stories.d.ts.map +1 -0
  115. package/dist/components/ui/stories/collapsible.stories.d.ts +51 -0
  116. package/dist/components/ui/stories/collapsible.stories.d.ts.map +1 -0
  117. package/dist/components/ui/stories/colors.stories.d.ts +31 -0
  118. package/dist/components/ui/stories/colors.stories.d.ts.map +1 -0
  119. package/dist/components/ui/stories/combobox.stories.d.ts +89 -0
  120. package/dist/components/ui/stories/combobox.stories.d.ts.map +1 -0
  121. package/dist/components/ui/stories/command.stories.d.ts +69 -0
  122. package/dist/components/ui/stories/command.stories.d.ts.map +1 -0
  123. package/dist/components/ui/stories/container.stories.d.ts +42 -0
  124. package/dist/components/ui/stories/container.stories.d.ts.map +1 -0
  125. package/dist/components/ui/stories/context-menu.stories.d.ts +32 -0
  126. package/dist/components/ui/stories/context-menu.stories.d.ts.map +1 -0
  127. package/dist/components/ui/stories/date-picker.stories.d.ts +67 -0
  128. package/dist/components/ui/stories/date-picker.stories.d.ts.map +1 -0
  129. package/dist/components/ui/stories/dialog.stories.d.ts +48 -0
  130. package/dist/components/ui/stories/dialog.stories.d.ts.map +1 -0
  131. package/dist/components/ui/stories/drawer.stories.d.ts +33 -0
  132. package/dist/components/ui/stories/drawer.stories.d.ts.map +1 -0
  133. package/dist/components/ui/stories/dropdown-menu.stories.d.ts +31 -0
  134. package/dist/components/ui/stories/dropdown-menu.stories.d.ts.map +1 -0
  135. package/dist/components/ui/stories/empty-state.stories.d.ts +74 -0
  136. package/dist/components/ui/stories/empty-state.stories.d.ts.map +1 -0
  137. package/dist/components/ui/stories/hover-card.stories.d.ts +35 -0
  138. package/dist/components/ui/stories/hover-card.stories.d.ts.map +1 -0
  139. package/dist/components/ui/stories/input.stories.d.ts +69 -0
  140. package/dist/components/ui/stories/input.stories.d.ts.map +1 -0
  141. package/dist/components/ui/stories/label.stories.d.ts +47 -0
  142. package/dist/components/ui/stories/label.stories.d.ts.map +1 -0
  143. package/dist/components/ui/stories/menubar.stories.d.ts +39 -0
  144. package/dist/components/ui/stories/menubar.stories.d.ts.map +1 -0
  145. package/dist/components/ui/stories/navigation-menu.stories.d.ts +44 -0
  146. package/dist/components/ui/stories/navigation-menu.stories.d.ts.map +1 -0
  147. package/dist/components/ui/stories/pagination.stories.d.ts +33 -0
  148. package/dist/components/ui/stories/pagination.stories.d.ts.map +1 -0
  149. package/dist/components/ui/stories/popover.stories.d.ts +36 -0
  150. package/dist/components/ui/stories/popover.stories.d.ts.map +1 -0
  151. package/dist/components/ui/stories/progress.stories.d.ts +38 -0
  152. package/dist/components/ui/stories/progress.stories.d.ts.map +1 -0
  153. package/dist/components/ui/stories/radio-group.stories.d.ts +76 -0
  154. package/dist/components/ui/stories/radio-group.stories.d.ts.map +1 -0
  155. package/dist/components/ui/stories/resizable.stories.d.ts +49 -0
  156. package/dist/components/ui/stories/resizable.stories.d.ts.map +1 -0
  157. package/dist/components/ui/stories/scroll-area.stories.d.ts +35 -0
  158. package/dist/components/ui/stories/scroll-area.stories.d.ts.map +1 -0
  159. package/dist/components/ui/stories/select.stories.d.ts +51 -0
  160. package/dist/components/ui/stories/select.stories.d.ts.map +1 -0
  161. package/dist/components/ui/stories/separator.stories.d.ts +58 -0
  162. package/dist/components/ui/stories/separator.stories.d.ts.map +1 -0
  163. package/dist/components/ui/stories/sheet.stories.d.ts +43 -0
  164. package/dist/components/ui/stories/sheet.stories.d.ts.map +1 -0
  165. package/dist/components/ui/stories/sidebar.stories.d.ts +60 -0
  166. package/dist/components/ui/stories/sidebar.stories.d.ts.map +1 -0
  167. package/dist/components/ui/stories/skeleton.stories.d.ts +42 -0
  168. package/dist/components/ui/stories/skeleton.stories.d.ts.map +1 -0
  169. package/dist/components/ui/stories/slider.stories.d.ts +99 -0
  170. package/dist/components/ui/stories/slider.stories.d.ts.map +1 -0
  171. package/dist/components/ui/stories/sonner.stories.d.ts +9 -0
  172. package/dist/components/ui/stories/sonner.stories.d.ts.map +1 -0
  173. package/dist/components/ui/stories/stack.stories.d.ts +39 -0
  174. package/dist/components/ui/stories/stack.stories.d.ts.map +1 -0
  175. package/dist/components/ui/stories/switch.stories.d.ts +71 -0
  176. package/dist/components/ui/stories/switch.stories.d.ts.map +1 -0
  177. package/dist/components/ui/stories/table.stories.d.ts +40 -0
  178. package/dist/components/ui/stories/table.stories.d.ts.map +1 -0
  179. package/dist/components/ui/stories/tabs.stories.d.ts +62 -0
  180. package/dist/components/ui/stories/tabs.stories.d.ts.map +1 -0
  181. package/dist/components/ui/stories/text-field.stories.d.ts +78 -0
  182. package/dist/components/ui/stories/text-field.stories.d.ts.map +1 -0
  183. package/dist/components/ui/stories/textarea.stories.d.ts +57 -0
  184. package/dist/components/ui/stories/textarea.stories.d.ts.map +1 -0
  185. package/dist/components/ui/stories/theme-toggle.stories.d.ts +71 -0
  186. package/dist/components/ui/stories/theme-toggle.stories.d.ts.map +1 -0
  187. package/dist/components/ui/stories/theme.stories.d.ts +51 -0
  188. package/dist/components/ui/stories/theme.stories.d.ts.map +1 -0
  189. package/dist/components/ui/stories/toggle-group.stories.d.ts +71 -0
  190. package/dist/components/ui/stories/toggle-group.stories.d.ts.map +1 -0
  191. package/dist/components/ui/stories/toggle.stories.d.ts +78 -0
  192. package/dist/components/ui/stories/toggle.stories.d.ts.map +1 -0
  193. package/dist/components/ui/stories/tooltip.stories.d.ts +37 -0
  194. package/dist/components/ui/stories/tooltip.stories.d.ts.map +1 -0
  195. package/dist/components/ui/stories/typography.stories.d.ts +137 -0
  196. package/dist/components/ui/stories/typography.stories.d.ts.map +1 -0
  197. package/dist/components/ui/stories/use-mobile.stories.d.ts +20 -0
  198. package/dist/components/ui/stories/use-mobile.stories.d.ts.map +1 -0
  199. package/dist/components/ui/stories/use-theme.stories.d.ts +23 -0
  200. package/dist/components/ui/stories/use-theme.stories.d.ts.map +1 -0
  201. package/dist/components/ui/switch.d.ts +84 -0
  202. package/dist/components/ui/switch.d.ts.map +1 -0
  203. package/dist/components/ui/table.d.ts +321 -0
  204. package/dist/components/ui/table.d.ts.map +1 -0
  205. package/dist/components/ui/tabs.d.ts +260 -0
  206. package/dist/components/ui/tabs.d.ts.map +1 -0
  207. package/dist/components/ui/text-field.d.ts +157 -0
  208. package/dist/components/ui/text-field.d.ts.map +1 -0
  209. package/dist/components/ui/textarea.d.ts +84 -0
  210. package/dist/components/ui/textarea.d.ts.map +1 -0
  211. package/dist/components/ui/theme-toggle.d.ts +105 -0
  212. package/dist/components/ui/theme-toggle.d.ts.map +1 -0
  213. package/dist/components/ui/theme.d.ts +110 -0
  214. package/dist/components/ui/theme.d.ts.map +1 -0
  215. package/dist/components/ui/toggle-group.d.ts +133 -0
  216. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  217. package/dist/components/ui/toggle.d.ts +84 -0
  218. package/dist/components/ui/toggle.d.ts.map +1 -0
  219. package/dist/components/ui/tooltip.d.ts +202 -0
  220. package/dist/components/ui/tooltip.d.ts.map +1 -0
  221. package/dist/components/ui/typography.d.ts +287 -0
  222. package/dist/components/ui/typography.d.ts.map +1 -0
  223. package/dist/hooks/use-mobile.d.ts +74 -0
  224. package/dist/hooks/use-mobile.d.ts.map +1 -0
  225. package/dist/hooks/use-theme.d.ts +142 -0
  226. package/dist/hooks/use-theme.d.ts.map +1 -0
  227. package/dist/index.d.ts +57 -0
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +27498 -0
  230. package/dist/index.js.map +1 -0
  231. package/dist/lib/utils.d.ts +43 -0
  232. package/dist/lib/utils.d.ts.map +1 -0
  233. package/dist/tsconfig.tsbuildinfo +1 -0
  234. package/docs/llm/colors.md +273 -0
  235. package/docs/llm/components/buttons.md +68 -0
  236. package/docs/llm/components/cards.md +53 -0
  237. package/docs/llm/components/display.md +134 -0
  238. package/docs/llm/components/feedback.md +96 -0
  239. package/docs/llm/components/forms.md +90 -0
  240. package/docs/llm/components/layout.md +59 -0
  241. package/docs/llm/components/menus.md +70 -0
  242. package/docs/llm/components/navigation.md +80 -0
  243. package/docs/llm/components/overlays.md +83 -0
  244. package/docs/llm/components/tables.md +73 -0
  245. package/docs/llm/components/typography.md +199 -0
  246. package/docs/llm/components/utilities.md +114 -0
  247. package/docs/llm/guide.md +165 -0
  248. package/llms.txt +122 -0
  249. package/package.json +104 -0
  250. package/src/components/ui/accordion.tsx +285 -0
  251. package/src/components/ui/alert-dialog.tsx +387 -0
  252. package/src/components/ui/alert.tsx +243 -0
  253. package/src/components/ui/aspect-ratio.tsx +99 -0
  254. package/src/components/ui/avatar.tsx +288 -0
  255. package/src/components/ui/badge.tsx +205 -0
  256. package/src/components/ui/breadcrumb.tsx +378 -0
  257. package/src/components/ui/button.tsx +195 -0
  258. package/src/components/ui/calendar.tsx +371 -0
  259. package/src/components/ui/card.tsx +447 -0
  260. package/src/components/ui/carousel.tsx +624 -0
  261. package/src/components/ui/chart.tsx +802 -0
  262. package/src/components/ui/checkbox.tsx +113 -0
  263. package/src/components/ui/collapsible.tsx +207 -0
  264. package/src/components/ui/combobox.tsx +373 -0
  265. package/src/components/ui/command.tsx +518 -0
  266. package/src/components/ui/container.tsx +114 -0
  267. package/src/components/ui/context-menu.tsx +563 -0
  268. package/src/components/ui/date-picker.tsx +213 -0
  269. package/src/components/ui/dialog.tsx +447 -0
  270. package/src/components/ui/drawer.tsx +273 -0
  271. package/src/components/ui/dropdown-menu.tsx +578 -0
  272. package/src/components/ui/empty-state.tsx +145 -0
  273. package/src/components/ui/hover-card.tsx +144 -0
  274. package/src/components/ui/input.tsx +106 -0
  275. package/src/components/ui/label.tsx +110 -0
  276. package/src/components/ui/menubar.tsx +553 -0
  277. package/src/components/ui/navigation-menu.tsx +471 -0
  278. package/src/components/ui/pagination.tsx +456 -0
  279. package/src/components/ui/popover.tsx +216 -0
  280. package/src/components/ui/progress.tsx +88 -0
  281. package/src/components/ui/radio-group.tsx +183 -0
  282. package/src/components/ui/resizable.tsx +209 -0
  283. package/src/components/ui/scroll-area.tsx +132 -0
  284. package/src/components/ui/select.tsx +485 -0
  285. package/src/components/ui/separator.tsx +101 -0
  286. package/src/components/ui/sheet.tsx +495 -0
  287. package/src/components/ui/sidebar.tsx +2211 -0
  288. package/src/components/ui/skeleton.tsx +76 -0
  289. package/src/components/ui/slider.tsx +147 -0
  290. package/src/components/ui/sonner.tsx +120 -0
  291. package/src/components/ui/stack.tsx +180 -0
  292. package/src/components/ui/stories/accordion.stories.tsx +429 -0
  293. package/src/components/ui/stories/alert-dialog.stories.tsx +519 -0
  294. package/src/components/ui/stories/alert.stories.tsx +228 -0
  295. package/src/components/ui/stories/aspect-ratio.stories.tsx +200 -0
  296. package/src/components/ui/stories/avatar.stories.tsx +317 -0
  297. package/src/components/ui/stories/badge.stories.tsx +260 -0
  298. package/src/components/ui/stories/breadcrumb.stories.tsx +482 -0
  299. package/src/components/ui/stories/button.stories.tsx +266 -0
  300. package/src/components/ui/stories/calendar.stories.tsx +375 -0
  301. package/src/components/ui/stories/card.stories.tsx +308 -0
  302. package/src/components/ui/stories/carousel.stories.tsx +328 -0
  303. package/src/components/ui/stories/chart.stories.tsx +430 -0
  304. package/src/components/ui/stories/checkbox.stories.tsx +297 -0
  305. package/src/components/ui/stories/cn.stories.tsx +433 -0
  306. package/src/components/ui/stories/collapsible.stories.tsx +256 -0
  307. package/src/components/ui/stories/colors.stories.tsx +502 -0
  308. package/src/components/ui/stories/combobox.stories.tsx +301 -0
  309. package/src/components/ui/stories/command.stories.tsx +632 -0
  310. package/src/components/ui/stories/container.stories.tsx +250 -0
  311. package/src/components/ui/stories/context-menu.stories.tsx +446 -0
  312. package/src/components/ui/stories/date-picker.stories.tsx +378 -0
  313. package/src/components/ui/stories/dialog.stories.tsx +535 -0
  314. package/src/components/ui/stories/drawer.stories.tsx +364 -0
  315. package/src/components/ui/stories/dropdown-menu.stories.tsx +374 -0
  316. package/src/components/ui/stories/empty-state.stories.tsx +244 -0
  317. package/src/components/ui/stories/hover-card.stories.tsx +355 -0
  318. package/src/components/ui/stories/input.stories.tsx +289 -0
  319. package/src/components/ui/stories/label.stories.tsx +294 -0
  320. package/src/components/ui/stories/menubar.stories.tsx +764 -0
  321. package/src/components/ui/stories/navigation-menu.stories.tsx +539 -0
  322. package/src/components/ui/stories/pagination.stories.tsx +604 -0
  323. package/src/components/ui/stories/popover.stories.tsx +392 -0
  324. package/src/components/ui/stories/progress.stories.tsx +218 -0
  325. package/src/components/ui/stories/radio-group.stories.tsx +400 -0
  326. package/src/components/ui/stories/resizable.stories.tsx +417 -0
  327. package/src/components/ui/stories/scroll-area.stories.tsx +180 -0
  328. package/src/components/ui/stories/select.stories.tsx +389 -0
  329. package/src/components/ui/stories/separator.stories.tsx +192 -0
  330. package/src/components/ui/stories/sheet.stories.tsx +468 -0
  331. package/src/components/ui/stories/sidebar.stories.tsx +731 -0
  332. package/src/components/ui/stories/skeleton.stories.tsx +216 -0
  333. package/src/components/ui/stories/slider.stories.tsx +321 -0
  334. package/src/components/ui/stories/sonner.stories.tsx +373 -0
  335. package/src/components/ui/stories/stack.stories.tsx +222 -0
  336. package/src/components/ui/stories/switch.stories.tsx +202 -0
  337. package/src/components/ui/stories/table.stories.tsx +541 -0
  338. package/src/components/ui/stories/tabs.stories.tsx +544 -0
  339. package/src/components/ui/stories/text-field.stories.tsx +280 -0
  340. package/src/components/ui/stories/textarea.stories.tsx +245 -0
  341. package/src/components/ui/stories/theme-toggle.stories.tsx +275 -0
  342. package/src/components/ui/stories/theme.stories.tsx +412 -0
  343. package/src/components/ui/stories/toggle-group.stories.tsx +337 -0
  344. package/src/components/ui/stories/toggle.stories.tsx +325 -0
  345. package/src/components/ui/stories/tooltip.stories.tsx +444 -0
  346. package/src/components/ui/stories/typography.stories.tsx +1586 -0
  347. package/src/components/ui/stories/use-mobile.stories.tsx +420 -0
  348. package/src/components/ui/stories/use-theme.stories.tsx +531 -0
  349. package/src/components/ui/switch.tsx +106 -0
  350. package/src/components/ui/table.tsx +424 -0
  351. package/src/components/ui/tabs.tsx +316 -0
  352. package/src/components/ui/text-field.tsx +206 -0
  353. package/src/components/ui/textarea.tsx +98 -0
  354. package/src/components/ui/theme-toggle.tsx +185 -0
  355. package/src/components/ui/theme.tsx +148 -0
  356. package/src/components/ui/toggle-group.tsx +196 -0
  357. package/src/components/ui/toggle.tsx +115 -0
  358. package/src/components/ui/tooltip.tsx +253 -0
  359. package/src/components/ui/typography.tsx +468 -0
  360. package/src/hooks/use-mobile.ts +91 -0
  361. package/src/hooks/use-theme.ts +319 -0
  362. package/src/index.ts +77 -0
  363. package/src/lib/utils.ts +57 -0
  364. package/src/styles/globals.css +160 -0
@@ -0,0 +1,280 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import React from "react";
3
+ import { TextField } from "../text-field";
4
+ import { Button } from "../button";
5
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../card";
6
+
7
+ const meta = {
8
+ title: "Form & Input/TextField",
9
+ component: TextField,
10
+ parameters: {
11
+ layout: "centered",
12
+ docs: {
13
+ description: {
14
+ component:
15
+ "A complete form field component that combines input, label, helper text, and error handling. Built on top of the Input component with enhanced accessibility and UX features.",
16
+ },
17
+ },
18
+ },
19
+ tags: ["autodocs"],
20
+ argTypes: {
21
+ label: {
22
+ control: { type: "text" },
23
+ description: "The label for the input field",
24
+ },
25
+ helperText: {
26
+ control: { type: "text" },
27
+ description: "Helper text displayed below the input",
28
+ },
29
+ error: {
30
+ control: { type: "text" },
31
+ description: "Error message to display (takes precedence over helperText)",
32
+ },
33
+ required: {
34
+ control: { type: "boolean" },
35
+ description: "Whether the field is required",
36
+ },
37
+ type: {
38
+ control: { type: "select" },
39
+ options: ["text", "email", "password", "number", "tel", "url", "search"],
40
+ description: "The input type",
41
+ },
42
+ disabled: {
43
+ control: { type: "boolean" },
44
+ description: "Whether the field is disabled",
45
+ },
46
+ placeholder: {
47
+ control: { type: "text" },
48
+ description: "Placeholder text for the input",
49
+ },
50
+ },
51
+ } satisfies Meta<typeof TextField>;
52
+
53
+ export default meta;
54
+ type Story = StoryObj<typeof meta>;
55
+
56
+ /**
57
+ * Interactive playground for testing all TextField props and variants.
58
+ * Use the controls below to experiment with different configurations.
59
+ */
60
+ export const Interactive: Story = {
61
+ args: {
62
+ label: "Username",
63
+ placeholder: "Enter your username",
64
+ helperText: "Choose a unique username (3-20 characters)",
65
+ required: false,
66
+ disabled: false,
67
+ type: "text",
68
+ },
69
+ render: (args) => (
70
+ <div className="w-[350px]">
71
+ <TextField {...args} />
72
+ </div>
73
+ ),
74
+ };
75
+
76
+ /**
77
+ * Showcase of all TextField variants and states.
78
+ * Demonstrates the component in different configurations for design reference.
79
+ */
80
+ export const Variants: Story = {
81
+ render: () => (
82
+ <div className="space-y-8 w-[400px]">
83
+ {/* Basic States */}
84
+ <div>
85
+ <h3 className="mb-4 text-lg font-semibold">Basic States</h3>
86
+ <div className="space-y-4">
87
+ <TextField
88
+ label="Default Field"
89
+ placeholder="Default state"
90
+ />
91
+ <TextField
92
+ label="With Helper Text"
93
+ placeholder="Enter value"
94
+ helperText="This is helpful information"
95
+ />
96
+ <TextField
97
+ label="Required Field"
98
+ placeholder="Required input"
99
+ required
100
+ />
101
+ <TextField
102
+ label="Disabled Field"
103
+ placeholder="Cannot edit"
104
+ disabled
105
+ defaultValue="Disabled value"
106
+ />
107
+ </div>
108
+ </div>
109
+
110
+ {/* Error State */}
111
+ <div>
112
+ <h3 className="mb-4 text-lg font-semibold">Error State</h3>
113
+ <div className="space-y-4">
114
+ <TextField
115
+ label="Field with Error"
116
+ placeholder="Invalid input"
117
+ error="This field contains an error"
118
+ defaultValue="invalid@"
119
+ />
120
+ <TextField
121
+ label="Required Field Error"
122
+ placeholder="Required field"
123
+ required
124
+ error="This field is required"
125
+ />
126
+ </div>
127
+ </div>
128
+
129
+ {/* Input Types */}
130
+ <div>
131
+ <h3 className="mb-4 text-lg font-semibold">Input Types</h3>
132
+ <div className="space-y-4">
133
+ <TextField
134
+ label="Email"
135
+ type="email"
136
+ placeholder="user@example.com"
137
+ helperText="We'll never share your email"
138
+ />
139
+ <TextField
140
+ label="Password"
141
+ type="password"
142
+ placeholder="Enter password"
143
+ helperText="Must be at least 8 characters"
144
+ />
145
+ <TextField
146
+ label="Number"
147
+ type="number"
148
+ placeholder="123"
149
+ helperText="Numeric values only"
150
+ />
151
+ <TextField
152
+ label="URL"
153
+ type="url"
154
+ placeholder="https://example.com"
155
+ helperText="Must be a valid URL"
156
+ />
157
+ </div>
158
+ </div>
159
+ </div>
160
+ ),
161
+ };
162
+
163
+ /**
164
+ * Real-world example showing TextField in a Farcaster profile form context.
165
+ * Demonstrates how the component works in practical applications.
166
+ */
167
+ export const InContext: Story = {
168
+ render: function ProfileFormExample() {
169
+ const [formData, setFormData] = React.useState({
170
+ username: "",
171
+ displayName: "",
172
+ bio: "",
173
+ website: "",
174
+ });
175
+ const [errors, setErrors] = React.useState<Record<string, string>>({});
176
+
177
+ const handleSubmit = (e: React.FormEvent) => {
178
+ e.preventDefault();
179
+ const newErrors: Record<string, string> = {};
180
+
181
+ if (!formData.username) {
182
+ newErrors.username = "Username is required";
183
+ } else if (formData.username.length < 3) {
184
+ newErrors.username = "Username must be at least 3 characters";
185
+ }
186
+
187
+ if (!formData.displayName) {
188
+ newErrors.displayName = "Display name is required";
189
+ }
190
+
191
+ if (formData.website && !formData.website.startsWith("http")) {
192
+ newErrors.website = "Website must be a valid URL";
193
+ }
194
+
195
+ setErrors(newErrors);
196
+
197
+ if (Object.keys(newErrors).length === 0) {
198
+ console.log("Profile updated:", formData);
199
+ // In a real app, this would make an API call
200
+ }
201
+ };
202
+
203
+ const updateField = (field: string, value: string) => {
204
+ setFormData(prev => ({ ...prev, [field]: value }));
205
+ // Clear error when user starts typing
206
+ if (errors[field]) {
207
+ setErrors(prev => ({ ...prev, [field]: "" }));
208
+ }
209
+ };
210
+
211
+ return (
212
+ <Card className="w-[450px]">
213
+ <CardHeader>
214
+ <CardTitle>Edit Farcaster Profile</CardTitle>
215
+ <CardDescription>
216
+ Update your profile information to customize how you appear to others
217
+ </CardDescription>
218
+ </CardHeader>
219
+ <CardContent>
220
+ <form onSubmit={handleSubmit} className="space-y-6">
221
+ <TextField
222
+ label="Username"
223
+ placeholder="@username"
224
+ required
225
+ value={formData.username}
226
+ onChange={(e) => updateField("username", e.target.value)}
227
+ error={errors.username}
228
+ helperText="3-20 characters, letters and numbers only"
229
+ />
230
+
231
+ <TextField
232
+ label="Display Name"
233
+ placeholder="Your full name"
234
+ required
235
+ value={formData.displayName}
236
+ onChange={(e) => updateField("displayName", e.target.value)}
237
+ error={errors.displayName}
238
+ helperText="How your name appears in the app"
239
+ />
240
+
241
+ <TextField
242
+ label="Bio"
243
+ placeholder="Tell others about yourself..."
244
+ value={formData.bio}
245
+ onChange={(e) => updateField("bio", e.target.value)}
246
+ helperText={`${formData.bio.length}/160 characters`}
247
+ maxLength={160}
248
+ />
249
+
250
+ <TextField
251
+ label="Website"
252
+ type="url"
253
+ placeholder="https://yourwebsite.com"
254
+ value={formData.website}
255
+ onChange={(e) => updateField("website", e.target.value)}
256
+ error={errors.website}
257
+ helperText="Optional: Link to your personal website or portfolio"
258
+ />
259
+
260
+ <div className="flex gap-3 pt-2">
261
+ <Button type="submit" className="flex-1">
262
+ Save Changes
263
+ </Button>
264
+ <Button
265
+ type="button"
266
+ variant="outline"
267
+ onClick={() => {
268
+ setFormData({username: "", displayName: "", bio: "", website: ""});
269
+ setErrors({});
270
+ }}
271
+ >
272
+ Reset
273
+ </Button>
274
+ </div>
275
+ </form>
276
+ </CardContent>
277
+ </Card>
278
+ );
279
+ },
280
+ };
@@ -0,0 +1,245 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import React from "react";
3
+ import { Textarea } from "../textarea";
4
+ import { Label } from "../label";
5
+ import { Button } from "../button";
6
+ import {
7
+ Card,
8
+ CardContent,
9
+ CardDescription,
10
+ CardHeader,
11
+ CardTitle,
12
+ } from "../card";
13
+ import { Avatar, AvatarFallback } from "../avatar";
14
+
15
+ const meta = {
16
+ title: "Form & Input/Textarea",
17
+ component: Textarea,
18
+ parameters: {
19
+ layout: "centered",
20
+ docs: {
21
+ description: {
22
+ component:
23
+ "A multi-line text input control for entering longer pieces of text. Features automatic content-based resizing and consistent styling with other form elements.",
24
+ },
25
+ },
26
+ },
27
+ tags: ["autodocs"],
28
+ argTypes: {
29
+ placeholder: {
30
+ control: { type: "text" },
31
+ description: "Placeholder text displayed when empty",
32
+ },
33
+ disabled: {
34
+ control: { type: "boolean" },
35
+ description: "Whether the textarea is disabled",
36
+ },
37
+ rows: {
38
+ control: { type: "number", min: 1, max: 10 },
39
+ description: "Number of visible text lines for initial height",
40
+ },
41
+ readOnly: {
42
+ control: { type: "boolean" },
43
+ description: "Whether the textarea is read-only",
44
+ },
45
+ maxLength: {
46
+ control: { type: "number", min: 0, max: 1000 },
47
+ description: "Maximum number of characters allowed",
48
+ },
49
+ },
50
+ } satisfies Meta<typeof Textarea>;
51
+
52
+ export default meta;
53
+ type Story = StoryObj<typeof meta>;
54
+
55
+ export const Interactive: Story = {
56
+ args: {
57
+ placeholder: "Type your message here...",
58
+ rows: 4,
59
+ disabled: false,
60
+ readOnly: false,
61
+ },
62
+ render: (args) => (
63
+ <div className="w-[400px] space-y-2">
64
+ <Label htmlFor="interactive-textarea">Interactive Textarea</Label>
65
+ <Textarea id="interactive-textarea" {...args} />
66
+ <p className="text-sm text-muted-foreground">
67
+ Adjust the controls to see different states and configurations
68
+ </p>
69
+ </div>
70
+ ),
71
+ };
72
+
73
+ export const Variants: Story = {
74
+ render: () => (
75
+ <div className="space-y-6 w-[500px]">
76
+ <div className="space-y-4">
77
+ <h3 className="text-lg font-semibold">States</h3>
78
+
79
+ <div className="space-y-2">
80
+ <Label>Default</Label>
81
+ <Textarea placeholder="Default textarea" />
82
+ </div>
83
+
84
+ <div className="space-y-2">
85
+ <Label>With content</Label>
86
+ <Textarea defaultValue="This textarea has some content already filled in." />
87
+ </div>
88
+
89
+ <div className="space-y-2">
90
+ <Label>Disabled</Label>
91
+ <Textarea disabled placeholder="This textarea is disabled" />
92
+ </div>
93
+
94
+ <div className="space-y-2">
95
+ <Label>Read-only</Label>
96
+ <Textarea readOnly defaultValue="This content cannot be modified." />
97
+ </div>
98
+
99
+ <div className="space-y-2">
100
+ <Label className="text-destructive">Error state</Label>
101
+ <Textarea
102
+ placeholder="Enter your feedback"
103
+ aria-invalid="true"
104
+ aria-describedby="error-message"
105
+ />
106
+ <p id="error-message" className="text-sm text-destructive">
107
+ This field is required
108
+ </p>
109
+ </div>
110
+ </div>
111
+
112
+ <div className="space-y-4">
113
+ <h3 className="text-lg font-semibold">Sizes</h3>
114
+
115
+ <div className="space-y-2">
116
+ <Label>Small (2 rows)</Label>
117
+ <Textarea placeholder="Small textarea" rows={2} />
118
+ </div>
119
+
120
+ <div className="space-y-2">
121
+ <Label>Default (auto-sizing)</Label>
122
+ <Textarea placeholder="Auto-sizing textarea" />
123
+ </div>
124
+
125
+ <div className="space-y-2">
126
+ <Label>Large (6 rows)</Label>
127
+ <Textarea placeholder="Large textarea" rows={6} />
128
+ </div>
129
+ </div>
130
+ </div>
131
+ ),
132
+ };
133
+
134
+ export const InContext: Story = {
135
+ render: function CastComposerExample() {
136
+ const [content, setContent] = React.useState("");
137
+ const [reply, setReply] = React.useState("");
138
+ const [isReplying, setIsReplying] = React.useState(false);
139
+ const maxLength = 320;
140
+
141
+ return (
142
+ <div className="space-y-6 w-[600px]">
143
+ <Card>
144
+ <CardHeader>
145
+ <CardTitle>Create New Cast</CardTitle>
146
+ <CardDescription>
147
+ Share an update with your followers on Farcaster
148
+ </CardDescription>
149
+ </CardHeader>
150
+ <CardContent className="space-y-4">
151
+ <div className="flex gap-3">
152
+ <Avatar>
153
+ <AvatarFallback>ME</AvatarFallback>
154
+ </Avatar>
155
+ <div className="flex-1 space-y-2">
156
+ <Textarea
157
+ placeholder="What's happening?"
158
+ value={content}
159
+ onChange={(e) =>
160
+ setContent(e.target.value.slice(0, maxLength))
161
+ }
162
+ className="min-h-[100px]"
163
+ />
164
+ <div className="flex justify-between items-center">
165
+ <div className="flex gap-2 text-sm text-muted-foreground">
166
+ <span>๐Ÿ“ท Image</span>
167
+ <span>๐Ÿ”— Link</span>
168
+ <span>๐Ÿ“Š Poll</span>
169
+ </div>
170
+ <span className="text-sm text-muted-foreground">
171
+ {content.length}/{maxLength}
172
+ </span>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ <div className="flex justify-end">
177
+ <Button disabled={!content.trim()}>Cast</Button>
178
+ </div>
179
+ </CardContent>
180
+ </Card>
181
+
182
+ <Card>
183
+ <CardContent className="pt-4">
184
+ <div className="space-y-4">
185
+ {/* Original cast */}
186
+ <div className="flex gap-3">
187
+ <Avatar>
188
+ <AvatarFallback>VB</AvatarFallback>
189
+ </Avatar>
190
+ <div className="flex-1">
191
+ <div className="flex items-center gap-2">
192
+ <span className="font-semibold">vitalik.eth</span>
193
+ <span className="text-sm text-muted-foreground">ยท 2h</span>
194
+ </div>
195
+ <p className="text-sm mt-1">
196
+ What are your thoughts on the future of decentralized social
197
+ networks? I believe we&apos;re just getting started with
198
+ protocols like Farcaster.
199
+ </p>
200
+ </div>
201
+ </div>
202
+
203
+ {/* Reply section */}
204
+ {!isReplying ? (
205
+ <Button
206
+ variant="ghost"
207
+ size="sm"
208
+ onClick={() => setIsReplying(true)}
209
+ className="ml-12"
210
+ >
211
+ ๐Ÿ’ฌ Reply
212
+ </Button>
213
+ ) : (
214
+ <div className="ml-12 space-y-3">
215
+ <Textarea
216
+ placeholder="Share your thoughts..."
217
+ value={reply}
218
+ onChange={(e) => setReply(e.target.value)}
219
+ className="min-h-[80px]"
220
+ autoFocus
221
+ />
222
+ <div className="flex justify-between items-center">
223
+ <Button
224
+ variant="ghost"
225
+ size="sm"
226
+ onClick={() => {
227
+ setIsReplying(false);
228
+ setReply("");
229
+ }}
230
+ >
231
+ Cancel
232
+ </Button>
233
+ <Button size="sm" disabled={!reply.trim()}>
234
+ Reply
235
+ </Button>
236
+ </div>
237
+ </div>
238
+ )}
239
+ </div>
240
+ </CardContent>
241
+ </Card>
242
+ </div>
243
+ );
244
+ },
245
+ };