@sviy/ui 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +142 -2
  2. package/index.ts +61 -0
  3. package/package.json +44 -4
  4. package/src/components/ui/alert/Alert.vue +21 -0
  5. package/src/components/ui/alert/AlertAction.vue +17 -0
  6. package/src/components/ui/alert/AlertDescription.vue +17 -0
  7. package/src/components/ui/alert/AlertTitle.vue +17 -0
  8. package/src/components/ui/alert/index.ts +21 -0
  9. package/src/components/ui/avatar/Avatar.vue +22 -0
  10. package/src/components/ui/avatar/AvatarBadge.vue +23 -0
  11. package/src/components/ui/avatar/AvatarFallback.vue +21 -0
  12. package/src/components/ui/avatar/AvatarGroup.vue +20 -0
  13. package/src/components/ui/avatar/AvatarGroupCount.vue +20 -0
  14. package/src/components/ui/avatar/AvatarImage.vue +16 -0
  15. package/src/components/ui/avatar/index.ts +27 -0
  16. package/src/components/ui/badge/Badge.vue +27 -0
  17. package/src/components/ui/badge/index.ts +24 -0
  18. package/src/components/ui/button/Button.vue +31 -0
  19. package/src/components/ui/button/index.ts +35 -0
  20. package/src/components/ui/card/Card.vue +21 -0
  21. package/src/components/ui/card/CardAction.vue +17 -0
  22. package/src/components/ui/card/CardContent.vue +17 -0
  23. package/src/components/ui/card/CardDescription.vue +17 -0
  24. package/src/components/ui/card/CardFooter.vue +17 -0
  25. package/src/components/ui/card/CardHeader.vue +17 -0
  26. package/src/components/ui/card/CardTitle.vue +17 -0
  27. package/src/components/ui/card/index.ts +7 -0
  28. package/src/components/ui/checkbox/Checkbox.vue +34 -0
  29. package/src/components/ui/checkbox/index.ts +1 -0
  30. package/src/components/ui/dialog/Dialog.vue +19 -0
  31. package/src/components/ui/dialog/DialogClose.vue +15 -0
  32. package/src/components/ui/dialog/DialogContent.vue +53 -0
  33. package/src/components/ui/dialog/DialogDescription.vue +23 -0
  34. package/src/components/ui/dialog/DialogFooter.vue +27 -0
  35. package/src/components/ui/dialog/DialogHeader.vue +17 -0
  36. package/src/components/ui/dialog/DialogOverlay.vue +21 -0
  37. package/src/components/ui/dialog/DialogScrollContent.vue +60 -0
  38. package/src/components/ui/dialog/DialogTitle.vue +23 -0
  39. package/src/components/ui/dialog/DialogTrigger.vue +15 -0
  40. package/src/components/ui/dialog/index.ts +10 -0
  41. package/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  42. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +43 -0
  43. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +40 -0
  44. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  45. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  46. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  47. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  48. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +44 -0
  49. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  50. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  51. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  52. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  53. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +32 -0
  54. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  55. package/src/components/ui/dropdown-menu/index.ts +16 -0
  56. package/src/components/ui/input/Input.vue +31 -0
  57. package/src/components/ui/input/index.ts +1 -0
  58. package/src/components/ui/label/Label.vue +26 -0
  59. package/src/components/ui/label/index.ts +1 -0
  60. package/src/components/ui/progress/Progress.vue +38 -0
  61. package/src/components/ui/progress/index.ts +1 -0
  62. package/src/components/ui/select/Select.vue +19 -0
  63. package/src/components/ui/select/SelectContent.vue +58 -0
  64. package/src/components/ui/select/SelectGroup.vue +21 -0
  65. package/src/components/ui/select/SelectItem.vue +45 -0
  66. package/src/components/ui/select/SelectItemText.vue +15 -0
  67. package/src/components/ui/select/SelectLabel.vue +17 -0
  68. package/src/components/ui/select/SelectScrollDownButton.vue +27 -0
  69. package/src/components/ui/select/SelectScrollUpButton.vue +27 -0
  70. package/src/components/ui/select/SelectSeparator.vue +19 -0
  71. package/src/components/ui/select/SelectTrigger.vue +34 -0
  72. package/src/components/ui/select/SelectValue.vue +15 -0
  73. package/src/components/ui/select/index.ts +11 -0
  74. package/src/components/ui/separator/Separator.vue +29 -0
  75. package/src/components/ui/separator/index.ts +1 -0
  76. package/src/components/ui/sonner/Sonner.vue +62 -0
  77. package/src/components/ui/sonner/index.ts +1 -0
  78. package/src/components/ui/switch/Switch.vue +44 -0
  79. package/src/components/ui/switch/index.ts +1 -0
  80. package/src/components/ui/table/Table.vue +16 -0
  81. package/src/components/ui/table/TableBody.vue +17 -0
  82. package/src/components/ui/table/TableCaption.vue +17 -0
  83. package/src/components/ui/table/TableCell.vue +17 -0
  84. package/src/components/ui/table/TableEmpty.vue +34 -0
  85. package/src/components/ui/table/TableFooter.vue +17 -0
  86. package/src/components/ui/table/TableHead.vue +17 -0
  87. package/src/components/ui/table/TableHeader.vue +17 -0
  88. package/src/components/ui/table/TableRow.vue +17 -0
  89. package/src/components/ui/table/index.ts +9 -0
  90. package/src/components/ui/tabs/Tabs.vue +25 -0
  91. package/src/components/ui/tabs/TabsContent.vue +21 -0
  92. package/src/components/ui/tabs/TabsList.vue +29 -0
  93. package/src/components/ui/tabs/TabsTrigger.vue +29 -0
  94. package/src/components/ui/tabs/index.ts +24 -0
  95. package/src/components/ui/textarea/Textarea.vue +28 -0
  96. package/src/components/ui/textarea/index.ts +1 -0
  97. package/src/components/ui/tooltip/Tooltip.vue +19 -0
  98. package/src/components/ui/tooltip/TooltipContent.vue +34 -0
  99. package/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  100. package/src/components/ui/tooltip/TooltipTrigger.vue +15 -0
  101. package/src/components/ui/tooltip/index.ts +4 -0
  102. package/src/lib/utils.ts +1 -0
  103. package/theme.css +223 -0
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import type { SeparatorProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import { Separator } from 'reka-ui'
7
+
8
+ const props = withDefaults(defineProps<
9
+ SeparatorProps & { class?: HTMLAttributes['class'] }
10
+ >(), {
11
+ orientation: 'horizontal',
12
+ decorative: true,
13
+ })
14
+
15
+ const delegatedProps = reactiveOmit(props, 'class')
16
+ </script>
17
+
18
+ <template>
19
+ <Separator
20
+ data-slot="separator"
21
+ v-bind="delegatedProps"
22
+ :class="
23
+ cn(
24
+ 'shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch',
25
+ props.class,
26
+ )
27
+ "
28
+ />
29
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Separator } from './Separator.vue'
@@ -0,0 +1,62 @@
1
+ <script lang="ts" setup>
2
+ import type { ToasterProps } from 'vue-sonner'
3
+
4
+ import {
5
+ CircleCheckIcon,
6
+ InfoIcon,
7
+ Loader2Icon,
8
+ OctagonXIcon,
9
+ TriangleAlertIcon,
10
+ XIcon,
11
+ } from '@lucide/vue'
12
+ import { reactiveOmit } from '@vueuse/core'
13
+ import { cn } from 'cn'
14
+ import { Toaster as Sonner } from 'vue-sonner'
15
+
16
+ const props = defineProps<ToasterProps>()
17
+ const delegatedProps = reactiveOmit(props, 'class', 'toastOptions')
18
+ </script>
19
+
20
+ <template>
21
+ <Sonner
22
+ :class="cn('toaster group', props.class)"
23
+ :style="{
24
+ '--normal-bg': 'var(--popover)',
25
+ '--normal-text': 'var(--popover-foreground)',
26
+ '--normal-border': 'var(--border)',
27
+ '--border-radius': 'var(--radius)',
28
+ '--gray2': 'hsl(var(--popover) / 0.9)',
29
+ '--gray3': 'var(--border)',
30
+ '--gray4': 'var(--border)',
31
+ '--gray5': 'var(--border)',
32
+ '--gray12': 'var(--popover-foreground)',
33
+ }"
34
+ :toast-options="props.toastOptions ?? {
35
+ classes: {
36
+ toast: 'rounded-2xl',
37
+ },
38
+ }"
39
+ v-bind="delegatedProps"
40
+ >
41
+ <template #success-icon>
42
+ <CircleCheckIcon class="size-4" />
43
+ </template>
44
+ <template #info-icon>
45
+ <InfoIcon class="size-4" />
46
+ </template>
47
+ <template #warning-icon>
48
+ <TriangleAlertIcon class="size-4" />
49
+ </template>
50
+ <template #error-icon>
51
+ <OctagonXIcon class="size-4" />
52
+ </template>
53
+ <template #loading-icon>
54
+ <div>
55
+ <Loader2Icon class="size-4 animate-spin" />
56
+ </div>
57
+ </template>
58
+ <template #close-icon>
59
+ <XIcon class="size-4" />
60
+ </template>
61
+ </Sonner>
62
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Toaster } from './Sonner.vue'
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ import type { SwitchRootEmits, SwitchRootProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import {
7
+ SwitchRoot,
8
+ SwitchThumb,
9
+ useForwardPropsEmits,
10
+ } from 'reka-ui'
11
+
12
+ const props = withDefaults(defineProps<SwitchRootProps & {
13
+ class?: HTMLAttributes['class']
14
+ size?: 'sm' | 'default'
15
+ }>(), {
16
+ size: 'default',
17
+ })
18
+
19
+ const emits = defineEmits<SwitchRootEmits>()
20
+
21
+ const delegatedProps = reactiveOmit(props, 'class', 'size')
22
+
23
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
24
+ </script>
25
+
26
+ <template>
27
+ <SwitchRoot
28
+ v-slot="slotProps"
29
+ data-slot="switch"
30
+ :data-size="size"
31
+ v-bind="forwarded"
32
+ :class="cn(
33
+ 'data-checked:bg-primary data-unchecked:bg-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 dark:data-unchecked:bg-input/80 shrink-0 rounded-full border border-transparent shadow-xs focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-[18.4px] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 peer group/switch relative inline-flex items-center transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 data-disabled:cursor-not-allowed data-disabled:opacity-50',
34
+ props.class,
35
+ )"
36
+ >
37
+ <SwitchThumb
38
+ data-slot="switch-thumb"
39
+ class="bg-background dark:data-unchecked:bg-foreground dark:data-checked:bg-primary-foreground rounded-full group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 pointer-events-none block ring-0 transition-transform"
40
+ >
41
+ <slot name="thumb" v-bind="slotProps" />
42
+ </SwitchThumb>
43
+ </SwitchRoot>
44
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Switch } from './Switch.vue'
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div data-slot="table-container" class="relative w-full overflow-x-auto">
12
+ <table data-slot="table" :class="cn('w-full caption-bottom text-sm', props.class)">
13
+ <slot />
14
+ </table>
15
+ </div>
16
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <tbody
12
+ data-slot="table-body"
13
+ :class="cn('[&_tr:last-child]:border-0', props.class)"
14
+ >
15
+ <slot />
16
+ </tbody>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <caption
12
+ data-slot="table-caption"
13
+ :class="cn('text-muted-foreground mt-4 text-sm', props.class)"
14
+ >
15
+ <slot />
16
+ </caption>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <td
12
+ data-slot="table-cell"
13
+ :class="cn('p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0', props.class)"
14
+ >
15
+ <slot />
16
+ </td>
17
+ </template>
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { reactiveOmit } from '@vueuse/core'
4
+ import { cn } from 'cn'
5
+ import TableCell from './TableCell.vue'
6
+ import TableRow from './TableRow.vue'
7
+
8
+ const props = withDefaults(defineProps<{
9
+ class?: HTMLAttributes['class']
10
+ colspan?: number
11
+ }>(), {
12
+ colspan: 1,
13
+ })
14
+
15
+ const delegatedProps = reactiveOmit(props, 'class')
16
+ </script>
17
+
18
+ <template>
19
+ <TableRow>
20
+ <TableCell
21
+ :class="
22
+ cn(
23
+ 'p-4 whitespace-nowrap align-middle text-sm text-foreground',
24
+ props.class,
25
+ )
26
+ "
27
+ v-bind="delegatedProps"
28
+ >
29
+ <div class="flex items-center justify-center py-10">
30
+ <slot />
31
+ </div>
32
+ </TableCell>
33
+ </TableRow>
34
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <tfoot
12
+ data-slot="table-footer"
13
+ :class="cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', props.class)"
14
+ >
15
+ <slot />
16
+ </tfoot>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <th
12
+ data-slot="table-head"
13
+ :class="cn('text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0', props.class)"
14
+ >
15
+ <slot />
16
+ </th>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <thead
12
+ data-slot="table-header"
13
+ :class="cn('[&_tr]:border-b', props.class)"
14
+ >
15
+ <slot />
16
+ </thead>
17
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { cn } from 'cn'
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class']
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <tr
12
+ data-slot="table-row"
13
+ :class="cn('hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors has-aria-expanded:bg-muted/50', props.class)"
14
+ >
15
+ <slot />
16
+ </tr>
17
+ </template>
@@ -0,0 +1,9 @@
1
+ export { default as Table } from './Table.vue'
2
+ export { default as TableBody } from './TableBody.vue'
3
+ export { default as TableCaption } from './TableCaption.vue'
4
+ export { default as TableCell } from './TableCell.vue'
5
+ export { default as TableEmpty } from './TableEmpty.vue'
6
+ export { default as TableFooter } from './TableFooter.vue'
7
+ export { default as TableHead } from './TableHead.vue'
8
+ export { default as TableHeader } from './TableHeader.vue'
9
+ export { default as TableRow } from './TableRow.vue'
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { TabsRootEmits, TabsRootProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import { TabsRoot, useForwardPropsEmits } from 'reka-ui'
7
+
8
+ const props = defineProps<TabsRootProps & { class?: HTMLAttributes['class'] }>()
9
+ const emits = defineEmits<TabsRootEmits>()
10
+
11
+ const delegatedProps = reactiveOmit(props, 'class')
12
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
13
+ </script>
14
+
15
+ <template>
16
+ <TabsRoot
17
+ v-slot="slotProps"
18
+ data-slot="tabs"
19
+ :data-orientation="forwarded.orientation || 'horizontal'"
20
+ v-bind="forwarded"
21
+ :class="cn('gap-2 group/tabs flex data-horizontal:flex-col', props.class)"
22
+ >
23
+ <slot v-bind="slotProps" />
24
+ </TabsRoot>
25
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import type { TabsContentProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import { TabsContent } from 'reka-ui'
7
+
8
+ const props = defineProps<TabsContentProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+ </script>
12
+
13
+ <template>
14
+ <TabsContent
15
+ data-slot="tabs-content"
16
+ :class="cn('text-sm flex-1 outline-none', props.class)"
17
+ v-bind="delegatedProps"
18
+ >
19
+ <slot />
20
+ </TabsContent>
21
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import type { TabsListProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import type { TabsListVariants } from '.'
5
+ import { reactiveOmit } from '@vueuse/core'
6
+ import { cn } from 'cn'
7
+ import { TabsList } from 'reka-ui'
8
+ import { tabsListVariants } from '.'
9
+
10
+ const props = withDefaults(defineProps<TabsListProps & {
11
+ class?: HTMLAttributes['class']
12
+ variant?: TabsListVariants['variant']
13
+ }>(), {
14
+ variant: 'default',
15
+ })
16
+
17
+ const delegatedProps = reactiveOmit(props, 'class', 'variant')
18
+ </script>
19
+
20
+ <template>
21
+ <TabsList
22
+ data-slot="tabs-list"
23
+ :data-variant="variant"
24
+ v-bind="delegatedProps"
25
+ :class="cn(tabsListVariants({ variant }), props.class)"
26
+ >
27
+ <slot />
28
+ </TabsList>
29
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import type { TabsTriggerProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import { TabsTrigger, useForwardProps } from 'reka-ui'
7
+
8
+ const props = defineProps<TabsTriggerProps & { class?: HTMLAttributes['class'] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, 'class')
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <TabsTrigger
17
+ data-slot="tabs-trigger"
18
+ :class="cn(
19
+ 'gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*=size-])]:size-4 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0',
20
+ 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent',
21
+ 'data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground',
22
+ 'after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100',
23
+ props.class,
24
+ )"
25
+ v-bind="forwardedProps"
26
+ >
27
+ <slot />
28
+ </TabsTrigger>
29
+ </template>
@@ -0,0 +1,24 @@
1
+ import type { VariantProps } from 'class-variance-authority'
2
+ import { cva } from 'class-variance-authority'
3
+
4
+ export { default as Tabs } from './Tabs.vue'
5
+ export { default as TabsContent } from './TabsContent.vue'
6
+ export { default as TabsList } from './TabsList.vue'
7
+ export { default as TabsTrigger } from './TabsTrigger.vue'
8
+
9
+ export const tabsListVariants = cva(
10
+ 'rounded-lg p-0.75 group-data-horizontal/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list inline-flex w-fit items-center justify-center text-muted-foreground group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col',
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: 'bg-muted',
15
+ line: 'gap-1 bg-transparent',
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ variant: 'default',
20
+ },
21
+ },
22
+ )
23
+
24
+ export type TabsListVariants = VariantProps<typeof tabsListVariants>
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { useVModel } from '@vueuse/core'
4
+ import { cn } from 'cn'
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
24
+ v-model="modelValue"
25
+ data-slot="textarea"
26
+ :class="cn('border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 md:text-sm flex field-sizing-content min-h-16 w-full outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', props.class)"
27
+ />
28
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Textarea } from './Textarea.vue'
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import type { TooltipRootEmits, TooltipRootProps } from 'reka-ui'
3
+ import { TooltipRoot, useForwardPropsEmits } from 'reka-ui'
4
+
5
+ const props = defineProps<TooltipRootProps>()
6
+ const emits = defineEmits<TooltipRootEmits>()
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits)
9
+ </script>
10
+
11
+ <template>
12
+ <TooltipRoot
13
+ v-slot="slotProps"
14
+ data-slot="tooltip"
15
+ v-bind="forwarded"
16
+ >
17
+ <slot v-bind="slotProps" />
18
+ </TooltipRoot>
19
+ </template>
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import type { TooltipContentEmits, TooltipContentProps } from 'reka-ui'
3
+ import type { HTMLAttributes } from 'vue'
4
+ import { reactiveOmit } from '@vueuse/core'
5
+ import { cn } from 'cn'
6
+ import { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from 'reka-ui'
7
+
8
+ defineOptions({
9
+ inheritAttrs: false,
10
+ })
11
+
12
+ const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes['class'] }>(), {
13
+ sideOffset: 0,
14
+ })
15
+
16
+ const emits = defineEmits<TooltipContentEmits>()
17
+
18
+ const delegatedProps = reactiveOmit(props, 'class')
19
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
20
+ </script>
21
+
22
+ <template>
23
+ <TooltipPortal>
24
+ <TooltipContent
25
+ data-slot="tooltip-content"
26
+ v-bind="{ ...forwarded, ...$attrs }"
27
+ :class="cn('data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm bg-foreground text-background z-50 w-fit max-w-xs origin-(--reka-tooltip-content-transform-origin)', props.class)"
28
+ >
29
+ <slot />
30
+
31
+ <TooltipArrow class="size-2.5 rotate-45 rounded-xs bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]" />
32
+ </TooltipContent>
33
+ </TooltipPortal>
34
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import type { TooltipProviderProps } from 'reka-ui'
3
+ import { TooltipProvider } from 'reka-ui'
4
+
5
+ const props = withDefaults(defineProps<TooltipProviderProps>(), {
6
+ delayDuration: 0,
7
+ })
8
+ </script>
9
+
10
+ <template>
11
+ <TooltipProvider v-bind="props">
12
+ <slot />
13
+ </TooltipProvider>
14
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { TooltipTriggerProps } from 'reka-ui'
3
+ import { TooltipTrigger } from 'reka-ui'
4
+
5
+ const props = defineProps<TooltipTriggerProps>()
6
+ </script>
7
+
8
+ <template>
9
+ <TooltipTrigger
10
+ data-slot="tooltip-trigger"
11
+ v-bind="props"
12
+ >
13
+ <slot />
14
+ </TooltipTrigger>
15
+ </template>
@@ -0,0 +1,4 @@
1
+ export { default as Tooltip } from './Tooltip.vue'
2
+ export { default as TooltipContent } from './TooltipContent.vue'
3
+ export { default as TooltipProvider } from './TooltipProvider.vue'
4
+ export { default as TooltipTrigger } from './TooltipTrigger.vue'
@@ -0,0 +1 @@
1
+ export { cn } from "cn"