@neynar/ui 0.2.1 → 0.3.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 (547) hide show
  1. package/{llm-docs → .llm}/a.llm.md +2 -16
  2. package/{llm-docs → .llm}/badge.llm.md +16 -21
  3. package/{llm-docs → .llm}/blockquote.llm.md +1 -6
  4. package/.llm/button-group-separator.llm.md +53 -0
  5. package/.llm/button-group-text.llm.md +56 -0
  6. package/.llm/button-group.llm.md +81 -0
  7. package/{llm-docs → .llm}/button.llm.md +1 -1
  8. package/{llm-docs → .llm}/code.llm.md +1 -6
  9. package/.llm/empty-content.llm.md +103 -0
  10. package/.llm/empty-description.llm.md +70 -0
  11. package/.llm/empty-header.llm.md +64 -0
  12. package/.llm/empty-media.llm.md +81 -0
  13. package/.llm/empty-title.llm.md +54 -0
  14. package/.llm/empty.llm.md +158 -0
  15. package/.llm/field-content.llm.md +28 -0
  16. package/.llm/field-description.llm.md +28 -0
  17. package/.llm/field-error.llm.md +41 -0
  18. package/.llm/field-group.llm.md +84 -0
  19. package/.llm/field-label.llm.md +28 -0
  20. package/.llm/field-legend.llm.md +77 -0
  21. package/.llm/field-separator.llm.md +35 -0
  22. package/.llm/field-set.llm.md +80 -0
  23. package/.llm/field-title.llm.md +28 -0
  24. package/.llm/field.llm.md +35 -0
  25. package/{llm-docs → .llm}/h1.llm.md +2 -7
  26. package/{llm-docs → .llm}/h2.llm.md +2 -7
  27. package/{llm-docs → .llm}/h3.llm.md +2 -7
  28. package/{llm-docs → .llm}/h4.llm.md +2 -7
  29. package/{llm-docs → .llm}/h5.llm.md +2 -7
  30. package/{llm-docs → .llm}/h6.llm.md +1 -6
  31. package/.llm/input-group-addon.llm.md +91 -0
  32. package/.llm/input-group-button.llm.md +120 -0
  33. package/.llm/input-group-input.llm.md +145 -0
  34. package/.llm/input-group-text.llm.md +75 -0
  35. package/.llm/input-group-textarea.llm.md +157 -0
  36. package/.llm/input-group.llm.md +108 -0
  37. package/.llm/item-actions.llm.md +77 -0
  38. package/.llm/item-content.llm.md +73 -0
  39. package/.llm/item-description.llm.md +61 -0
  40. package/.llm/item-footer.llm.md +68 -0
  41. package/.llm/item-group.llm.md +73 -0
  42. package/.llm/item-header.llm.md +66 -0
  43. package/.llm/item-media.llm.md +75 -0
  44. package/.llm/item-separator.llm.md +80 -0
  45. package/.llm/item-title.llm.md +59 -0
  46. package/.llm/item.llm.md +115 -0
  47. package/.llm/kbd-group.llm.md +71 -0
  48. package/.llm/kbd.llm.md +71 -0
  49. package/{llm-docs → .llm}/lead.llm.md +1 -6
  50. package/{llm-docs → .llm}/p.llm.md +1 -6
  51. package/{llm-docs → .llm}/sdk-items-registry.json +390 -6
  52. package/{llm-docs → .llm}/small.llm.md +1 -6
  53. package/{llm-docs → .llm}/span.llm.md +2 -16
  54. package/.llm/spinner.llm.md +182 -0
  55. package/{llm-docs → .llm}/strong.llm.md +1 -6
  56. package/{llm-docs → .llm}/typography.llm.md +2 -16
  57. package/dist/components/ui/button-group.d.ts +448 -0
  58. package/dist/components/ui/button-group.d.ts.map +1 -0
  59. package/dist/components/ui/button.d.ts +1 -1
  60. package/dist/components/ui/button.d.ts.map +1 -1
  61. package/dist/components/ui/empty-state.d.ts +1 -0
  62. package/dist/components/ui/empty-state.d.ts.map +1 -1
  63. package/dist/components/ui/empty.d.ts +630 -0
  64. package/dist/components/ui/empty.d.ts.map +1 -0
  65. package/dist/components/ui/field.d.ts +238 -0
  66. package/dist/components/ui/field.d.ts.map +1 -0
  67. package/dist/components/ui/input-group.d.ts +636 -0
  68. package/dist/components/ui/input-group.d.ts.map +1 -0
  69. package/dist/components/ui/item.d.ts +766 -0
  70. package/dist/components/ui/item.d.ts.map +1 -0
  71. package/dist/components/ui/kbd.d.ts +149 -0
  72. package/dist/components/ui/kbd.d.ts.map +1 -0
  73. package/dist/components/ui/scroll-area.d.ts +5 -5
  74. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  75. package/dist/components/ui/spinner.d.ts +194 -0
  76. package/dist/components/ui/spinner.d.ts.map +1 -0
  77. package/dist/components/ui/stack.d.ts.map +1 -1
  78. package/dist/components/ui/stories/accordion.stories.d.ts +0 -1
  79. package/dist/components/ui/stories/accordion.stories.d.ts.map +1 -1
  80. package/dist/components/ui/stories/alert-dialog.stories.d.ts +0 -1
  81. package/dist/components/ui/stories/alert-dialog.stories.d.ts.map +1 -1
  82. package/dist/components/ui/stories/alert.stories.d.ts +0 -1
  83. package/dist/components/ui/stories/alert.stories.d.ts.map +1 -1
  84. package/dist/components/ui/stories/aspect-ratio.stories.d.ts +0 -1
  85. package/dist/components/ui/stories/aspect-ratio.stories.d.ts.map +1 -1
  86. package/dist/components/ui/stories/avatar.stories.d.ts +0 -1
  87. package/dist/components/ui/stories/avatar.stories.d.ts.map +1 -1
  88. package/dist/components/ui/stories/badge.stories.d.ts +0 -1
  89. package/dist/components/ui/stories/badge.stories.d.ts.map +1 -1
  90. package/dist/components/ui/stories/breadcrumb.stories.d.ts +0 -1
  91. package/dist/components/ui/stories/breadcrumb.stories.d.ts.map +1 -1
  92. package/dist/components/ui/stories/button-group.stories.d.ts +48 -0
  93. package/dist/components/ui/stories/button-group.stories.d.ts.map +1 -0
  94. package/dist/components/ui/stories/button.stories.d.ts +0 -1
  95. package/dist/components/ui/stories/button.stories.d.ts.map +1 -1
  96. package/dist/components/ui/stories/calendar.stories.d.ts +0 -1
  97. package/dist/components/ui/stories/calendar.stories.d.ts.map +1 -1
  98. package/dist/components/ui/stories/card.stories.d.ts +0 -1
  99. package/dist/components/ui/stories/card.stories.d.ts.map +1 -1
  100. package/dist/components/ui/stories/carousel.stories.d.ts +0 -1
  101. package/dist/components/ui/stories/carousel.stories.d.ts.map +1 -1
  102. package/dist/components/ui/stories/chart.stories.d.ts +0 -1
  103. package/dist/components/ui/stories/chart.stories.d.ts.map +1 -1
  104. package/dist/components/ui/stories/checkbox.stories.d.ts +0 -1
  105. package/dist/components/ui/stories/checkbox.stories.d.ts.map +1 -1
  106. package/dist/components/ui/stories/cn.stories.d.ts.map +1 -1
  107. package/dist/components/ui/stories/collapsible.stories.d.ts +0 -1
  108. package/dist/components/ui/stories/collapsible.stories.d.ts.map +1 -1
  109. package/dist/components/ui/stories/colors.stories.d.ts +0 -1
  110. package/dist/components/ui/stories/colors.stories.d.ts.map +1 -1
  111. package/dist/components/ui/stories/combobox.stories.d.ts +0 -1
  112. package/dist/components/ui/stories/combobox.stories.d.ts.map +1 -1
  113. package/dist/components/ui/stories/command.stories.d.ts +0 -1
  114. package/dist/components/ui/stories/command.stories.d.ts.map +1 -1
  115. package/dist/components/ui/stories/container.stories.d.ts +0 -1
  116. package/dist/components/ui/stories/container.stories.d.ts.map +1 -1
  117. package/dist/components/ui/stories/context-menu.stories.d.ts +0 -1
  118. package/dist/components/ui/stories/context-menu.stories.d.ts.map +1 -1
  119. package/dist/components/ui/stories/date-picker.stories.d.ts +0 -1
  120. package/dist/components/ui/stories/date-picker.stories.d.ts.map +1 -1
  121. package/dist/components/ui/stories/dialog.stories.d.ts +0 -1
  122. package/dist/components/ui/stories/dialog.stories.d.ts.map +1 -1
  123. package/dist/components/ui/stories/drawer.stories.d.ts +0 -1
  124. package/dist/components/ui/stories/drawer.stories.d.ts.map +1 -1
  125. package/dist/components/ui/stories/dropdown-menu.stories.d.ts +0 -1
  126. package/dist/components/ui/stories/dropdown-menu.stories.d.ts.map +1 -1
  127. package/dist/components/ui/stories/empty-state.stories.d.ts +0 -1
  128. package/dist/components/ui/stories/empty-state.stories.d.ts.map +1 -1
  129. package/dist/components/ui/stories/empty.stories.d.ts +38 -0
  130. package/dist/components/ui/stories/empty.stories.d.ts.map +1 -0
  131. package/dist/components/ui/stories/field.stories.d.ts +48 -0
  132. package/dist/components/ui/stories/field.stories.d.ts.map +1 -0
  133. package/dist/components/ui/stories/hover-card.stories.d.ts +0 -1
  134. package/dist/components/ui/stories/hover-card.stories.d.ts.map +1 -1
  135. package/dist/components/ui/stories/input-group.stories.d.ts +37 -0
  136. package/dist/components/ui/stories/input-group.stories.d.ts.map +1 -0
  137. package/dist/components/ui/stories/input.stories.d.ts +0 -1
  138. package/dist/components/ui/stories/input.stories.d.ts.map +1 -1
  139. package/dist/components/ui/stories/item.stories.d.ts +61 -0
  140. package/dist/components/ui/stories/item.stories.d.ts.map +1 -0
  141. package/dist/components/ui/stories/kbd.stories.d.ts +37 -0
  142. package/dist/components/ui/stories/kbd.stories.d.ts.map +1 -0
  143. package/dist/components/ui/stories/label.stories.d.ts +0 -1
  144. package/dist/components/ui/stories/label.stories.d.ts.map +1 -1
  145. package/dist/components/ui/stories/menubar.stories.d.ts +0 -1
  146. package/dist/components/ui/stories/menubar.stories.d.ts.map +1 -1
  147. package/dist/components/ui/stories/navigation-menu.stories.d.ts +0 -1
  148. package/dist/components/ui/stories/navigation-menu.stories.d.ts.map +1 -1
  149. package/dist/components/ui/stories/pagination.stories.d.ts +0 -1
  150. package/dist/components/ui/stories/pagination.stories.d.ts.map +1 -1
  151. package/dist/components/ui/stories/popover.stories.d.ts +0 -1
  152. package/dist/components/ui/stories/popover.stories.d.ts.map +1 -1
  153. package/dist/components/ui/stories/progress.stories.d.ts +0 -1
  154. package/dist/components/ui/stories/progress.stories.d.ts.map +1 -1
  155. package/dist/components/ui/stories/radio-group.stories.d.ts +0 -1
  156. package/dist/components/ui/stories/radio-group.stories.d.ts.map +1 -1
  157. package/dist/components/ui/stories/resizable.stories.d.ts +0 -1
  158. package/dist/components/ui/stories/resizable.stories.d.ts.map +1 -1
  159. package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -2
  160. package/dist/components/ui/stories/scroll-area.stories.d.ts.map +1 -1
  161. package/dist/components/ui/stories/select.stories.d.ts +0 -1
  162. package/dist/components/ui/stories/select.stories.d.ts.map +1 -1
  163. package/dist/components/ui/stories/separator.stories.d.ts +0 -1
  164. package/dist/components/ui/stories/separator.stories.d.ts.map +1 -1
  165. package/dist/components/ui/stories/sheet.stories.d.ts +0 -1
  166. package/dist/components/ui/stories/sheet.stories.d.ts.map +1 -1
  167. package/dist/components/ui/stories/sidebar.stories.d.ts +0 -1
  168. package/dist/components/ui/stories/sidebar.stories.d.ts.map +1 -1
  169. package/dist/components/ui/stories/skeleton.stories.d.ts +0 -1
  170. package/dist/components/ui/stories/skeleton.stories.d.ts.map +1 -1
  171. package/dist/components/ui/stories/slider.stories.d.ts +0 -1
  172. package/dist/components/ui/stories/slider.stories.d.ts.map +1 -1
  173. package/dist/components/ui/stories/sonner.stories.d.ts.map +1 -1
  174. package/dist/components/ui/stories/spinner.stories.d.ts +37 -0
  175. package/dist/components/ui/stories/spinner.stories.d.ts.map +1 -0
  176. package/dist/components/ui/stories/stack.stories.d.ts +0 -1
  177. package/dist/components/ui/stories/stack.stories.d.ts.map +1 -1
  178. package/dist/components/ui/stories/switch.stories.d.ts +0 -1
  179. package/dist/components/ui/stories/switch.stories.d.ts.map +1 -1
  180. package/dist/components/ui/stories/table.stories.d.ts +0 -1
  181. package/dist/components/ui/stories/table.stories.d.ts.map +1 -1
  182. package/dist/components/ui/stories/tabs.stories.d.ts +0 -1
  183. package/dist/components/ui/stories/tabs.stories.d.ts.map +1 -1
  184. package/dist/components/ui/stories/text-field.stories.d.ts +0 -1
  185. package/dist/components/ui/stories/text-field.stories.d.ts.map +1 -1
  186. package/dist/components/ui/stories/textarea.stories.d.ts +0 -1
  187. package/dist/components/ui/stories/textarea.stories.d.ts.map +1 -1
  188. package/dist/components/ui/stories/theme-toggle.stories.d.ts +0 -1
  189. package/dist/components/ui/stories/theme-toggle.stories.d.ts.map +1 -1
  190. package/dist/components/ui/stories/theme.stories.d.ts +0 -1
  191. package/dist/components/ui/stories/theme.stories.d.ts.map +1 -1
  192. package/dist/components/ui/stories/toggle-group.stories.d.ts +0 -1
  193. package/dist/components/ui/stories/toggle-group.stories.d.ts.map +1 -1
  194. package/dist/components/ui/stories/toggle.stories.d.ts +0 -1
  195. package/dist/components/ui/stories/toggle.stories.d.ts.map +1 -1
  196. package/dist/components/ui/stories/tooltip.stories.d.ts +0 -1
  197. package/dist/components/ui/stories/tooltip.stories.d.ts.map +1 -1
  198. package/dist/components/ui/stories/typography.stories.d.ts +0 -1
  199. package/dist/components/ui/stories/typography.stories.d.ts.map +1 -1
  200. package/dist/components/ui/stories/use-mobile.stories.d.ts.map +1 -1
  201. package/dist/components/ui/stories/use-theme.stories.d.ts.map +1 -1
  202. package/dist/components/ui/theme-toggle.d.ts +0 -3
  203. package/dist/components/ui/theme-toggle.d.ts.map +1 -1
  204. package/dist/components/ui/theme.d.ts.map +1 -1
  205. package/dist/components/ui/typography.d.ts +12 -11
  206. package/dist/components/ui/typography.d.ts.map +1 -1
  207. package/dist/index.d.ts +7 -0
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +4973 -2353
  210. package/dist/index.js.map +1 -1
  211. package/dist/tsconfig.tsbuildinfo +1 -1
  212. package/docs/llm/components/display.md +125 -0
  213. package/docs/llm/components/feedback.md +0 -14
  214. package/docs/llm/components/forms.md +94 -0
  215. package/docs/llm/components/layout.md +169 -0
  216. package/llms.txt +18 -12
  217. package/package.json +7 -6
  218. package/src/components/ui/button-group.tsx +525 -0
  219. package/src/components/ui/button.tsx +9 -12
  220. package/src/components/ui/empty-state.tsx +1 -0
  221. package/src/components/ui/empty.tsx +793 -0
  222. package/src/components/ui/field.tsx +494 -0
  223. package/src/components/ui/input-group.tsx +801 -0
  224. package/src/components/ui/item.tsx +955 -0
  225. package/src/components/ui/kbd.tsx +175 -0
  226. package/src/components/ui/skeleton.tsx +1 -1
  227. package/src/components/ui/spinner.tsx +211 -0
  228. package/src/components/ui/stack.tsx +3 -1
  229. package/src/components/ui/stories/accordion.stories.tsx +0 -1
  230. package/src/components/ui/stories/alert-dialog.stories.tsx +0 -1
  231. package/src/components/ui/stories/alert.stories.tsx +0 -1
  232. package/src/components/ui/stories/aspect-ratio.stories.tsx +0 -1
  233. package/src/components/ui/stories/avatar.stories.tsx +0 -1
  234. package/src/components/ui/stories/badge.stories.tsx +0 -1
  235. package/src/components/ui/stories/breadcrumb.stories.tsx +0 -1
  236. package/src/components/ui/stories/button-group.stories.tsx +300 -0
  237. package/src/components/ui/stories/button.stories.tsx +0 -1
  238. package/src/components/ui/stories/calendar.stories.tsx +0 -1
  239. package/src/components/ui/stories/card.stories.tsx +0 -1
  240. package/src/components/ui/stories/carousel.stories.tsx +0 -1
  241. package/src/components/ui/stories/chart.stories.tsx +0 -1
  242. package/src/components/ui/stories/checkbox.stories.tsx +0 -1
  243. package/src/components/ui/stories/cn.stories.tsx +0 -1
  244. package/src/components/ui/stories/collapsible.stories.tsx +0 -1
  245. package/src/components/ui/stories/colors.stories.tsx +0 -1
  246. package/src/components/ui/stories/combobox.stories.tsx +0 -1
  247. package/src/components/ui/stories/command.stories.tsx +0 -1
  248. package/src/components/ui/stories/container.stories.tsx +0 -1
  249. package/src/components/ui/stories/context-menu.stories.tsx +0 -1
  250. package/src/components/ui/stories/date-picker.stories.tsx +0 -1
  251. package/src/components/ui/stories/dialog.stories.tsx +0 -1
  252. package/src/components/ui/stories/drawer.stories.tsx +0 -1
  253. package/src/components/ui/stories/dropdown-menu.stories.tsx +0 -1
  254. package/src/components/ui/stories/empty-state.stories.tsx +0 -1
  255. package/src/components/ui/stories/empty.stories.tsx +293 -0
  256. package/src/components/ui/stories/field.stories.tsx +470 -0
  257. package/src/components/ui/stories/hover-card.stories.tsx +0 -1
  258. package/src/components/ui/stories/input-group.stories.tsx +444 -0
  259. package/src/components/ui/stories/input.stories.tsx +0 -1
  260. package/src/components/ui/stories/item.stories.tsx +601 -0
  261. package/src/components/ui/stories/kbd.stories.tsx +462 -0
  262. package/src/components/ui/stories/label.stories.tsx +0 -1
  263. package/src/components/ui/stories/menubar.stories.tsx +0 -1
  264. package/src/components/ui/stories/navigation-menu.stories.tsx +0 -1
  265. package/src/components/ui/stories/pagination.stories.tsx +0 -1
  266. package/src/components/ui/stories/popover.stories.tsx +0 -1
  267. package/src/components/ui/stories/progress.stories.tsx +0 -1
  268. package/src/components/ui/stories/radio-group.stories.tsx +0 -1
  269. package/src/components/ui/stories/resizable.stories.tsx +0 -1
  270. package/src/components/ui/stories/scroll-area.stories.tsx +0 -1
  271. package/src/components/ui/stories/select.stories.tsx +0 -1
  272. package/src/components/ui/stories/separator.stories.tsx +0 -1
  273. package/src/components/ui/stories/sheet.stories.tsx +0 -1
  274. package/src/components/ui/stories/sidebar.stories.tsx +0 -1
  275. package/src/components/ui/stories/skeleton.stories.tsx +0 -1
  276. package/src/components/ui/stories/slider.stories.tsx +0 -1
  277. package/src/components/ui/stories/sonner.stories.tsx +0 -1
  278. package/src/components/ui/stories/spinner.stories.tsx +356 -0
  279. package/src/components/ui/stories/stack.stories.tsx +0 -1
  280. package/src/components/ui/stories/switch.stories.tsx +0 -1
  281. package/src/components/ui/stories/table.stories.tsx +0 -1
  282. package/src/components/ui/stories/tabs.stories.tsx +0 -1
  283. package/src/components/ui/stories/text-field.stories.tsx +0 -1
  284. package/src/components/ui/stories/textarea.stories.tsx +0 -1
  285. package/src/components/ui/stories/theme-toggle.stories.tsx +0 -1
  286. package/src/components/ui/stories/theme.stories.tsx +0 -1
  287. package/src/components/ui/stories/toggle-group.stories.tsx +0 -1
  288. package/src/components/ui/stories/toggle.stories.tsx +0 -1
  289. package/src/components/ui/stories/tooltip.stories.tsx +0 -1
  290. package/src/components/ui/stories/typography.stories.tsx +5 -2
  291. package/src/components/ui/stories/use-mobile.stories.tsx +0 -1
  292. package/src/components/ui/stories/use-theme.stories.tsx +0 -1
  293. package/src/components/ui/tabs.tsx +1 -1
  294. package/src/components/ui/theme-toggle.tsx +1 -3
  295. package/src/components/ui/theme.tsx +6 -1
  296. package/src/components/ui/typography.tsx +29 -129
  297. package/src/index.ts +7 -0
  298. package/src/styles/globals.css +82 -94
  299. /package/{llm-docs → .llm}/accordion-content.llm.md +0 -0
  300. /package/{llm-docs → .llm}/accordion-item.llm.md +0 -0
  301. /package/{llm-docs → .llm}/accordion-trigger.llm.md +0 -0
  302. /package/{llm-docs → .llm}/accordion.llm.md +0 -0
  303. /package/{llm-docs → .llm}/alert-description.llm.md +0 -0
  304. /package/{llm-docs → .llm}/alert-dialog-action.llm.md +0 -0
  305. /package/{llm-docs → .llm}/alert-dialog-cancel.llm.md +0 -0
  306. /package/{llm-docs → .llm}/alert-dialog-content.llm.md +0 -0
  307. /package/{llm-docs → .llm}/alert-dialog-description.llm.md +0 -0
  308. /package/{llm-docs → .llm}/alert-dialog-footer.llm.md +0 -0
  309. /package/{llm-docs → .llm}/alert-dialog-header.llm.md +0 -0
  310. /package/{llm-docs → .llm}/alert-dialog-overlay.llm.md +0 -0
  311. /package/{llm-docs → .llm}/alert-dialog-portal.llm.md +0 -0
  312. /package/{llm-docs → .llm}/alert-dialog-title.llm.md +0 -0
  313. /package/{llm-docs → .llm}/alert-dialog-trigger.llm.md +0 -0
  314. /package/{llm-docs → .llm}/alert-dialog.llm.md +0 -0
  315. /package/{llm-docs → .llm}/alert-title.llm.md +0 -0
  316. /package/{llm-docs → .llm}/alert.llm.md +0 -0
  317. /package/{llm-docs → .llm}/aspect-ratio.llm.md +0 -0
  318. /package/{llm-docs → .llm}/avatar-fallback.llm.md +0 -0
  319. /package/{llm-docs → .llm}/avatar-image.llm.md +0 -0
  320. /package/{llm-docs → .llm}/avatar.llm.md +0 -0
  321. /package/{llm-docs → .llm}/breadcrumb-ellipsis.llm.md +0 -0
  322. /package/{llm-docs → .llm}/breadcrumb-item.llm.md +0 -0
  323. /package/{llm-docs → .llm}/breadcrumb-link.llm.md +0 -0
  324. /package/{llm-docs → .llm}/breadcrumb-list.llm.md +0 -0
  325. /package/{llm-docs → .llm}/breadcrumb-page.llm.md +0 -0
  326. /package/{llm-docs → .llm}/breadcrumb-separator.llm.md +0 -0
  327. /package/{llm-docs → .llm}/breadcrumb.llm.md +0 -0
  328. /package/{llm-docs → .llm}/calendar-day-button.llm.md +0 -0
  329. /package/{llm-docs → .llm}/calendar.llm.md +0 -0
  330. /package/{llm-docs → .llm}/card-action.llm.md +0 -0
  331. /package/{llm-docs → .llm}/card-content.llm.md +0 -0
  332. /package/{llm-docs → .llm}/card-description.llm.md +0 -0
  333. /package/{llm-docs → .llm}/card-footer.llm.md +0 -0
  334. /package/{llm-docs → .llm}/card-header.llm.md +0 -0
  335. /package/{llm-docs → .llm}/card-title.llm.md +0 -0
  336. /package/{llm-docs → .llm}/card.llm.md +0 -0
  337. /package/{llm-docs → .llm}/carousel-content.llm.md +0 -0
  338. /package/{llm-docs → .llm}/carousel-item.llm.md +0 -0
  339. /package/{llm-docs → .llm}/carousel-next.llm.md +0 -0
  340. /package/{llm-docs → .llm}/carousel-previous.llm.md +0 -0
  341. /package/{llm-docs → .llm}/carousel.llm.md +0 -0
  342. /package/{llm-docs → .llm}/chart-config.llm.md +0 -0
  343. /package/{llm-docs → .llm}/chart-container.llm.md +0 -0
  344. /package/{llm-docs → .llm}/chart-legend-content.llm.md +0 -0
  345. /package/{llm-docs → .llm}/chart-legend.llm.md +0 -0
  346. /package/{llm-docs → .llm}/chart-style.llm.md +0 -0
  347. /package/{llm-docs → .llm}/chart-tooltip-content.llm.md +0 -0
  348. /package/{llm-docs → .llm}/chart-tooltip.llm.md +0 -0
  349. /package/{llm-docs → .llm}/checkbox.llm.md +0 -0
  350. /package/{llm-docs → .llm}/cn.llm.md +0 -0
  351. /package/{llm-docs → .llm}/collapsible-content.llm.md +0 -0
  352. /package/{llm-docs → .llm}/collapsible-trigger.llm.md +0 -0
  353. /package/{llm-docs → .llm}/collapsible.llm.md +0 -0
  354. /package/{llm-docs → .llm}/combobox-option.llm.md +0 -0
  355. /package/{llm-docs → .llm}/combobox.llm.md +0 -0
  356. /package/{llm-docs → .llm}/command-dialog.llm.md +0 -0
  357. /package/{llm-docs → .llm}/command-empty.llm.md +0 -0
  358. /package/{llm-docs → .llm}/command-group.llm.md +0 -0
  359. /package/{llm-docs → .llm}/command-input.llm.md +0 -0
  360. /package/{llm-docs → .llm}/command-item.llm.md +0 -0
  361. /package/{llm-docs → .llm}/command-list.llm.md +0 -0
  362. /package/{llm-docs → .llm}/command-loading.llm.md +0 -0
  363. /package/{llm-docs → .llm}/command-separator.llm.md +0 -0
  364. /package/{llm-docs → .llm}/command-shortcut.llm.md +0 -0
  365. /package/{llm-docs → .llm}/command.llm.md +0 -0
  366. /package/{llm-docs → .llm}/container.llm.md +0 -0
  367. /package/{llm-docs → .llm}/context-menu-checkbox-item.llm.md +0 -0
  368. /package/{llm-docs → .llm}/context-menu-content.llm.md +0 -0
  369. /package/{llm-docs → .llm}/context-menu-group.llm.md +0 -0
  370. /package/{llm-docs → .llm}/context-menu-item.llm.md +0 -0
  371. /package/{llm-docs → .llm}/context-menu-label.llm.md +0 -0
  372. /package/{llm-docs → .llm}/context-menu-portal.llm.md +0 -0
  373. /package/{llm-docs → .llm}/context-menu-radio-group.llm.md +0 -0
  374. /package/{llm-docs → .llm}/context-menu-radio-item.llm.md +0 -0
  375. /package/{llm-docs → .llm}/context-menu-separator.llm.md +0 -0
  376. /package/{llm-docs → .llm}/context-menu-shortcut.llm.md +0 -0
  377. /package/{llm-docs → .llm}/context-menu-sub-content.llm.md +0 -0
  378. /package/{llm-docs → .llm}/context-menu-sub-trigger.llm.md +0 -0
  379. /package/{llm-docs → .llm}/context-menu-sub.llm.md +0 -0
  380. /package/{llm-docs → .llm}/context-menu-trigger.llm.md +0 -0
  381. /package/{llm-docs → .llm}/context-menu.llm.md +0 -0
  382. /package/{llm-docs → .llm}/date-picker.llm.md +0 -0
  383. /package/{llm-docs → .llm}/dialog-close.llm.md +0 -0
  384. /package/{llm-docs → .llm}/dialog-content.llm.md +0 -0
  385. /package/{llm-docs → .llm}/dialog-description.llm.md +0 -0
  386. /package/{llm-docs → .llm}/dialog-footer.llm.md +0 -0
  387. /package/{llm-docs → .llm}/dialog-header.llm.md +0 -0
  388. /package/{llm-docs → .llm}/dialog-overlay.llm.md +0 -0
  389. /package/{llm-docs → .llm}/dialog-portal.llm.md +0 -0
  390. /package/{llm-docs → .llm}/dialog-title.llm.md +0 -0
  391. /package/{llm-docs → .llm}/dialog-trigger.llm.md +0 -0
  392. /package/{llm-docs → .llm}/dialog.llm.md +0 -0
  393. /package/{llm-docs → .llm}/drawer-close.llm.md +0 -0
  394. /package/{llm-docs → .llm}/drawer-content.llm.md +0 -0
  395. /package/{llm-docs → .llm}/drawer-description.llm.md +0 -0
  396. /package/{llm-docs → .llm}/drawer-footer.llm.md +0 -0
  397. /package/{llm-docs → .llm}/drawer-header.llm.md +0 -0
  398. /package/{llm-docs → .llm}/drawer-overlay.llm.md +0 -0
  399. /package/{llm-docs → .llm}/drawer-portal.llm.md +0 -0
  400. /package/{llm-docs → .llm}/drawer-title.llm.md +0 -0
  401. /package/{llm-docs → .llm}/drawer-trigger.llm.md +0 -0
  402. /package/{llm-docs → .llm}/drawer.llm.md +0 -0
  403. /package/{llm-docs → .llm}/dropdown-menu-checkbox-item.llm.md +0 -0
  404. /package/{llm-docs → .llm}/dropdown-menu-content.llm.md +0 -0
  405. /package/{llm-docs → .llm}/dropdown-menu-group.llm.md +0 -0
  406. /package/{llm-docs → .llm}/dropdown-menu-item.llm.md +0 -0
  407. /package/{llm-docs → .llm}/dropdown-menu-label.llm.md +0 -0
  408. /package/{llm-docs → .llm}/dropdown-menu-portal.llm.md +0 -0
  409. /package/{llm-docs → .llm}/dropdown-menu-radio-group.llm.md +0 -0
  410. /package/{llm-docs → .llm}/dropdown-menu-radio-item.llm.md +0 -0
  411. /package/{llm-docs → .llm}/dropdown-menu-separator.llm.md +0 -0
  412. /package/{llm-docs → .llm}/dropdown-menu-shortcut.llm.md +0 -0
  413. /package/{llm-docs → .llm}/dropdown-menu-sub-content.llm.md +0 -0
  414. /package/{llm-docs → .llm}/dropdown-menu-sub-trigger.llm.md +0 -0
  415. /package/{llm-docs → .llm}/dropdown-menu-sub.llm.md +0 -0
  416. /package/{llm-docs → .llm}/dropdown-menu-trigger.llm.md +0 -0
  417. /package/{llm-docs → .llm}/dropdown-menu.llm.md +0 -0
  418. /package/{llm-docs → .llm}/empty-state.llm.md +0 -0
  419. /package/{llm-docs → .llm}/hover-card-content.llm.md +0 -0
  420. /package/{llm-docs → .llm}/hover-card-trigger.llm.md +0 -0
  421. /package/{llm-docs → .llm}/hover-card.llm.md +0 -0
  422. /package/{llm-docs → .llm}/input.llm.md +0 -0
  423. /package/{llm-docs → .llm}/label.llm.md +0 -0
  424. /package/{llm-docs → .llm}/menubar-checkbox-item.llm.md +0 -0
  425. /package/{llm-docs → .llm}/menubar-content.llm.md +0 -0
  426. /package/{llm-docs → .llm}/menubar-group.llm.md +0 -0
  427. /package/{llm-docs → .llm}/menubar-item.llm.md +0 -0
  428. /package/{llm-docs → .llm}/menubar-label.llm.md +0 -0
  429. /package/{llm-docs → .llm}/menubar-menu.llm.md +0 -0
  430. /package/{llm-docs → .llm}/menubar-portal.llm.md +0 -0
  431. /package/{llm-docs → .llm}/menubar-radio-group.llm.md +0 -0
  432. /package/{llm-docs → .llm}/menubar-radio-item.llm.md +0 -0
  433. /package/{llm-docs → .llm}/menubar-separator.llm.md +0 -0
  434. /package/{llm-docs → .llm}/menubar-shortcut.llm.md +0 -0
  435. /package/{llm-docs → .llm}/menubar-sub-content.llm.md +0 -0
  436. /package/{llm-docs → .llm}/menubar-sub-trigger.llm.md +0 -0
  437. /package/{llm-docs → .llm}/menubar-sub.llm.md +0 -0
  438. /package/{llm-docs → .llm}/menubar-trigger.llm.md +0 -0
  439. /package/{llm-docs → .llm}/menubar.llm.md +0 -0
  440. /package/{llm-docs → .llm}/navigation-menu-content.llm.md +0 -0
  441. /package/{llm-docs → .llm}/navigation-menu-indicator.llm.md +0 -0
  442. /package/{llm-docs → .llm}/navigation-menu-item.llm.md +0 -0
  443. /package/{llm-docs → .llm}/navigation-menu-link.llm.md +0 -0
  444. /package/{llm-docs → .llm}/navigation-menu-list.llm.md +0 -0
  445. /package/{llm-docs → .llm}/navigation-menu-trigger-style.llm.md +0 -0
  446. /package/{llm-docs → .llm}/navigation-menu-trigger.llm.md +0 -0
  447. /package/{llm-docs → .llm}/navigation-menu-viewport.llm.md +0 -0
  448. /package/{llm-docs → .llm}/navigation-menu.llm.md +0 -0
  449. /package/{llm-docs → .llm}/pagination-content.llm.md +0 -0
  450. /package/{llm-docs → .llm}/pagination-ellipsis.llm.md +0 -0
  451. /package/{llm-docs → .llm}/pagination-item.llm.md +0 -0
  452. /package/{llm-docs → .llm}/pagination-link.llm.md +0 -0
  453. /package/{llm-docs → .llm}/pagination-next.llm.md +0 -0
  454. /package/{llm-docs → .llm}/pagination-previous.llm.md +0 -0
  455. /package/{llm-docs → .llm}/pagination.llm.md +0 -0
  456. /package/{llm-docs → .llm}/popover-anchor.llm.md +0 -0
  457. /package/{llm-docs → .llm}/popover-content.llm.md +0 -0
  458. /package/{llm-docs → .llm}/popover-trigger.llm.md +0 -0
  459. /package/{llm-docs → .llm}/popover.llm.md +0 -0
  460. /package/{llm-docs → .llm}/progress.llm.md +0 -0
  461. /package/{llm-docs → .llm}/radio-group-indicator.llm.md +0 -0
  462. /package/{llm-docs → .llm}/radio-group-item.llm.md +0 -0
  463. /package/{llm-docs → .llm}/radio-group.llm.md +0 -0
  464. /package/{llm-docs → .llm}/resizable-handle.llm.md +0 -0
  465. /package/{llm-docs → .llm}/resizable-panel-group.llm.md +0 -0
  466. /package/{llm-docs → .llm}/resizable-panel.llm.md +0 -0
  467. /package/{llm-docs → .llm}/scroll-area-corner.llm.md +0 -0
  468. /package/{llm-docs → .llm}/scroll-area-thumb.llm.md +0 -0
  469. /package/{llm-docs → .llm}/scroll-area-viewport.llm.md +0 -0
  470. /package/{llm-docs → .llm}/scroll-area.llm.md +0 -0
  471. /package/{llm-docs → .llm}/scroll-bar.llm.md +0 -0
  472. /package/{llm-docs → .llm}/select-content.llm.md +0 -0
  473. /package/{llm-docs → .llm}/select-group.llm.md +0 -0
  474. /package/{llm-docs → .llm}/select-item.llm.md +0 -0
  475. /package/{llm-docs → .llm}/select-label.llm.md +0 -0
  476. /package/{llm-docs → .llm}/select-scroll-down-button.llm.md +0 -0
  477. /package/{llm-docs → .llm}/select-scroll-up-button.llm.md +0 -0
  478. /package/{llm-docs → .llm}/select-separator.llm.md +0 -0
  479. /package/{llm-docs → .llm}/select-trigger.llm.md +0 -0
  480. /package/{llm-docs → .llm}/select-value.llm.md +0 -0
  481. /package/{llm-docs → .llm}/select.llm.md +0 -0
  482. /package/{llm-docs → .llm}/separator.llm.md +0 -0
  483. /package/{llm-docs → .llm}/sheet-close.llm.md +0 -0
  484. /package/{llm-docs → .llm}/sheet-content.llm.md +0 -0
  485. /package/{llm-docs → .llm}/sheet-description.llm.md +0 -0
  486. /package/{llm-docs → .llm}/sheet-footer.llm.md +0 -0
  487. /package/{llm-docs → .llm}/sheet-header.llm.md +0 -0
  488. /package/{llm-docs → .llm}/sheet-title.llm.md +0 -0
  489. /package/{llm-docs → .llm}/sheet-trigger.llm.md +0 -0
  490. /package/{llm-docs → .llm}/sheet.llm.md +0 -0
  491. /package/{llm-docs → .llm}/sidebar-content.llm.md +0 -0
  492. /package/{llm-docs → .llm}/sidebar-footer.llm.md +0 -0
  493. /package/{llm-docs → .llm}/sidebar-group-action.llm.md +0 -0
  494. /package/{llm-docs → .llm}/sidebar-group-content.llm.md +0 -0
  495. /package/{llm-docs → .llm}/sidebar-group-label.llm.md +0 -0
  496. /package/{llm-docs → .llm}/sidebar-group.llm.md +0 -0
  497. /package/{llm-docs → .llm}/sidebar-header.llm.md +0 -0
  498. /package/{llm-docs → .llm}/sidebar-input.llm.md +0 -0
  499. /package/{llm-docs → .llm}/sidebar-inset.llm.md +0 -0
  500. /package/{llm-docs → .llm}/sidebar-menu-action.llm.md +0 -0
  501. /package/{llm-docs → .llm}/sidebar-menu-badge.llm.md +0 -0
  502. /package/{llm-docs → .llm}/sidebar-menu-button.llm.md +0 -0
  503. /package/{llm-docs → .llm}/sidebar-menu-item.llm.md +0 -0
  504. /package/{llm-docs → .llm}/sidebar-menu-skeleton.llm.md +0 -0
  505. /package/{llm-docs → .llm}/sidebar-menu-sub-button.llm.md +0 -0
  506. /package/{llm-docs → .llm}/sidebar-menu-sub-item.llm.md +0 -0
  507. /package/{llm-docs → .llm}/sidebar-menu-sub.llm.md +0 -0
  508. /package/{llm-docs → .llm}/sidebar-menu.llm.md +0 -0
  509. /package/{llm-docs → .llm}/sidebar-provider.llm.md +0 -0
  510. /package/{llm-docs → .llm}/sidebar-rail.llm.md +0 -0
  511. /package/{llm-docs → .llm}/sidebar-separator.llm.md +0 -0
  512. /package/{llm-docs → .llm}/sidebar-trigger.llm.md +0 -0
  513. /package/{llm-docs → .llm}/sidebar.llm.md +0 -0
  514. /package/{llm-docs → .llm}/skeleton.llm.md +0 -0
  515. /package/{llm-docs → .llm}/slider.llm.md +0 -0
  516. /package/{llm-docs → .llm}/stack.llm.md +0 -0
  517. /package/{llm-docs → .llm}/switch.llm.md +0 -0
  518. /package/{llm-docs → .llm}/table-body.llm.md +0 -0
  519. /package/{llm-docs → .llm}/table-caption.llm.md +0 -0
  520. /package/{llm-docs → .llm}/table-cell.llm.md +0 -0
  521. /package/{llm-docs → .llm}/table-footer.llm.md +0 -0
  522. /package/{llm-docs → .llm}/table-head.llm.md +0 -0
  523. /package/{llm-docs → .llm}/table-header.llm.md +0 -0
  524. /package/{llm-docs → .llm}/table-row.llm.md +0 -0
  525. /package/{llm-docs → .llm}/table.llm.md +0 -0
  526. /package/{llm-docs → .llm}/tabs-content.llm.md +0 -0
  527. /package/{llm-docs → .llm}/tabs-list.llm.md +0 -0
  528. /package/{llm-docs → .llm}/tabs-trigger.llm.md +0 -0
  529. /package/{llm-docs → .llm}/tabs.llm.md +0 -0
  530. /package/{llm-docs → .llm}/text-field.llm.md +0 -0
  531. /package/{llm-docs → .llm}/textarea.llm.md +0 -0
  532. /package/{llm-docs → .llm}/theme-preference.llm.md +0 -0
  533. /package/{llm-docs → .llm}/theme-toggle.llm.md +0 -0
  534. /package/{llm-docs → .llm}/theme.llm.md +0 -0
  535. /package/{llm-docs → .llm}/toast.llm.md +0 -0
  536. /package/{llm-docs → .llm}/toaster.llm.md +0 -0
  537. /package/{llm-docs → .llm}/toggle-group-item.llm.md +0 -0
  538. /package/{llm-docs → .llm}/toggle-group.llm.md +0 -0
  539. /package/{llm-docs → .llm}/toggle.llm.md +0 -0
  540. /package/{llm-docs → .llm}/tooltip-content.llm.md +0 -0
  541. /package/{llm-docs → .llm}/tooltip-provider.llm.md +0 -0
  542. /package/{llm-docs → .llm}/tooltip-trigger.llm.md +0 -0
  543. /package/{llm-docs → .llm}/tooltip.llm.md +0 -0
  544. /package/{llm-docs → .llm}/use-carousel.llm.md +0 -0
  545. /package/{llm-docs → .llm}/use-command-state.llm.md +0 -0
  546. /package/{llm-docs → .llm}/use-is-mobile.llm.md +0 -0
  547. /package/{llm-docs → .llm}/use-sidebar.llm.md +0 -0
@@ -0,0 +1,793 @@
1
+ import { cva, type VariantProps } from "class-variance-authority"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ /**
6
+ * Props for Empty component (Documentation only - NOT used in component implementation)
7
+ * These types are for documentation generation and should not replace HTML inferred types
8
+ */
9
+ // eslint-disable-next-line unused-imports/no-unused-vars
10
+ type EmptyDocsProps = {
11
+ /** Additional CSS classes to merge with default empty container styles */
12
+ className?: string;
13
+ /** Child components including EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, and action buttons */
14
+ children?: React.ReactNode;
15
+ } & React.HTMLAttributes<HTMLDivElement>;
16
+
17
+ /**
18
+ * Props for EmptyHeader component (Documentation only)
19
+ */
20
+ // eslint-disable-next-line unused-imports/no-unused-vars
21
+ type EmptyHeaderDocsProps = {
22
+ /** Additional CSS classes for custom styling */
23
+ className?: string;
24
+ /** Header content including EmptyMedia and EmptyTitle */
25
+ children?: React.ReactNode;
26
+ } & React.HTMLAttributes<HTMLDivElement>;
27
+
28
+ /**
29
+ * Props for EmptyMedia component (Documentation only)
30
+ */
31
+ // eslint-disable-next-line unused-imports/no-unused-vars
32
+ type EmptyMediaDocsProps = {
33
+ /** Visual variant for the media container @default "default" */
34
+ variant?: "default" | "icon";
35
+ /** Additional CSS classes for custom styling */
36
+ className?: string;
37
+ /** Icon or illustration element (typically SVG from lucide-react) */
38
+ children?: React.ReactNode;
39
+ } & React.HTMLAttributes<HTMLDivElement>;
40
+
41
+ /**
42
+ * Props for EmptyTitle component (Documentation only)
43
+ */
44
+ // eslint-disable-next-line unused-imports/no-unused-vars
45
+ type EmptyTitleDocsProps = {
46
+ /** Additional CSS classes for custom styling */
47
+ className?: string;
48
+ /** Title text content describing the empty state */
49
+ children?: React.ReactNode;
50
+ } & React.HTMLAttributes<HTMLDivElement>;
51
+
52
+ /**
53
+ * Props for EmptyDescription component (Documentation only)
54
+ */
55
+ // eslint-disable-next-line unused-imports/no-unused-vars
56
+ type EmptyDescriptionDocsProps = {
57
+ /** Additional CSS classes for custom styling */
58
+ className?: string;
59
+ /** Description text or rich content (supports links, paragraphs, etc.) */
60
+ children?: React.ReactNode;
61
+ } & React.HTMLAttributes<HTMLDivElement>;
62
+
63
+ /**
64
+ * Props for EmptyContent component (Documentation only)
65
+ */
66
+ // eslint-disable-next-line unused-imports/no-unused-vars
67
+ type EmptyContentDocsProps = {
68
+ /** Additional CSS classes for custom styling */
69
+ className?: string;
70
+ /** Additional content such as action buttons, links, or secondary information */
71
+ children?: React.ReactNode;
72
+ } & React.HTMLAttributes<HTMLDivElement>;
73
+
74
+ /**
75
+ * Empty - Flexible container for displaying empty states with consistent layout
76
+ *
77
+ * A foundational empty state component that provides a centered, vertically-aligned
78
+ * container optimized for displaying empty or no-data states. Uses a composable
79
+ * architecture similar to Alert and Card components, allowing fine-grained control
80
+ * over layout and content through sub-components.
81
+ *
82
+ * ## Key Features
83
+ * - Composable sub-components for flexible layouts (header, media, title, description, content)
84
+ * - Responsive padding that adapts from mobile to desktop (p-6 to md:p-12)
85
+ * - Built-in flex layout with automatic centering and gap spacing
86
+ * - Border-dashed styling hint for visual differentiation
87
+ * - Maximum content width constraints for optimal readability
88
+ * - Text balance for improved typography on multi-line content
89
+ * - Fully accessible with semantic HTML structure
90
+ *
91
+ * ## When to Use
92
+ * - Search results with no matches
93
+ * - Empty data tables, lists, or dashboards
94
+ * - Onboarding states for new users
95
+ * - File uploads or content creation areas
96
+ * - Inbox or notification centers with no items
97
+ * - Error recovery or loading failure scenarios
98
+ *
99
+ * ## Component Architecture
100
+ * - **Empty**: Root container with flex layout, padding, and centering
101
+ * - **EmptyHeader**: Groups media and title with constrained width (max-w-sm)
102
+ * - **EmptyMedia**: Icon or illustration display with two variants
103
+ * - **EmptyTitle**: Prominent heading text with medium font weight
104
+ * - **EmptyDescription**: Muted description text with link styling
105
+ * - **EmptyContent**: Additional content area for buttons or secondary info
106
+ *
107
+ * @example
108
+ * ```tsx
109
+ * // Basic empty state with icon, title, and description
110
+ * import { Inbox } from 'lucide-react';
111
+ *
112
+ * <Empty>
113
+ * <EmptyHeader>
114
+ * <EmptyMedia variant="icon">
115
+ * <Inbox />
116
+ * </EmptyMedia>
117
+ * <EmptyTitle>No messages yet</EmptyTitle>
118
+ * </EmptyHeader>
119
+ * <EmptyDescription>
120
+ * New messages will appear here when you receive them.
121
+ * </EmptyDescription>
122
+ * </Empty>
123
+ * ```
124
+ *
125
+ * @example
126
+ * ```tsx
127
+ * // Search results empty state with action button
128
+ * import { Search } from 'lucide-react';
129
+ * import { Button } from './button';
130
+ *
131
+ * <Empty>
132
+ * <EmptyHeader>
133
+ * <EmptyMedia variant="icon">
134
+ * <Search />
135
+ * </EmptyMedia>
136
+ * <EmptyTitle>No results found</EmptyTitle>
137
+ * </EmptyHeader>
138
+ * <EmptyDescription>
139
+ * Try adjusting your search or filters to find what you're looking for.
140
+ * </EmptyDescription>
141
+ * <EmptyContent>
142
+ * <Button variant="outline" onClick={clearFilters}>
143
+ * Clear filters
144
+ * </Button>
145
+ * </EmptyContent>
146
+ * </Empty>
147
+ * ```
148
+ *
149
+ * @example
150
+ * ```tsx
151
+ * // File upload empty state with custom illustration
152
+ * import { Upload } from 'lucide-react';
153
+ * import { Button } from './button';
154
+ *
155
+ * <Empty className="min-h-[400px] border-2 border-dashed">
156
+ * <EmptyHeader>
157
+ * <EmptyMedia>
158
+ * <Upload className="w-16 h-16 text-muted-foreground" />
159
+ * </EmptyMedia>
160
+ * <EmptyTitle>Drop files here</EmptyTitle>
161
+ * </EmptyHeader>
162
+ * <EmptyDescription>
163
+ * Drag and drop files to upload, or click the button below.
164
+ * </EmptyDescription>
165
+ * <EmptyContent>
166
+ * <Button onClick={openFilePicker}>
167
+ * Choose files
168
+ * </Button>
169
+ * </EmptyContent>
170
+ * </Empty>
171
+ * ```
172
+ *
173
+ * @example
174
+ * ```tsx
175
+ * // Complex empty state with multiple actions
176
+ * import { Users, UserPlus, Upload } from 'lucide-react';
177
+ * import { Button } from './button';
178
+ *
179
+ * <Empty>
180
+ * <EmptyHeader>
181
+ * <EmptyMedia variant="icon">
182
+ * <Users />
183
+ * </EmptyMedia>
184
+ * <EmptyTitle>No team members</EmptyTitle>
185
+ * </EmptyHeader>
186
+ * <EmptyDescription>
187
+ * Get started by <a href="/invite">inviting your first team member</a> or
188
+ * importing from a CSV file.
189
+ * </EmptyDescription>
190
+ * <EmptyContent>
191
+ * <div className="flex gap-2">
192
+ * <Button onClick={openInviteModal}>
193
+ * <UserPlus className="w-4 h-4 mr-2" />
194
+ * Invite member
195
+ * </Button>
196
+ * <Button variant="outline" onClick={importFromCsv}>
197
+ * <Upload className="w-4 h-4 mr-2" />
198
+ * Import CSV
199
+ * </Button>
200
+ * </div>
201
+ * </EmptyContent>
202
+ * </Empty>
203
+ * ```
204
+ *
205
+ * @example
206
+ * ```tsx
207
+ * // Minimal empty state without header grouping
208
+ * import { Sparkles } from 'lucide-react';
209
+ *
210
+ * <Empty>
211
+ * <EmptyMedia>
212
+ * <Sparkles className="w-12 h-12 text-primary" />
213
+ * </EmptyMedia>
214
+ * <EmptyTitle>All caught up!</EmptyTitle>
215
+ * <EmptyDescription>
216
+ * You've reviewed all pending items.
217
+ * </EmptyDescription>
218
+ * </Empty>
219
+ * ```
220
+ *
221
+ * @example
222
+ * ```tsx
223
+ * // Error state with custom styling
224
+ * import { AlertCircle } from 'lucide-react';
225
+ * import { Button } from './button';
226
+ *
227
+ * <Empty className="border-destructive/50 bg-destructive/5">
228
+ * <EmptyHeader>
229
+ * <EmptyMedia>
230
+ * <AlertCircle className="w-12 h-12 text-destructive" />
231
+ * </EmptyMedia>
232
+ * <EmptyTitle>Failed to load data</EmptyTitle>
233
+ * </EmptyHeader>
234
+ * <EmptyDescription className="text-destructive/90">
235
+ * There was an error loading your content. Please try again.
236
+ * </EmptyDescription>
237
+ * <EmptyContent>
238
+ * <Button variant="destructive" onClick={retry}>
239
+ * Retry
240
+ * </Button>
241
+ * </EmptyContent>
242
+ * </Empty>
243
+ * ```
244
+ *
245
+ * @accessibility
246
+ * - Semantic HTML structure with proper div hierarchy
247
+ * - Center-aligned content aids screen reader comprehension
248
+ * - Text balance improves readability for dyslexic users
249
+ * - Sufficient color contrast for text elements (muted-foreground meets WCAG AA)
250
+ * - Responsive padding ensures adequate touch targets on mobile
251
+ * - Interactive elements (buttons, links) remain keyboard accessible
252
+ * - Icons are decorative and don't interfere with screen reader navigation
253
+ * - Supports reduced motion preferences through CSS transitions
254
+ *
255
+ * @see {@link EmptyHeader} - Groups media and title with constrained width
256
+ * @see {@link EmptyMedia} - Icon or illustration display with variants
257
+ * @see {@link EmptyTitle} - Prominent heading for the empty state
258
+ * @see {@link EmptyDescription} - Descriptive text with link support
259
+ * @see {@link EmptyContent} - Additional content area for actions
260
+ * @see {@link https://ui.shadcn.com/docs/components/empty-state} - shadcn/ui empty state patterns
261
+ * @since 1.0.0
262
+ */
263
+ function Empty({ className, ...props }: React.ComponentProps<"div">) {
264
+ return (
265
+ <div
266
+ data-slot="empty"
267
+ className={cn(
268
+ "flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12",
269
+ className
270
+ )}
271
+ {...props}
272
+ />
273
+ )
274
+ }
275
+
276
+ /**
277
+ * EmptyHeader - Groups media and title elements with constrained width
278
+ *
279
+ * A container component that groups the EmptyMedia and EmptyTitle elements together,
280
+ * applying a maximum width constraint (max-w-sm / 24rem) for optimal visual hierarchy
281
+ * and readability. Typically used to create a cohesive header unit within the empty state.
282
+ *
283
+ * ## Features
284
+ * - Maximum width of 24rem (384px) for visual balance
285
+ * - Flex column layout with 0.5rem (8px) gap between children
286
+ * - Center-aligned items and text
287
+ * - Maintains semantic grouping for screen readers
288
+ *
289
+ * ## Usage Patterns
290
+ * - Group EmptyMedia and EmptyTitle together
291
+ * - Create visual separation from description and content
292
+ * - Constrain width of title for better readability
293
+ * - Optional - components can be used without header grouping
294
+ *
295
+ * @example
296
+ * ```tsx
297
+ * // Standard header with icon and title
298
+ * import { Package } from 'lucide-react';
299
+ *
300
+ * <EmptyHeader>
301
+ * <EmptyMedia variant="icon">
302
+ * <Package />
303
+ * </EmptyMedia>
304
+ * <EmptyTitle>No packages found</EmptyTitle>
305
+ * </EmptyHeader>
306
+ * ```
307
+ *
308
+ * @example
309
+ * ```tsx
310
+ * // Header with large illustration
311
+ * import { Rocket } from 'lucide-react';
312
+ *
313
+ * <EmptyHeader>
314
+ * <EmptyMedia>
315
+ * <Rocket className="w-20 h-20 text-primary" />
316
+ * </EmptyMedia>
317
+ * <EmptyTitle>Ready to launch!</EmptyTitle>
318
+ * </EmptyHeader>
319
+ * ```
320
+ *
321
+ * @example
322
+ * ```tsx
323
+ * // Custom styled header
324
+ * <EmptyHeader className="max-w-md gap-4">
325
+ * <EmptyMedia variant="icon">
326
+ * <Star />
327
+ * </EmptyMedia>
328
+ * <EmptyTitle>Custom spacing and width</EmptyTitle>
329
+ * </EmptyHeader>
330
+ * ```
331
+ *
332
+ * @accessibility
333
+ * - Semantic grouping improves screen reader context
334
+ * - Maintains proper reading order (media → title)
335
+ * - Width constraint enhances readability for all users
336
+ * - Center alignment provides clear visual focus
337
+ *
338
+ * @see {@link EmptyMedia} - Icon or illustration component typically used within header
339
+ * @see {@link EmptyTitle} - Title component typically used within header
340
+ * @see {@link Empty} - Parent container component
341
+ */
342
+ function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) {
343
+ return (
344
+ <div
345
+ data-slot="empty-header"
346
+ className={cn(
347
+ "flex max-w-sm flex-col items-center gap-2 text-center",
348
+ className
349
+ )}
350
+ {...props}
351
+ />
352
+ )
353
+ }
354
+
355
+ /**
356
+ * EmptyMedia variant styles configuration
357
+ *
358
+ * @variant default - Transparent background for custom illustrations or large icons
359
+ * @variant icon - Muted background with rounded corners and constrained sizing for standard icons (40px container, 24px icon)
360
+ */
361
+ const emptyMediaVariants = cva(
362
+ "flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0",
363
+ {
364
+ variants: {
365
+ variant: {
366
+ /** Transparent background suitable for custom-sized illustrations or decorative graphics */
367
+ default: "bg-transparent",
368
+ /** Muted background with rounded corners, fixed 40px container, and automatic 24px icon sizing */
369
+ icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6",
370
+ },
371
+ },
372
+ defaultVariants: {
373
+ variant: "default",
374
+ },
375
+ }
376
+ )
377
+
378
+ /**
379
+ * EmptyMedia - Icon or illustration display component with styling variants
380
+ *
381
+ * Displays icons, illustrations, or other visual elements in an empty state. Offers
382
+ * two variants: a transparent default for custom-sized graphics and an "icon" variant
383
+ * with consistent sizing and background styling. Automatically handles SVG pointer
384
+ * events and shrinking behavior.
385
+ *
386
+ * ## Variants
387
+ *
388
+ * ### default
389
+ * - Transparent background (bg-transparent)
390
+ * - No size constraints - use for custom-sized illustrations
391
+ * - Full control over icon/illustration dimensions
392
+ * - Best for large decorative graphics (48px+)
393
+ *
394
+ * ### icon
395
+ * - Muted background (bg-muted) with rounded corners (rounded-lg)
396
+ * - Fixed 40px × 40px container (size-10)
397
+ * - Automatically sizes child SVGs to 24px (size-6) unless explicitly sized
398
+ * - Text color set to foreground for proper contrast
399
+ * - Best for standard icon sizes (16-24px)
400
+ * - Provides visual emphasis through background contrast
401
+ *
402
+ * ## Features
403
+ * - SVG pointer events disabled to prevent interaction issues
404
+ * - Shrink prevention for consistent sizing
405
+ * - Bottom margin (mb-2 / 8px) for spacing from subsequent elements
406
+ * - Flex layout with centered content
407
+ * - Compatible with all icon libraries (lucide-react, heroicons, etc.)
408
+ *
409
+ * @example
410
+ * ```tsx
411
+ * // Standard icon variant with auto-sizing
412
+ * import { Inbox } from 'lucide-react';
413
+ *
414
+ * <EmptyMedia variant="icon">
415
+ * <Inbox />
416
+ * </EmptyMedia>
417
+ * ```
418
+ *
419
+ * @example
420
+ * ```tsx
421
+ * // Default variant with custom-sized illustration
422
+ * import { Package } from 'lucide-react';
423
+ *
424
+ * <EmptyMedia>
425
+ * <Package className="w-16 h-16 text-primary" />
426
+ * </EmptyMedia>
427
+ * ```
428
+ *
429
+ * @example
430
+ * ```tsx
431
+ * // Icon variant with explicitly sized SVG (overrides auto-sizing)
432
+ * import { Search } from 'lucide-react';
433
+ *
434
+ * <EmptyMedia variant="icon">
435
+ * <Search className="size-5" />
436
+ * </EmptyMedia>
437
+ * ```
438
+ *
439
+ * @example
440
+ * ```tsx
441
+ * // Custom styled media container
442
+ * import { Sparkles } from 'lucide-react';
443
+ *
444
+ * <EmptyMedia className="bg-primary/10 rounded-full p-4">
445
+ * <Sparkles className="w-8 h-8 text-primary" />
446
+ * </EmptyMedia>
447
+ * ```
448
+ *
449
+ * @example
450
+ * ```tsx
451
+ * // Multiple icons or complex graphics
452
+ * import { Users, Plus } from 'lucide-react';
453
+ *
454
+ * <EmptyMedia>
455
+ * <div className="relative">
456
+ * <Users className="w-12 h-12 text-muted-foreground" />
457
+ * <Plus className="w-6 h-6 text-primary absolute -bottom-1 -right-1" />
458
+ * </div>
459
+ * </EmptyMedia>
460
+ * ```
461
+ *
462
+ * @accessibility
463
+ * - Icons are decorative and don't require alt text
464
+ * - SVG pointer events disabled prevents accidental interactions
465
+ * - Sufficient size for visibility and recognition
466
+ * - Color contrast maintained through foreground/muted colors
467
+ * - Responsive to theme changes (light/dark mode)
468
+ *
469
+ * @see {@link EmptyHeader} - Often used within header for visual grouping
470
+ * @see {@link Empty} - Parent container component
471
+ */
472
+ function EmptyMedia({
473
+ className,
474
+ variant = "default",
475
+ ...props
476
+ }: React.ComponentProps<"div"> & VariantProps<typeof emptyMediaVariants>) {
477
+ return (
478
+ <div
479
+ data-slot="empty-icon"
480
+ data-variant={variant}
481
+ className={cn(emptyMediaVariants({ variant, className }))}
482
+ {...props}
483
+ />
484
+ )
485
+ }
486
+
487
+ /**
488
+ * EmptyTitle - Prominent heading text for empty state messages
489
+ *
490
+ * Displays the primary heading or title for an empty state, styled with medium font
491
+ * weight and tight character spacing for visual hierarchy. Typically describes what
492
+ * is missing or the current state in a concise, user-friendly way.
493
+ *
494
+ * ## Features
495
+ * - Large text size (text-lg / 1.125rem / 18px)
496
+ * - Medium font weight (font-medium / 500) for emphasis
497
+ * - Tight character spacing (tracking-tight / -0.025em) for readability
498
+ * - Foreground color for maximum contrast
499
+ * - Center-aligned within empty state layout
500
+ *
501
+ * ## Best Practices
502
+ * - Keep titles short and descriptive (2-6 words)
503
+ * - Focus on the current state rather than what's wrong
504
+ * - Use positive language when possible
505
+ * - Be specific rather than generic ("No projects" vs "Empty")
506
+ * - Avoid technical jargon or error codes
507
+ *
508
+ * @example
509
+ * ```tsx
510
+ * // Simple descriptive title
511
+ * <EmptyTitle>No results found</EmptyTitle>
512
+ * ```
513
+ *
514
+ * @example
515
+ * ```tsx
516
+ * // Positive framing for empty inbox
517
+ * <EmptyTitle>You're all caught up!</EmptyTitle>
518
+ * ```
519
+ *
520
+ * @example
521
+ * ```tsx
522
+ * // Specific empty list title
523
+ * <EmptyTitle>No team members yet</EmptyTitle>
524
+ * ```
525
+ *
526
+ * @example
527
+ * ```tsx
528
+ * // Custom styled title
529
+ * <EmptyTitle className="text-xl font-semibold text-primary">
530
+ * Welcome to your dashboard
531
+ * </EmptyTitle>
532
+ * ```
533
+ *
534
+ * @accessibility
535
+ * - Provides clear, descriptive content for screen readers
536
+ * - Font size and weight ensure readability
537
+ * - High contrast color (foreground) meets WCAG AA standards
538
+ * - Center alignment aids comprehension
539
+ * - Can be enhanced with heading tags via className if needed for semantic structure
540
+ *
541
+ * @see {@link EmptyHeader} - Often grouped within header with EmptyMedia
542
+ * @see {@link EmptyDescription} - Complementary description text component
543
+ * @see {@link Empty} - Parent container component
544
+ */
545
+ function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
546
+ return (
547
+ <div
548
+ data-slot="empty-title"
549
+ className={cn("text-lg font-medium tracking-tight", className)}
550
+ {...props}
551
+ />
552
+ )
553
+ }
554
+
555
+ /**
556
+ * EmptyDescription - Descriptive text with link styling for empty states
557
+ *
558
+ * Provides supplementary information, guidance, or context below the empty state title.
559
+ * Automatically styles inline links with underlines and hover effects, making it easy
560
+ * to include helpful links or documentation references within the description text.
561
+ *
562
+ * ## Features
563
+ * - Muted foreground color for visual hierarchy below title
564
+ * - Small text size (text-sm) with relaxed line height for readability
565
+ * - Automatic link styling with underlines and offset
566
+ * - Hover state for links changes color to primary
567
+ * - Supports rich content including paragraphs and inline elements
568
+ * - Center-aligned text within empty state layout
569
+ *
570
+ * ## Link Styling
571
+ * - Default: underline with 4px offset, muted-foreground color
572
+ * - Hover: primary color while maintaining underline
573
+ * - Provides clear visual affordance for interactive elements
574
+ *
575
+ * ## Best Practices
576
+ * - Provide helpful context or next steps
577
+ * - Keep descriptions concise (1-2 sentences)
578
+ * - Include actionable guidance when possible
579
+ * - Use links to documentation, help, or related features
580
+ * - Avoid overwhelming users with too much information
581
+ *
582
+ * @example
583
+ * ```tsx
584
+ * // Simple description text
585
+ * <EmptyDescription>
586
+ * Try adjusting your search or filters to find what you're looking for.
587
+ * </EmptyDescription>
588
+ * ```
589
+ *
590
+ * @example
591
+ * ```tsx
592
+ * // Description with inline link
593
+ * <EmptyDescription>
594
+ * Get started by <a href="/docs/setup">reading our setup guide</a> or
595
+ * watching the tutorial video.
596
+ * </EmptyDescription>
597
+ * ```
598
+ *
599
+ * @example
600
+ * ```tsx
601
+ * // Multi-line description
602
+ * <EmptyDescription>
603
+ * Your inbox is empty. New messages and notifications will appear here
604
+ * when you receive them.
605
+ * </EmptyDescription>
606
+ * ```
607
+ *
608
+ * @example
609
+ * ```tsx
610
+ * // Description with multiple links
611
+ * <EmptyDescription>
612
+ * Need help? Check out our <a href="/docs">documentation</a> or
613
+ * <a href="/support">contact support</a>.
614
+ * </EmptyDescription>
615
+ * ```
616
+ *
617
+ * @example
618
+ * ```tsx
619
+ * // Custom styled description
620
+ * <EmptyDescription className="text-base text-foreground max-w-md">
621
+ * Override default styling for custom appearance and width.
622
+ * </EmptyDescription>
623
+ * ```
624
+ *
625
+ * @accessibility
626
+ * - Links are keyboard accessible (Tab navigation)
627
+ * - Underlines provide visual affordance independent of color
628
+ * - Hover state provides additional interactive feedback
629
+ * - Muted color still meets WCAG AA contrast requirements
630
+ * - Relaxed line height (text-sm/relaxed) improves readability
631
+ * - Screen readers properly announce links and their purpose
632
+ *
633
+ * @see {@link EmptyTitle} - Title component that precedes description
634
+ * @see {@link EmptyContent} - Additional content area for buttons and actions
635
+ * @see {@link Empty} - Parent container component
636
+ */
637
+ function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) {
638
+ return (
639
+ <div
640
+ data-slot="empty-description"
641
+ className={cn(
642
+ "text-muted-foreground [&>a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4",
643
+ className
644
+ )}
645
+ {...props}
646
+ />
647
+ )
648
+ }
649
+
650
+ /**
651
+ * EmptyContent - Additional content area for buttons, actions, or secondary information
652
+ *
653
+ * A flexible container for additional content within an empty state, typically used for
654
+ * action buttons, links, or secondary information. Provides consistent width constraints,
655
+ * gap spacing, and alignment for optimal layout of calls-to-action and supplementary content.
656
+ *
657
+ * ## Features
658
+ * - Maximum width of 24rem (384px) for visual balance
659
+ * - Minimum width of 0 to prevent overflow issues
660
+ * - Flex column layout with 1rem (16px) gap between children
661
+ * - Center-aligned items for button grouping
662
+ * - Small text size (text-sm) for secondary content
663
+ * - Text balance for improved multi-line typography
664
+ * - Full width within constraints (w-full)
665
+ *
666
+ * ## Common Use Cases
667
+ * - Primary and secondary action buttons
668
+ * - Button groups with multiple actions
669
+ * - Secondary links or navigation
670
+ * - Additional context or instructions
671
+ * - Step indicators or progress information
672
+ *
673
+ * ## Layout Patterns
674
+ * - Single button: automatically centered
675
+ * - Multiple buttons: stack vertically with gap spacing
676
+ * - Button groups: use flex-row with gap within content
677
+ * - Text content: maintains readability with text-balance
678
+ *
679
+ * @example
680
+ * ```tsx
681
+ * // Single action button
682
+ * import { Button } from './button';
683
+ *
684
+ * <EmptyContent>
685
+ * <Button onClick={handleCreate}>Create new project</Button>
686
+ * </EmptyContent>
687
+ * ```
688
+ *
689
+ * @example
690
+ * ```tsx
691
+ * // Multiple vertically stacked buttons
692
+ * import { Button } from './button';
693
+ *
694
+ * <EmptyContent>
695
+ * <Button onClick={handleCreate}>Create project</Button>
696
+ * <Button variant="outline" onClick={handleImport}>Import project</Button>
697
+ * </EmptyContent>
698
+ * ```
699
+ *
700
+ * @example
701
+ * ```tsx
702
+ * // Horizontal button group
703
+ * import { Button } from './button';
704
+ * import { Plus, Upload } from 'lucide-react';
705
+ *
706
+ * <EmptyContent>
707
+ * <div className="flex gap-2">
708
+ * <Button onClick={handleCreate}>
709
+ * <Plus className="w-4 h-4 mr-2" />
710
+ * Create
711
+ * </Button>
712
+ * <Button variant="outline" onClick={handleUpload}>
713
+ * <Upload className="w-4 h-4 mr-2" />
714
+ * Upload
715
+ * </Button>
716
+ * </div>
717
+ * </EmptyContent>
718
+ * ```
719
+ *
720
+ * @example
721
+ * ```tsx
722
+ * // Button with additional text
723
+ * import { Button } from './button';
724
+ *
725
+ * <EmptyContent>
726
+ * <Button onClick={handleInvite}>Invite team members</Button>
727
+ * <p className="text-xs text-muted-foreground">
728
+ * or <a href="/import" className="underline">import from CSV</a>
729
+ * </p>
730
+ * </EmptyContent>
731
+ * ```
732
+ *
733
+ * @example
734
+ * ```tsx
735
+ * // Secondary links only
736
+ * <EmptyContent>
737
+ * <a href="/docs" className="text-sm underline underline-offset-4">
738
+ * View documentation
739
+ * </a>
740
+ * <a href="/examples" className="text-sm underline underline-offset-4">
741
+ * Browse examples
742
+ * </a>
743
+ * </EmptyContent>
744
+ * ```
745
+ *
746
+ * @example
747
+ * ```tsx
748
+ * // Custom styled content area
749
+ * import { Button } from './button';
750
+ *
751
+ * <EmptyContent className="max-w-md gap-2">
752
+ * <Button className="w-full" onClick={handleAction}>
753
+ * Full width button
754
+ * </Button>
755
+ * <p className="text-center">
756
+ * Tighter gap and wider max width
757
+ * </p>
758
+ * </EmptyContent>
759
+ * ```
760
+ *
761
+ * @accessibility
762
+ * - Maintains focus order for keyboard navigation
763
+ * - Buttons and links remain fully keyboard accessible
764
+ * - Adequate spacing between interactive elements for touch targets
765
+ * - Text content maintains readability with text-balance
766
+ * - Center alignment provides clear visual hierarchy
767
+ * - Supports reduced motion preferences through CSS
768
+ *
769
+ * @see {@link EmptyDescription} - Description component that typically precedes content
770
+ * @see {@link Empty} - Parent container component
771
+ * @see {@link Button} - Common component used within EmptyContent for actions
772
+ */
773
+ function EmptyContent({ className, ...props }: React.ComponentProps<"div">) {
774
+ return (
775
+ <div
776
+ data-slot="empty-content"
777
+ className={cn(
778
+ "flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance",
779
+ className
780
+ )}
781
+ {...props}
782
+ />
783
+ )
784
+ }
785
+
786
+ export {
787
+ Empty,
788
+ EmptyHeader,
789
+ EmptyTitle,
790
+ EmptyDescription,
791
+ EmptyContent,
792
+ EmptyMedia,
793
+ }