@slexn/codecenter-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/LICENSE +34 -0
  2. package/README.md +148 -0
  3. package/components.json +20 -0
  4. package/dist/codecenter-ui.cjs +10 -0
  5. package/dist/codecenter-ui.js +17995 -0
  6. package/dist/components/ui/accordion/Accordion.vue.d.ts +28 -0
  7. package/dist/components/ui/accordion/AccordionContent.vue.d.ts +22 -0
  8. package/dist/components/ui/accordion/AccordionItem.vue.d.ts +24 -0
  9. package/dist/components/ui/accordion/AccordionTrigger.vue.d.ts +22 -0
  10. package/dist/components/ui/accordion/index.d.ts +4 -0
  11. package/dist/components/ui/alert/Alert.vue.d.ts +32 -0
  12. package/dist/components/ui/alert/AlertDescription.vue.d.ts +24 -0
  13. package/dist/components/ui/alert/AlertTitle.vue.d.ts +24 -0
  14. package/dist/components/ui/alert/index.d.ts +4 -0
  15. package/dist/components/ui/alert/variants.d.ts +5 -0
  16. package/dist/components/ui/button/Button.vue.d.ts +27 -0
  17. package/dist/components/ui/button/index.d.ts +2 -0
  18. package/dist/components/ui/button/variants.d.ts +6 -0
  19. package/dist/components/ui/button-group/ButtonGroup.vue.d.ts +25 -0
  20. package/dist/components/ui/button-group/index.d.ts +2 -0
  21. package/dist/components/ui/card/Card.vue.d.ts +21 -0
  22. package/dist/components/ui/card/CardContent.vue.d.ts +21 -0
  23. package/dist/components/ui/card/CardDescription.vue.d.ts +21 -0
  24. package/dist/components/ui/card/CardFooter.vue.d.ts +21 -0
  25. package/dist/components/ui/card/CardHeader.vue.d.ts +21 -0
  26. package/dist/components/ui/card/CardTitle.vue.d.ts +21 -0
  27. package/dist/components/ui/card/index.d.ts +6 -0
  28. package/dist/components/ui/chart/Chart.vue.d.ts +92 -0
  29. package/dist/components/ui/chart/index.d.ts +2 -0
  30. package/dist/components/ui/chat/Chat.vue.d.ts +190 -0
  31. package/dist/components/ui/chat/ChatAttachments.vue.d.ts +11 -0
  32. package/dist/components/ui/chat/ChatCodeBlock.vue.d.ts +16 -0
  33. package/dist/components/ui/chat/code-block.d.ts +27 -0
  34. package/dist/components/ui/chat/index.d.ts +6 -0
  35. package/dist/components/ui/chat/types.d.ts +15 -0
  36. package/dist/components/ui/checkbox/Checkbox.vue.d.ts +29 -0
  37. package/dist/components/ui/checkbox/index.d.ts +1 -0
  38. package/dist/components/ui/commit/Commit.vue.d.ts +62 -0
  39. package/dist/components/ui/commit/index.d.ts +2 -0
  40. package/dist/components/ui/contribution-graph/ContributionGraph.vue.d.ts +87 -0
  41. package/dist/components/ui/contribution-graph/index.d.ts +2 -0
  42. package/dist/components/ui/data-table/DataTable.vue.d.ts +109 -0
  43. package/dist/components/ui/data-table/index.d.ts +2 -0
  44. package/dist/components/ui/date-picker/DatePicker.vue.d.ts +37 -0
  45. package/dist/components/ui/date-picker/index.d.ts +2 -0
  46. package/dist/components/ui/dialog/Dialog.vue.d.ts +25 -0
  47. package/dist/components/ui/dialog/DialogClose.vue.d.ts +18 -0
  48. package/dist/components/ui/dialog/DialogContent.vue.d.ts +39 -0
  49. package/dist/components/ui/dialog/DialogDescription.vue.d.ts +22 -0
  50. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +21 -0
  51. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +21 -0
  52. package/dist/components/ui/dialog/DialogOverlay.vue.d.ts +22 -0
  53. package/dist/components/ui/dialog/DialogScrollContent.vue.d.ts +36 -0
  54. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +22 -0
  55. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +18 -0
  56. package/dist/components/ui/dialog/index.d.ts +10 -0
  57. package/dist/components/ui/diff/DiffTool.vue.d.ts +21 -0
  58. package/dist/components/ui/diff/diff-parser.d.ts +30 -0
  59. package/dist/components/ui/diff/diff-tool.d.ts +36 -0
  60. package/dist/components/ui/diff/index.d.ts +2 -0
  61. package/dist/components/ui/dropdown-menu/DropdownMenu.vue.d.ts +24 -0
  62. package/dist/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +29 -0
  63. package/dist/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +36 -0
  64. package/dist/components/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts +18 -0
  65. package/dist/components/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +26 -0
  66. package/dist/components/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts +23 -0
  67. package/dist/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +22 -0
  68. package/dist/components/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +27 -0
  69. package/dist/components/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts +7 -0
  70. package/dist/components/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts +21 -0
  71. package/dist/components/ui/dropdown-menu/DropdownMenuSub.vue.d.ts +22 -0
  72. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +38 -0
  73. package/dist/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts +23 -0
  74. package/dist/components/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts +18 -0
  75. package/dist/components/ui/dropdown-menu/index.d.ts +15 -0
  76. package/dist/components/ui/gauge/Gauge.vue.d.ts +62 -0
  77. package/dist/components/ui/gauge/index.d.ts +2 -0
  78. package/dist/components/ui/git-graph/GitGraph.vue.d.ts +59 -0
  79. package/dist/components/ui/git-graph/index.d.ts +2 -0
  80. package/dist/components/ui/incident-timeline/IncidentTimeline.vue.d.ts +50 -0
  81. package/dist/components/ui/incident-timeline/index.d.ts +2 -0
  82. package/dist/components/ui/input/Input.vue.d.ts +14 -0
  83. package/dist/components/ui/input/InputControl.vue.d.ts +14 -0
  84. package/dist/components/ui/input/InputFieldGroup.vue.d.ts +21 -0
  85. package/dist/components/ui/input/index.d.ts +4 -0
  86. package/dist/components/ui/input/types.d.ts +31 -0
  87. package/dist/components/ui/kpi-card/KpiCard.vue.d.ts +46 -0
  88. package/dist/components/ui/kpi-card/index.d.ts +2 -0
  89. package/dist/components/ui/kpi-line-card/KpiLineCard.vue.d.ts +66 -0
  90. package/dist/components/ui/kpi-line-card/index.d.ts +2 -0
  91. package/dist/components/ui/model-selector/ModelSelector.vue.d.ts +41 -0
  92. package/dist/components/ui/model-selector/index.d.ts +2 -0
  93. package/dist/components/ui/model-selector/types.d.ts +12 -0
  94. package/dist/components/ui/network-graph/NetworkGraph.vue.d.ts +75 -0
  95. package/dist/components/ui/network-graph/index.d.ts +2 -0
  96. package/dist/components/ui/pagination/Pagination.vue.d.ts +29 -0
  97. package/dist/components/ui/pagination/PaginationContent.vue.d.ts +29 -0
  98. package/dist/components/ui/pagination/PaginationEllipsis.vue.d.ts +22 -0
  99. package/dist/components/ui/pagination/PaginationFirst.vue.d.ts +26 -0
  100. package/dist/components/ui/pagination/PaginationItem.vue.d.ts +28 -0
  101. package/dist/components/ui/pagination/PaginationLast.vue.d.ts +26 -0
  102. package/dist/components/ui/pagination/PaginationNext.vue.d.ts +26 -0
  103. package/dist/components/ui/pagination/PaginationPrevious.vue.d.ts +26 -0
  104. package/dist/components/ui/pagination/index.d.ts +8 -0
  105. package/dist/components/ui/profile/Profile.vue.d.ts +30 -0
  106. package/dist/components/ui/profile/ProfileGroup.vue.d.ts +37 -0
  107. package/dist/components/ui/profile/index.d.ts +4 -0
  108. package/dist/components/ui/progress/Progress.vue.d.ts +36 -0
  109. package/dist/components/ui/progress/index.d.ts +2 -0
  110. package/dist/components/ui/prompt-input/PromptInput.vue.d.ts +150 -0
  111. package/dist/components/ui/prompt-input/index.d.ts +2 -0
  112. package/dist/components/ui/prompt-input/types.d.ts +61 -0
  113. package/dist/components/ui/radio-group/RadioGroup.vue.d.ts +30 -0
  114. package/dist/components/ui/radio-group/RadioGroupItem.vue.d.ts +12 -0
  115. package/dist/components/ui/radio-group/RadioGroupOption.vue.d.ts +28 -0
  116. package/dist/components/ui/radio-group/index.d.ts +3 -0
  117. package/dist/components/ui/reasoning/Reasoning.vue.d.ts +40 -0
  118. package/dist/components/ui/reasoning/index.d.ts +2 -0
  119. package/dist/components/ui/reasoning/types.d.ts +26 -0
  120. package/dist/components/ui/select/Select.vue.d.ts +28 -0
  121. package/dist/components/ui/select/SelectContent.vue.d.ts +46 -0
  122. package/dist/components/ui/select/SelectGroup.vue.d.ts +18 -0
  123. package/dist/components/ui/select/SelectItem.vue.d.ts +26 -0
  124. package/dist/components/ui/select/SelectItemText.vue.d.ts +18 -0
  125. package/dist/components/ui/select/SelectLabel.vue.d.ts +22 -0
  126. package/dist/components/ui/select/SelectScrollDownButton.vue.d.ts +22 -0
  127. package/dist/components/ui/select/SelectScrollUpButton.vue.d.ts +22 -0
  128. package/dist/components/ui/select/SelectSeparator.vue.d.ts +7 -0
  129. package/dist/components/ui/select/SelectTrigger.vue.d.ts +25 -0
  130. package/dist/components/ui/select/SelectValue.vue.d.ts +18 -0
  131. package/dist/components/ui/select/index.d.ts +11 -0
  132. package/dist/components/ui/select/search.d.ts +18 -0
  133. package/dist/components/ui/separator/Separator.vue.d.ts +6 -0
  134. package/dist/components/ui/separator/index.d.ts +2 -0
  135. package/dist/components/ui/separator/types.d.ts +7 -0
  136. package/dist/components/ui/shimmer/Shimmer.vue.d.ts +37 -0
  137. package/dist/components/ui/shimmer/index.d.ts +2 -0
  138. package/dist/components/ui/sidebar/Sidebar.vue.d.ts +24 -0
  139. package/dist/components/ui/sidebar/SidebarContent.vue.d.ts +21 -0
  140. package/dist/components/ui/sidebar/SidebarFooter.vue.d.ts +21 -0
  141. package/dist/components/ui/sidebar/SidebarGroup.vue.d.ts +21 -0
  142. package/dist/components/ui/sidebar/SidebarGroupAction.vue.d.ts +24 -0
  143. package/dist/components/ui/sidebar/SidebarGroupContent.vue.d.ts +21 -0
  144. package/dist/components/ui/sidebar/SidebarGroupLabel.vue.d.ts +24 -0
  145. package/dist/components/ui/sidebar/SidebarHeader.vue.d.ts +21 -0
  146. package/dist/components/ui/sidebar/SidebarInput.vue.d.ts +6 -0
  147. package/dist/components/ui/sidebar/SidebarInset.vue.d.ts +21 -0
  148. package/dist/components/ui/sidebar/SidebarMenu.vue.d.ts +21 -0
  149. package/dist/components/ui/sidebar/SidebarMenuAction.vue.d.ts +25 -0
  150. package/dist/components/ui/sidebar/SidebarMenuBadge.vue.d.ts +21 -0
  151. package/dist/components/ui/sidebar/SidebarMenuButton.vue.d.ts +25 -0
  152. package/dist/components/ui/sidebar/SidebarMenuButtonChild.vue.d.ts +30 -0
  153. package/dist/components/ui/sidebar/SidebarMenuItem.vue.d.ts +21 -0
  154. package/dist/components/ui/sidebar/SidebarMenuSub.vue.d.ts +21 -0
  155. package/dist/components/ui/sidebar/SidebarMenuSubButton.vue.d.ts +27 -0
  156. package/dist/components/ui/sidebar/SidebarMenuSubItem.vue.d.ts +21 -0
  157. package/dist/components/ui/sidebar/SidebarProvider.vue.d.ts +36 -0
  158. package/dist/components/ui/sidebar/SidebarRail.vue.d.ts +21 -0
  159. package/dist/components/ui/sidebar/SidebarSeparator.vue.d.ts +6 -0
  160. package/dist/components/ui/sidebar/SidebarTrigger.vue.d.ts +6 -0
  161. package/dist/components/ui/sidebar/context.d.ts +19 -0
  162. package/dist/components/ui/sidebar/index.d.ts +26 -0
  163. package/dist/components/ui/sidebar/types.d.ts +11 -0
  164. package/dist/components/ui/sidebar/variants.d.ts +6 -0
  165. package/dist/components/ui/skeleton/Skeleton.vue.d.ts +18 -0
  166. package/dist/components/ui/skeleton/index.d.ts +2 -0
  167. package/dist/components/ui/sonner/Sonner.vue.d.ts +5 -0
  168. package/dist/components/ui/sonner/index.d.ts +2 -0
  169. package/dist/components/ui/spinner/Spinner.vue.d.ts +11 -0
  170. package/dist/components/ui/spinner/index.d.ts +1 -0
  171. package/dist/components/ui/stepper/Stepper.vue.d.ts +38 -0
  172. package/dist/components/ui/stepper/StepperDescription.vue.d.ts +22 -0
  173. package/dist/components/ui/stepper/StepperIndicator.vue.d.ts +30 -0
  174. package/dist/components/ui/stepper/StepperItem.vue.d.ts +24 -0
  175. package/dist/components/ui/stepper/StepperSeparator.vue.d.ts +7 -0
  176. package/dist/components/ui/stepper/StepperTitle.vue.d.ts +22 -0
  177. package/dist/components/ui/stepper/StepperTrigger.vue.d.ts +22 -0
  178. package/dist/components/ui/stepper/index.d.ts +7 -0
  179. package/dist/components/ui/switch/Switch.vue.d.ts +12 -0
  180. package/dist/components/ui/switch/index.d.ts +1 -0
  181. package/dist/components/ui/table/Table.vue.d.ts +22 -0
  182. package/dist/components/ui/table/TableBody.vue.d.ts +21 -0
  183. package/dist/components/ui/table/TableCaption.vue.d.ts +21 -0
  184. package/dist/components/ui/table/TableCell.vue.d.ts +22 -0
  185. package/dist/components/ui/table/TableEmpty.vue.d.ts +24 -0
  186. package/dist/components/ui/table/TableFooter.vue.d.ts +21 -0
  187. package/dist/components/ui/table/TableHead.vue.d.ts +21 -0
  188. package/dist/components/ui/table/TableHeader.vue.d.ts +21 -0
  189. package/dist/components/ui/table/TableRow.vue.d.ts +21 -0
  190. package/dist/components/ui/table/index.d.ts +9 -0
  191. package/dist/components/ui/tabs/Tabs.vue.d.ts +28 -0
  192. package/dist/components/ui/tabs/TabsContent.vue.d.ts +22 -0
  193. package/dist/components/ui/tabs/TabsList.vue.d.ts +22 -0
  194. package/dist/components/ui/tabs/TabsTrigger.vue.d.ts +22 -0
  195. package/dist/components/ui/tabs/index.d.ts +4 -0
  196. package/dist/components/ui/tag/Tag.vue.d.ts +35 -0
  197. package/dist/components/ui/tag/index.d.ts +2 -0
  198. package/dist/components/ui/tag/variants.d.ts +6 -0
  199. package/dist/components/ui/textarea/Textarea.vue.d.ts +14 -0
  200. package/dist/components/ui/textarea/TextareaControl.vue.d.ts +14 -0
  201. package/dist/components/ui/textarea/TextareaFieldGroup.vue.d.ts +21 -0
  202. package/dist/components/ui/textarea/index.d.ts +4 -0
  203. package/dist/components/ui/textarea/types.d.ts +32 -0
  204. package/dist/components/ui/tool/Tool.vue.d.ts +61 -0
  205. package/dist/components/ui/tool/index.d.ts +2 -0
  206. package/dist/components/ui/tooltip/Tooltip.vue.d.ts +24 -0
  207. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +32 -0
  208. package/dist/components/ui/tooltip/TooltipProvider.vue.d.ts +20 -0
  209. package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts +18 -0
  210. package/dist/components/ui/tooltip/index.d.ts +4 -0
  211. package/dist/docs/component-docs.d.ts +18 -0
  212. package/dist/docs/markdown.d.ts +27 -0
  213. package/dist/index.d.ts +45 -0
  214. package/dist/lib/code-highlight.d.ts +11 -0
  215. package/dist/lib/utils.d.ts +2 -0
  216. package/dist/styles.css +3 -0
  217. package/package.json +76 -0
  218. package/public/r/accordion.json +52 -0
  219. package/public/r/alert.json +51 -0
  220. package/public/r/button-group.json +31 -0
  221. package/public/r/button.json +39 -0
  222. package/public/r/card.json +61 -0
  223. package/public/r/chart.json +31 -0
  224. package/public/r/chat.json +186 -0
  225. package/public/r/checkbox.json +34 -0
  226. package/public/r/commit.json +32 -0
  227. package/public/r/contribution-graph.json +63 -0
  228. package/public/r/data-table.json +197 -0
  229. package/public/r/date-picker.json +33 -0
  230. package/public/r/dialog.json +88 -0
  231. package/public/r/diff.json +71 -0
  232. package/public/r/dropdown-menu.json +112 -0
  233. package/public/r/gauge.json +31 -0
  234. package/public/r/git-graph.json +32 -0
  235. package/public/r/incident-timeline.json +64 -0
  236. package/public/r/input.json +49 -0
  237. package/public/r/kpi-card.json +32 -0
  238. package/public/r/kpi-line-card.json +32 -0
  239. package/public/r/model-selector.json +148 -0
  240. package/public/r/network-graph.json +33 -0
  241. package/public/r/pagination.json +95 -0
  242. package/public/r/profile.json +37 -0
  243. package/public/r/progress.json +31 -0
  244. package/public/r/prompt-input.json +293 -0
  245. package/public/r/radio-group.json +45 -0
  246. package/public/r/reasoning.json +38 -0
  247. package/public/r/registry.json +2512 -0
  248. package/public/r/select.json +100 -0
  249. package/public/r/separator.json +37 -0
  250. package/public/r/shimmer.json +31 -0
  251. package/public/r/sidebar.json +221 -0
  252. package/public/r/skeleton.json +31 -0
  253. package/public/r/sonner.json +33 -0
  254. package/public/r/spinner.json +31 -0
  255. package/public/r/stepper.json +70 -0
  256. package/public/r/switch.json +33 -0
  257. package/public/r/table.json +79 -0
  258. package/public/r/tabs.json +51 -0
  259. package/public/r/tag.json +39 -0
  260. package/public/r/textarea.json +49 -0
  261. package/public/r/tool.json +32 -0
  262. package/public/r/tooltip.json +51 -0
  263. package/registry.json +2512 -0
  264. package/src/components/docs/MarkdownContent.vue +106 -0
  265. package/src/components/ui/accordion/Accordion.vue +24 -0
  266. package/src/components/ui/accordion/AccordionContent.vue +62 -0
  267. package/src/components/ui/accordion/AccordionItem.vue +23 -0
  268. package/src/components/ui/accordion/AccordionTrigger.vue +38 -0
  269. package/src/components/ui/accordion/index.ts +4 -0
  270. package/src/components/ui/alert/Alert.vue +40 -0
  271. package/src/components/ui/alert/AlertDescription.vue +24 -0
  272. package/src/components/ui/alert/AlertTitle.vue +24 -0
  273. package/src/components/ui/alert/index.ts +4 -0
  274. package/src/components/ui/alert/variants.ts +19 -0
  275. package/src/components/ui/button/Button.vue +27 -0
  276. package/src/components/ui/button/index.ts +2 -0
  277. package/src/components/ui/button/variants.ts +32 -0
  278. package/src/components/ui/button-group/ButtonGroup.vue +31 -0
  279. package/src/components/ui/button-group/index.ts +2 -0
  280. package/src/components/ui/card/Card.vue +17 -0
  281. package/src/components/ui/card/CardContent.vue +14 -0
  282. package/src/components/ui/card/CardDescription.vue +14 -0
  283. package/src/components/ui/card/CardFooter.vue +14 -0
  284. package/src/components/ui/card/CardHeader.vue +17 -0
  285. package/src/components/ui/card/CardTitle.vue +14 -0
  286. package/src/components/ui/card/index.ts +6 -0
  287. package/src/components/ui/chart/Chart.vue +1042 -0
  288. package/src/components/ui/chart/index.ts +13 -0
  289. package/src/components/ui/chat/Chat.vue +1297 -0
  290. package/src/components/ui/chat/ChatAttachments.vue +278 -0
  291. package/src/components/ui/chat/ChatCodeBlock.vue +283 -0
  292. package/src/components/ui/chat/code-block.ts +30 -0
  293. package/src/components/ui/chat/index.ts +24 -0
  294. package/src/components/ui/chat/types.ts +23 -0
  295. package/src/components/ui/checkbox/Checkbox.vue +38 -0
  296. package/src/components/ui/checkbox/index.ts +1 -0
  297. package/src/components/ui/commit/Commit.vue +423 -0
  298. package/src/components/ui/commit/index.ts +9 -0
  299. package/src/components/ui/contribution-graph/ContributionGraph.vue +719 -0
  300. package/src/components/ui/contribution-graph/index.ts +9 -0
  301. package/src/components/ui/data-table/DataTable.vue +534 -0
  302. package/src/components/ui/data-table/index.ts +9 -0
  303. package/src/components/ui/date-picker/DatePicker.vue +649 -0
  304. package/src/components/ui/date-picker/index.ts +7 -0
  305. package/src/components/ui/dialog/Dialog.vue +19 -0
  306. package/src/components/ui/dialog/DialogClose.vue +17 -0
  307. package/src/components/ui/dialog/DialogContent.vue +60 -0
  308. package/src/components/ui/dialog/DialogDescription.vue +23 -0
  309. package/src/components/ui/dialog/DialogFooter.vue +17 -0
  310. package/src/components/ui/dialog/DialogHeader.vue +17 -0
  311. package/src/components/ui/dialog/DialogOverlay.vue +23 -0
  312. package/src/components/ui/dialog/DialogScrollContent.vue +69 -0
  313. package/src/components/ui/dialog/DialogTitle.vue +23 -0
  314. package/src/components/ui/dialog/DialogTrigger.vue +17 -0
  315. package/src/components/ui/dialog/index.ts +10 -0
  316. package/src/components/ui/diff/DiffTool.vue +513 -0
  317. package/src/components/ui/diff/diff-parser.ts +423 -0
  318. package/src/components/ui/diff/diff-tool.ts +39 -0
  319. package/src/components/ui/diff/index.ts +5 -0
  320. package/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  321. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -0
  322. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -0
  323. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  324. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  325. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  326. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  327. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  328. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  329. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  330. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  331. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  332. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  333. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  334. package/src/components/ui/dropdown-menu/index.ts +16 -0
  335. package/src/components/ui/gauge/Gauge.vue +725 -0
  336. package/src/components/ui/gauge/index.ts +9 -0
  337. package/src/components/ui/git-graph/GitGraph.vue +715 -0
  338. package/src/components/ui/git-graph/index.ts +9 -0
  339. package/src/components/ui/incident-timeline/IncidentTimeline.vue +360 -0
  340. package/src/components/ui/incident-timeline/index.ts +7 -0
  341. package/src/components/ui/input/Input.vue +159 -0
  342. package/src/components/ui/input/InputControl.vue +135 -0
  343. package/src/components/ui/input/InputFieldGroup.vue +14 -0
  344. package/src/components/ui/input/index.ts +9 -0
  345. package/src/components/ui/input/types.ts +34 -0
  346. package/src/components/ui/kpi-card/KpiCard.vue +268 -0
  347. package/src/components/ui/kpi-card/index.ts +9 -0
  348. package/src/components/ui/kpi-line-card/KpiLineCard.vue +622 -0
  349. package/src/components/ui/kpi-line-card/index.ts +11 -0
  350. package/src/components/ui/model-selector/ModelSelector.vue +328 -0
  351. package/src/components/ui/model-selector/index.ts +6 -0
  352. package/src/components/ui/model-selector/types.ts +15 -0
  353. package/src/components/ui/network-graph/NetworkGraph.vue +902 -0
  354. package/src/components/ui/network-graph/index.ts +7 -0
  355. package/src/components/ui/pagination/Pagination.vue +26 -0
  356. package/src/components/ui/pagination/PaginationContent.vue +24 -0
  357. package/src/components/ui/pagination/PaginationEllipsis.vue +27 -0
  358. package/src/components/ui/pagination/PaginationFirst.vue +33 -0
  359. package/src/components/ui/pagination/PaginationItem.vue +39 -0
  360. package/src/components/ui/pagination/PaginationLast.vue +33 -0
  361. package/src/components/ui/pagination/PaginationNext.vue +33 -0
  362. package/src/components/ui/pagination/PaginationPrevious.vue +33 -0
  363. package/src/components/ui/pagination/index.ts +8 -0
  364. package/src/components/ui/profile/Profile.vue +226 -0
  365. package/src/components/ui/profile/ProfileGroup.vue +96 -0
  366. package/src/components/ui/profile/index.ts +8 -0
  367. package/src/components/ui/progress/Progress.vue +271 -0
  368. package/src/components/ui/progress/index.ts +9 -0
  369. package/src/components/ui/prompt-input/PromptInput.vue +1094 -0
  370. package/src/components/ui/prompt-input/index.ts +14 -0
  371. package/src/components/ui/prompt-input/types.ts +78 -0
  372. package/src/components/ui/radio-group/RadioGroup.vue +36 -0
  373. package/src/components/ui/radio-group/RadioGroupItem.vue +45 -0
  374. package/src/components/ui/radio-group/RadioGroupOption.vue +80 -0
  375. package/src/components/ui/radio-group/index.ts +3 -0
  376. package/src/components/ui/reasoning/Reasoning.vue +278 -0
  377. package/src/components/ui/reasoning/index.ts +8 -0
  378. package/src/components/ui/reasoning/types.ts +29 -0
  379. package/src/components/ui/select/Select.vue +19 -0
  380. package/src/components/ui/select/SelectContent.vue +166 -0
  381. package/src/components/ui/select/SelectGroup.vue +23 -0
  382. package/src/components/ui/select/SelectItem.vue +97 -0
  383. package/src/components/ui/select/SelectItemText.vue +15 -0
  384. package/src/components/ui/select/SelectLabel.vue +17 -0
  385. package/src/components/ui/select/SelectScrollDownButton.vue +26 -0
  386. package/src/components/ui/select/SelectScrollUpButton.vue +26 -0
  387. package/src/components/ui/select/SelectSeparator.vue +19 -0
  388. package/src/components/ui/select/SelectTrigger.vue +33 -0
  389. package/src/components/ui/select/SelectValue.vue +15 -0
  390. package/src/components/ui/select/index.ts +11 -0
  391. package/src/components/ui/select/search.ts +26 -0
  392. package/src/components/ui/separator/Separator.vue +30 -0
  393. package/src/components/ui/separator/index.ts +5 -0
  394. package/src/components/ui/separator/types.ts +9 -0
  395. package/src/components/ui/shimmer/Shimmer.vue +110 -0
  396. package/src/components/ui/shimmer/index.ts +5 -0
  397. package/src/components/ui/sidebar/Sidebar.vue +142 -0
  398. package/src/components/ui/sidebar/SidebarContent.vue +18 -0
  399. package/src/components/ui/sidebar/SidebarFooter.vue +18 -0
  400. package/src/components/ui/sidebar/SidebarGroup.vue +18 -0
  401. package/src/components/ui/sidebar/SidebarGroupAction.vue +31 -0
  402. package/src/components/ui/sidebar/SidebarGroupContent.vue +18 -0
  403. package/src/components/ui/sidebar/SidebarGroupLabel.vue +30 -0
  404. package/src/components/ui/sidebar/SidebarHeader.vue +18 -0
  405. package/src/components/ui/sidebar/SidebarInput.vue +26 -0
  406. package/src/components/ui/sidebar/SidebarInset.vue +23 -0
  407. package/src/components/ui/sidebar/SidebarMenu.vue +18 -0
  408. package/src/components/ui/sidebar/SidebarMenuAction.vue +34 -0
  409. package/src/components/ui/sidebar/SidebarMenuBadge.vue +25 -0
  410. package/src/components/ui/sidebar/SidebarMenuButton.vue +37 -0
  411. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +38 -0
  412. package/src/components/ui/sidebar/SidebarMenuItem.vue +18 -0
  413. package/src/components/ui/sidebar/SidebarMenuSub.vue +18 -0
  414. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +36 -0
  415. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  416. package/src/components/ui/sidebar/SidebarProvider.vue +119 -0
  417. package/src/components/ui/sidebar/SidebarRail.vue +35 -0
  418. package/src/components/ui/sidebar/SidebarSeparator.vue +18 -0
  419. package/src/components/ui/sidebar/SidebarTrigger.vue +28 -0
  420. package/src/components/ui/sidebar/context.ts +39 -0
  421. package/src/components/ui/sidebar/index.ts +43 -0
  422. package/src/components/ui/sidebar/types.ts +13 -0
  423. package/src/components/ui/sidebar/variants.ts +25 -0
  424. package/src/components/ui/skeleton/Skeleton.vue +53 -0
  425. package/src/components/ui/skeleton/index.ts +5 -0
  426. package/src/components/ui/sonner/Sonner.vue +69 -0
  427. package/src/components/ui/sonner/index.ts +12 -0
  428. package/src/components/ui/spinner/Spinner.vue +33 -0
  429. package/src/components/ui/spinner/index.ts +1 -0
  430. package/src/components/ui/stepper/Stepper.vue +29 -0
  431. package/src/components/ui/stepper/StepperDescription.vue +30 -0
  432. package/src/components/ui/stepper/StepperIndicator.vue +50 -0
  433. package/src/components/ui/stepper/StepperItem.vue +28 -0
  434. package/src/components/ui/stepper/StepperSeparator.vue +25 -0
  435. package/src/components/ui/stepper/StepperTitle.vue +27 -0
  436. package/src/components/ui/stepper/StepperTrigger.vue +27 -0
  437. package/src/components/ui/stepper/index.ts +7 -0
  438. package/src/components/ui/switch/Switch.vue +41 -0
  439. package/src/components/ui/switch/index.ts +1 -0
  440. package/src/components/ui/table/Table.vue +23 -0
  441. package/src/components/ui/table/TableBody.vue +17 -0
  442. package/src/components/ui/table/TableCaption.vue +17 -0
  443. package/src/components/ui/table/TableCell.vue +24 -0
  444. package/src/components/ui/table/TableEmpty.vue +31 -0
  445. package/src/components/ui/table/TableFooter.vue +17 -0
  446. package/src/components/ui/table/TableHead.vue +22 -0
  447. package/src/components/ui/table/TableHeader.vue +17 -0
  448. package/src/components/ui/table/TableRow.vue +22 -0
  449. package/src/components/ui/table/index.ts +9 -0
  450. package/src/components/ui/tabs/Tabs.vue +24 -0
  451. package/src/components/ui/tabs/TabsContent.vue +22 -0
  452. package/src/components/ui/tabs/TabsList.vue +27 -0
  453. package/src/components/ui/tabs/TabsTrigger.vue +27 -0
  454. package/src/components/ui/tabs/index.ts +4 -0
  455. package/src/components/ui/tag/Tag.vue +55 -0
  456. package/src/components/ui/tag/index.ts +2 -0
  457. package/src/components/ui/tag/variants.ts +29 -0
  458. package/src/components/ui/textarea/Textarea.vue +159 -0
  459. package/src/components/ui/textarea/TextareaControl.vue +120 -0
  460. package/src/components/ui/textarea/TextareaFieldGroup.vue +14 -0
  461. package/src/components/ui/textarea/index.ts +10 -0
  462. package/src/components/ui/textarea/types.ts +35 -0
  463. package/src/components/ui/tool/Tool.vue +304 -0
  464. package/src/components/ui/tool/index.ts +7 -0
  465. package/src/components/ui/tooltip/Tooltip.vue +19 -0
  466. package/src/components/ui/tooltip/TooltipContent.vue +44 -0
  467. package/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  468. package/src/components/ui/tooltip/TooltipTrigger.vue +15 -0
  469. package/src/components/ui/tooltip/index.ts +4 -0
  470. package/src/lib/code-highlight.ts +220 -0
  471. package/src/lib/utils.ts +6 -0
  472. package/src/styles.css +684 -0
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "stepper",
4
+ "title": "Stepper",
5
+ "description": "A multi-step progress control for onboarding, setup, and wizard flows.",
6
+ "dependencies": [
7
+ "@lucide/vue",
8
+ "@vueuse/core",
9
+ "clsx",
10
+ "reka-ui",
11
+ "tailwind-merge"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "src/components/ui/stepper/Stepper.vue",
16
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperRootEmits, StepperRootProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { StepperRoot as StepperPrimitiveRoot, useForwardPropsEmits } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperRootProps & { class?: HTMLAttributes[\"class\"] }>()\nconst emits = defineEmits<StepperRootEmits>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <StepperPrimitiveRoot\n v-slot=\"slotProps\"\n data-slot=\"stepper\"\n v-bind=\"forwarded\"\n :class=\"\n cn(\n 'flex w-full items-start gap-2 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch',\n props.class,\n )\n \"\n >\n <slot v-bind=\"slotProps\" />\n </StepperPrimitiveRoot>\n</template>\n",
17
+ "type": "registry:ui",
18
+ "target": "components/ui/stepper/Stepper.vue"
19
+ },
20
+ {
21
+ "path": "src/components/ui/stepper/StepperItem.vue",
22
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperItemProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { StepperItem as StepperPrimitiveItem, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperItemProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <StepperPrimitiveItem\n v-slot=\"slotProps\"\n data-slot=\"stepper-item\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'group relative flex min-w-0 flex-1 flex-col items-center text-center data-[orientation=vertical]:flex-row data-[orientation=vertical]:items-start data-[orientation=vertical]:text-left',\n props.class,\n )\n \"\n >\n <slot v-bind=\"slotProps\" />\n </StepperPrimitiveItem>\n</template>\n",
23
+ "type": "registry:ui",
24
+ "target": "components/ui/stepper/StepperItem.vue"
25
+ },
26
+ {
27
+ "path": "src/components/ui/stepper/StepperTrigger.vue",
28
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperTriggerProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { StepperTrigger as StepperPrimitiveTrigger, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperTriggerProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <StepperPrimitiveTrigger\n data-slot=\"stepper-trigger\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'focus-visible:border-ring focus-visible:ring-ring/50 relative z-10 inline-flex min-w-0 items-center gap-3 rounded-md text-left outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50',\n props.class,\n )\n \"\n >\n <slot />\n </StepperPrimitiveTrigger>\n</template>\n",
29
+ "type": "registry:ui",
30
+ "target": "components/ui/stepper/StepperTrigger.vue"
31
+ },
32
+ {
33
+ "path": "src/components/ui/stepper/StepperIndicator.vue",
34
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperIndicatorProps } from \"reka-ui\"\nimport { computed } from \"vue\"\nimport { Check } from \"@lucide/vue\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport {\n injectStepperItemContext,\n StepperIndicator as StepperPrimitiveIndicator,\n useForwardProps,\n} from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperIndicatorProps & { class?: HTMLAttributes[\"class\"] }>()\n\ndefineSlots<{\n default?: (props: { state: \"active\" | \"completed\" | \"inactive\"; step: number }) => unknown\n}>()\n\nconst itemContext = injectStepperItemContext()\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\nconst step = computed(() => itemContext.step.value)\nconst state = computed(() => itemContext.state.value)\n</script>\n\n<template>\n <StepperPrimitiveIndicator\n data-slot=\"stepper-indicator\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'border-input bg-background text-muted-foreground relative z-10 flex size-8 shrink-0 items-center justify-center rounded-full border text-sm font-medium transition-[background-color,border-color,color,box-shadow] group-data-[state=active]:border-primary group-data-[state=active]:bg-primary group-data-[state=active]:text-primary-foreground group-data-[state=completed]:border-primary group-data-[state=completed]:bg-primary group-data-[state=completed]:text-primary-foreground group-data-[disabled]:opacity-50',\n props.class,\n )\n \"\n >\n <slot\n :state=\"state\"\n :step=\"step\"\n >\n <Check\n v-if=\"state === 'completed'\"\n aria-hidden=\"true\"\n class=\"size-4\"\n />\n <span v-else>{{ step }}</span>\n </slot>\n </StepperPrimitiveIndicator>\n</template>\n",
35
+ "type": "registry:ui",
36
+ "target": "components/ui/stepper/StepperIndicator.vue"
37
+ },
38
+ {
39
+ "path": "src/components/ui/stepper/StepperTitle.vue",
40
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperTitleProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { StepperTitle as StepperPrimitiveTitle, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperTitleProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <StepperPrimitiveTitle\n data-slot=\"stepper-title\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'text-sm font-medium leading-none text-foreground transition-colors group-data-[state=inactive]:text-muted-foreground group-data-[disabled]:text-muted-foreground',\n props.class,\n )\n \"\n >\n <slot />\n </StepperPrimitiveTitle>\n</template>\n",
41
+ "type": "registry:ui",
42
+ "target": "components/ui/stepper/StepperTitle.vue"
43
+ },
44
+ {
45
+ "path": "src/components/ui/stepper/StepperDescription.vue",
46
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperDescriptionProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport {\n StepperDescription as StepperPrimitiveDescription,\n useForwardProps,\n} from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperDescriptionProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <StepperPrimitiveDescription\n data-slot=\"stepper-description\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'text-xs leading-relaxed text-muted-foreground transition-colors group-data-[state=active]:text-foreground group-data-[disabled]:text-muted-foreground',\n props.class,\n )\n \"\n >\n <slot />\n </StepperPrimitiveDescription>\n</template>\n",
47
+ "type": "registry:ui",
48
+ "target": "components/ui/stepper/StepperDescription.vue"
49
+ },
50
+ {
51
+ "path": "src/components/ui/stepper/StepperSeparator.vue",
52
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { StepperSeparatorProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { StepperSeparator as StepperPrimitiveSeparator, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<StepperSeparatorProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <StepperPrimitiveSeparator\n data-slot=\"stepper-separator\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'bg-muted pointer-events-none z-0 transition-colors data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:flex-1 data-[orientation=vertical]:w-0.5 data-[orientation=vertical]:self-stretch group-data-[state=completed]:bg-primary',\n props.class,\n )\n \"\n />\n</template>\n",
53
+ "type": "registry:ui",
54
+ "target": "components/ui/stepper/StepperSeparator.vue"
55
+ },
56
+ {
57
+ "path": "src/components/ui/stepper/index.ts",
58
+ "content": "export { default as Stepper } from \"./Stepper.vue\"\nexport { default as StepperDescription } from \"./StepperDescription.vue\"\nexport { default as StepperIndicator } from \"./StepperIndicator.vue\"\nexport { default as StepperItem } from \"./StepperItem.vue\"\nexport { default as StepperSeparator } from \"./StepperSeparator.vue\"\nexport { default as StepperTitle } from \"./StepperTitle.vue\"\nexport { default as StepperTrigger } from \"./StepperTrigger.vue\"\n",
59
+ "type": "registry:ui",
60
+ "target": "components/ui/stepper/index.ts"
61
+ },
62
+ {
63
+ "path": "src/lib/utils.ts",
64
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
65
+ "type": "registry:lib",
66
+ "target": "lib/utils.ts"
67
+ }
68
+ ],
69
+ "type": "registry:ui"
70
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "switch",
4
+ "title": "Switch",
5
+ "description": "A toggle control for checked, unchecked, disabled, and invalid states.",
6
+ "dependencies": [
7
+ "@vueuse/core",
8
+ "clsx",
9
+ "reka-ui",
10
+ "tailwind-merge"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "src/components/ui/switch/Switch.vue",
15
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { SwitchRootEmits, SwitchRootProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { SwitchRoot, SwitchThumb, useForwardPropsEmits } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<\n SwitchRootProps & {\n class?: HTMLAttributes[\"class\"]\n thumbClass?: HTMLAttributes[\"class\"]\n }\n>()\nconst emits = defineEmits<SwitchRootEmits>()\n\nconst delegatedProps = reactiveOmit(props, \"class\", \"thumbClass\")\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <SwitchRoot\n data-slot=\"switch\"\n v-bind=\"forwarded\"\n :class=\"\n cn(\n 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border border-transparent shadow-xs transition-[background-color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',\n props.class,\n )\n \"\n >\n <SwitchThumb\n data-slot=\"switch-thumb\"\n :class=\"\n cn(\n 'bg-background pointer-events-none block size-4 rounded-full shadow-sm ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0',\n props.thumbClass,\n )\n \"\n />\n </SwitchRoot>\n</template>\n",
16
+ "type": "registry:ui",
17
+ "target": "components/ui/switch/Switch.vue"
18
+ },
19
+ {
20
+ "path": "src/components/ui/switch/index.ts",
21
+ "content": "export { default as Switch } from \"./Switch.vue\"\n",
22
+ "type": "registry:ui",
23
+ "target": "components/ui/switch/index.ts"
24
+ },
25
+ {
26
+ "path": "src/lib/utils.ts",
27
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
28
+ "type": "registry:lib",
29
+ "target": "lib/utils.ts"
30
+ }
31
+ ],
32
+ "type": "registry:ui"
33
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "table",
4
+ "title": "Table",
5
+ "description": "Composable table primitives for structured data, captions, footers, empty states, and horizontal overflow.",
6
+ "dependencies": [
7
+ "clsx",
8
+ "tailwind-merge"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "src/components/ui/table/Table.vue",
13
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n containerClass?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <div\n data-slot=\"table-container\"\n :class=\"cn('relative w-full min-w-0 overflow-auto', props.containerClass)\"\n >\n <table\n data-slot=\"table\"\n :class=\"cn('w-full caption-bottom text-sm', props.class)\"\n >\n <slot />\n </table>\n </div>\n</template>\n",
14
+ "type": "registry:ui",
15
+ "target": "components/ui/table/Table.vue"
16
+ },
17
+ {
18
+ "path": "src/components/ui/table/TableHeader.vue",
19
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <thead\n data-slot=\"table-header\"\n :class=\"cn('[&_tr]:border-b', props.class)\"\n >\n <slot />\n </thead>\n</template>\n",
20
+ "type": "registry:ui",
21
+ "target": "components/ui/table/TableHeader.vue"
22
+ },
23
+ {
24
+ "path": "src/components/ui/table/TableBody.vue",
25
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <tbody\n data-slot=\"table-body\"\n :class=\"cn('[&_tr:last-child]:border-0', props.class)\"\n >\n <slot />\n </tbody>\n</template>\n",
26
+ "type": "registry:ui",
27
+ "target": "components/ui/table/TableBody.vue"
28
+ },
29
+ {
30
+ "path": "src/components/ui/table/TableFooter.vue",
31
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <tfoot\n data-slot=\"table-footer\"\n :class=\"cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', props.class)\"\n >\n <slot />\n </tfoot>\n</template>\n",
32
+ "type": "registry:ui",
33
+ "target": "components/ui/table/TableFooter.vue"
34
+ },
35
+ {
36
+ "path": "src/components/ui/table/TableRow.vue",
37
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <tr\n data-slot=\"table-row\"\n :class=\"\n cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n props.class,\n )\n \"\n >\n <slot />\n </tr>\n</template>\n",
38
+ "type": "registry:ui",
39
+ "target": "components/ui/table/TableRow.vue"
40
+ },
41
+ {
42
+ "path": "src/components/ui/table/TableHead.vue",
43
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <th\n data-slot=\"table-head\"\n :class=\"\n cn(\n 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n props.class,\n )\n \"\n >\n <slot />\n </th>\n</template>\n",
44
+ "type": "registry:ui",
45
+ "target": "components/ui/table/TableHead.vue"
46
+ },
47
+ {
48
+ "path": "src/components/ui/table/TableCell.vue",
49
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n colspan?: number | string\n}>()\n</script>\n\n<template>\n <td\n data-slot=\"table-cell\"\n :colspan=\"props.colspan\"\n :class=\"\n cn(\n 'p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n props.class,\n )\n \"\n >\n <slot />\n </td>\n</template>\n",
50
+ "type": "registry:ui",
51
+ "target": "components/ui/table/TableCell.vue"
52
+ },
53
+ {
54
+ "path": "src/components/ui/table/TableCaption.vue",
55
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <caption\n data-slot=\"table-caption\"\n :class=\"cn('text-muted-foreground mt-4 text-sm', props.class)\"\n >\n <slot />\n </caption>\n</template>\n",
56
+ "type": "registry:ui",
57
+ "target": "components/ui/table/TableCaption.vue"
58
+ },
59
+ {
60
+ "path": "src/components/ui/table/TableEmpty.vue",
61
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\nimport TableCell from \"./TableCell.vue\"\nimport TableRow from \"./TableRow.vue\"\n\nconst props = withDefaults(defineProps<{\n class?: HTMLAttributes[\"class\"]\n colspan?: number | string\n}>(), {\n colspan: 1,\n})\n</script>\n\n<template>\n <TableRow>\n <TableCell\n :colspan=\"props.colspan\"\n :class=\"\n cn(\n 'p-4 text-sm text-foreground',\n props.class,\n )\n \"\n >\n <div class=\"flex items-center justify-center py-10\">\n <slot />\n </div>\n </TableCell>\n </TableRow>\n</template>\n",
62
+ "type": "registry:ui",
63
+ "target": "components/ui/table/TableEmpty.vue"
64
+ },
65
+ {
66
+ "path": "src/components/ui/table/index.ts",
67
+ "content": "export { default as Table } from \"./Table.vue\"\nexport { default as TableBody } from \"./TableBody.vue\"\nexport { default as TableCaption } from \"./TableCaption.vue\"\nexport { default as TableCell } from \"./TableCell.vue\"\nexport { default as TableEmpty } from \"./TableEmpty.vue\"\nexport { default as TableFooter } from \"./TableFooter.vue\"\nexport { default as TableHead } from \"./TableHead.vue\"\nexport { default as TableHeader } from \"./TableHeader.vue\"\nexport { default as TableRow } from \"./TableRow.vue\"\n",
68
+ "type": "registry:ui",
69
+ "target": "components/ui/table/index.ts"
70
+ },
71
+ {
72
+ "path": "src/lib/utils.ts",
73
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
74
+ "type": "registry:lib",
75
+ "target": "lib/utils.ts"
76
+ }
77
+ ],
78
+ "type": "registry:ui"
79
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "tabs",
4
+ "title": "Tabs",
5
+ "description": "A layered content control that displays one panel at a time.",
6
+ "dependencies": [
7
+ "@vueuse/core",
8
+ "clsx",
9
+ "reka-ui",
10
+ "tailwind-merge"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "src/components/ui/tabs/Tabs.vue",
15
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { TabsRootEmits, TabsRootProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { TabsRoot as TabsPrimitiveRoot, useForwardPropsEmits } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<TabsRootProps & { class?: HTMLAttributes[\"class\"] }>()\nconst emits = defineEmits<TabsRootEmits>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <TabsPrimitiveRoot\n v-slot=\"slotProps\"\n data-slot=\"tabs\"\n v-bind=\"forwarded\"\n :class=\"cn('flex flex-col', props.class)\"\n >\n <slot v-bind=\"slotProps\" />\n </TabsPrimitiveRoot>\n</template>\n",
16
+ "type": "registry:ui",
17
+ "target": "components/ui/tabs/Tabs.vue"
18
+ },
19
+ {
20
+ "path": "src/components/ui/tabs/TabsList.vue",
21
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { TabsListProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { TabsList as TabsPrimitiveList, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<TabsListProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TabsPrimitiveList\n data-slot=\"tabs-list\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'border-border text-muted-foreground inline-flex h-10 w-full max-w-full items-center justify-start gap-5 overflow-x-auto border-b',\n props.class,\n )\n \"\n >\n <slot />\n </TabsPrimitiveList>\n</template>\n",
22
+ "type": "registry:ui",
23
+ "target": "components/ui/tabs/TabsList.vue"
24
+ },
25
+ {
26
+ "path": "src/components/ui/tabs/TabsTrigger.vue",
27
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { TabsTriggerProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { TabsTrigger as TabsPrimitiveTrigger, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<TabsTriggerProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TabsPrimitiveTrigger\n data-slot=\"tabs-trigger\"\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'focus-visible:border-ring focus-visible:ring-ring/50 data-[state=active]:border-foreground data-[state=active]:text-foreground relative -mb-px inline-flex h-10 flex-none items-center justify-center gap-1.5 border-b-2 border-transparent px-0 text-sm font-medium whitespace-nowrap text-muted-foreground outline-none transition-[border-color,color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50',\n props.class,\n )\n \"\n >\n <slot />\n </TabsPrimitiveTrigger>\n</template>\n",
28
+ "type": "registry:ui",
29
+ "target": "components/ui/tabs/TabsTrigger.vue"
30
+ },
31
+ {
32
+ "path": "src/components/ui/tabs/TabsContent.vue",
33
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport type { TabsContentProps } from \"reka-ui\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { TabsContent as TabsPrimitiveContent, useForwardProps } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<TabsContentProps & { class?: HTMLAttributes[\"class\"] }>()\n\nconst delegatedProps = reactiveOmit(props, \"class\")\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TabsPrimitiveContent\n data-slot=\"tabs-content\"\n v-bind=\"forwardedProps\"\n :class=\"cn('flex-1 outline-none', props.class)\"\n >\n <slot />\n </TabsPrimitiveContent>\n</template>\n",
34
+ "type": "registry:ui",
35
+ "target": "components/ui/tabs/TabsContent.vue"
36
+ },
37
+ {
38
+ "path": "src/components/ui/tabs/index.ts",
39
+ "content": "export { default as Tabs } from \"./Tabs.vue\"\nexport { default as TabsContent } from \"./TabsContent.vue\"\nexport { default as TabsList } from \"./TabsList.vue\"\nexport { default as TabsTrigger } from \"./TabsTrigger.vue\"\n",
40
+ "type": "registry:ui",
41
+ "target": "components/ui/tabs/index.ts"
42
+ },
43
+ {
44
+ "path": "src/lib/utils.ts",
45
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
46
+ "type": "registry:lib",
47
+ "target": "lib/utils.ts"
48
+ }
49
+ ],
50
+ "type": "registry:ui"
51
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "tag",
4
+ "title": "Tag",
5
+ "description": "A compact label for status, metadata, filters, and removable tokens.",
6
+ "dependencies": [
7
+ "@lucide/vue",
8
+ "class-variance-authority",
9
+ "clsx",
10
+ "tailwind-merge"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "src/components/ui/tag/Tag.vue",
15
+ "content": "<script setup lang=\"ts\">\nimport type { Component, HTMLAttributes } from \"vue\"\nimport { XIcon } from \"@lucide/vue\"\nimport { cn } from \"@/lib/utils\"\nimport { tagVariants, type TagVariants } from \"./variants\"\n\ninterface TagProps {\n class?: HTMLAttributes[\"class\"]\n icon?: Component\n iconClass?: HTMLAttributes[\"class\"]\n labelClass?: HTMLAttributes[\"class\"]\n removable?: boolean\n removeLabel?: string\n size?: TagVariants[\"size\"]\n variant?: TagVariants[\"variant\"]\n}\n\nconst props = withDefaults(defineProps<TagProps>(), {\n removeLabel: \"Remove tag\",\n})\n\nconst emit = defineEmits<{\n (event: \"remove\"): void\n}>()\n</script>\n\n<template>\n <span\n data-slot=\"tag\"\n :class=\"cn(tagVariants({ size: props.size, variant: props.variant }), props.class)\"\n >\n <component\n :is=\"props.icon\"\n v-if=\"props.icon\"\n data-slot=\"tag-icon\"\n aria-hidden=\"true\"\n :class=\"props.iconClass\"\n />\n\n <span data-slot=\"tag-label\" :class=\"cn('min-w-0 truncate', props.labelClass)\">\n <slot />\n </span>\n\n <button\n v-if=\"props.removable\"\n data-slot=\"tag-remove\"\n type=\"button\"\n :aria-label=\"props.removeLabel\"\n class=\"-mr-1 inline-flex shrink-0 items-center justify-center rounded-full p-0.5 text-current opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n @click.stop=\"emit('remove')\"\n >\n <XIcon data-slot=\"tag-remove-icon\" aria-hidden=\"true\" />\n </button>\n </span>\n</template>\n",
16
+ "type": "registry:ui",
17
+ "target": "components/ui/tag/Tag.vue"
18
+ },
19
+ {
20
+ "path": "src/components/ui/tag/variants.ts",
21
+ "content": "import { cva, type VariantProps } from \"class-variance-authority\"\n\nexport const tagVariants = cva(\n \"inline-flex max-w-full shrink-0 items-center gap-1 rounded-full border font-medium whitespace-nowrap outline-none transition-[background-color,border-color,color,box-shadow] focus-within:ring-[3px] focus-within:ring-ring/50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-primary text-primary-foreground\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground focus-within:ring-destructive/30\",\n muted: \"border-transparent bg-muted text-muted-foreground\",\n outline: \"border-border bg-background text-foreground\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground\",\n },\n size: {\n default:\n \"h-7 px-2.5 text-xs [&_[data-slot=tag-icon]]:size-3.5 [&_[data-slot=tag-remove-icon]]:size-3.5\",\n lg: \"h-8 px-3 text-sm [&_[data-slot=tag-icon]]:size-4 [&_[data-slot=tag-remove-icon]]:size-4\",\n sm: \"h-6 px-2 text-xs [&_[data-slot=tag-icon]]:size-3 [&_[data-slot=tag-remove-icon]]:size-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n },\n)\n\nexport type TagVariants = VariantProps<typeof tagVariants>\n",
22
+ "type": "registry:ui",
23
+ "target": "components/ui/tag/variants.ts"
24
+ },
25
+ {
26
+ "path": "src/components/ui/tag/index.ts",
27
+ "content": "export { default as Tag } from \"./Tag.vue\"\nexport { tagVariants, type TagVariants } from \"./variants\"\n",
28
+ "type": "registry:ui",
29
+ "target": "components/ui/tag/index.ts"
30
+ },
31
+ {
32
+ "path": "src/lib/utils.ts",
33
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
34
+ "type": "registry:lib",
35
+ "target": "lib/utils.ts"
36
+ }
37
+ ],
38
+ "type": "registry:ui"
39
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "textarea",
4
+ "title": "Textarea",
5
+ "description": "A textarea control with plain, field, field group, disabled, resize, validation, and icon states.",
6
+ "dependencies": [
7
+ "clsx",
8
+ "tailwind-merge"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "src/components/ui/textarea/Textarea.vue",
13
+ "content": "<script setup lang=\"ts\">\nimport { computed, useAttrs, useId } from \"vue\"\nimport { cn } from \"@/lib/utils\"\nimport TextareaControl from \"./TextareaControl.vue\"\nimport type { TextareaModelValue, TextareaProps } from \"./types\"\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n iconPosition: \"start\",\n resize: \"vertical\",\n})\n\nconst emit = defineEmits<{\n \"update:modelValue\": [value: TextareaModelValue]\n input: [event: Event]\n change: [event: Event]\n}>()\n\nconst attrs = useAttrs()\nconst generatedId = useId()\n\nconst controlId = computed(() => props.id ?? generatedId)\nconst hasMessage = computed(() => Boolean(props.message || props.error))\nconst hasError = computed(() => Boolean(props.error))\nconst shouldRenderField = computed(() =>\n Boolean(\n props.field\n || props.fieldGroup\n || props.label\n || props.description\n || hasMessage.value,\n ),\n)\nconst descriptionId = computed(() =>\n props.description ? `${controlId.value}-description` : undefined,\n)\nconst messageId = computed(() =>\n hasMessage.value ? `${controlId.value}-message` : undefined,\n)\nconst describedBy = computed(() => {\n const value = [\n attrs[\"aria-describedby\"],\n descriptionId.value,\n messageId.value,\n ].filter(Boolean).join(\" \")\n\n return value || undefined\n})\nconst resolvedMessage = computed(() =>\n typeof props.error === \"string\" ? props.error : props.message,\n)\n\nfunction handleUpdate(value: TextareaModelValue) {\n emit(\"update:modelValue\", value)\n}\n</script>\n\n<template>\n <TextareaControl\n v-if=\"!shouldRenderField\"\n v-bind=\"attrs\"\n :id=\"controlId\"\n :class=\"props.class\"\n :default-value=\"props.defaultValue\"\n :disabled=\"props.disabled\"\n :icon=\"props.icon\"\n :icon-class=\"props.iconClass\"\n :icon-position=\"props.iconPosition\"\n :invalid=\"props.invalid || hasError\"\n :model-value=\"props.modelValue\"\n :placeholder=\"props.placeholder\"\n :readonly=\"props.readonly\"\n :resize=\"props.resize\"\n :textarea-class=\"props.textareaClass\"\n @change=\"emit('change', $event)\"\n @input=\"emit('input', $event)\"\n @update:model-value=\"handleUpdate\"\n />\n\n <div\n v-else\n :data-slot=\"props.fieldGroup ? 'textarea-field-group' : 'textarea-field'\"\n :class=\"\n cn(\n props.fieldGroup ? 'grid gap-4' : 'grid gap-2',\n props.groupClass,\n )\n \"\n >\n <div\n data-slot=\"textarea-field\"\n :data-disabled=\"props.disabled ? '' : undefined\"\n :data-invalid=\"hasError ? '' : undefined\"\n :class=\"cn('grid gap-2', props.fieldClass)\"\n >\n <label\n v-if=\"props.label\"\n data-slot=\"textarea-label\"\n :for=\"controlId\"\n :class=\"\n cn(\n 'text-sm font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70 data-[disabled=true]:opacity-50',\n props.labelClass,\n )\n \"\n >\n {{ props.label }}\n </label>\n\n <TextareaControl\n v-bind=\"attrs\"\n :id=\"controlId\"\n :aria-describedby=\"describedBy\"\n :class=\"props.class\"\n :default-value=\"props.defaultValue\"\n :disabled=\"props.disabled\"\n :icon=\"props.icon\"\n :icon-class=\"props.iconClass\"\n :icon-position=\"props.iconPosition\"\n :invalid=\"props.invalid || hasError\"\n :model-value=\"props.modelValue\"\n :placeholder=\"props.placeholder\"\n :readonly=\"props.readonly\"\n :resize=\"props.resize\"\n :textarea-class=\"props.textareaClass\"\n @change=\"emit('change', $event)\"\n @input=\"emit('input', $event)\"\n @update:model-value=\"handleUpdate\"\n />\n\n <p\n v-if=\"props.description\"\n :id=\"descriptionId\"\n data-slot=\"textarea-description\"\n :class=\"cn('text-xs leading-relaxed text-muted-foreground', props.descriptionClass)\"\n >\n {{ props.description }}\n </p>\n\n <p\n v-if=\"resolvedMessage\"\n :id=\"messageId\"\n data-slot=\"textarea-message\"\n :class=\"\n cn(\n 'text-xs font-medium leading-relaxed',\n hasError ? 'text-destructive' : 'text-muted-foreground',\n props.messageClass,\n )\n \"\n >\n {{ resolvedMessage }}\n </p>\n </div>\n </div>\n</template>\n",
14
+ "type": "registry:ui",
15
+ "target": "components/ui/textarea/Textarea.vue"
16
+ },
17
+ {
18
+ "path": "src/components/ui/textarea/TextareaControl.vue",
19
+ "content": "<script setup lang=\"ts\">\nimport { computed, useAttrs } from \"vue\"\nimport { cn } from \"@/lib/utils\"\nimport type { TextareaControlProps, TextareaModelValue } from \"./types\"\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<TextareaControlProps>(), {\n iconPosition: \"start\",\n resize: \"vertical\",\n})\n\nconst emit = defineEmits<{\n \"update:modelValue\": [value: TextareaModelValue]\n input: [event: Event]\n change: [event: Event]\n}>()\n\nconst attrs = useAttrs()\n\nconst hasIcon = computed(() => Boolean(props.icon))\nconst textareaValue = computed(() => props.modelValue ?? props.defaultValue ?? \"\")\nconst controlAttrs = computed(() => ({\n ...attrs,\n value: textareaValue.value,\n}))\nconst resizeClass = computed(() => {\n if (props.resize === \"none\") return \"resize-none\"\n if (props.resize === \"horizontal\") return \"resize-x\"\n if (props.resize === \"both\") return \"resize\"\n\n return \"resize-y\"\n})\n\nconst textareaClasses = computed(() =>\n cn(\n \"border-input bg-background text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex min-h-20 w-full min-w-0 rounded-md border px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20\",\n resizeClass.value,\n hasIcon.value\n && \"min-h-16 border-0 bg-transparent px-0 py-0 shadow-none focus-visible:border-transparent focus-visible:ring-0\",\n props.textareaClass,\n !hasIcon.value && props.class,\n ),\n)\n\nconst wrapperClasses = computed(() =>\n cn(\n \"border-input bg-background text-foreground focus-within:border-ring focus-within:ring-ring/50 flex min-h-20 w-full min-w-0 items-start gap-2 rounded-md border px-3 py-2 shadow-xs transition-[color,box-shadow] focus-within:ring-[3px] has-disabled:cursor-not-allowed has-disabled:opacity-50 has-aria-invalid:border-destructive has-aria-invalid:ring-destructive/20\",\n props.class,\n ),\n)\n\nfunction getTextareaModelValue(target: HTMLTextAreaElement) {\n return target.value\n}\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLTextAreaElement\n\n emit(\"update:modelValue\", getTextareaModelValue(target))\n emit(\"input\", event)\n}\n\nfunction handleChange(event: Event) {\n emit(\"change\", event)\n}\n</script>\n\n<template>\n <div\n v-if=\"hasIcon\"\n data-slot=\"textarea-wrapper\"\n :class=\"wrapperClasses\"\n >\n <component\n :is=\"props.icon\"\n v-if=\"props.iconPosition === 'start'\"\n aria-hidden=\"true\"\n data-slot=\"textarea-icon\"\n :class=\"cn('mt-0.5 size-4 shrink-0 text-muted-foreground', props.iconClass)\"\n />\n\n <textarea\n v-bind=\"controlAttrs\"\n :id=\"props.id\"\n data-slot=\"textarea\"\n :aria-invalid=\"props.invalid ? true : undefined\"\n :class=\"textareaClasses\"\n :disabled=\"props.disabled\"\n :placeholder=\"props.placeholder\"\n :readonly=\"props.readonly\"\n @change=\"handleChange\"\n @input=\"handleInput\"\n />\n\n <component\n :is=\"props.icon\"\n v-if=\"props.iconPosition === 'end'\"\n aria-hidden=\"true\"\n data-slot=\"textarea-icon\"\n :class=\"cn('mt-0.5 size-4 shrink-0 text-muted-foreground', props.iconClass)\"\n />\n </div>\n\n <textarea\n v-else\n v-bind=\"controlAttrs\"\n :id=\"props.id\"\n data-slot=\"textarea\"\n :aria-invalid=\"props.invalid ? true : undefined\"\n :class=\"textareaClasses\"\n :disabled=\"props.disabled\"\n :placeholder=\"props.placeholder\"\n :readonly=\"props.readonly\"\n @change=\"handleChange\"\n @input=\"handleInput\"\n />\n</template>\n",
20
+ "type": "registry:ui",
21
+ "target": "components/ui/textarea/TextareaControl.vue"
22
+ },
23
+ {
24
+ "path": "src/components/ui/textarea/TextareaFieldGroup.vue",
25
+ "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from \"vue\"\nimport { cn } from \"@/lib/utils\"\n\nconst props = defineProps<{\n class?: HTMLAttributes[\"class\"]\n}>()\n</script>\n\n<template>\n <div data-slot=\"textarea-field-group\" :class=\"cn('grid gap-4', props.class)\">\n <slot />\n </div>\n</template>\n",
26
+ "type": "registry:ui",
27
+ "target": "components/ui/textarea/TextareaFieldGroup.vue"
28
+ },
29
+ {
30
+ "path": "src/components/ui/textarea/types.ts",
31
+ "content": "import type { Component, HTMLAttributes } from \"vue\"\n\nexport type TextareaModelValue = string | number\nexport type TextareaIconPosition = \"start\" | \"end\"\nexport type TextareaResize = \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n\nexport interface TextareaControlProps {\n class?: HTMLAttributes[\"class\"]\n defaultValue?: TextareaModelValue\n disabled?: boolean\n icon?: Component\n iconClass?: HTMLAttributes[\"class\"]\n iconPosition?: TextareaIconPosition\n id?: string\n invalid?: boolean\n modelValue?: TextareaModelValue\n placeholder?: string\n readonly?: boolean\n resize?: TextareaResize\n textareaClass?: HTMLAttributes[\"class\"]\n}\n\nexport interface TextareaProps extends TextareaControlProps {\n description?: string\n descriptionClass?: HTMLAttributes[\"class\"]\n error?: string | boolean\n field?: boolean\n fieldClass?: HTMLAttributes[\"class\"]\n fieldGroup?: boolean\n groupClass?: HTMLAttributes[\"class\"]\n label?: string\n labelClass?: HTMLAttributes[\"class\"]\n message?: string\n messageClass?: HTMLAttributes[\"class\"]\n}\n",
32
+ "type": "registry:ui",
33
+ "target": "components/ui/textarea/types.ts"
34
+ },
35
+ {
36
+ "path": "src/components/ui/textarea/index.ts",
37
+ "content": "export { default as Textarea } from \"./Textarea.vue\"\nexport { default as TextareaControl } from \"./TextareaControl.vue\"\nexport { default as TextareaFieldGroup } from \"./TextareaFieldGroup.vue\"\nexport type {\n TextareaControlProps,\n TextareaIconPosition,\n TextareaModelValue,\n TextareaProps,\n TextareaResize,\n} from \"./types\"\n",
38
+ "type": "registry:ui",
39
+ "target": "components/ui/textarea/index.ts"
40
+ },
41
+ {
42
+ "path": "src/lib/utils.ts",
43
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
44
+ "type": "registry:lib",
45
+ "target": "lib/utils.ts"
46
+ }
47
+ ],
48
+ "type": "registry:ui"
49
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "tool",
4
+ "title": "Tool",
5
+ "description": "A collapsible tool execution card with status badge and parameters panel.",
6
+ "dependencies": [
7
+ "@lucide/vue",
8
+ "clsx",
9
+ "tailwind-merge"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "src/components/ui/tool/Tool.vue",
14
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\"\nimport type { HTMLAttributes } from \"vue\"\nimport {\n ChevronDownIcon,\n CircleCheckIcon,\n CircleXIcon,\n ClockIcon,\n LoaderCircleIcon,\n WrenchIcon,\n} from \"@lucide/vue\"\nimport { createCodeLines } from \"@/lib/code-highlight\"\nimport { cn } from \"@/lib/utils\"\n\nexport type ToolSize = \"sm\" | \"default\" | \"lg\"\nexport type ToolStatus =\n | \"pending\"\n | \"awaiting-approval\"\n | \"responded\"\n | \"running\"\n | \"completed\"\n | \"error\"\n | \"denied\"\n\nexport type ToolParameters =\n | string\n | number\n | boolean\n | Record<string, unknown>\n | unknown[]\n | null\n\nexport interface ToolTogglePayload {\n open: boolean\n}\n\ninterface ToolProps {\n class?: HTMLAttributes[\"class\"]\n collapsible?: boolean\n defaultOpen?: boolean\n highlight?: boolean\n name?: string\n open?: boolean\n parameters?: ToolParameters\n parametersLabel?: string\n parametersLanguage?: string\n showParameters?: boolean\n showToggle?: boolean\n size?: ToolSize\n status?: ToolStatus\n statusLabel?: string\n}\n\nconst props = withDefaults(defineProps<ToolProps>(), {\n collapsible: true,\n defaultOpen: true,\n highlight: true,\n name: \"tool\",\n parametersLabel: \"Parameters\",\n parametersLanguage: \"json\",\n showParameters: true,\n showToggle: true,\n size: \"default\",\n status: \"pending\",\n})\n\nconst emit = defineEmits<{\n \"toggle\": [payload: ToolTogglePayload]\n \"update:open\": [value: boolean]\n}>()\n\nconst localOpen = ref(props.defaultOpen)\nconst isOpen = computed(() => {\n if (!props.collapsible) return true\n\n return props.open ?? localOpen.value\n})\nconst statusLabel = computed(() => props.statusLabel ?? defaultStatusLabel(props.status))\nconst statusIcon = computed(() => {\n if (props.status === \"pending\") return LoaderCircleIcon\n if (props.status === \"awaiting-approval\") return ClockIcon\n if (props.status === \"responded\") return CircleCheckIcon\n if (props.status === \"running\") return ClockIcon\n if (props.status === \"completed\") return CircleCheckIcon\n\n return CircleXIcon\n})\nconst parameterText = computed(() => formatParameters(props.parameters))\nconst parameterLines = computed(() => createCodeLines(\n parameterText.value,\n props.parametersLanguage,\n props.highlight,\n))\nconst sizeClasses = computed(() => {\n if (props.size === \"sm\") {\n return {\n badge: \"h-5 gap-1.5 px-2 text-xs\",\n badgeIcon: \"size-3\",\n content: \"px-3 pb-3 pt-2.5\",\n header: \"gap-2.5 px-3 py-2.5\",\n icon: \"size-3.5\",\n innerGap: \"gap-2.5\",\n label: \"text-xs\",\n name: \"text-xs\",\n panel: \"mt-2 min-h-12 rounded-lg px-3 py-2 text-xs leading-5\",\n toggleButton: \"size-7\",\n toggleIcon: \"size-3.5\",\n }\n }\n\n if (props.size === \"lg\") {\n return {\n badge: \"h-7 gap-2 px-3 text-sm\",\n badgeIcon: \"size-4\",\n content: \"px-5 pb-5 pt-4\",\n header: \"gap-3 px-5 py-4\",\n icon: \"size-5\",\n innerGap: \"gap-3\",\n label: \"text-xs\",\n name: \"text-sm\",\n panel: \"mt-3 min-h-20 rounded-xl px-4 py-3 text-xs leading-6\",\n toggleButton: \"size-9\",\n toggleIcon: \"size-4\",\n }\n }\n\n return {\n badge: \"h-6 gap-1.5 px-2.5 text-xs\",\n badgeIcon: \"size-3.5\",\n content: \"px-4 pb-4 pt-3\",\n header: \"gap-2.5 px-4 py-3\",\n icon: \"size-4\",\n innerGap: \"gap-2.5\",\n label: \"text-xs\",\n name: \"text-[13px]\",\n panel: \"mt-3 min-h-16 rounded-xl px-4 py-3 text-xs leading-6\",\n toggleButton: \"size-8\",\n toggleIcon: \"size-4\",\n }\n})\n\nfunction defaultStatusLabel(status: ToolStatus) {\n if (status === \"awaiting-approval\") return \"Awaiting Approval\"\n if (status === \"responded\") return \"Responded\"\n if (status === \"running\") return \"Running\"\n if (status === \"completed\") return \"Completed\"\n if (status === \"error\") return \"Error\"\n if (status === \"denied\") return \"Denied\"\n\n return \"Pending\"\n}\n\nfunction statusClass(status: ToolStatus) {\n if (status === \"pending\") return \"text-foreground\"\n if (status === \"awaiting-approval\") return \"text-amber-600\"\n if (status === \"responded\") return \"text-blue-600\"\n if (status === \"completed\") return \"text-emerald-600\"\n if (status === \"error\") return \"text-destructive\"\n if (status === \"denied\") return \"text-orange-600\"\n\n return \"text-muted-foreground\"\n}\n\nfunction formatParameters(value?: ToolParameters) {\n if (value === undefined || value === null) return \"{}\"\n if (typeof value === \"string\") return value\n\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction setOpen(nextOpen: boolean) {\n if (!props.collapsible) return\n\n const previousOpen = isOpen.value\n\n if (props.open === undefined) {\n localOpen.value = nextOpen\n }\n\n emit(\"update:open\", nextOpen)\n\n if (previousOpen !== nextOpen) {\n emit(\"toggle\", { open: nextOpen })\n }\n}\n\nfunction toggleOpen() {\n setOpen(!isOpen.value)\n}\n</script>\n\n<template>\n <article\n data-slot=\"tool\"\n :data-open=\"isOpen\"\n :data-size=\"props.size\"\n :data-status=\"props.status\"\n :class=\"cn('overflow-hidden rounded-xl border bg-card text-card-foreground shadow-xs', props.class)\"\n >\n <header\n data-slot=\"tool-header\"\n :class=\"cn('flex items-center transition-colors', sizeClasses.header)\"\n >\n <component\n :is=\"props.collapsible ? 'button' : 'div'\"\n data-slot=\"tool-toggle\"\n :type=\"props.collapsible ? 'button' : undefined\"\n :aria-expanded=\"props.collapsible ? isOpen : undefined\"\n :class=\"cn('flex min-w-0 flex-1 items-center text-left outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50', sizeClasses.innerGap)\"\n @click=\"toggleOpen\"\n >\n <WrenchIcon\n data-slot=\"tool-icon\"\n aria-hidden=\"true\"\n :class=\"cn('shrink-0 text-muted-foreground', sizeClasses.icon)\"\n />\n\n <span\n data-slot=\"tool-name\"\n :class=\"cn('min-w-0 truncate font-semibold leading-tight tracking-normal', sizeClasses.name)\"\n >\n {{ props.name }}\n </span>\n\n <span\n data-slot=\"tool-status\"\n :class=\"cn('inline-flex shrink-0 items-center rounded-full bg-muted font-medium leading-none text-foreground', sizeClasses.badge)\"\n >\n <component\n :is=\"statusIcon\"\n data-slot=\"tool-status-icon\"\n aria-hidden=\"true\"\n :class=\"cn(sizeClasses.badgeIcon, statusClass(props.status), props.status === 'pending' && 'animate-spin')\"\n />\n <span>{{ statusLabel }}</span>\n </span>\n </component>\n\n <button\n v-if=\"props.collapsible && props.showToggle\"\n data-slot=\"tool-toggle-icon\"\n type=\"button\"\n :aria-label=\"isOpen ? 'Collapse tool' : 'Expand tool'\"\n :aria-expanded=\"isOpen\"\n :class=\"\n cn(\n 'inline-flex shrink-0 items-center justify-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50',\n sizeClasses.toggleButton,\n )\n \"\n @click=\"toggleOpen\"\n >\n <ChevronDownIcon\n aria-hidden=\"true\"\n :class=\"cn('transition-transform', sizeClasses.toggleIcon, isOpen && 'rotate-180')\"\n />\n </button>\n </header>\n\n <section\n v-if=\"isOpen && props.showParameters\"\n data-slot=\"tool-content\"\n :class=\"sizeClasses.content\"\n >\n <div\n data-slot=\"tool-parameters-label\"\n :class=\"cn('font-semibold uppercase leading-none text-muted-foreground', sizeClasses.label)\"\n >\n {{ props.parametersLabel }}\n </div>\n\n <pre\n data-slot=\"tool-parameters\"\n :class=\"cn('overflow-auto border bg-background font-mono text-foreground whitespace-pre-wrap break-words', sizeClasses.panel)\"\n ><slot\n name=\"parameters\"\n :parameters=\"props.parameters\"\n :text=\"parameterText\"\n :lines=\"parameterLines\"\n ><code\n data-slot=\"tool-parameters-code\"\n :data-language=\"props.parametersLanguage\"\n class=\"block min-w-0 whitespace-pre-wrap break-words\"\n ><span\n v-for=\"line in parameterLines\"\n :key=\"line.number\"\n data-slot=\"tool-parameters-line\"\n :data-line=\"line.number\"\n class=\"block min-h-[1lh]\"\n ><span\n v-if=\"line.isEmpty\"\n aria-hidden=\"true\"\n >&nbsp;</span><span\n v-else\n data-slot=\"tool-parameters-token\"\n v-html=\"line.html\"\n /></span></code></slot></pre>\n </section>\n </article>\n</template>\n",
15
+ "type": "registry:ui",
16
+ "target": "components/ui/tool/Tool.vue"
17
+ },
18
+ {
19
+ "path": "src/components/ui/tool/index.ts",
20
+ "content": "export { default as Tool } from \"./Tool.vue\"\nexport type {\n ToolParameters,\n ToolSize,\n ToolStatus,\n ToolTogglePayload,\n} from \"./Tool.vue\"\n",
21
+ "type": "registry:ui",
22
+ "target": "components/ui/tool/index.ts"
23
+ },
24
+ {
25
+ "path": "src/lib/utils.ts",
26
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
27
+ "type": "registry:lib",
28
+ "target": "lib/utils.ts"
29
+ }
30
+ ],
31
+ "type": "registry:ui"
32
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://shadcn-vue.com/schema/registry-item.json",
3
+ "name": "tooltip",
4
+ "title": "Tooltip",
5
+ "description": "A small contextual overlay for explaining controls and compact UI elements.",
6
+ "dependencies": [
7
+ "@vueuse/core",
8
+ "clsx",
9
+ "reka-ui",
10
+ "tailwind-merge"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "src/components/ui/tooltip/Tooltip.vue",
15
+ "content": "<script setup lang=\"ts\">\nimport type { TooltipRootEmits, TooltipRootProps } from \"reka-ui\"\nimport { TooltipRoot, useForwardPropsEmits } from \"reka-ui\"\n\nconst props = defineProps<TooltipRootProps>()\nconst emits = defineEmits<TooltipRootEmits>()\n\nconst forwarded = useForwardPropsEmits(props, emits)\n</script>\n\n<template>\n <TooltipRoot\n v-slot=\"slotProps\"\n data-slot=\"tooltip\"\n v-bind=\"forwarded\"\n >\n <slot v-bind=\"slotProps\" />\n </TooltipRoot>\n</template>\n",
16
+ "type": "registry:ui",
17
+ "target": "components/ui/tooltip/Tooltip.vue"
18
+ },
19
+ {
20
+ "path": "src/components/ui/tooltip/TooltipTrigger.vue",
21
+ "content": "<script setup lang=\"ts\">\nimport type { TooltipTriggerProps } from \"reka-ui\"\nimport { TooltipTrigger } from \"reka-ui\"\n\nconst props = defineProps<TooltipTriggerProps>()\n</script>\n\n<template>\n <TooltipTrigger\n data-slot=\"tooltip-trigger\"\n v-bind=\"props\"\n >\n <slot />\n </TooltipTrigger>\n</template>\n",
22
+ "type": "registry:ui",
23
+ "target": "components/ui/tooltip/TooltipTrigger.vue"
24
+ },
25
+ {
26
+ "path": "src/components/ui/tooltip/TooltipContent.vue",
27
+ "content": "<script setup lang=\"ts\">\nimport type { TooltipContentEmits, TooltipContentProps } from \"reka-ui\"\nimport type { HTMLAttributes } from \"vue\"\nimport { reactiveOmit } from \"@vueuse/core\"\nimport { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from \"reka-ui\"\nimport { cn } from \"@/lib/utils\"\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(\n defineProps<TooltipContentProps & {\n arrow?: boolean\n class?: HTMLAttributes[\"class\"]\n }>(),\n {\n arrow: true,\n sideOffset: 4,\n },\n)\n\nconst emits = defineEmits<TooltipContentEmits>()\n\nconst delegatedProps = reactiveOmit(props, \"arrow\", \"class\")\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <TooltipPortal>\n <TooltipContent\n data-slot=\"tooltip-content\"\n v-bind=\"{ ...forwarded, ...$attrs }\"\n :class=\"cn('bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance', props.class)\"\n >\n <slot />\n\n <TooltipArrow\n v-if=\"props.arrow\"\n class=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\"\n />\n </TooltipContent>\n </TooltipPortal>\n</template>\n",
28
+ "type": "registry:ui",
29
+ "target": "components/ui/tooltip/TooltipContent.vue"
30
+ },
31
+ {
32
+ "path": "src/components/ui/tooltip/TooltipProvider.vue",
33
+ "content": "<script setup lang=\"ts\">\nimport type { TooltipProviderProps } from \"reka-ui\"\nimport { TooltipProvider } from \"reka-ui\"\n\nconst props = withDefaults(defineProps<TooltipProviderProps>(), {\n delayDuration: 0,\n})\n</script>\n\n<template>\n <TooltipProvider v-bind=\"props\">\n <slot />\n </TooltipProvider>\n</template>\n",
34
+ "type": "registry:ui",
35
+ "target": "components/ui/tooltip/TooltipProvider.vue"
36
+ },
37
+ {
38
+ "path": "src/components/ui/tooltip/index.ts",
39
+ "content": "export { default as Tooltip } from \"./Tooltip.vue\"\nexport { default as TooltipContent } from \"./TooltipContent.vue\"\nexport { default as TooltipProvider } from \"./TooltipProvider.vue\"\nexport { default as TooltipTrigger } from \"./TooltipTrigger.vue\"\n",
40
+ "type": "registry:ui",
41
+ "target": "components/ui/tooltip/index.ts"
42
+ },
43
+ {
44
+ "path": "src/lib/utils.ts",
45
+ "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
46
+ "type": "registry:lib",
47
+ "target": "lib/utils.ts"
48
+ }
49
+ ],
50
+ "type": "registry:ui"
51
+ }