@mkbabb/glass-ui 0.2.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 (335) hide show
  1. package/README.md +172 -0
  2. package/dist/glass-ui.css +1 -0
  3. package/dist/glass-ui.js +10019 -0
  4. package/dist/index.d.ts +6619 -0
  5. package/package.json +65 -0
  6. package/src/components/custom/aurora/Aurora.vue +34 -0
  7. package/src/components/custom/aurora/composables/color.ts +122 -0
  8. package/src/components/custom/aurora/composables/useAurora.ts +355 -0
  9. package/src/components/custom/aurora/index.ts +8 -0
  10. package/src/components/custom/confirm-dialog/ConfirmDialog.vue +88 -0
  11. package/src/components/custom/confirm-dialog/index.ts +1 -0
  12. package/src/components/custom/controls/DarkModeToggle.vue +96 -0
  13. package/src/components/custom/controls/index.ts +1 -0
  14. package/src/components/custom/dock/DockLayerGroup.vue +21 -0
  15. package/src/components/custom/dock/DockPopover.vue +263 -0
  16. package/src/components/custom/dock/GlassDock.vue +276 -0
  17. package/src/components/custom/dock/composables/index.ts +16 -0
  18. package/src/components/custom/dock/composables/isTeleportedTarget.ts +19 -0
  19. package/src/components/custom/dock/composables/useDockActionBar.ts +33 -0
  20. package/src/components/custom/dock/composables/useDockState.ts +301 -0
  21. package/src/components/custom/dock/composables/useDockTransition.ts +146 -0
  22. package/src/components/custom/dock/composables/useLayerTransition.ts +135 -0
  23. package/src/components/custom/dock/composables/usePopupMutex.ts +83 -0
  24. package/src/components/custom/dock/index.ts +9 -0
  25. package/src/components/custom/expandable-container/ExpandableContainer.vue +64 -0
  26. package/src/components/custom/expandable-container/index.ts +1 -0
  27. package/src/components/custom/glass-panel/GlassPanel.vue +98 -0
  28. package/src/components/custom/glass-panel/index.ts +2 -0
  29. package/src/components/custom/icon-tooltip/IconTooltip.vue +20 -0
  30. package/src/components/custom/icon-tooltip/index.ts +1 -0
  31. package/src/components/custom/index.ts +15 -0
  32. package/src/components/custom/infinite-scroll/InfiniteScroll.vue +55 -0
  33. package/src/components/custom/infinite-scroll/composables/index.ts +2 -0
  34. package/src/components/custom/infinite-scroll/composables/types.ts +23 -0
  35. package/src/components/custom/infinite-scroll/composables/useInfiniteScroll.ts +73 -0
  36. package/src/components/custom/infinite-scroll/index.ts +1 -0
  37. package/src/components/custom/labeled-field/LabeledInput.vue +29 -0
  38. package/src/components/custom/labeled-field/LabeledSelect.vue +59 -0
  39. package/src/components/custom/labeled-field/LabeledSlider.vue +32 -0
  40. package/src/components/custom/labeled-field/LabeledSwitch.vue +27 -0
  41. package/src/components/custom/labeled-field/index.ts +4 -0
  42. package/src/components/custom/metaballs/MetaballCanvas.vue +23 -0
  43. package/src/components/custom/metaballs/index.ts +4 -0
  44. package/src/components/custom/metaballs/shaders.ts +63 -0
  45. package/src/components/custom/metaballs/types.ts +29 -0
  46. package/src/components/custom/metaballs/useMetaballs.ts +252 -0
  47. package/src/components/custom/search/FuzzySearch.vue +589 -0
  48. package/src/components/custom/search/SearchBar.vue +44 -0
  49. package/src/components/custom/search/composables/fuzzySearchIndex.ts +224 -0
  50. package/src/components/custom/search/composables/index.ts +5 -0
  51. package/src/components/custom/search/composables/types.ts +34 -0
  52. package/src/components/custom/search/composables/useFuzzySearch.ts +115 -0
  53. package/src/components/custom/search/index.ts +7 -0
  54. package/src/components/custom/sidebar/ProgressiveSidebar.vue +256 -0
  55. package/src/components/custom/sidebar/composables/index.ts +6 -0
  56. package/src/components/custom/sidebar/composables/useScrollTracker.ts +242 -0
  57. package/src/components/custom/sidebar/composables/useSidebarFollow.ts +247 -0
  58. package/src/components/custom/sidebar/composables/useSidebarState.ts +72 -0
  59. package/src/components/custom/sidebar/composables/useTreeIndex.ts +152 -0
  60. package/src/components/custom/sidebar/index.ts +15 -0
  61. package/src/components/custom/sidebar/types.ts +50 -0
  62. package/src/components/custom/tabs/BouncyTabs.vue +39 -0
  63. package/src/components/custom/tabs/BouncyToggle.vue +352 -0
  64. package/src/components/custom/tabs/UnderlineTabs.vue +115 -0
  65. package/src/components/custom/tabs/index.ts +5 -0
  66. package/src/components/custom/timeline/GlassTimeline.vue +174 -0
  67. package/src/components/custom/timeline/index.ts +1 -0
  68. package/src/components/custom/typewriter/TypewriterText.vue +239 -0
  69. package/src/components/custom/typewriter/composables/index.ts +1 -0
  70. package/src/components/custom/typewriter/composables/useTypewriter.ts +413 -0
  71. package/src/components/custom/typewriter/index.ts +7 -0
  72. package/src/components/custom/typewriter/types.ts +159 -0
  73. package/src/components/custom/typewriter/utils/keyboard.ts +213 -0
  74. package/src/components/custom/typewriter/utils/pausePatterns.ts +55 -0
  75. package/src/components/custom/typewriter/utils/timing.ts +104 -0
  76. package/src/components/custom/typewriter/utils/typoStateMachine.ts +197 -0
  77. package/src/components/index.ts +2 -0
  78. package/src/components/ui/accordion/Accordion.vue +19 -0
  79. package/src/components/ui/accordion/AccordionContent.vue +24 -0
  80. package/src/components/ui/accordion/AccordionItem.vue +24 -0
  81. package/src/components/ui/accordion/AccordionTrigger.vue +39 -0
  82. package/src/components/ui/accordion/index.ts +4 -0
  83. package/src/components/ui/alert/Alert.vue +20 -0
  84. package/src/components/ui/alert/AlertDescription.vue +17 -0
  85. package/src/components/ui/alert/AlertTitle.vue +17 -0
  86. package/src/components/ui/alert/index.ts +23 -0
  87. package/src/components/ui/avatar/Avatar.vue +21 -0
  88. package/src/components/ui/avatar/AvatarFallback.vue +11 -0
  89. package/src/components/ui/avatar/AvatarImage.vue +9 -0
  90. package/src/components/ui/avatar/index.ts +24 -0
  91. package/src/components/ui/badge/Badge.vue +16 -0
  92. package/src/components/ui/badge/index.ts +25 -0
  93. package/src/components/ui/button/Button.vue +26 -0
  94. package/src/components/ui/button/index.ts +43 -0
  95. package/src/components/ui/card/Card.vue +28 -0
  96. package/src/components/ui/card/CardContent.vue +14 -0
  97. package/src/components/ui/card/CardDescription.vue +14 -0
  98. package/src/components/ui/card/CardFooter.vue +14 -0
  99. package/src/components/ui/card/CardHeader.vue +14 -0
  100. package/src/components/ui/card/CardTitle.vue +21 -0
  101. package/src/components/ui/card/index.ts +6 -0
  102. package/src/components/ui/carousel/Carousel.vue +53 -0
  103. package/src/components/ui/carousel/CarouselContent.vue +35 -0
  104. package/src/components/ui/carousel/CarouselItem.vue +24 -0
  105. package/src/components/ui/carousel/CarouselNext.vue +40 -0
  106. package/src/components/ui/carousel/CarouselPrevious.vue +40 -0
  107. package/src/components/ui/carousel/index.ts +10 -0
  108. package/src/components/ui/carousel/interface.ts +26 -0
  109. package/src/components/ui/carousel/useCarousel.ts +56 -0
  110. package/src/components/ui/checkbox/Checkbox.vue +33 -0
  111. package/src/components/ui/checkbox/index.ts +1 -0
  112. package/src/components/ui/collapsible/Collapsible.vue +15 -0
  113. package/src/components/ui/collapsible/CollapsibleContent.vue +11 -0
  114. package/src/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
  115. package/src/components/ui/collapsible/index.ts +3 -0
  116. package/src/components/ui/combobox/Combobox.vue +17 -0
  117. package/src/components/ui/combobox/ComboboxAnchor.vue +23 -0
  118. package/src/components/ui/combobox/ComboboxEmpty.vue +21 -0
  119. package/src/components/ui/combobox/ComboboxGroup.vue +27 -0
  120. package/src/components/ui/combobox/ComboboxInput.vue +41 -0
  121. package/src/components/ui/combobox/ComboboxItem.vue +24 -0
  122. package/src/components/ui/combobox/ComboboxItemIndicator.vue +23 -0
  123. package/src/components/ui/combobox/ComboboxList.vue +29 -0
  124. package/src/components/ui/combobox/ComboboxSeparator.vue +21 -0
  125. package/src/components/ui/combobox/ComboboxViewport.vue +23 -0
  126. package/src/components/ui/combobox/index.ts +12 -0
  127. package/src/components/ui/command/Command.vue +30 -0
  128. package/src/components/ui/command/CommandDialog.vue +21 -0
  129. package/src/components/ui/command/CommandEmpty.vue +20 -0
  130. package/src/components/ui/command/CommandGroup.vue +29 -0
  131. package/src/components/ui/command/CommandInput.vue +33 -0
  132. package/src/components/ui/command/CommandItem.vue +26 -0
  133. package/src/components/ui/command/CommandList.vue +27 -0
  134. package/src/components/ui/command/CommandSeparator.vue +23 -0
  135. package/src/components/ui/command/CommandShortcut.vue +14 -0
  136. package/src/components/ui/command/index.ts +9 -0
  137. package/src/components/ui/context-menu/ContextMenu.vue +15 -0
  138. package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
  139. package/src/components/ui/context-menu/ContextMenuContent.vue +36 -0
  140. package/src/components/ui/context-menu/ContextMenuGroup.vue +11 -0
  141. package/src/components/ui/context-menu/ContextMenuItem.vue +34 -0
  142. package/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
  143. package/src/components/ui/context-menu/ContextMenuPortal.vue +11 -0
  144. package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
  145. package/src/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
  146. package/src/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
  147. package/src/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
  148. package/src/components/ui/context-menu/ContextMenuSub.vue +19 -0
  149. package/src/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
  150. package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
  151. package/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
  152. package/src/components/ui/context-menu/index.ts +14 -0
  153. package/src/components/ui/data-table/DataTable.vue +167 -0
  154. package/src/components/ui/data-table/DataTablePagination.vue +112 -0
  155. package/src/components/ui/data-table/index.ts +3 -0
  156. package/src/components/ui/data-table/types.ts +48 -0
  157. package/src/components/ui/dialog/Dialog.vue +14 -0
  158. package/src/components/ui/dialog/DialogClose.vue +11 -0
  159. package/src/components/ui/dialog/DialogContent.vue +61 -0
  160. package/src/components/ui/dialog/DialogDescription.vue +24 -0
  161. package/src/components/ui/dialog/DialogFooter.vue +19 -0
  162. package/src/components/ui/dialog/DialogHeader.vue +16 -0
  163. package/src/components/ui/dialog/DialogScrollContent.vue +65 -0
  164. package/src/components/ui/dialog/DialogTitle.vue +29 -0
  165. package/src/components/ui/dialog/DialogTrigger.vue +11 -0
  166. package/src/components/ui/dialog/index.ts +9 -0
  167. package/src/components/ui/drawer/Drawer.vue +19 -0
  168. package/src/components/ui/drawer/DrawerContent.vue +28 -0
  169. package/src/components/ui/drawer/DrawerDescription.vue +20 -0
  170. package/src/components/ui/drawer/DrawerFooter.vue +14 -0
  171. package/src/components/ui/drawer/DrawerHeader.vue +14 -0
  172. package/src/components/ui/drawer/DrawerOverlay.vue +18 -0
  173. package/src/components/ui/drawer/DrawerTitle.vue +20 -0
  174. package/src/components/ui/drawer/index.ts +8 -0
  175. package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
  176. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  177. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +44 -0
  178. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  179. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
  180. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
  181. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
  182. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  183. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
  184. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  185. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  186. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +36 -0
  187. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
  188. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  189. package/src/components/ui/dropdown-menu/index.ts +16 -0
  190. package/src/components/ui/hover-card/HoverCard.vue +14 -0
  191. package/src/components/ui/hover-card/HoverCardContent.vue +41 -0
  192. package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
  193. package/src/components/ui/hover-card/index.ts +3 -0
  194. package/src/components/ui/index.ts +41 -0
  195. package/src/components/ui/input/Input.vue +24 -0
  196. package/src/components/ui/input/index.ts +1 -0
  197. package/src/components/ui/label/Label.vue +27 -0
  198. package/src/components/ui/label/index.ts +1 -0
  199. package/src/components/ui/multi-select/MultiSelect.vue +141 -0
  200. package/src/components/ui/multi-select/index.ts +7 -0
  201. package/src/components/ui/notification/Notification.vue +85 -0
  202. package/src/components/ui/notification/index.ts +1 -0
  203. package/src/components/ui/number-field/NumberField.vue +23 -0
  204. package/src/components/ui/number-field/NumberFieldContent.vue +14 -0
  205. package/src/components/ui/number-field/NumberFieldDecrement.vue +25 -0
  206. package/src/components/ui/number-field/NumberFieldIncrement.vue +25 -0
  207. package/src/components/ui/number-field/NumberFieldInput.vue +8 -0
  208. package/src/components/ui/number-field/index.ts +5 -0
  209. package/src/components/ui/popover/Popover.vue +15 -0
  210. package/src/components/ui/popover/PopoverContent.vue +61 -0
  211. package/src/components/ui/popover/PopoverTrigger.vue +11 -0
  212. package/src/components/ui/popover/index.ts +3 -0
  213. package/src/components/ui/progress/Progress.vue +39 -0
  214. package/src/components/ui/progress/index.ts +1 -0
  215. package/src/components/ui/radio-group/RadioGroup.vue +25 -0
  216. package/src/components/ui/radio-group/RadioGroupItem.vue +39 -0
  217. package/src/components/ui/radio-group/index.ts +2 -0
  218. package/src/components/ui/scroll-area/ScrollArea.vue +29 -0
  219. package/src/components/ui/scroll-area/ScrollBar.vue +30 -0
  220. package/src/components/ui/scroll-area/index.ts +2 -0
  221. package/src/components/ui/scroll-pane/ScrollPane.vue +25 -0
  222. package/src/components/ui/scroll-pane/ScrollPaneHeader.vue +75 -0
  223. package/src/components/ui/scroll-pane/index.ts +2 -0
  224. package/src/components/ui/select/Select.vue +15 -0
  225. package/src/components/ui/select/SelectContent.vue +57 -0
  226. package/src/components/ui/select/SelectGroup.vue +19 -0
  227. package/src/components/ui/select/SelectItem.vue +47 -0
  228. package/src/components/ui/select/SelectItemText.vue +11 -0
  229. package/src/components/ui/select/SelectLabel.vue +13 -0
  230. package/src/components/ui/select/SelectScrollDownButton.vue +24 -0
  231. package/src/components/ui/select/SelectScrollUpButton.vue +24 -0
  232. package/src/components/ui/select/SelectSeparator.vue +17 -0
  233. package/src/components/ui/select/SelectTrigger.vue +45 -0
  234. package/src/components/ui/select/SelectValue.vue +11 -0
  235. package/src/components/ui/select/index.ts +11 -0
  236. package/src/components/ui/separator/Separator.vue +35 -0
  237. package/src/components/ui/separator/index.ts +1 -0
  238. package/src/components/ui/sheet/Sheet.vue +14 -0
  239. package/src/components/ui/sheet/SheetClose.vue +11 -0
  240. package/src/components/ui/sheet/SheetContent.vue +56 -0
  241. package/src/components/ui/sheet/SheetDescription.vue +22 -0
  242. package/src/components/ui/sheet/SheetFooter.vue +19 -0
  243. package/src/components/ui/sheet/SheetHeader.vue +16 -0
  244. package/src/components/ui/sheet/SheetTitle.vue +22 -0
  245. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  246. package/src/components/ui/sheet/index.ts +31 -0
  247. package/src/components/ui/skeleton/Skeleton.vue +14 -0
  248. package/src/components/ui/skeleton/index.ts +1 -0
  249. package/src/components/ui/slider/Slider.vue +66 -0
  250. package/src/components/ui/slider/index.ts +1 -0
  251. package/src/components/ui/switch/Switch.vue +37 -0
  252. package/src/components/ui/switch/index.ts +1 -0
  253. package/src/components/ui/table/Table.vue +16 -0
  254. package/src/components/ui/table/TableBody.vue +14 -0
  255. package/src/components/ui/table/TableCaption.vue +14 -0
  256. package/src/components/ui/table/TableCell.vue +14 -0
  257. package/src/components/ui/table/TableEmpty.vue +39 -0
  258. package/src/components/ui/table/TableFooter.vue +16 -0
  259. package/src/components/ui/table/TableHead.vue +21 -0
  260. package/src/components/ui/table/TableHeader.vue +14 -0
  261. package/src/components/ui/table/TableRow.vue +21 -0
  262. package/src/components/ui/table/index.ts +9 -0
  263. package/src/components/ui/tabs/Tabs.vue +15 -0
  264. package/src/components/ui/tabs/TabsContent.vue +22 -0
  265. package/src/components/ui/tabs/TabsIndicator.vue +22 -0
  266. package/src/components/ui/tabs/TabsList.vue +25 -0
  267. package/src/components/ui/tabs/TabsTrigger.vue +29 -0
  268. package/src/components/ui/tabs/index.ts +5 -0
  269. package/src/components/ui/tags-input/TagsInput.vue +22 -0
  270. package/src/components/ui/tags-input/TagsInputInput.vue +19 -0
  271. package/src/components/ui/tags-input/TagsInputItem.vue +22 -0
  272. package/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
  273. package/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
  274. package/src/components/ui/tags-input/index.ts +5 -0
  275. package/src/components/ui/textarea/Textarea.vue +24 -0
  276. package/src/components/ui/textarea/index.ts +1 -0
  277. package/src/components/ui/toast/Toast.vue +57 -0
  278. package/src/components/ui/toast/ToastAction.vue +30 -0
  279. package/src/components/ui/toast/ToastClose.vue +31 -0
  280. package/src/components/ui/toast/ToastDescription.vue +25 -0
  281. package/src/components/ui/toast/ToastTitle.vue +25 -0
  282. package/src/components/ui/toast/Toaster.vue +31 -0
  283. package/src/components/ui/toast/index.ts +8 -0
  284. package/src/components/ui/toast/use-toast.ts +136 -0
  285. package/src/components/ui/toggle/Toggle.vue +35 -0
  286. package/src/components/ui/toggle/index.ts +27 -0
  287. package/src/components/ui/toggle-group/ToggleGroup.vue +34 -0
  288. package/src/components/ui/toggle-group/ToggleGroupItem.vue +35 -0
  289. package/src/components/ui/toggle-group/index.ts +2 -0
  290. package/src/components/ui/tooltip/Tooltip.vue +14 -0
  291. package/src/components/ui/tooltip/TooltipContent.vue +31 -0
  292. package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
  293. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  294. package/src/components/ui/tooltip/index.ts +4 -0
  295. package/src/composables/glass/index.ts +8 -0
  296. package/src/composables/glass/useGlassRenderer.ts +252 -0
  297. package/src/composables/glass/webgl/frostShader.ts +221 -0
  298. package/src/composables/glass/webgpu/glassShader.wgsl +173 -0
  299. package/src/composables/index.ts +32 -0
  300. package/src/composables/infinite-scroll/index.ts +2 -0
  301. package/src/composables/infinite-scroll/types.ts +25 -0
  302. package/src/composables/infinite-scroll/useInfiniteScroll.ts +101 -0
  303. package/src/composables/interaction/index.ts +5 -0
  304. package/src/composables/interaction/useHeightTransition.ts +82 -0
  305. package/src/composables/interaction/useHoverPopover.ts +64 -0
  306. package/src/composables/interaction/useHoverToggle.ts +103 -0
  307. package/src/composables/interaction/useLeaveTimer.ts +17 -0
  308. package/src/composables/interaction/useTouchGate.ts +207 -0
  309. package/src/composables/pagination/index.ts +2 -0
  310. package/src/composables/pagination/useOffsetPagination.ts +70 -0
  311. package/src/composables/prng.ts +32 -0
  312. package/src/composables/useCharSplit.ts +31 -0
  313. package/src/composables/useClipboard.ts +46 -0
  314. package/src/composables/useGlobalDark.ts +61 -0
  315. package/src/composables/useKeyboardShortcuts.ts +205 -0
  316. package/src/composables/useWatercolorBlob.ts +136 -0
  317. package/src/composables/virtual/index.ts +22 -0
  318. package/src/composables/virtual/useVirtualSectionWindow.ts +338 -0
  319. package/src/composables/virtual/useWindowedStore.ts +86 -0
  320. package/src/composables/virtual/virtualSectionLayout.ts +212 -0
  321. package/src/index.ts +9 -0
  322. package/src/styles/animations.css +233 -0
  323. package/src/styles/cards.css +66 -0
  324. package/src/styles/dock.css +221 -0
  325. package/src/styles/floating-panel.css +49 -0
  326. package/src/styles/glass.css +266 -0
  327. package/src/styles/index.css +26 -0
  328. package/src/styles/scroll-pane.css +10 -0
  329. package/src/styles/theme.css +138 -0
  330. package/src/styles/tokens.css +333 -0
  331. package/src/styles/transitions.css +226 -0
  332. package/src/styles/typography.css +277 -0
  333. package/src/styles/utilities.css +697 -0
  334. package/src/utils/cn.ts +6 -0
  335. package/src/utils/index.ts +1 -0
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+ import { type AlertVariants, alertVariants } from '.'
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes['class']
8
+ variant?: AlertVariants['variant']
9
+ }>()
10
+ </script>
11
+
12
+ <template>
13
+ <div
14
+ data-slot="alert"
15
+ :class="cn(alertVariants({ variant }), props.class)"
16
+ role="alert"
17
+ >
18
+ <slot />
19
+ </div>
20
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-description"
13
+ :class="cn('text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed', props.class)"
14
+ >
15
+ <slot />
16
+ </div>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ data-slot="alert-title"
13
+ :class="cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', props.class)"
14
+ >
15
+ <slot />
16
+ </div>
17
+ </template>
@@ -0,0 +1,23 @@
1
+ import { cva, type VariantProps } from 'class-variance-authority'
2
+
3
+ export { default as Alert } from './Alert.vue'
4
+ export { default as AlertDescription } from './AlertDescription.vue'
5
+ export { default as AlertTitle } from './AlertTitle.vue'
6
+
7
+ export const alertVariants = cva(
8
+ 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'bg-card text-card-foreground',
13
+ destructive:
14
+ 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',
15
+ },
16
+ },
17
+ defaultVariants: {
18
+ variant: 'default',
19
+ },
20
+ },
21
+ )
22
+
23
+ export type AlertVariants = VariantProps<typeof alertVariants>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { AvatarRoot } from 'reka-ui'
4
+ import { type AvatarVariants, avatarVariant } from '.'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = withDefaults(defineProps<{
8
+ class?: HTMLAttributes['class']
9
+ size?: AvatarVariants['size']
10
+ shape?: AvatarVariants['shape']
11
+ }>(), {
12
+ size: 'sm',
13
+ shape: 'circle',
14
+ })
15
+ </script>
16
+
17
+ <template>
18
+ <AvatarRoot :class="cn(avatarVariant({ size, shape }), props.class)">
19
+ <slot />
20
+ </AvatarRoot>
21
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { AvatarFallback, type AvatarFallbackProps } from 'reka-ui'
3
+
4
+ const props = defineProps<AvatarFallbackProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <AvatarFallback v-bind="props">
9
+ <slot />
10
+ </AvatarFallback>
11
+ </template>
@@ -0,0 +1,9 @@
1
+ <script setup lang="ts">
2
+ import { AvatarImage, type AvatarImageProps } from 'reka-ui'
3
+
4
+ const props = defineProps<AvatarImageProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <AvatarImage v-bind="props" class="h-full w-full object-cover" />
9
+ </template>
@@ -0,0 +1,24 @@
1
+ import { type VariantProps, cva } from 'class-variance-authority'
2
+
3
+ export { default as Avatar } from './Avatar.vue'
4
+ export { default as AvatarImage } from './AvatarImage.vue'
5
+ export { default as AvatarFallback } from './AvatarFallback.vue'
6
+
7
+ export const avatarVariant = cva(
8
+ 'inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden',
9
+ {
10
+ variants: {
11
+ size: {
12
+ sm: 'h-10 w-10 text-xs',
13
+ base: 'h-16 w-16 text-2xl',
14
+ lg: 'h-32 w-32 text-5xl',
15
+ },
16
+ shape: {
17
+ circle: 'rounded-full',
18
+ square: 'rounded-md',
19
+ },
20
+ },
21
+ },
22
+ )
23
+
24
+ export type AvatarVariants = VariantProps<typeof avatarVariant>
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { type BadgeVariants, badgeVariants } from '.'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<{
7
+ variant?: BadgeVariants['variant']
8
+ class?: HTMLAttributes['class']
9
+ }>()
10
+ </script>
11
+
12
+ <template>
13
+ <div :class="cn(badgeVariants({ variant }), props.class)">
14
+ <slot />
15
+ </div>
16
+ </template>
@@ -0,0 +1,25 @@
1
+ import { type VariantProps, cva } from 'class-variance-authority'
2
+
3
+ export { default as Badge } from './Badge.vue'
4
+
5
+ export const badgeVariants = cva(
6
+ 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus-visible:shadow-[0_0_0_2px_color-mix(in_srgb,var(--ring)_40%,transparent)]',
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default:
11
+ 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',
12
+ secondary:
13
+ 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',
14
+ destructive:
15
+ 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',
16
+ outline: 'text-foreground',
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: 'default',
21
+ },
22
+ },
23
+ )
24
+
25
+ export type BadgeVariants = VariantProps<typeof badgeVariants>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { Primitive, type PrimitiveProps } from 'reka-ui'
4
+ import { type ButtonVariants, buttonVariants } from '.'
5
+ import { cn } from '../../../utils'
6
+
7
+ interface Props extends PrimitiveProps {
8
+ variant?: ButtonVariants['variant']
9
+ size?: ButtonVariants['size']
10
+ class?: HTMLAttributes['class']
11
+ }
12
+
13
+ const props = withDefaults(defineProps<Props>(), {
14
+ as: 'button',
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <Primitive
20
+ :as="as"
21
+ :as-child="asChild"
22
+ :class="cn(buttonVariants({ variant, size }), props.class)"
23
+ >
24
+ <slot />
25
+ </Primitive>
26
+ </template>
@@ -0,0 +1,43 @@
1
+ import { type VariantProps, cva } from 'class-variance-authority'
2
+
3
+ export { default as Button } from './Button.vue'
4
+
5
+ export const buttonVariants = cva(
6
+ // Base: compose with btn-pill from glass.css
7
+ 'btn-pill whitespace-nowrap text-sm font-medium focus-visible:outline-none focus-visible:shadow-[0_0_0_2px_color-mix(in_srgb,var(--ring)_30%,transparent),0_0_8px_color-mix(in_srgb,var(--ring)_15%,transparent)] disabled:pointer-events-none disabled:opacity-50',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
12
+ destructive:
13
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
14
+ outline:
15
+ 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
16
+ secondary:
17
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
18
+ // Glass library modifier classes:
19
+ accent: 'btn-pill-accent',
20
+ ghost: 'btn-pill-ghost',
21
+ glass: 'btn-pill-glass',
22
+ 'glass-subtle':
23
+ 'glass-subtle text-foreground/70 hover:border-[color-mix(in_srgb,var(--border)_50%,transparent)] hover:text-foreground',
24
+ ai: 'bg-amber-500/15 text-amber-700 hover:bg-amber-500/25 dark:text-amber-400',
25
+ 'danger-subtle': 'bg-destructive/10 text-destructive hover:bg-destructive/20',
26
+ link: 'text-primary underline-offset-4 hover:underline',
27
+ },
28
+ size: {
29
+ default: 'h-10 px-4 py-2',
30
+ xs: 'h-7 rounded-full px-2',
31
+ sm: 'h-9 rounded-full px-3',
32
+ lg: 'h-11 rounded-full px-8',
33
+ icon: 'h-10 w-10',
34
+ },
35
+ },
36
+ defaultVariants: {
37
+ variant: 'default',
38
+ size: 'default',
39
+ },
40
+ },
41
+ )
42
+
43
+ export type ButtonVariants = VariantProps<typeof buttonVariants>
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from "vue";
3
+ import { cn } from "../../../utils";
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"];
7
+ /** When true, renders as a plain structural wrapper with no border, shadow, or background.
8
+ * Used when a Card is nested inside another card or serves as a layout container. */
9
+ plain?: boolean;
10
+ /** 'default' = glass bg + shadow; 'pane' = translucent bg + blur (scrollable content panes) */
11
+ variant?: "default" | "pane";
12
+ }>();
13
+
14
+ const variantClass = computed(() => {
15
+ if (props.plain) return "scrollbar-hidden rounded-xl";
16
+ if (props.variant === "pane")
17
+ // Pane uses glass background + blur without the ::after grain overlay,
18
+ // which conflicts with overflow:auto scroll containers.
19
+ return "scrollbar-hidden rounded-xl text-card-foreground bg-[var(--glass-bg-subtle)] [backdrop-filter:var(--glass-blur-subtle)] border border-[var(--glass-border-subtle)]";
20
+ return "scrollbar-hidden glass-default rounded-xl text-card-foreground shadow-[var(--shadow-card)]";
21
+ });
22
+ </script>
23
+
24
+ <template>
25
+ <div :class="cn(variantClass, props.class)">
26
+ <slot />
27
+ </div>
28
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div :class="cn('p-6', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <p :class="cn('text-sm text-muted-foreground', props.class)">
12
+ <slot />
13
+ </p>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div :class="cn('flex items-center p-6 pt-0', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div :class="cn('flex flex-col gap-y-1.5 p-6', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from "vue";
3
+ import { cn } from "../../../utils";
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes["class"];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <h3
12
+ :class="
13
+ cn(
14
+ 'text-3xl font-semibold leading-none tracking-tight',
15
+ props.class,
16
+ )
17
+ "
18
+ >
19
+ <slot />
20
+ </h3>
21
+ </template>
@@ -0,0 +1,6 @@
1
+ export { default as Card } from './Card.vue'
2
+ export { default as CardHeader } from './CardHeader.vue'
3
+ export { default as CardTitle } from './CardTitle.vue'
4
+ export { default as CardDescription } from './CardDescription.vue'
5
+ export { default as CardContent } from './CardContent.vue'
6
+ export { default as CardFooter } from './CardFooter.vue'
@@ -0,0 +1,53 @@
1
+ <script setup lang="ts">
2
+ import type { CarouselEmits, CarouselProps, WithClassAsProps } from './interface'
3
+ import { cn } from '../../../utils'
4
+ import { useProvideCarousel } from './useCarousel'
5
+
6
+ const props = withDefaults(defineProps<CarouselProps & WithClassAsProps>(), {
7
+ orientation: 'horizontal',
8
+ })
9
+
10
+ const emits = defineEmits<CarouselEmits>()
11
+
12
+ const { canScrollNext, canScrollPrev, carouselApi, carouselRef, orientation, scrollNext, scrollPrev } = useProvideCarousel(props, emits)
13
+
14
+ defineExpose({
15
+ canScrollNext,
16
+ canScrollPrev,
17
+ carouselApi,
18
+ carouselRef,
19
+ orientation,
20
+ scrollNext,
21
+ scrollPrev,
22
+ })
23
+
24
+ function onKeyDown(event: KeyboardEvent) {
25
+ const prevKey = props.orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft'
26
+ const nextKey = props.orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight'
27
+
28
+ if (event.key === prevKey) {
29
+ event.preventDefault()
30
+ scrollPrev()
31
+
32
+ return
33
+ }
34
+
35
+ if (event.key === nextKey) {
36
+ event.preventDefault()
37
+ scrollNext()
38
+ }
39
+ }
40
+ </script>
41
+
42
+ <template>
43
+ <div
44
+ data-slot="carousel"
45
+ :class="cn('relative', props.class)"
46
+ role="region"
47
+ aria-roledescription="carousel"
48
+ tabindex="0"
49
+ @keydown="onKeyDown"
50
+ >
51
+ <slot :can-scroll-next :can-scroll-prev :carousel-api :carousel-ref :orientation :scroll-next :scroll-prev />
52
+ </div>
53
+ </template>
@@ -0,0 +1,35 @@
1
+ <script setup lang="ts">
2
+ import type { WithClassAsProps } from './interface'
3
+ import { cn } from '../../../utils'
4
+ import { useCarousel } from './useCarousel'
5
+
6
+ defineOptions({
7
+ inheritAttrs: false,
8
+ })
9
+
10
+ const props = defineProps<WithClassAsProps>()
11
+
12
+ const { carouselRef, orientation } = useCarousel()
13
+
14
+ defineExpose({ carouselRef })
15
+ </script>
16
+
17
+ <template>
18
+ <div
19
+ ref="carouselRef"
20
+ data-slot="carousel-content"
21
+ class="overflow-hidden"
22
+ >
23
+ <div
24
+ :class="
25
+ cn(
26
+ 'flex',
27
+ orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col',
28
+ props.class,
29
+ )"
30
+ v-bind="$attrs"
31
+ >
32
+ <slot />
33
+ </div>
34
+ </div>
35
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { WithClassAsProps } from './interface'
3
+ import { cn } from '../../../utils'
4
+ import { useCarousel } from './useCarousel'
5
+
6
+ const props = defineProps<WithClassAsProps>()
7
+
8
+ const { orientation } = useCarousel()
9
+ </script>
10
+
11
+ <template>
12
+ <div
13
+ data-slot="carousel-item"
14
+ role="group"
15
+ aria-roledescription="slide"
16
+ :class="cn(
17
+ 'min-w-0 shrink-0 grow-0 basis-full',
18
+ orientation === 'horizontal' ? 'pl-4' : 'pt-4',
19
+ props.class,
20
+ )"
21
+ >
22
+ <slot />
23
+ </div>
24
+ </template>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import type { WithClassAsProps } from './interface'
3
+ import { ArrowRight } from 'lucide-vue-next'
4
+ import { cn } from '../../../utils'
5
+ import { Button, type ButtonVariants } from '../button'
6
+ import { useCarousel } from './useCarousel'
7
+
8
+ const props = withDefaults(defineProps<{
9
+ variant?: ButtonVariants['variant']
10
+ size?: ButtonVariants['size']
11
+ }
12
+ & WithClassAsProps>(), {
13
+ variant: 'outline',
14
+ size: 'icon',
15
+ })
16
+
17
+ const { orientation, canScrollNext, scrollNext } = useCarousel()
18
+ </script>
19
+
20
+ <template>
21
+ <Button
22
+ data-slot="carousel-next"
23
+ :disabled="!canScrollNext"
24
+ :class="cn(
25
+ 'absolute size-8 rounded-full',
26
+ orientation === 'horizontal'
27
+ ? 'top-1/2 -right-12 -translate-y-1/2'
28
+ : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',
29
+ props.class,
30
+ )"
31
+ :variant="variant"
32
+ :size="size"
33
+ @click="scrollNext"
34
+ >
35
+ <slot>
36
+ <ArrowRight />
37
+ <span class="sr-only">Next Slide</span>
38
+ </slot>
39
+ </Button>
40
+ </template>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import type { WithClassAsProps } from './interface'
3
+ import { ArrowLeft } from 'lucide-vue-next'
4
+ import { cn } from '../../../utils'
5
+ import { Button, type ButtonVariants } from '../button'
6
+ import { useCarousel } from './useCarousel'
7
+
8
+ const props = withDefaults(defineProps<{
9
+ variant?: ButtonVariants['variant']
10
+ size?: ButtonVariants['size']
11
+ }
12
+ & WithClassAsProps>(), {
13
+ variant: 'outline',
14
+ size: 'icon',
15
+ })
16
+
17
+ const { orientation, canScrollPrev, scrollPrev } = useCarousel()
18
+ </script>
19
+
20
+ <template>
21
+ <Button
22
+ data-slot="carousel-previous"
23
+ :disabled="!canScrollPrev"
24
+ :class="cn(
25
+ 'absolute size-8 rounded-full',
26
+ orientation === 'horizontal'
27
+ ? 'top-1/2 -left-12 -translate-y-1/2'
28
+ : '-top-12 left-1/2 -translate-x-1/2 rotate-90',
29
+ props.class,
30
+ )"
31
+ :variant="variant"
32
+ :size="size"
33
+ @click="scrollPrev"
34
+ >
35
+ <slot>
36
+ <ArrowLeft />
37
+ <span class="sr-only">Previous Slide</span>
38
+ </slot>
39
+ </Button>
40
+ </template>
@@ -0,0 +1,10 @@
1
+ export { default as Carousel } from './Carousel.vue'
2
+ export { default as CarouselContent } from './CarouselContent.vue'
3
+ export { default as CarouselItem } from './CarouselItem.vue'
4
+ export { default as CarouselNext } from './CarouselNext.vue'
5
+ export { default as CarouselPrevious } from './CarouselPrevious.vue'
6
+ export type {
7
+ UnwrapRefCarouselApi as CarouselApi,
8
+ } from './interface'
9
+
10
+ export { useCarousel } from './useCarousel'
@@ -0,0 +1,26 @@
1
+ import type useEmblaCarousel from 'embla-carousel-vue'
2
+ import type {
3
+ EmblaCarouselVueType,
4
+ } from 'embla-carousel-vue'
5
+ import type { HTMLAttributes, UnwrapRef } from 'vue'
6
+
7
+ type CarouselApi = EmblaCarouselVueType[1]
8
+ type UseCarouselParameters = Parameters<typeof useEmblaCarousel>
9
+ type CarouselOptions = UseCarouselParameters[0]
10
+ type CarouselPlugin = UseCarouselParameters[1]
11
+
12
+ export type UnwrapRefCarouselApi = UnwrapRef<CarouselApi>
13
+
14
+ export interface CarouselProps {
15
+ opts?: CarouselOptions
16
+ plugins?: CarouselPlugin
17
+ orientation?: 'horizontal' | 'vertical'
18
+ }
19
+
20
+ export interface CarouselEmits {
21
+ (e: 'init-api', payload: UnwrapRefCarouselApi): void
22
+ }
23
+
24
+ export interface WithClassAsProps {
25
+ class?: HTMLAttributes['class']
26
+ }