@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,3 @@
1
+ export { default as DataTable } from "./DataTable.vue";
2
+ export { default as DataTablePagination } from "./DataTablePagination.vue";
3
+ export type { DataTableColumn, DataTableSort, DataTableProps } from "./types";
@@ -0,0 +1,48 @@
1
+ import type { Component } from "vue";
2
+
3
+ export interface DataTableColumn<T = any> {
4
+ /** Unique key matching a property on the row object */
5
+ key: string;
6
+ /** Display label for the column header */
7
+ label: string;
8
+ /** Optional formatter for cell values */
9
+ formatter?: (value: any, row: T) => string;
10
+ /** Optional custom component to render in the cell. Receives `value` and `row` props. */
11
+ component?: Component;
12
+ /** Whether this column is sortable */
13
+ sortable?: boolean;
14
+ /** Text alignment */
15
+ align?: "left" | "center" | "right";
16
+ /** Additional CSS classes for the column cells */
17
+ class?: string;
18
+ /** Additional CSS classes for the header cell */
19
+ headerClass?: string;
20
+ }
21
+
22
+ export interface DataTableSort {
23
+ key: string;
24
+ direction: "asc" | "desc";
25
+ }
26
+
27
+ export interface DataTableProps<T = any> {
28
+ /** Column definitions */
29
+ columns: DataTableColumn<T>[];
30
+ /** Row data to display */
31
+ rows: T[];
32
+ /** Total number of rows across all pages (for pagination display) */
33
+ total: number;
34
+ /** Current page number (1-indexed) */
35
+ page: number;
36
+ /** Number of rows per page */
37
+ pageSize: number;
38
+ /** Whether data is currently loading */
39
+ isLoading?: boolean;
40
+ /** Unique key field on each row (defaults to "_id") */
41
+ rowKey?: string;
42
+ /** Current sort state */
43
+ sort?: DataTableSort;
44
+ /** When true, hides pagination and shows infinite scroll sentinel */
45
+ infinite?: boolean;
46
+ /** Whether more data is available (for infinite scroll mode) */
47
+ hasMore?: boolean;
48
+ }
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { DialogRoot, type DialogRootEmits, type DialogRootProps, useForwardPropsEmits } from 'reka-ui'
3
+
4
+ const props = defineProps<DialogRootProps>()
5
+ const emits = defineEmits<DialogRootEmits>()
6
+
7
+ const forwarded = useForwardPropsEmits(props, emits)
8
+ </script>
9
+
10
+ <template>
11
+ <DialogRoot v-bind="forwarded">
12
+ <slot />
13
+ </DialogRoot>
14
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DialogClose, type DialogCloseProps } from 'reka-ui'
3
+
4
+ const props = defineProps<DialogCloseProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <DialogClose v-bind="props">
9
+ <slot />
10
+ </DialogClose>
11
+ </template>
@@ -0,0 +1,61 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import {
4
+ DialogClose,
5
+ DialogContent,
6
+ type DialogContentEmits,
7
+ type DialogContentProps,
8
+ DialogOverlay,
9
+ DialogPortal,
10
+ useForwardPropsEmits,
11
+ } from 'reka-ui'
12
+ import { X } from 'lucide-vue-next'
13
+ import { cn } from '../../../utils'
14
+
15
+ const props = withDefaults(
16
+ defineProps<DialogContentProps & {
17
+ class?: HTMLAttributes['class'];
18
+ /** Visual variant: "glass" (translucent blur, default) or "opaque" (solid background). */
19
+ variant?: 'glass' | 'opaque';
20
+ }>(),
21
+ { variant: 'glass' },
22
+ )
23
+ const emits = defineEmits<DialogContentEmits>()
24
+
25
+ const delegatedProps = computed(() => {
26
+ const { class: _, variant: _v, ...delegated } = props
27
+ return delegated
28
+ })
29
+
30
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
31
+
32
+ // Center fade + zoom only — no slide animation.
33
+ const baseClasses = 'fixed left-1/2 top-1/2 z-modal grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 p-6 shadow-xl duration-[var(--duration-normal)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95'
34
+
35
+ const variantClasses = computed(() =>
36
+ props.variant === 'opaque'
37
+ ? 'bg-background border sm:rounded-xl'
38
+ : 'glass-elevated rounded-xl'
39
+ )
40
+ </script>
41
+
42
+ <template>
43
+ <DialogPortal>
44
+ <DialogOverlay
45
+ class="fixed inset-0 z-overlay bg-black/50 [backdrop-filter:var(--glass-blur-subtle)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
46
+ />
47
+ <DialogContent
48
+ v-bind="forwarded"
49
+ :class="cn(baseClasses, variantClasses, props.class)"
50
+ >
51
+ <slot />
52
+
53
+ <DialogClose
54
+ class="absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus-visible:shadow-[0_0_0_2px_color-mix(in_srgb,var(--ring)_40%,transparent)] disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"
55
+ >
56
+ <X class="w-4 h-4" />
57
+ <span class="sr-only">Close</span>
58
+ </DialogClose>
59
+ </DialogContent>
60
+ </DialogPortal>
61
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DialogDescription, type DialogDescriptionProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps)
15
+ </script>
16
+
17
+ <template>
18
+ <DialogDescription
19
+ v-bind="forwardedProps"
20
+ :class="cn('text-sm text-muted-foreground', props.class)"
21
+ >
22
+ <slot />
23
+ </DialogDescription>
24
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>()
6
+ </script>
7
+
8
+ <template>
9
+ <div
10
+ :class="
11
+ cn(
12
+ 'flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2',
13
+ props.class,
14
+ )
15
+ "
16
+ >
17
+ <slot />
18
+ </div>
19
+ </template>
@@ -0,0 +1,16 @@
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
+ :class="cn('flex flex-col gap-y-1.5 text-center sm:text-left', props.class)"
13
+ >
14
+ <slot />
15
+ </div>
16
+ </template>
@@ -0,0 +1,65 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import {
4
+ DialogClose,
5
+ DialogContent,
6
+ type DialogContentEmits,
7
+ type DialogContentProps,
8
+ DialogOverlay,
9
+ DialogPortal,
10
+ useForwardPropsEmits,
11
+ } from 'reka-ui'
12
+ import { X } from 'lucide-vue-next'
13
+ import { cn } from '../../../utils'
14
+
15
+ const props = defineProps<DialogContentProps & {
16
+ class?: HTMLAttributes['class']
17
+ overlayClass?: HTMLAttributes['class']
18
+ }>()
19
+ const emits = defineEmits<DialogContentEmits>()
20
+
21
+ const delegatedProps = computed(() => {
22
+ const { class: _, overlayClass: __, ...delegated } = props
23
+
24
+ return delegated
25
+ })
26
+
27
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
28
+ </script>
29
+
30
+ <template>
31
+ <DialogPortal>
32
+ <DialogOverlay
33
+ :class="cn(
34
+ 'fixed inset-0 z-overlay grid place-items-center overflow-y-auto bg-black/40 [backdrop-filter:var(--glass-blur-subtle)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
35
+ props.overlayClass,
36
+ )"
37
+ >
38
+ <DialogContent
39
+ :class="
40
+ cn(
41
+ 'relative z-overlay grid w-full max-w-lg my-8 gap-4 border border-border bg-background p-6 shadow-lg duration-200 sm:rounded-2xl md:w-full',
42
+ props.class,
43
+ )
44
+ "
45
+ v-bind="forwarded"
46
+ @pointer-down-outside="(event) => {
47
+ const originalEvent = event.detail.originalEvent;
48
+ const target = originalEvent.target as HTMLElement;
49
+ if (originalEvent.offsetX > target.clientWidth || originalEvent.offsetY > target.clientHeight) {
50
+ event.preventDefault();
51
+ }
52
+ }"
53
+ >
54
+ <slot />
55
+
56
+ <DialogClose
57
+ class="absolute top-3 right-3 p-0.5 transition-colors rounded-full hover:bg-secondary 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)]"
58
+ >
59
+ <X class="w-4 h-4" />
60
+ <span class="sr-only">Close</span>
61
+ </DialogClose>
62
+ </DialogContent>
63
+ </DialogOverlay>
64
+ </DialogPortal>
65
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DialogTitle, type DialogTitleProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps)
15
+ </script>
16
+
17
+ <template>
18
+ <DialogTitle
19
+ v-bind="forwardedProps"
20
+ :class="
21
+ cn(
22
+ 'text-lg font-semibold leading-none tracking-tight',
23
+ props.class,
24
+ )
25
+ "
26
+ >
27
+ <slot />
28
+ </DialogTitle>
29
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DialogTrigger, type DialogTriggerProps } from 'reka-ui'
3
+
4
+ const props = defineProps<DialogTriggerProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <DialogTrigger v-bind="props">
9
+ <slot />
10
+ </DialogTrigger>
11
+ </template>
@@ -0,0 +1,9 @@
1
+ export { default as Dialog } from './Dialog.vue'
2
+ export { default as DialogClose } from './DialogClose.vue'
3
+ export { default as DialogTrigger } from './DialogTrigger.vue'
4
+ export { default as DialogHeader } from './DialogHeader.vue'
5
+ export { default as DialogTitle } from './DialogTitle.vue'
6
+ export { default as DialogDescription } from './DialogDescription.vue'
7
+ export { default as DialogContent } from './DialogContent.vue'
8
+ export { default as DialogScrollContent } from './DialogScrollContent.vue'
9
+ export { default as DialogFooter } from './DialogFooter.vue'
@@ -0,0 +1,19 @@
1
+ <script lang="ts" setup>
2
+ import type { DrawerRootEmits, DrawerRootProps } from 'vaul-vue'
3
+ import { DrawerRoot } from 'vaul-vue'
4
+ import { useForwardPropsEmits } from 'reka-ui'
5
+
6
+ const props = withDefaults(defineProps<DrawerRootProps>(), {
7
+ shouldScaleBackground: true,
8
+ })
9
+
10
+ const emits = defineEmits<DrawerRootEmits>()
11
+
12
+ const forwarded = useForwardPropsEmits(props, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <DrawerRoot v-bind="forwarded">
17
+ <slot />
18
+ </DrawerRoot>
19
+ </template>
@@ -0,0 +1,28 @@
1
+ <script lang="ts" setup>
2
+ import { DrawerContent, DrawerPortal } from 'vaul-vue'
3
+ import type { DialogContentEmits, DialogContentProps } from 'reka-ui'
4
+ import { useForwardPropsEmits } from 'reka-ui'
5
+ import type { HtmlHTMLAttributes } from 'vue'
6
+ import DrawerOverlay from './DrawerOverlay.vue'
7
+ import { cn } from '../../../utils'
8
+
9
+ const props = defineProps<DialogContentProps & { class?: HtmlHTMLAttributes['class'] }>()
10
+ const emits = defineEmits<DialogContentEmits>()
11
+
12
+ const forwarded = useForwardPropsEmits(props, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <DrawerPortal>
17
+ <DrawerOverlay />
18
+ <DrawerContent
19
+ v-bind="forwarded" :class="cn(
20
+ 'fixed inset-x-0 bottom-0 z-overlay mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background',
21
+ props.class,
22
+ )"
23
+ >
24
+ <div class="mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
25
+ <slot />
26
+ </DrawerContent>
27
+ </DrawerPortal>
28
+ </template>
@@ -0,0 +1,20 @@
1
+ <script lang="ts" setup>
2
+ import type { DrawerDescriptionProps } from 'vaul-vue'
3
+ import { DrawerDescription } from 'vaul-vue'
4
+ import { type HtmlHTMLAttributes, computed } from 'vue'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = defineProps<DrawerDescriptionProps & { class?: HtmlHTMLAttributes['class'] }>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+ </script>
15
+
16
+ <template>
17
+ <DrawerDescription v-bind="delegatedProps" :class="cn('text-sm text-muted-foreground', props.class)">
18
+ <slot />
19
+ </DrawerDescription>
20
+ </template>
@@ -0,0 +1,14 @@
1
+ <script lang="ts" setup>
2
+ import type { HtmlHTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HtmlHTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div :class="cn('mt-auto flex flex-col gap-2 p-4', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script lang="ts" setup>
2
+ import type { HtmlHTMLAttributes } from 'vue'
3
+ import { cn } from '../../../utils'
4
+
5
+ const props = defineProps<{
6
+ class?: HtmlHTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div :class="cn('grid gap-1.5 p-4 text-center sm:text-left', props.class)">
12
+ <slot />
13
+ </div>
14
+ </template>
@@ -0,0 +1,18 @@
1
+ <script lang="ts" setup>
2
+ import { DrawerOverlay } from 'vaul-vue'
3
+ import type { DialogOverlayProps } from 'reka-ui'
4
+ import { type HtmlHTMLAttributes, computed } from 'vue'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = defineProps<DialogOverlayProps & { class?: HtmlHTMLAttributes['class'] }>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+ </script>
15
+
16
+ <template>
17
+ <DrawerOverlay v-bind="delegatedProps" :class="cn('fixed inset-0 z-overlay bg-black/80 [backdrop-filter:var(--glass-blur-subtle)]', props.class)" />
18
+ </template>
@@ -0,0 +1,20 @@
1
+ <script lang="ts" setup>
2
+ import type { DrawerTitleProps } from 'vaul-vue'
3
+ import { DrawerTitle } from 'vaul-vue'
4
+ import { type HtmlHTMLAttributes, computed } from 'vue'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = defineProps<DrawerTitleProps & { class?: HtmlHTMLAttributes['class'] }>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+ </script>
15
+
16
+ <template>
17
+ <DrawerTitle v-bind="delegatedProps" :class="cn('text-lg font-semibold leading-none tracking-tight', props.class)">
18
+ <slot />
19
+ </DrawerTitle>
20
+ </template>
@@ -0,0 +1,8 @@
1
+ export { DrawerPortal, DrawerTrigger, DrawerClose } from 'vaul-vue'
2
+ export { default as Drawer } from './Drawer.vue'
3
+ export { default as DrawerOverlay } from './DrawerOverlay.vue'
4
+ export { default as DrawerContent } from './DrawerContent.vue'
5
+ export { default as DrawerHeader } from './DrawerHeader.vue'
6
+ export { default as DrawerFooter } from './DrawerFooter.vue'
7
+ export { default as DrawerTitle } from './DrawerTitle.vue'
8
+ export { default as DrawerDescription } from './DrawerDescription.vue'
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuRoot, type DropdownMenuRootEmits, type DropdownMenuRootProps, useForwardPropsEmits } from 'reka-ui'
3
+
4
+ const props = defineProps<DropdownMenuRootProps>()
5
+ const emits = defineEmits<DropdownMenuRootEmits>()
6
+
7
+ const forwarded = useForwardPropsEmits(props, emits)
8
+ </script>
9
+
10
+ <template>
11
+ <DropdownMenuRoot v-bind="forwarded">
12
+ <slot />
13
+ </DropdownMenuRoot>
14
+ </template>
@@ -0,0 +1,40 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import {
4
+ DropdownMenuCheckboxItem,
5
+ type DropdownMenuCheckboxItemEmits,
6
+ type DropdownMenuCheckboxItemProps,
7
+ DropdownMenuItemIndicator,
8
+ useForwardPropsEmits,
9
+ } from 'reka-ui'
10
+ import { Check } from 'lucide-vue-next'
11
+ import { cn } from '../../../utils'
12
+
13
+ const props = defineProps<DropdownMenuCheckboxItemProps & { class?: HTMLAttributes['class'] }>()
14
+ const emits = defineEmits<DropdownMenuCheckboxItemEmits>()
15
+
16
+ const delegatedProps = computed(() => {
17
+ const { class: _, ...delegated } = props
18
+
19
+ return delegated
20
+ })
21
+
22
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
23
+ </script>
24
+
25
+ <template>
26
+ <DropdownMenuCheckboxItem
27
+ v-bind="forwarded"
28
+ :class=" cn(
29
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
30
+ props.class,
31
+ )"
32
+ >
33
+ <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
34
+ <DropdownMenuItemIndicator>
35
+ <Check class="w-4 h-4" />
36
+ </DropdownMenuItemIndicator>
37
+ </span>
38
+ <slot />
39
+ </DropdownMenuCheckboxItem>
40
+ </template>
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import {
4
+ DropdownMenuContent,
5
+ type DropdownMenuContentEmits,
6
+ type DropdownMenuContentProps,
7
+ DropdownMenuPortal,
8
+ useForwardPropsEmits,
9
+ } from 'reka-ui'
10
+ import { cn } from '../../../utils'
11
+
12
+ const props = withDefaults(
13
+ defineProps<DropdownMenuContentProps & { class?: HTMLAttributes['class'] }>(),
14
+ {
15
+ sideOffset: 4,
16
+ },
17
+ )
18
+ const emits = defineEmits<DropdownMenuContentEmits>()
19
+
20
+ const delegatedProps = computed(() => {
21
+ const { class: _, ...delegated } = props
22
+
23
+ return delegated
24
+ })
25
+
26
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
27
+ </script>
28
+
29
+ <template>
30
+ <DropdownMenuPortal>
31
+ <DropdownMenuContent
32
+ v-bind="forwarded"
33
+ :class="cn('dropdown-menu-content z-popover min-w-32 max-h-[60vh] overflow-y-auto rounded-xl border glass-elevated [backdrop-filter:var(--glass-blur-elevated)] p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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', props.class)"
34
+ >
35
+ <slot />
36
+ </DropdownMenuContent>
37
+ </DropdownMenuPortal>
38
+ </template>
39
+
40
+ <style scoped>
41
+ .dropdown-menu-content {
42
+ font-family: var(--dropdown-menu-font, inherit);
43
+ }
44
+ </style>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuGroup, type DropdownMenuGroupProps } from 'reka-ui'
3
+
4
+ const props = defineProps<DropdownMenuGroupProps>()
5
+ </script>
6
+
7
+ <template>
8
+ <DropdownMenuGroup v-bind="props">
9
+ <slot />
10
+ </DropdownMenuGroup>
11
+ </template>
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DropdownMenuItem, type DropdownMenuItemProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<DropdownMenuItemProps & { class?: HTMLAttributes['class'], inset?: boolean }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps)
15
+ </script>
16
+
17
+ <template>
18
+ <DropdownMenuItem
19
+ v-bind="forwardedProps"
20
+ :class="cn(
21
+ 'relative flex cursor-default select-none items-center rounded-lg px-2 py-1.5 outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
22
+ inset && 'pl-8',
23
+ props.class,
24
+ )"
25
+ >
26
+ <slot />
27
+ </DropdownMenuItem>
28
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { DropdownMenuLabel, type DropdownMenuLabelProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<DropdownMenuLabelProps & { class?: HTMLAttributes['class'], inset?: boolean }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps)
15
+ </script>
16
+
17
+ <template>
18
+ <DropdownMenuLabel
19
+ v-bind="forwardedProps"
20
+ :class="cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', props.class)"
21
+ >
22
+ <slot />
23
+ </DropdownMenuLabel>
24
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ DropdownMenuRadioGroup,
4
+ type DropdownMenuRadioGroupEmits,
5
+ type DropdownMenuRadioGroupProps,
6
+ useForwardPropsEmits,
7
+ } from 'reka-ui'
8
+
9
+ const props = defineProps<DropdownMenuRadioGroupProps>()
10
+ const emits = defineEmits<DropdownMenuRadioGroupEmits>()
11
+
12
+ const forwarded = useForwardPropsEmits(props, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <DropdownMenuRadioGroup v-bind="forwarded">
17
+ <slot />
18
+ </DropdownMenuRadioGroup>
19
+ </template>