@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,604 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import React from "react";
3
+ import {
4
+ Pagination,
5
+ PaginationContent,
6
+ PaginationEllipsis,
7
+ PaginationItem,
8
+ PaginationLink,
9
+ PaginationNext,
10
+ PaginationPrevious,
11
+ } from "../pagination";
12
+
13
+ const meta = {
14
+ title: "Navigation & Menus/Pagination",
15
+ component: Pagination,
16
+ parameters: {
17
+ layout: "centered",
18
+ docs: {
19
+ description: {
20
+ component:
21
+ "A comprehensive pagination component for navigating through large datasets. Built on shadcn/ui standards with full accessibility support and responsive design. Perfect for data tables, search results, and product listings.",
22
+ },
23
+ },
24
+ },
25
+ tags: ["autodocs"],
26
+ } satisfies Meta<typeof Pagination>;
27
+
28
+ export default meta;
29
+ type Story = StoryObj<typeof meta>;
30
+
31
+ /**
32
+ * Interactive playground for testing all pagination features and controls.
33
+ * Supports dynamic page changes, disabled states, and various configurations.
34
+ */
35
+ export const Interactive: Story = {
36
+ render: function InteractivePagination() {
37
+ const [currentPage, setCurrentPage] = React.useState(5);
38
+ const [totalPages, setTotalPages] = React.useState(20);
39
+ const [showEllipsis, setShowEllipsis] = React.useState(true);
40
+
41
+ const renderPageNumbers = () => {
42
+ const pages = [];
43
+ const maxVisible = showEllipsis ? 5 : totalPages;
44
+
45
+ if (!showEllipsis) {
46
+ // Show all pages when ellipsis is disabled
47
+ for (let i = 1; i <= totalPages; i++) {
48
+ pages.push(
49
+ <PaginationItem key={i}>
50
+ <PaginationLink
51
+ href="#"
52
+ isActive={i === currentPage}
53
+ onClick={(e) => {
54
+ e.preventDefault();
55
+ setCurrentPage(i);
56
+ }}
57
+ >
58
+ {i}
59
+ </PaginationLink>
60
+ </PaginationItem>
61
+ );
62
+ }
63
+ return pages;
64
+ }
65
+
66
+ // Smart ellipsis logic for large page ranges
67
+ let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
68
+ let endPage = Math.min(totalPages, startPage + maxVisible - 1);
69
+
70
+ if (endPage - startPage < maxVisible - 1) {
71
+ startPage = Math.max(1, endPage - maxVisible + 1);
72
+ }
73
+
74
+ // Always show first page
75
+ if (startPage > 1) {
76
+ pages.push(
77
+ <PaginationItem key={1}>
78
+ <PaginationLink
79
+ href="#"
80
+ onClick={(e) => {
81
+ e.preventDefault();
82
+ setCurrentPage(1);
83
+ }}
84
+ >
85
+ 1
86
+ </PaginationLink>
87
+ </PaginationItem>
88
+ );
89
+ if (startPage > 2) {
90
+ pages.push(
91
+ <PaginationItem key="ellipsis-start">
92
+ <PaginationEllipsis />
93
+ </PaginationItem>
94
+ );
95
+ }
96
+ }
97
+
98
+ // Show visible page range
99
+ for (let i = startPage; i <= endPage; i++) {
100
+ pages.push(
101
+ <PaginationItem key={i}>
102
+ <PaginationLink
103
+ href="#"
104
+ isActive={i === currentPage}
105
+ onClick={(e) => {
106
+ e.preventDefault();
107
+ setCurrentPage(i);
108
+ }}
109
+ >
110
+ {i}
111
+ </PaginationLink>
112
+ </PaginationItem>
113
+ );
114
+ }
115
+
116
+ // Always show last page
117
+ if (endPage < totalPages) {
118
+ if (endPage < totalPages - 1) {
119
+ pages.push(
120
+ <PaginationItem key="ellipsis-end">
121
+ <PaginationEllipsis />
122
+ </PaginationItem>
123
+ );
124
+ }
125
+ pages.push(
126
+ <PaginationItem key={totalPages}>
127
+ <PaginationLink
128
+ href="#"
129
+ onClick={(e) => {
130
+ e.preventDefault();
131
+ setCurrentPage(totalPages);
132
+ }}
133
+ >
134
+ {totalPages}
135
+ </PaginationLink>
136
+ </PaginationItem>
137
+ );
138
+ }
139
+
140
+ return pages;
141
+ };
142
+
143
+ return (
144
+ <div className="space-y-6 p-4">
145
+ {/* Controls */}
146
+ <div className="space-y-4 text-sm">
147
+ <div className="flex gap-4 items-center">
148
+ <label className="font-medium">Current Page:</label>
149
+ <input
150
+ type="number"
151
+ min="1"
152
+ max={totalPages}
153
+ value={currentPage}
154
+ onChange={(e) => setCurrentPage(Math.min(totalPages, Math.max(1, parseInt(e.target.value) || 1)))}
155
+ className="border rounded px-2 py-1 w-20"
156
+ />
157
+ </div>
158
+ <div className="flex gap-4 items-center">
159
+ <label className="font-medium">Total Pages:</label>
160
+ <input
161
+ type="number"
162
+ min="1"
163
+ max="100"
164
+ value={totalPages}
165
+ onChange={(e) => {
166
+ const newTotal = parseInt(e.target.value) || 1;
167
+ setTotalPages(newTotal);
168
+ setCurrentPage(Math.min(currentPage, newTotal));
169
+ }}
170
+ className="border rounded px-2 py-1 w-20"
171
+ />
172
+ </div>
173
+ <div className="flex gap-4 items-center">
174
+ <label className="font-medium">Show Ellipsis:</label>
175
+ <input
176
+ type="checkbox"
177
+ checked={showEllipsis}
178
+ onChange={(e) => setShowEllipsis(e.target.checked)}
179
+ className="w-4 h-4"
180
+ />
181
+ </div>
182
+ </div>
183
+
184
+ {/* Pagination Component */}
185
+ <div className="border rounded-lg p-4 bg-background">
186
+ <Pagination>
187
+ <PaginationContent>
188
+ <PaginationItem>
189
+ <PaginationPrevious
190
+ href="#"
191
+ onClick={(e) => {
192
+ e.preventDefault();
193
+ setCurrentPage(Math.max(1, currentPage - 1));
194
+ }}
195
+ className={currentPage === 1 ? "pointer-events-none opacity-50" : ""}
196
+ />
197
+ </PaginationItem>
198
+ {renderPageNumbers()}
199
+ <PaginationItem>
200
+ <PaginationNext
201
+ href="#"
202
+ onClick={(e) => {
203
+ e.preventDefault();
204
+ setCurrentPage(Math.min(totalPages, currentPage + 1));
205
+ }}
206
+ className={currentPage === totalPages ? "pointer-events-none opacity-50" : ""}
207
+ />
208
+ </PaginationItem>
209
+ </PaginationContent>
210
+ </Pagination>
211
+ </div>
212
+
213
+ {/* Status */}
214
+ <div className="text-center text-sm text-muted-foreground">
215
+ Page {currentPage} of {totalPages}
216
+ </div>
217
+ </div>
218
+ );
219
+ },
220
+ parameters: {
221
+ docs: {
222
+ description: {
223
+ story: "Interactive pagination with customizable settings. Test different page counts, current page positions, and ellipsis behavior.",
224
+ },
225
+ },
226
+ },
227
+ };
228
+
229
+ /**
230
+ * Systematic showcase of all pagination variants and states.
231
+ * Demonstrates different pagination configurations side by side.
232
+ */
233
+ export const Variants: Story = {
234
+ render: () => (
235
+ <div className="space-y-8 w-full max-w-4xl">
236
+ {/* Basic 3-page pagination */}
237
+ <div className="space-y-2">
238
+ <h3 className="text-sm font-medium text-muted-foreground">Basic - Few Pages</h3>
239
+ <Pagination>
240
+ <PaginationContent>
241
+ <PaginationItem>
242
+ <PaginationPrevious href="#" />
243
+ </PaginationItem>
244
+ <PaginationItem>
245
+ <PaginationLink href="#">1</PaginationLink>
246
+ </PaginationItem>
247
+ <PaginationItem>
248
+ <PaginationLink href="#" isActive>2</PaginationLink>
249
+ </PaginationItem>
250
+ <PaginationItem>
251
+ <PaginationLink href="#">3</PaginationLink>
252
+ </PaginationItem>
253
+ <PaginationItem>
254
+ <PaginationNext href="#" />
255
+ </PaginationItem>
256
+ </PaginationContent>
257
+ </Pagination>
258
+ </div>
259
+
260
+ {/* First page with ellipsis */}
261
+ <div className="space-y-2">
262
+ <h3 className="text-sm font-medium text-muted-foreground">First Page - With Ellipsis</h3>
263
+ <Pagination>
264
+ <PaginationContent>
265
+ <PaginationItem>
266
+ <PaginationPrevious href="#" className="pointer-events-none opacity-50" />
267
+ </PaginationItem>
268
+ <PaginationItem>
269
+ <PaginationLink href="#" isActive>1</PaginationLink>
270
+ </PaginationItem>
271
+ <PaginationItem>
272
+ <PaginationLink href="#">2</PaginationLink>
273
+ </PaginationItem>
274
+ <PaginationItem>
275
+ <PaginationLink href="#">3</PaginationLink>
276
+ </PaginationItem>
277
+ <PaginationItem>
278
+ <PaginationEllipsis />
279
+ </PaginationItem>
280
+ <PaginationItem>
281
+ <PaginationLink href="#">50</PaginationLink>
282
+ </PaginationItem>
283
+ <PaginationItem>
284
+ <PaginationNext href="#" />
285
+ </PaginationItem>
286
+ </PaginationContent>
287
+ </Pagination>
288
+ </div>
289
+
290
+ {/* Middle page with double ellipsis */}
291
+ <div className="space-y-2">
292
+ <h3 className="text-sm font-medium text-muted-foreground">Middle Page - Double Ellipsis</h3>
293
+ <Pagination>
294
+ <PaginationContent>
295
+ <PaginationItem>
296
+ <PaginationPrevious href="#" />
297
+ </PaginationItem>
298
+ <PaginationItem>
299
+ <PaginationLink href="#">1</PaginationLink>
300
+ </PaginationItem>
301
+ <PaginationItem>
302
+ <PaginationEllipsis />
303
+ </PaginationItem>
304
+ <PaginationItem>
305
+ <PaginationLink href="#">24</PaginationLink>
306
+ </PaginationItem>
307
+ <PaginationItem>
308
+ <PaginationLink href="#" isActive>25</PaginationLink>
309
+ </PaginationItem>
310
+ <PaginationItem>
311
+ <PaginationLink href="#">26</PaginationLink>
312
+ </PaginationItem>
313
+ <PaginationItem>
314
+ <PaginationEllipsis />
315
+ </PaginationItem>
316
+ <PaginationItem>
317
+ <PaginationLink href="#">50</PaginationLink>
318
+ </PaginationItem>
319
+ <PaginationItem>
320
+ <PaginationNext href="#" />
321
+ </PaginationItem>
322
+ </PaginationContent>
323
+ </Pagination>
324
+ </div>
325
+
326
+ {/* Last page */}
327
+ <div className="space-y-2">
328
+ <h3 className="text-sm font-medium text-muted-foreground">Last Page - End State</h3>
329
+ <Pagination>
330
+ <PaginationContent>
331
+ <PaginationItem>
332
+ <PaginationPrevious href="#" />
333
+ </PaginationItem>
334
+ <PaginationItem>
335
+ <PaginationLink href="#">1</PaginationLink>
336
+ </PaginationItem>
337
+ <PaginationItem>
338
+ <PaginationEllipsis />
339
+ </PaginationItem>
340
+ <PaginationItem>
341
+ <PaginationLink href="#">48</PaginationLink>
342
+ </PaginationItem>
343
+ <PaginationItem>
344
+ <PaginationLink href="#">49</PaginationLink>
345
+ </PaginationItem>
346
+ <PaginationItem>
347
+ <PaginationLink href="#" isActive>50</PaginationLink>
348
+ </PaginationItem>
349
+ <PaginationItem>
350
+ <PaginationNext href="#" className="pointer-events-none opacity-50" />
351
+ </PaginationItem>
352
+ </PaginationContent>
353
+ </Pagination>
354
+ </div>
355
+
356
+ {/* Single page */}
357
+ <div className="space-y-2">
358
+ <h3 className="text-sm font-medium text-muted-foreground">Single Page - Minimal</h3>
359
+ <Pagination>
360
+ <PaginationContent>
361
+ <PaginationItem>
362
+ <PaginationPrevious href="#" className="pointer-events-none opacity-50" />
363
+ </PaginationItem>
364
+ <PaginationItem>
365
+ <PaginationLink href="#" isActive>1</PaginationLink>
366
+ </PaginationItem>
367
+ <PaginationItem>
368
+ <PaginationNext href="#" className="pointer-events-none opacity-50" />
369
+ </PaginationItem>
370
+ </PaginationContent>
371
+ </Pagination>
372
+ </div>
373
+
374
+ {/* Responsive example */}
375
+ <div className="space-y-2">
376
+ <h3 className="text-sm font-medium text-muted-foreground">Responsive - Mobile Optimized</h3>
377
+ <div className="w-full max-w-xs mx-auto">
378
+ <Pagination>
379
+ <PaginationContent>
380
+ <PaginationItem>
381
+ <PaginationPrevious href="#" />
382
+ </PaginationItem>
383
+ <PaginationItem className="hidden sm:block">
384
+ <PaginationLink href="#">1</PaginationLink>
385
+ </PaginationItem>
386
+ <PaginationItem>
387
+ <PaginationLink href="#" isActive>5</PaginationLink>
388
+ </PaginationItem>
389
+ <PaginationItem className="hidden sm:block">
390
+ <PaginationLink href="#">10</PaginationLink>
391
+ </PaginationItem>
392
+ <PaginationItem>
393
+ <PaginationNext href="#" />
394
+ </PaginationItem>
395
+ </PaginationContent>
396
+ </Pagination>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ ),
401
+ parameters: {
402
+ docs: {
403
+ description: {
404
+ story: "Comprehensive showcase of pagination variants including first page, middle page, last page, single page, and responsive layouts.",
405
+ },
406
+ },
407
+ },
408
+ };
409
+
410
+ /**
411
+ * Real-world pagination usage in a data table context.
412
+ * Shows how pagination integrates with actual content and user workflows.
413
+ */
414
+ export const InContext: Story = {
415
+ render: function PaginationInContext() {
416
+ const [currentPage, setCurrentPage] = React.useState(3);
417
+ const totalPages = 15;
418
+ const itemsPerPage = 10;
419
+ const totalItems = 147;
420
+
421
+ // Mock data for demonstration
422
+ const currentItems = Array.from({ length: itemsPerPage }, (_, i) => ({
423
+ id: (currentPage - 1) * itemsPerPage + i + 1,
424
+ name: `Product ${(currentPage - 1) * itemsPerPage + i + 1}`,
425
+ category: ["Electronics", "Clothing", "Books", "Home"][Math.floor(Math.random() * 4)],
426
+ price: Math.floor(Math.random() * 200) + 10,
427
+ status: ["In Stock", "Low Stock", "Out of Stock"][Math.floor(Math.random() * 3)],
428
+ }));
429
+
430
+ const handlePageChange = (page: number) => {
431
+ setCurrentPage(page);
432
+ // In real app: fetch new data, update URL, etc.
433
+ };
434
+
435
+ const renderPageNumbers = () => {
436
+ const pages = [];
437
+ const maxVisible = 5;
438
+ let startPage = Math.max(1, currentPage - Math.floor(maxVisible / 2));
439
+ let endPage = Math.min(totalPages, startPage + maxVisible - 1);
440
+
441
+ if (endPage - startPage < maxVisible - 1) {
442
+ startPage = Math.max(1, endPage - maxVisible + 1);
443
+ }
444
+
445
+ if (startPage > 1) {
446
+ pages.push(
447
+ <PaginationItem key={1}>
448
+ <PaginationLink
449
+ href="#"
450
+ onClick={(e) => {
451
+ e.preventDefault();
452
+ handlePageChange(1);
453
+ }}
454
+ >
455
+ 1
456
+ </PaginationLink>
457
+ </PaginationItem>
458
+ );
459
+ if (startPage > 2) {
460
+ pages.push(
461
+ <PaginationItem key="ellipsis-start">
462
+ <PaginationEllipsis />
463
+ </PaginationItem>
464
+ );
465
+ }
466
+ }
467
+
468
+ for (let i = startPage; i <= endPage; i++) {
469
+ pages.push(
470
+ <PaginationItem key={i}>
471
+ <PaginationLink
472
+ href="#"
473
+ isActive={i === currentPage}
474
+ onClick={(e) => {
475
+ e.preventDefault();
476
+ handlePageChange(i);
477
+ }}
478
+ >
479
+ {i}
480
+ </PaginationLink>
481
+ </PaginationItem>
482
+ );
483
+ }
484
+
485
+ if (endPage < totalPages) {
486
+ if (endPage < totalPages - 1) {
487
+ pages.push(
488
+ <PaginationItem key="ellipsis-end">
489
+ <PaginationEllipsis />
490
+ </PaginationItem>
491
+ );
492
+ }
493
+ pages.push(
494
+ <PaginationItem key={totalPages}>
495
+ <PaginationLink
496
+ href="#"
497
+ onClick={(e) => {
498
+ e.preventDefault();
499
+ handlePageChange(totalPages);
500
+ }}
501
+ >
502
+ {totalPages}
503
+ </PaginationLink>
504
+ </PaginationItem>
505
+ );
506
+ }
507
+
508
+ return pages;
509
+ };
510
+
511
+ return (
512
+ <div className="w-full max-w-4xl space-y-4">
513
+ {/* Data Table Header */}
514
+ <div className="flex justify-between items-center">
515
+ <div>
516
+ <h2 className="text-lg font-semibold">Products</h2>
517
+ <p className="text-sm text-muted-foreground">
518
+ Showing {(currentPage - 1) * itemsPerPage + 1}-{Math.min(currentPage * itemsPerPage, totalItems)} of {totalItems} products
519
+ </p>
520
+ </div>
521
+ <div className="text-sm text-muted-foreground">
522
+ Page {currentPage} of {totalPages}
523
+ </div>
524
+ </div>
525
+
526
+ {/* Data Table */}
527
+ <div className="border rounded-lg overflow-hidden">
528
+ <table className="w-full">
529
+ <thead className="bg-muted/50">
530
+ <tr>
531
+ <th className="text-left p-3 font-medium">Product</th>
532
+ <th className="text-left p-3 font-medium">Category</th>
533
+ <th className="text-left p-3 font-medium">Price</th>
534
+ <th className="text-left p-3 font-medium">Status</th>
535
+ </tr>
536
+ </thead>
537
+ <tbody>
538
+ {currentItems.map((item, index) => (
539
+ <tr key={item.id} className={index % 2 === 0 ? "bg-background" : "bg-muted/20"}>
540
+ <td className="p-3">{item.name}</td>
541
+ <td className="p-3">{item.category}</td>
542
+ <td className="p-3">${item.price}</td>
543
+ <td className="p-3">
544
+ <span
545
+ className={`inline-flex px-2 py-1 rounded-full text-xs font-medium ${
546
+ item.status === "In Stock"
547
+ ? "bg-green-100 text-green-800"
548
+ : item.status === "Low Stock"
549
+ ? "bg-yellow-100 text-yellow-800"
550
+ : "bg-red-100 text-red-800"
551
+ }`}
552
+ >
553
+ {item.status}
554
+ </span>
555
+ </td>
556
+ </tr>
557
+ ))}
558
+ </tbody>
559
+ </table>
560
+ </div>
561
+
562
+ {/* Pagination */}
563
+ <div className="flex items-center justify-between pt-4">
564
+ <div className="text-sm text-muted-foreground">
565
+ Showing {(currentPage - 1) * itemsPerPage + 1} to {Math.min(currentPage * itemsPerPage, totalItems)} of {totalItems} results
566
+ </div>
567
+
568
+ <Pagination>
569
+ <PaginationContent>
570
+ <PaginationItem>
571
+ <PaginationPrevious
572
+ href="#"
573
+ onClick={(e) => {
574
+ e.preventDefault();
575
+ handlePageChange(Math.max(1, currentPage - 1));
576
+ }}
577
+ className={currentPage === 1 ? "pointer-events-none opacity-50" : ""}
578
+ />
579
+ </PaginationItem>
580
+ {renderPageNumbers()}
581
+ <PaginationItem>
582
+ <PaginationNext
583
+ href="#"
584
+ onClick={(e) => {
585
+ e.preventDefault();
586
+ handlePageChange(Math.min(totalPages, currentPage + 1));
587
+ }}
588
+ className={currentPage === totalPages ? "pointer-events-none opacity-50" : ""}
589
+ />
590
+ </PaginationItem>
591
+ </PaginationContent>
592
+ </Pagination>
593
+ </div>
594
+ </div>
595
+ );
596
+ },
597
+ parameters: {
598
+ docs: {
599
+ description: {
600
+ story: "Real-world example showing pagination integrated with a data table. Demonstrates how pagination works in context with actual content, including result counts and status indicators.",
601
+ },
602
+ },
603
+ },
604
+ };