@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,15 @@
1
+ <script setup lang="ts">
2
+ import { TabsRoot, useForwardPropsEmits } from 'reka-ui'
3
+ import type { TabsRootEmits, TabsRootProps } from 'reka-ui'
4
+
5
+ const props = defineProps<TabsRootProps>()
6
+ const emits = defineEmits<TabsRootEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <TabsRoot v-bind="forwarded">
13
+ <slot />
14
+ </TabsRoot>
15
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TabsContent, type TabsContentProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<TabsContentProps & { class?: HTMLAttributes['class'] }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <TabsContent
17
+ :class="cn('mt-2 focus-visible:outline-none', props.class)"
18
+ v-bind="delegatedProps"
19
+ >
20
+ <slot />
21
+ </TabsContent>
22
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from "vue";
3
+ import { TabsIndicator, type TabsIndicatorProps } from "reka-ui";
4
+ import { cn } from "../../../utils";
5
+
6
+ const props = defineProps<TabsIndicatorProps & { class?: HTMLAttributes["class"] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+ return delegated;
11
+ });
12
+ </script>
13
+
14
+ <template>
15
+ <TabsIndicator
16
+ v-bind="delegatedProps"
17
+ :class="cn(
18
+ 'absolute left-0 h-[--reka-tabs-indicator-size] translate-x-[--reka-tabs-indicator-position] rounded-pill bg-secondary/80 transition-[width,transform] duration-[var(--duration-normal)] ease-[var(--spring-snappy)]',
19
+ props.class,
20
+ )"
21
+ />
22
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TabsList, type TabsListProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<TabsListProps & { class?: HTMLAttributes['class'] }>()
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props
10
+
11
+ return delegated
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <TabsList
17
+ v-bind="delegatedProps"
18
+ :class="cn(
19
+ 'inline-flex h-10 items-center justify-center rounded-md p-1 text-muted-foreground',
20
+ props.class,
21
+ )"
22
+ >
23
+ <slot />
24
+ </TabsList>
25
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from "vue";
3
+ import { TabsTrigger, type TabsTriggerProps, useForwardProps } from "reka-ui";
4
+ import { cn } from "../../../utils";
5
+
6
+ const props = defineProps<TabsTriggerProps & { 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
+ <TabsTrigger
19
+ v-bind="forwardedProps"
20
+ :class="
21
+ cn(
22
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-sm p-1 px-3 text-sm font-medium transition-all duration-[var(--duration-fast)] ease-[var(--ease-standard)] 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 data-[state=active]:text-[var(--active-tab-color,var(--foreground))] hover:text-foreground/70',
23
+ props.class,
24
+ )
25
+ "
26
+ >
27
+ <slot />
28
+ </TabsTrigger>
29
+ </template>
@@ -0,0 +1,5 @@
1
+ export { default as Tabs } from './Tabs.vue'
2
+ export { default as TabsTrigger } from './TabsTrigger.vue'
3
+ export { default as TabsList } from './TabsList.vue'
4
+ export { default as TabsContent } from './TabsContent.vue'
5
+ export { default as TabsIndicator } from './TabsIndicator.vue'
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TagsInputRoot, type TagsInputRootEmits, type TagsInputRootProps, useForwardPropsEmits } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<TagsInputRootProps & { class?: HTMLAttributes['class'] }>()
7
+ const emits = defineEmits<TagsInputRootEmits>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+
15
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
16
+ </script>
17
+
18
+ <template>
19
+ <TagsInputRoot v-bind="forwarded" :class="cn('flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-3 py-2 text-sm', props.class)">
20
+ <slot />
21
+ </TagsInputRoot>
22
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TagsInputInput, type TagsInputInputProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<TagsInputInputProps & { 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
+ <TagsInputInput v-bind="forwardedProps" :class="cn('text-sm min-h-6 focus:outline-none flex-1 bg-transparent px-1', props.class)" />
19
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TagsInputItem, type TagsInputItemProps, useForwardProps } from 'reka-ui'
4
+
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = defineProps<TagsInputItemProps & { class?: HTMLAttributes['class'] }>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+
15
+ const forwardedProps = useForwardProps(delegatedProps)
16
+ </script>
17
+
18
+ <template>
19
+ <TagsInputItem v-bind="forwardedProps" :class="cn('flex h-6 items-center rounded bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)">
20
+ <slot />
21
+ </TagsInputItem>
22
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TagsInputItemDelete, type TagsInputItemDeleteProps, useForwardProps } from 'reka-ui'
4
+ import { X } from 'lucide-vue-next'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes['class'] }>()
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props
11
+
12
+ return delegated
13
+ })
14
+
15
+ const forwardedProps = useForwardProps(delegatedProps)
16
+ </script>
17
+
18
+ <template>
19
+ <TagsInputItemDelete v-bind="forwardedProps" :class="cn('flex rounded bg-transparent mr-1', props.class)">
20
+ <slot>
21
+ <X class="w-4 h-4" />
22
+ </slot>
23
+ </TagsInputItemDelete>
24
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { TagsInputItemText, type TagsInputItemTextProps, useForwardProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<TagsInputItemTextProps & { 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
+ <TagsInputItemText v-bind="forwardedProps" :class="cn('py-1 px-2 text-sm rounded bg-transparent', props.class)" />
19
+ </template>
@@ -0,0 +1,5 @@
1
+ export { default as TagsInput } from './TagsInput.vue'
2
+ export { default as TagsInputInput } from './TagsInputInput.vue'
3
+ export { default as TagsInputItem } from './TagsInputItem.vue'
4
+ export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue'
5
+ export { default as TagsInputItemText } from './TagsInputItemText.vue'
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { useVModel } from '@vueuse/core'
4
+ import { cn } from '../../../utils'
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes['class']
8
+ defaultValue?: string | number
9
+ modelValue?: string | number
10
+ }>()
11
+
12
+ const emits = defineEmits<{
13
+ (e: 'update:modelValue', payload: string | number): void
14
+ }>()
15
+
16
+ const modelValue = useVModel(props, 'modelValue', emits, {
17
+ passive: true,
18
+ defaultValue: props.defaultValue,
19
+ })
20
+ </script>
21
+
22
+ <template>
23
+ <textarea v-model="modelValue" :class="cn('input-pill min-h-20 py-2 text-sm', props.class)" />
24
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Textarea } from './Textarea.vue'
@@ -0,0 +1,57 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from 'vue'
3
+ import {
4
+ ToastProvider,
5
+ ToastRoot,
6
+ ToastViewport,
7
+ type ToastRootEmits,
8
+ type ToastRootProps,
9
+ } from 'reka-ui'
10
+ import { cn } from '../../../utils'
11
+
12
+ interface ToastProps extends ToastRootProps {
13
+ class?: HTMLAttributes['class']
14
+ variant?: 'default' | 'destructive'
15
+ onOpenChange?: ((value: boolean) => void) | undefined
16
+ }
17
+
18
+ interface ToastEmits extends ToastRootEmits {}
19
+
20
+ const props = withDefaults(defineProps<ToastProps>(), {
21
+ variant: 'default',
22
+ })
23
+
24
+ const emits = defineEmits<ToastEmits>()
25
+
26
+ const delegatedProps = computed(() => {
27
+ const { class: _, variant, ...delegated } = props
28
+ return delegated
29
+ })
30
+ </script>
31
+
32
+ <template>
33
+ <ToastProvider>
34
+ <ToastRoot
35
+ v-bind="delegatedProps"
36
+ :class="
37
+ cn(
38
+ 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-xl border p-6 pr-8 shadow-lg transition-[opacity,transform] data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--reka-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--reka-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
39
+ {
40
+ 'bg-background text-foreground border': variant === 'default',
41
+ 'bg-destructive text-destructive-foreground border-destructive': variant === 'destructive',
42
+ },
43
+ props.class,
44
+ )
45
+ "
46
+ @update:open="emits('update:open', $event)"
47
+ @escapeKeyDown="emits('escapeKeyDown', $event)"
48
+ @swipeStart="emits('swipeStart', $event)"
49
+ @swipeMove="emits('swipeMove', $event)"
50
+ @swipeEnd="emits('swipeEnd', $event)"
51
+ @swipeCancel="emits('swipeCancel', $event)"
52
+ >
53
+ <slot />
54
+ </ToastRoot>
55
+ <ToastViewport />
56
+ </ToastProvider>
57
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from 'vue'
3
+ import { ToastAction, type ToastActionProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ interface Props extends ToastActionProps {
7
+ class?: HTMLAttributes['class']
8
+ }
9
+
10
+ const props = defineProps<Props>()
11
+
12
+ const delegatedProps = computed(() => {
13
+ const { class: _, ...delegated } = props
14
+ return delegated
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <ToastAction
20
+ v-bind="delegatedProps"
21
+ :class="
22
+ cn(
23
+ 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',
24
+ props.class,
25
+ )
26
+ "
27
+ >
28
+ <slot />
29
+ </ToastAction>
30
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from 'vue'
3
+ import { ToastClose, type ToastCloseProps } from 'reka-ui'
4
+ import { X } from 'lucide-vue-next'
5
+ import { cn } from '../../../utils'
6
+
7
+ interface Props extends ToastCloseProps {
8
+ class?: HTMLAttributes['class']
9
+ }
10
+
11
+ const props = defineProps<Props>()
12
+
13
+ const delegatedProps = computed(() => {
14
+ const { class: _, ...delegated } = props
15
+ return delegated
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <ToastClose
21
+ v-bind="delegatedProps"
22
+ :class="
23
+ cn(
24
+ 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',
25
+ props.class,
26
+ )
27
+ "
28
+ >
29
+ <X class="h-4 w-4" />
30
+ </ToastClose>
31
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from 'vue'
3
+ import { ToastDescription, type ToastDescriptionProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ interface Props extends ToastDescriptionProps {
7
+ class?: HTMLAttributes['class']
8
+ }
9
+
10
+ const props = defineProps<Props>()
11
+
12
+ const delegatedProps = computed(() => {
13
+ const { class: _, ...delegated } = props
14
+ return delegated
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <ToastDescription
20
+ v-bind="delegatedProps"
21
+ :class="cn('text-sm opacity-90', props.class)"
22
+ >
23
+ <slot />
24
+ </ToastDescription>
25
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { computed, type HTMLAttributes } from 'vue'
3
+ import { ToastTitle, type ToastTitleProps } from 'reka-ui'
4
+ import { cn } from '../../../utils'
5
+
6
+ interface Props extends ToastTitleProps {
7
+ class?: HTMLAttributes['class']
8
+ }
9
+
10
+ const props = defineProps<Props>()
11
+
12
+ const delegatedProps = computed(() => {
13
+ const { class: _, ...delegated } = props
14
+ return delegated
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <ToastTitle
20
+ v-bind="delegatedProps"
21
+ :class="cn('text-sm font-semibold', props.class)"
22
+ >
23
+ <slot />
24
+ </ToastTitle>
25
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { ToastProvider, ToastViewport } from 'reka-ui'
3
+ import Toast from './Toast.vue'
4
+ import ToastClose from './ToastClose.vue'
5
+ import ToastTitle from './ToastTitle.vue'
6
+ import ToastDescription from './ToastDescription.vue'
7
+ import { useToast } from './use-toast'
8
+
9
+ const { toasts } = useToast()
10
+ </script>
11
+
12
+ <template>
13
+ <ToastProvider>
14
+ <Toast
15
+ v-for="toast in toasts"
16
+ :key="toast.id"
17
+ v-bind="toast"
18
+ >
19
+ <div class="grid gap-1">
20
+ <ToastTitle v-if="toast.title">
21
+ {{ toast.title }}
22
+ </ToastTitle>
23
+ <ToastDescription v-if="toast.description">
24
+ {{ toast.description }}
25
+ </ToastDescription>
26
+ </div>
27
+ <ToastClose />
28
+ </Toast>
29
+ <ToastViewport class="fixed top-0 z-50 flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]" />
30
+ </ToastProvider>
31
+ </template>
@@ -0,0 +1,8 @@
1
+ export { default as Toast } from './Toast.vue'
2
+ export { default as ToastAction } from './ToastAction.vue'
3
+ export { default as ToastClose } from './ToastClose.vue'
4
+ export { default as ToastDescription } from './ToastDescription.vue'
5
+ export { default as ToastTitle } from './ToastTitle.vue'
6
+ export { default as Toaster } from './Toaster.vue'
7
+ export { toast, useToast } from './use-toast'
8
+ export type { Toast as ToastType, ToastVariant } from './use-toast'
@@ -0,0 +1,136 @@
1
+ import { ref, computed } from 'vue'
2
+ import type { Component, VNode } from 'vue'
3
+
4
+ const TOAST_LIMIT = 5
5
+ const TOAST_REMOVE_DELAY = 1000000
6
+
7
+ export type ToastVariant = 'default' | 'destructive'
8
+
9
+ export interface Toast {
10
+ id: string
11
+ title?: string
12
+ description?: string
13
+ action?: Component | VNode
14
+ variant?: ToastVariant
15
+ }
16
+
17
+ type ToasterToast = Toast & {
18
+ id: string
19
+ title?: string
20
+ description?: string
21
+ action?: Component | VNode
22
+ }
23
+
24
+ const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
25
+
26
+ function addToRemoveQueue(toastId: string) {
27
+ if (toastTimeouts.has(toastId)) {
28
+ return
29
+ }
30
+
31
+ const timeout = setTimeout(() => {
32
+ toastTimeouts.delete(toastId)
33
+ dispatch({
34
+ type: 'REMOVE_TOAST',
35
+ toastId,
36
+ })
37
+ }, TOAST_REMOVE_DELAY)
38
+
39
+ toastTimeouts.set(toastId, timeout)
40
+ }
41
+
42
+ const toasts = ref<ToasterToast[]>([])
43
+
44
+ function dispatch(action: any) {
45
+ switch (action.type) {
46
+ case 'ADD_TOAST':
47
+ toasts.value = [action.toast, ...toasts.value].slice(0, TOAST_LIMIT)
48
+ break
49
+
50
+ case 'UPDATE_TOAST':
51
+ toasts.value = toasts.value.map((t) =>
52
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
53
+ )
54
+ break
55
+
56
+ case 'DISMISS_TOAST': {
57
+ const { toastId } = action
58
+
59
+ if (toastId) {
60
+ addToRemoveQueue(toastId)
61
+ } else {
62
+ toasts.value.forEach((toast) => {
63
+ addToRemoveQueue(toast.id)
64
+ })
65
+ }
66
+
67
+ toasts.value = toasts.value.map((t) =>
68
+ t.id === toastId || toastId === undefined
69
+ ? {
70
+ ...t,
71
+ open: false,
72
+ }
73
+ : t
74
+ )
75
+ break
76
+ }
77
+
78
+ case 'REMOVE_TOAST':
79
+ if (action.toastId === undefined) {
80
+ toasts.value = []
81
+ } else {
82
+ toasts.value = toasts.value.filter((t) => t.id !== action.toastId)
83
+ }
84
+
85
+ break
86
+ }
87
+ }
88
+
89
+ let count = 0
90
+
91
+ function genId() {
92
+ count = (count + 1) % Number.MAX_VALUE
93
+ return count.toString()
94
+ }
95
+
96
+ type ToastOptions = Omit<ToasterToast, 'id'>
97
+
98
+ function toast(props: ToastOptions) {
99
+ const id = genId()
100
+
101
+ const update = (props: ToasterToast) =>
102
+ dispatch({
103
+ type: 'UPDATE_TOAST',
104
+ toast: { ...props, id },
105
+ })
106
+
107
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })
108
+
109
+ dispatch({
110
+ type: 'ADD_TOAST',
111
+ toast: {
112
+ ...props,
113
+ id,
114
+ open: true,
115
+ onOpenChange: (open: boolean) => {
116
+ if (!open) dismiss()
117
+ },
118
+ },
119
+ })
120
+
121
+ return {
122
+ id,
123
+ dismiss,
124
+ update,
125
+ }
126
+ }
127
+
128
+ function useToast() {
129
+ return {
130
+ toasts: computed(() => toasts.value),
131
+ toast,
132
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),
133
+ }
134
+ }
135
+
136
+ export { toast, useToast }
@@ -0,0 +1,35 @@
1
+ <script setup lang="ts">
2
+ import { type HTMLAttributes, computed } from 'vue'
3
+ import { Toggle, type ToggleEmits, type ToggleProps, useForwardPropsEmits } from 'reka-ui'
4
+ import { type ToggleVariants, toggleVariants } from '.'
5
+ import { cn } from '../../../utils'
6
+
7
+ const props = withDefaults(defineProps<ToggleProps & {
8
+ class?: HTMLAttributes['class']
9
+ variant?: ToggleVariants['variant']
10
+ size?: ToggleVariants['size']
11
+ }>(), {
12
+ variant: 'default',
13
+ size: 'default',
14
+ disabled: false,
15
+ })
16
+
17
+ const emits = defineEmits<ToggleEmits>()
18
+
19
+ const delegatedProps = computed(() => {
20
+ const { class: _, size, variant, ...delegated } = props
21
+
22
+ return delegated
23
+ })
24
+
25
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
26
+ </script>
27
+
28
+ <template>
29
+ <Toggle
30
+ v-bind="forwarded"
31
+ :class="cn(toggleVariants({ variant, size }), props.class)"
32
+ >
33
+ <slot />
34
+ </Toggle>
35
+ </template>