ui-thing 0.0.3

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.
package/src/comp.ts ADDED
@@ -0,0 +1,2134 @@
1
+ export default [
2
+ {
3
+ name: "Accordion",
4
+ value: "accordion",
5
+ deps: ["radix-vue", "tailwind-variants"],
6
+ devDeps: ["tailwindcss-animate", "nuxt-icon", "nuxt-lodash"],
7
+ nuxtModules: ["nuxt-icon", "nuxt-lodash"],
8
+ instructions: ["Remember to add the accordion animations to your tailwind.config.js"],
9
+ files: [
10
+ {
11
+ fileName: "Accordion/Accordion.vue",
12
+ dirPath: "components/UI",
13
+ fileContent:
14
+ '<template>\n <AccordionRoot v-bind="forwarded">\n <slot>\n <template v-for="(item, i) in items" :key="i">\n <UIAccordionItem :disabled="item.disabled" :value="item.value">\n <slot name="header">\n <UIAccordionHeader>\n <slot name="trigger">\n <UIAccordionTrigger :title="item.title" :icon="item.icon" />\n </slot>\n </UIAccordionHeader>\n </slot>\n <slot name="content">\n <UIAccordionContent :content="item.content"></UIAccordionContent>\n </slot>\n </UIAccordionItem>\n </template>\n </slot>\n </AccordionRoot>\n</template>\n\n<script setup lang="ts">\n import { AccordionRoot, useForwardPropsEmits } from "radix-vue";\n import type { AccordionRootEmits, AccordionRootProps } from "radix-vue";\n\n export interface AccordionItem {\n title?: string;\n content?: string;\n value: string;\n disabled?: boolean;\n icon?: string;\n }\n\n const props = withDefaults(\n defineProps<\n AccordionRootProps & {\n items?: AccordionItem[];\n }\n >(),\n { type: "single", collapsible: true }\n );\n\n const emits = defineEmits<AccordionRootEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["items"]), emits);\n</script>\n',
15
+ },
16
+ {
17
+ fileName: "Accordion/Content.vue",
18
+ dirPath: "components/UI",
19
+ fileContent:
20
+ '<template>\n <AccordionContent v-bind="forwarded" :class="styles({ class: props.class })">\n <div class="pb-4 pt-0">\n <slot>{{ content }}</slot>\n </div>\n </AccordionContent>\n</template>\n\n<script lang="ts" setup>\n import { AccordionContent, useForwardProps } from "radix-vue";\n import type { AccordionContentProps } from "radix-vue";\n\n const props = defineProps<\n AccordionContentProps & {\n class?: any;\n content?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class", "content"]));\n\n const styles = tv({\n base: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",\n });\n</script>\n',
21
+ },
22
+ {
23
+ fileName: "Accordion/Header.vue",
24
+ dirPath: "components/UI",
25
+ fileContent:
26
+ '<template>\n <AccordionHeader v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </AccordionHeader>\n</template>\n\n<script lang="ts" setup>\n import { AccordionHeader, useForwardProps } from "radix-vue";\n import type { AccordionHeaderProps } from "radix-vue";\n\n const props = defineProps<\n AccordionHeaderProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "flex",\n });\n</script>\n',
27
+ },
28
+ {
29
+ fileName: "Accordion/Item.vue",
30
+ dirPath: "components/UI",
31
+ fileContent:
32
+ '<template>\n <AccordionItem v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </AccordionItem>\n</template>\n\n<script setup lang="ts">\n import { AccordionItem, useForwardProps } from "radix-vue";\n import type { AccordionItemProps } from "radix-vue";\n\n const props = defineProps<\n AccordionItemProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "border-b",\n });\n</script>\n',
33
+ },
34
+ {
35
+ fileName: "Accordion/Trigger.vue",
36
+ dirPath: "components/UI",
37
+ fileContent:
38
+ '<template>\n <AccordionTrigger v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n {{ title }}\n </slot>\n <slot name="icon">\n <Icon v-if="icon" :name="icon" class="h-4 w-4 shrink-0 transition-transform duration-200" />\n </slot>\n </AccordionTrigger>\n</template>\n\n<script lang="ts" setup>\n import { AccordionTrigger, useForwardProps } from "radix-vue";\n import type { AccordionTriggerProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n AccordionTriggerProps & {\n class?: any;\n title?: string;\n icon?: string;\n }\n >(),\n {\n icon: "lucide:chevron-down",\n }\n );\n const forwarded = useForwardProps(useOmit(props, ["class", "title", "icon"]));\n\n const styles = tv({\n base: "flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 [&[data-state=open]>svg]:rotate-180",\n });\n</script>\n',
39
+ },
40
+ ],
41
+ utils: [],
42
+ composables: [],
43
+ },
44
+ {
45
+ name: "Alert",
46
+ value: "alert",
47
+ deps: ["radix-vue", "tailwind-variants"],
48
+ devDeps: ["nuxt-icon", "nuxt-lodash", "@vueuse/core", "@vueuse/nuxt"],
49
+ nuxtModules: ["nuxt-icon", "nuxt-lodash", "@vueuse/nuxt"],
50
+ files: [
51
+ {
52
+ fileName: "Alert/Alert.vue",
53
+ dirPath: "components/UI",
54
+ fileContent:
55
+ '<template>\n <div :class="styles({ variant: variant, class: props.class })" v-if="shown">\n <slot name="icon">\n <Icon :name="icon" v-if="icon" class="h-4 w-4" />\n </slot>\n <div>\n <slot>\n <UIAlertTitle :title="title" v-if="title" />\n <UIAlertDescription v-if="description" :description="description" />\n </slot>\n </div>\n </div>\n</template>\n\n<script lang="ts" setup>\n const props = withDefaults(\n defineProps<{\n class?: any;\n modelValue?: boolean;\n variant?: VariantProps<typeof styles>["variant"];\n title?: string;\n description?: string;\n icon?: string;\n }>(),\n {\n modelValue: true,\n }\n );\n\n const emit = defineEmits(["update:modelValue"]);\n const shown = useVModel(props, "modelValue", emit, { defaultValue: true });\n\n const styles = tv({\n base: "relative flex w-full gap-3 rounded-lg border p-4",\n variants: {\n variant: {\n default: "bg-background text-foreground",\n destructive:\n "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",\n },\n },\n defaultVariants: {\n variant: "default",\n },\n });\n</script>\n',
56
+ },
57
+ {
58
+ fileName: "Alert/Description.vue",
59
+ dirPath: "components/UI",
60
+ fileContent:
61
+ '<template>\n <Primitive v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>{{ description }}</slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n description?: string;\n }\n >(),\n { as: "div" }\n );\n const forwarded = useForwardProps(useOmit(props, ["class", "description"]));\n\n const styles = tv({\n base: "text-sm [&_p]:leading-relaxed",\n });\n</script>\n',
62
+ },
63
+ {
64
+ fileName: "Alert/Title.vue",
65
+ dirPath: "components/UI",
66
+ fileContent:
67
+ '<template>\n <Primitive v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>{{ title }}</slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n title?: string;\n }\n >(),\n { as: "h5" }\n );\n const forwarded = useForwardProps(useOmit(props, ["class", "title"]));\n\n const styles = tv({\n base: "mb-1 font-medium leading-none tracking-tight",\n });\n</script>\n',
68
+ },
69
+ ],
70
+ utils: [],
71
+ composables: [],
72
+ },
73
+ {
74
+ name: "Alert Dialog",
75
+ value: "alert-dialog",
76
+ deps: ["radix-vue", "tailwind-variants"],
77
+ devDeps: ["tailwindcss-animate", "nuxt-icon", "nuxt-lodash", "@vueuse/core", "@vueuse/nuxt"],
78
+ nuxtModules: ["nuxt-icon", "nuxt-lodash", "@vueuse/nuxt"],
79
+ utils: [
80
+ {
81
+ fileName: "shared.styles.ts",
82
+ dirPath: "utils",
83
+ fileContent:
84
+ '// Add here because button styles are used in several components\r\nexport const buttonStyles = tv({\r\n base: "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",\r\n variants: {\r\n variant: {\r\n default: "bg-primary text-primary-foreground hover:bg-primary/90",\r\n destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",\r\n outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",\r\n secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",\r\n ghost: "hover:bg-accent hover:text-accent-foreground",\r\n link: "text-primary underline-offset-4 hover:underline",\r\n },\r\n size: {\r\n default: "h-10 px-4 py-2",\r\n sm: "h-9 rounded-md px-3",\r\n lg: "h-11 rounded-md px-8",\r\n "icon-sm": "h-9 w-9",\r\n icon: "h-10 w-10",\r\n },\r\n disabled: {\r\n true: "pointer-events-none opacity-50",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: "default",\r\n size: "default",\r\n },\r\n});\r\n',
85
+ },
86
+ ],
87
+ files: [
88
+ {
89
+ fileName: "AlertDialog/Action.vue",
90
+ dirPath: "components/UI",
91
+ fileContent:
92
+ '<template>\r\n <AlertDialogAction\r\n v-bind="forwarded"\r\n :class="buttonStyles({ variant, size, disabled, class: props.class })"\r\n >\r\n <slot>{{ text }} </slot>\r\n </AlertDialogAction>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AlertDialogAction, useForwardProps } from "radix-vue";\r\n import type { AlertDialogActionProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n AlertDialogActionProps & {\r\n onClick?: () => void;\r\n text?: string;\r\n class?: any;\r\n disabled?: boolean;\r\n variant?: VariantProps<typeof buttonStyles>["variant"];\r\n size?: VariantProps<typeof buttonStyles>["size"];\r\n }\r\n >(),\r\n {\r\n text: "Continue",\r\n variant: "default",\r\n }\r\n );\r\n\r\n const forwarded = useForwardProps(useOmit(props, ["text", "class", "variant", "size"]));\r\n</script>\r\n',
93
+ },
94
+ {
95
+ fileName: "AlertDialog/AlertDialog.vue",
96
+ dirPath: "components/UI",
97
+ fileContent:
98
+ '<template>\n <AlertDialogRoot v-bind="forwarded">\n <slot>\n <slot name="trigger">\n <UIAlertDialogTrigger v-if="triggerText" as-child>\n <UIButton variant="outline">{{ triggerText }}</UIButton>\n </UIAlertDialogTrigger>\n </slot>\n <slot name="content">\n <UIAlertDialogContent>\n <slot name="header">\n <UIAlertDialogHeader>\n <slot name="title">\n <UIAlertDialogTitle v-if="title" :title="title" />\n </slot>\n <slot name="description">\n <UIAlertDialogDescription v-if="description" :description="description" />\n </slot>\n </UIAlertDialogHeader>\n </slot>\n <slot name="footer">\n <UIAlertDialogFooter>\n <slot name="cancel">\n <UIAlertDialogCancel />\n </slot>\n <slot name="action">\n <UIAlertDialogAction />\n </slot>\n </UIAlertDialogFooter>\n </slot>\n </UIAlertDialogContent>\n </slot>\n </slot>\n </AlertDialogRoot>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogRoot, useForwardPropsEmits } from "radix-vue";\n import type { AlertDialogEmits, AlertDialogProps } from "radix-vue";\n\n const props = defineProps<\n AlertDialogProps & {\n triggerText?: string;\n title?: string;\n description?: string;\n }\n >();\n\n const emits = defineEmits<AlertDialogEmits>();\n\n const forwarded = useForwardPropsEmits(\n useOmit(props, ["description", "title", "triggerText"]),\n emits\n );\n</script>\n',
99
+ },
100
+ {
101
+ fileName: "AlertDialog/Cancel.vue",
102
+ dirPath: "components/UI",
103
+ fileContent:
104
+ '<template>\r\n <AlertDialogCancel\r\n v-bind="forwarded"\r\n :class="buttonStyles({ variant, size, disabled, class: props.class })"\r\n >\r\n <slot>{{ text }}</slot>\r\n </AlertDialogCancel>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AlertDialogCancel, useForwardProps } from "radix-vue";\r\n import type { AlertDialogCancelProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n AlertDialogCancelProps & {\r\n onClick?: () => void;\r\n text?: string;\r\n class?: any;\r\n disabled?: boolean;\r\n variant?: VariantProps<typeof buttonStyles>["variant"];\r\n size?: VariantProps<typeof buttonStyles>["size"];\r\n }\r\n >(),\r\n {\r\n text: "Cancel",\r\n variant: "outline",\r\n }\r\n );\r\n const forwarded = useForwardProps(useOmit(props, ["text", "class", "variant", "size"]));\r\n</script>\r\n',
105
+ },
106
+ {
107
+ fileName: "AlertDialog/Content.vue",
108
+ dirPath: "components/UI",
109
+ fileContent:
110
+ '<template>\n <UIAlertDialogPortal :to="to">\n <slot name="overlay">\n <UIAlertDialogOverlay />\n </slot>\n <AlertDialogContent\n :class="styles({ class: props.class })"\n v-bind="{ ...forwarded, ...$attrs }"\n >\n <slot></slot>\n </AlertDialogContent>\n </UIAlertDialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogContent, useForwardPropsEmits } from "radix-vue";\n import type { AlertDialogContentEmits, AlertDialogContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = defineProps<\n AlertDialogContentProps & {\n class?: any;\n to?: string | HTMLElement;\n }\n >();\n const emit = defineEmits<AlertDialogContentEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["class", "to"]), emit);\n\n const styles = tv({\n base: "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",\n });\n</script>\n',
111
+ },
112
+ {
113
+ fileName: "AlertDialog/Description.vue",
114
+ dirPath: "components/UI",
115
+ fileContent:
116
+ '<template>\n <AlertDialogDescription v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>{{ description }}</slot>\n </AlertDialogDescription>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogDescription, useForwardProps } from "radix-vue";\n import type { AlertDialogDescriptionProps } from "radix-vue";\n\n const props = defineProps<\n AlertDialogDescriptionProps & {\n description?: string;\n class?: any;\n }\n >();\n\n const forwarded = useForwardProps(useOmit(props, ["description", "class"]));\n\n const styles = tv({\n base: "text-sm text-muted-foreground",\n });\n</script>\n',
117
+ },
118
+ {
119
+ fileName: "AlertDialog/Footer.vue",
120
+ dirPath: "components/UI",
121
+ fileContent:
122
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2",\n });\n</script>\n',
123
+ },
124
+ {
125
+ fileName: "AlertDialog/Header.vue",
126
+ dirPath: "components/UI",
127
+ fileContent:
128
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "flex flex-col gap-2 text-center sm:text-left",\n });\n</script>\n',
129
+ },
130
+ {
131
+ fileName: "AlertDialog/Overlay.vue",
132
+ dirPath: "components/UI",
133
+ fileContent:
134
+ '<template>\n <AlertDialogOverlay v-bind="forwarded" :class="styles({ class: props.class })" />\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogOverlay, useForwardProps } from "radix-vue";\n import type { AlertDialogOverlayProps } from "radix-vue";\n\n const props = defineProps<\n AlertDialogOverlayProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-fadeOut data-[state=open]:animate-fadeIn",\n });\n</script>\n',
135
+ },
136
+ {
137
+ fileName: "AlertDialog/Portal.vue",
138
+ dirPath: "components/UI",
139
+ fileContent:
140
+ '<template>\n <AlertDialogPortal v-bind="forwarded">\n <slot></slot>\n </AlertDialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogPortal, useForwardProps } from "radix-vue";\n import type { AlertDialogPortalProps } from "radix-vue";\n\n const props = defineProps<AlertDialogPortalProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
141
+ },
142
+ {
143
+ fileName: "AlertDialog/Title.vue",
144
+ dirPath: "components/UI",
145
+ fileContent:
146
+ '<template>\n <AlertDialogTitle v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>{{ title }}</slot>\n </AlertDialogTitle>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogTitle, useForwardProps } from "radix-vue";\n import type { AlertDialogTitleProps } from "radix-vue";\n\n const props = defineProps<\n AlertDialogTitleProps & {\n title?: string;\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["title", "class"]));\n\n const styles = tv({\n base: "text-lg font-semibold",\n });\n</script>\n',
147
+ },
148
+ {
149
+ fileName: "AlertDialog/Trigger.vue",
150
+ dirPath: "components/UI",
151
+ fileContent:
152
+ '<template>\n <AlertDialogTrigger v-bind="forwarded">\n <slot></slot>\n </AlertDialogTrigger>\n</template>\n\n<script lang="ts" setup>\n import { AlertDialogTrigger, useForwardProps } from "radix-vue";\n import type { AlertDialogTriggerProps } from "radix-vue";\n\n const props = defineProps<AlertDialogTriggerProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
153
+ },
154
+ ],
155
+ composables: [],
156
+ },
157
+ {
158
+ name: "Aspect Ratio",
159
+ value: "aspect-ratio",
160
+ deps: ["radix-vue"],
161
+ devDeps: [],
162
+ nuxtModules: [],
163
+ files: [
164
+ {
165
+ fileName: "AspectRatio.vue",
166
+ dirPath: "components/UI",
167
+ fileContent:
168
+ '<template>\r\n <AspectRatio v-bind="forwarded">\r\n <slot />\r\n </AspectRatio>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AspectRatio, useForwardProps } from "radix-vue";\r\n import type { AspectRatioProps } from "radix-vue";\r\n\r\n const props = defineProps<AspectRatioProps>();\r\n const forwarded = useForwardProps(props);\r\n</script>\r\n',
169
+ },
170
+ ],
171
+ utils: [],
172
+ composables: [],
173
+ },
174
+ {
175
+ name: "Autocomplete",
176
+ value: "autocomplete",
177
+ deps: ["radix-vue", "tailwind-variants"],
178
+ devDeps: ["tailwindcss-animate", "nuxt-icon", "nuxt-lodash", "@vueuse/core", "@vueuse/nuxt"],
179
+ nuxtModules: ["nuxt-icon", "nuxt-lodash", "@vueuse/nuxt"],
180
+ files: [
181
+ {
182
+ fileName: "Autocomplete/Anchor.vue",
183
+ dirPath: "components/UI",
184
+ fileContent:
185
+ '<template>\n <ComboboxAnchor v-bind="props">\n <slot></slot>\n </ComboboxAnchor>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxAnchor } from "radix-vue";\n import type { ComboboxAnchorProps } from "radix-vue";\n\n const props = defineProps<ComboboxAnchorProps>();\n</script>\n',
186
+ },
187
+ {
188
+ fileName: "Autocomplete/Arrow.vue",
189
+ dirPath: "components/UI",
190
+ fileContent:
191
+ '<template>\n <ComboboxArrow v-bind="props" :class="styles({ class: props.class })" />\n</template>\n\n<script lang="ts" setup>\n import { ComboboxArrow } from "radix-vue";\n import type { ComboboxArrowProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxArrowProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "rotate-45 border bg-muted",\n });\n</script>\n',
192
+ },
193
+ {
194
+ fileName: "Autocomplete/Autocomplete.vue",
195
+ dirPath: "components/UI",
196
+ fileContent:
197
+ '<template>\n <ComboboxRoot v-bind="forwarded">\n <slot></slot>\n </ComboboxRoot>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxRoot, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxRootEmits, ComboboxRootProps } from "radix-vue";\n\n const props = defineProps<ComboboxRootProps>();\n\n const emits = defineEmits<ComboboxRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
198
+ },
199
+ {
200
+ fileName: "Autocomplete/Cancel.vue",
201
+ dirPath: "components/UI",
202
+ fileContent:
203
+ '<template>\n <ComboboxCancel v-bind="props">\n <slot></slot>\n </ComboboxCancel>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxCancel } from "radix-vue";\n import type { ComboboxCancelProps } from "radix-vue";\n\n const props = defineProps<ComboboxCancelProps>();\n</script>\n',
204
+ },
205
+ {
206
+ fileName: "Autocomplete/Content.vue",
207
+ dirPath: "components/UI",
208
+ fileContent:
209
+ '<template>\n <ComboboxContent v-bind="forwarded" :class="styles({ class: props.class })">\n <UIAutocompleteViewport>\n <slot></slot>\n </UIAutocompleteViewport>\n </ComboboxContent>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxContent, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxContentEmits, ComboboxContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = withDefaults(\n defineProps<\n ComboboxContentProps & {\n class?: any;\n }\n >(),\n {\n position: "popper",\n bodyLock: true,\n side: "bottom",\n sideOffset: 8,\n }\n );\n\n const emits = defineEmits<ComboboxContentEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "z-50 w-[var(--radix-combobox-trigger-width)] min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-accent-foreground shadow-md 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 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",\n });\n</script>\n',
210
+ },
211
+ {
212
+ fileName: "Autocomplete/Empty.vue",
213
+ dirPath: "components/UI",
214
+ fileContent:
215
+ '<template>\n <ComboboxEmpty v-bind="props">\n <slot></slot>\n </ComboboxEmpty>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxEmpty } from "radix-vue";\n import type { ComboboxEmptyProps } from "radix-vue";\n\n const props = defineProps<ComboboxEmptyProps>();\n</script>\n',
216
+ },
217
+ {
218
+ fileName: "Autocomplete/Group.vue",
219
+ dirPath: "components/UI",
220
+ fileContent:
221
+ '<template>\n <ComboboxGroup v-bind="props">\n <slot></slot>\n </ComboboxGroup>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxGroup } from "radix-vue";\n import type { ComboboxGroupProps } from "radix-vue";\n\n const props = defineProps<ComboboxGroupProps>();\n</script>\n',
222
+ },
223
+ {
224
+ fileName: "Autocomplete/Input.vue",
225
+ dirPath: "components/UI",
226
+ fileContent:
227
+ '<template>\n <ComboboxInput v-bind="props" :class="styles({ class: props.class })" />\n</template>\n\n<script lang="ts" setup>\n import { ComboboxInput } from "radix-vue";\n import type { ComboboxInputProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxInputProps & {\n type?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground file:hover:cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm",\n });\n</script>\n',
228
+ },
229
+ {
230
+ fileName: "Autocomplete/Item.vue",
231
+ dirPath: "components/UI",
232
+ fileContent:
233
+ '<template>\n <ComboboxItem v-bind="forwarded" :class="styles({ class: props.class })">\n <slot name="icon">\n <span class="absolute inset-y-0 left-2 flex items-center justify-center">\n <UIAutocompleteItemIndicator class="animate-in fade-in-0 zoom-in-0" :icon="icon" />\n </span>\n </slot>\n <slot></slot>\n </ComboboxItem>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxItem, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxItemEmits, ComboboxItemProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxItemProps & {\n class?: any;\n icon?: string;\n }\n >();\n\n const emits = defineEmits<{\n select: ComboboxItemEmits["select"];\n }>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 pl-9 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
234
+ },
235
+ {
236
+ fileName: "Autocomplete/ItemIndicator.vue",
237
+ dirPath: "components/UI",
238
+ fileContent:
239
+ '<template>\n <ComboboxItemIndicator v-bind="props">\n <slot><Icon :name="icon || \'ph:check\'" class="h-4 w-4" /></slot>\n </ComboboxItemIndicator>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxItemIndicator } from "radix-vue";\n import type { ComboboxItemIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxItemIndicatorProps & {\n icon?: string;\n }\n >();\n</script>\n',
240
+ },
241
+ {
242
+ fileName: "Autocomplete/Label.vue",
243
+ dirPath: "components/UI",
244
+ fileContent:
245
+ '<template>\n <ComboboxLabel :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </ComboboxLabel>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxLabel } from "radix-vue";\n import type { ComboboxLabelProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxLabelProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "px-2 py-1.5 pl-9 text-sm font-medium text-muted-foreground",\n });\n</script>\n',
246
+ },
247
+ {
248
+ fileName: "Autocomplete/Portal.vue",
249
+ dirPath: "components/UI",
250
+ fileContent:
251
+ '<template>\n <ComboboxPortal v-bind="props">\n <slot></slot>\n </ComboboxPortal>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxPortal } from "radix-vue";\n import type { ComboboxPortalProps } from "radix-vue";\n\n const props = defineProps<ComboboxPortalProps>();\n</script>\n',
252
+ },
253
+ {
254
+ fileName: "Autocomplete/Separator.vue",
255
+ dirPath: "components/UI",
256
+ fileContent:
257
+ '<template>\n <ComboboxSeparator v-bind="props">\n <slot></slot>\n </ComboboxSeparator>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxSeparator } from "radix-vue";\n import type { ComboboxSeparatorProps } from "radix-vue";\n\n const props = defineProps<ComboboxSeparatorProps>();\n</script>\n',
258
+ },
259
+ {
260
+ fileName: "Autocomplete/Trigger.vue",
261
+ dirPath: "components/UI",
262
+ fileContent:
263
+ '<template>\n <ComboboxTrigger v-bind="props">\n <slot></slot>\n </ComboboxTrigger>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxTrigger } from "radix-vue";\n import type { ComboboxTriggerProps } from "radix-vue";\n\n const props = defineProps<ComboboxTriggerProps>();\n</script>\n',
264
+ },
265
+ {
266
+ fileName: "Autocomplete/Viewport.vue",
267
+ dirPath: "components/UI",
268
+ fileContent:
269
+ '<template>\n <ComboboxViewport v-bind="props">\n <slot></slot>\n </ComboboxViewport>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxViewport } from "radix-vue";\n import type { ComboboxViewportProps } from "radix-vue";\n\n const props = defineProps<ComboboxViewportProps>();\n</script>\n',
270
+ },
271
+ ],
272
+ utils: [],
273
+ composables: [],
274
+ },
275
+ {
276
+ name: "Avatar",
277
+ value: "avatar",
278
+ deps: ["radix-vue", "tailwind-variants"],
279
+ devDeps: ["nuxt-lodash"],
280
+ nuxtModules: ["nuxt-lodash"],
281
+ files: [
282
+ {
283
+ fileName: "Avatar/Avatar.vue",
284
+ dirPath: "components/UI",
285
+ fileContent:
286
+ '<template>\r\n <AvatarRoot :as="as" :as-child="asChild" :class="styles({ class: props.class })">\r\n <slot>\r\n <slot name="image">\r\n <UIAvatarImage\r\n @loading-status-change="emits(\'loadingStatusChange\', $event)"\r\n v-if="src"\r\n :src="src"\r\n :alt="alt"\r\n :class="imageClass"\r\n />\r\n </slot>\r\n <slot name="fallback">\r\n <UIAvatarFallback :delay-ms="delayMs" :class="fallbackClass" :fallback="fallback" />\r\n </slot>\r\n </slot>\r\n </AvatarRoot>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AvatarRoot } from "radix-vue";\r\n import type { AvatarImageEmits, AvatarImageProps, AvatarRootProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n AvatarRootProps &\r\n Partial<AvatarImageProps> & {\r\n class?: any;\r\n imageClass?: any;\r\n fallbackClass?: any;\r\n alt?: string;\r\n fallback?: string;\r\n delayMs?: number;\r\n }\r\n >(),\r\n {}\r\n );\r\n\r\n const emits = defineEmits<AvatarImageEmits>();\r\n const styles = tv({\r\n base: "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",\r\n });\r\n</script>\r\n',
287
+ },
288
+ {
289
+ fileName: "Avatar/Fallback.vue",
290
+ dirPath: "components/UI",
291
+ fileContent:
292
+ '<template>\r\n <AvatarFallback :class="styles({ class: props.class })" v-bind="forwarded">\r\n <slot>\r\n {{ fallback }}\r\n </slot>\r\n </AvatarFallback>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AvatarFallback, useForwardProps } from "radix-vue";\r\n import type { AvatarFallbackProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n AvatarFallbackProps & {\r\n fallback?: string;\r\n class?: any;\r\n }\r\n >();\r\n const forwarded = useForwardProps(useOmit(props, ["fallback", "class"]));\r\n\r\n const styles = tv({\r\n base: "flex h-full w-full items-center justify-center rounded-full bg-muted font-medium",\r\n });\r\n</script>\r\n',
293
+ },
294
+ {
295
+ fileName: "Avatar/Image.vue",
296
+ dirPath: "components/UI",
297
+ fileContent:
298
+ '<template>\r\n <AvatarImage v-bind="forwarded" :class="styles({ class: props.class })" :alt="alt" />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { AvatarImage, useForwardPropsEmits } from "radix-vue";\r\n import type { AvatarImageEmits, AvatarImageProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n AvatarImageProps & {\r\n alt?: string;\r\n class?: any;\r\n }\r\n >();\r\n const emits = defineEmits<AvatarImageEmits>();\r\n const forwarded = useForwardPropsEmits(useOmit(props, ["alt", "class"]));\r\n\r\n const styles = tv({\r\n base: "aspect-square h-full w-full object-cover",\r\n });\r\n</script>\r\n',
299
+ },
300
+ ],
301
+ utils: [],
302
+ composables: [],
303
+ },
304
+ {
305
+ name: "Badge",
306
+ value: "badge",
307
+ deps: ["radix-vue", "tailwind-variants"],
308
+ devDeps: [],
309
+ nuxtModules: [],
310
+ files: [
311
+ {
312
+ fileName: "Badge.vue",
313
+ dirPath: "components/UI",
314
+ fileContent:
315
+ '<template>\n <component\n :is="elementType"\n @click="onClick"\n :to="to"\n :href="href"\n :disabled="disabled"\n :class="badgeVariants({ disabled, variant, class: props.class })"\n >\n <slot></slot>\n </component>\n</template>\n\n<script lang="ts" setup>\n const badgeVariants = tv({\n base: "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",\n variants: {\n variant: {\n default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",\n secondary:\n "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",\n destructive:\n "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",\n outline: "text-foreground",\n },\n disabled: {\n true: "cursor-not-allowed opacity-50",\n },\n },\n defaultVariants: {\n variant: "default",\n },\n });\n\n type BadgeProps = VariantProps<typeof badgeVariants>;\n\n const props = defineProps<{\n class?: any;\n variant?: BadgeProps["variant"];\n onClick?: () => void;\n to?: string;\n href?: string;\n disabled?: boolean;\n tag?: string;\n }>();\n\n const elementType = computed(() => {\n if (props.tag) return props.tag;\n if (props.href || props.to) return resolveComponent("NuxtLink");\n return props.tag || "div";\n });\n</script>\n',
316
+ },
317
+ ],
318
+ utils: [],
319
+ composables: [],
320
+ },
321
+ {
322
+ name: "Breadcrumbs",
323
+ value: "breadcrumbs",
324
+ deps: ["radix-vue", "tailwind-variants"],
325
+ devDeps: ["nuxt-icon"],
326
+ nuxtModules: ["nuxt-icon"],
327
+ files: [
328
+ {
329
+ fileName: "Breadcrumbs.vue",
330
+ dirPath: "components/UI",
331
+ fileContent:
332
+ '<template>\n <div :class="styles({ class: props.class })">\n <template v-for="(item, i) in items" :key="i">\n <div class="flex items-center gap-3">\n <div class="flex cursor-pointer items-center gap-2">\n <slot name="crumbIcon" :item="item" :index="i">\n <Icon\n v-if="item.icon"\n :name="item.icon"\n :class="[!isNotLastItem(i) && \'text-primary\']"\n />\n </slot>\n <slot :item="item" :isNotLastItem="isNotLastItem" :index="i" name="link">\n <NuxtLink\n @click="item?.click?.()"\n :to="!item?.disabled ? item.link : \'\'"\n :class="[\n isNotLastItem(i)\n ? \'text-muted-foreground hover:underline\'\n : \'font-semibold text-primary\',\n ]"\n class="text-sm text-foreground"\n v-if="item.label"\n >{{ item.label }}</NuxtLink\n >\n </slot>\n </div>\n <slot name="separator" :item="item" :index="i">\n <Icon v-if="isNotLastItem(i)" :name="separator" class="h-3 w-3 text-muted-foreground" />\n </slot>\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang="ts">\n export interface Crumbs {\n label: string;\n icon?: string;\n link?: string;\n disabled?: boolean;\n click?: Function;\n }\n const props = withDefaults(\n defineProps<{\n /**\n * The items to display in the breadcrumbs.\n */\n items?: Crumbs[];\n /**\n * The separator to use between each breadcrumb.\n */\n separator?: string;\n class?: any;\n }>(),\n {\n separator: "heroicons:chevron-right",\n items: () => [],\n }\n );\n\n const isNotLastItem = (index: number) => {\n return index !== props?.items?.length - 1;\n };\n\n const styles = tv({\n base: "flex w-full items-center gap-4",\n });\n</script>\n',
333
+ },
334
+ ],
335
+ utils: [],
336
+ composables: [],
337
+ },
338
+ {
339
+ name: "Button",
340
+ value: "button",
341
+ deps: ["radix-vue", "tailwind-variants"],
342
+ devDeps: [],
343
+ nuxtModules: [],
344
+ utils: [
345
+ {
346
+ fileName: "shared.styles.ts",
347
+ dirPath: "utils",
348
+ fileContent:
349
+ '// Add here because button styles are used in several components\r\nexport const buttonStyles = tv({\r\n base: "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",\r\n variants: {\r\n variant: {\r\n default: "bg-primary text-primary-foreground hover:bg-primary/90",\r\n destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",\r\n outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",\r\n secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",\r\n ghost: "hover:bg-accent hover:text-accent-foreground",\r\n link: "text-primary underline-offset-4 hover:underline",\r\n },\r\n size: {\r\n default: "h-10 px-4 py-2",\r\n sm: "h-9 rounded-md px-3",\r\n lg: "h-11 rounded-md px-8",\r\n "icon-sm": "h-9 w-9",\r\n icon: "h-10 w-10",\r\n },\r\n disabled: {\r\n true: "pointer-events-none opacity-50",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: "default",\r\n size: "default",\r\n },\r\n});\r\n',
350
+ },
351
+ ],
352
+ files: [
353
+ {
354
+ fileName: "Button.vue",
355
+ dirPath: "components/UI",
356
+ fileContent:
357
+ '<template>\r\n <component\r\n :is="elementType"\r\n :class="\r\n buttonStyles({\r\n disabled: disabled || loading,\r\n variant: variant,\r\n size: size,\r\n class: props.class,\r\n })\r\n "\r\n :disabled="disabled || loading"\r\n :to="to"\r\n :href="href"\r\n :type="type"\r\n @click="onClick"\r\n >\r\n <slot></slot>\r\n </component>\r\n</template>\r\n\r\n<script setup lang="ts">\r\n import type { RouteLocationRaw } from "vue-router";\r\n\r\n type ButtonProps = VariantProps<typeof buttonStyles>;\r\n const props = withDefaults(\r\n defineProps<{\r\n type?: "button" | "submit" | "reset";\r\n disabled?: boolean;\r\n loading?: boolean;\r\n onClick?: () => void;\r\n to?: string | RouteLocationRaw;\r\n href?: string;\r\n as?: string;\r\n class?: any;\r\n variant?: ButtonProps["variant"];\r\n size?: ButtonProps["size"];\r\n }>(),\r\n {\r\n type: "button",\r\n }\r\n );\r\n\r\n const elementType = computed(() => {\r\n if (props.as) return props.as;\r\n if (props.href || props.to) return resolveComponent("NuxtLink");\r\n return "button";\r\n });\r\n</script>\r\n',
358
+ },
359
+ ],
360
+ composables: [],
361
+ },
362
+ {
363
+ name: "Calendar",
364
+ value: "calendar",
365
+ deps: [],
366
+ devDeps: ["@samk-dev/nuxt-vcalendar"],
367
+ nuxtModules: ["@samk-dev/nuxt-vcalendar"],
368
+ instructions: ["You can customize the calendar by adding options to your nuxt.config.js file"],
369
+ files: [
370
+ {
371
+ fileName: "Calendar.vue",
372
+ dirPath: "components/UI",
373
+ fileContent:
374
+ '<template>\r\n <ClientOnly>\r\n <VCalendar\r\n :trimWeeks="props.trimWeeks || true"\r\n :is-dark="$colorMode.value == \'dark\'"\r\n v-bind="$attrs"\r\n >\r\n <template v-for="(_, slot) in $slots" v-slot:[slot]="scope">\r\n <slot :name="slot" v-bind="scope"></slot>\r\n </template>\r\n </VCalendar>\r\n </ClientOnly>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Calendar } from "v-calendar";\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n interface Props extends /* @vue-ignore */ Partial<InstanceType<typeof Calendar>["$props"]> {}\r\n\r\n const props = defineProps<Props & { trimWeeks?: boolean }>();\r\n</script>\r\n\r\n<style>\r\n :root {\r\n --vc-font-family: var(--font-sans);\r\n --vc-rounded-full: var(--radius);\r\n --vc-font-bold: 500;\r\n --vc-font-semibold: 600;\r\n --vc-text-lg: 16px;\r\n }\r\n\r\n .vc-light,\r\n .vc-dark {\r\n --vc-bg: theme("colors.background");\r\n --vc-border: theme("colors.border");\r\n --vc-focus-ring: 0 0 0 3px hsl(var(--primary) / 30%);\r\n --vc-weekday-color: theme("colors.muted.foreground");\r\n --vc-popover-content-color: theme("colors.popover.foreground");\r\n --vc-hover-bg: theme("colors.accent.DEFAULT");\r\n --vc-popover-content-bg: theme("colors.popover.DEFAULT");\r\n --vc-popover-content-border: theme("colors.border");\r\n --vc-header-arrow-hover-bg: theme("colors.accent.DEFAULT");\r\n --vc-weeknumber-color: theme("colors.muted.foreground");\r\n --vc-nav-hover-bg: theme("colors.accent.DEFAULT");\r\n\r\n --vc-nav-item-active-color: theme("colors.primary.foreground");\r\n --vc-nav-item-active-bg: theme("colors.primary.DEFAULT");\r\n\r\n &.vc-attr,\r\n & .vc-attr {\r\n --vc-content-color: theme("colors.primary.DEFAULT");\r\n --vc-highlight-outline-bg: theme("colors.primary.DEFAULT");\r\n --vc-highlight-outline-border: theme("colors.primary.DEFAULT");\r\n --vc-highlight-outline-content-color: theme("colors.primary.foreground");\r\n --vc-highlight-light-bg: var(--vc-accent-200); /* Highlighted color between two dates */\r\n --vc-highlight-light-content-color: theme("colors.secondary.foreground");\r\n --vc-highlight-solid-bg: theme("colors.primary.DEFAULT");\r\n --vc-highlight-solid-content-color: theme("colors.primary.foreground");\r\n }\r\n }\r\n\r\n .vc-blue {\r\n --vc-accent-200: theme("colors.primary.DEFAULT / 20%");\r\n --vc-accent-400: theme("colors.primary.DEFAULT");\r\n --vc-accent-500: theme("colors.primary.DEFAULT");\r\n --vc-accent-600: theme("colors.primary.DEFAULT / 70%");\r\n }\r\n\r\n .dark {\r\n .vc-blue {\r\n --vc-accent-200: theme("colors.primary.DEFAULT / 20%");\r\n --vc-accent-400: theme("colors.primary.DEFAULT");\r\n --vc-accent-500: theme("colors.primary.DEFAULT / 70%");\r\n }\r\n }\r\n .vc-header .vc-title {\r\n @apply font-medium;\r\n }\r\n .vc-weekdays {\r\n @apply my-2 font-normal;\r\n }\r\n .vc-day-content,\r\n .vc-day,\r\n .vc-highlight {\r\n @apply h-9 w-9 rounded-md;\r\n }\r\n .vc-focus {\r\n @apply focus-within:shadow-none;\r\n }\r\n .vc-day {\r\n @apply mb-1.5;\r\n }\r\n\r\n .vc-base-icon {\r\n @apply h-4 w-4 stroke-1;\r\n }\r\n .vc-header .vc-arrow,\r\n .vc-nav-arrow {\r\n @apply h-7 w-7 rounded-md;\r\n border: 1px solid hsl(var(--border));\r\n }\r\n .vc-header .vc-prev,\r\n .vc-header .vc-next {\r\n @apply border;\r\n }\r\n .weekday-position-1 .vc-highlights {\r\n @apply rounded-l-md;\r\n }\r\n .weekday-position-7 .vc-highlights {\r\n @apply rounded-r-md;\r\n }\r\n .vc-highlight-bg-light {\r\n @apply bg-accent;\r\n }\r\n .vc-nav-item {\r\n @apply font-medium;\r\n }\r\n .vc-header .vc-title-wrapper {\r\n @apply decoration-accent-foreground/60 underline-offset-2 hover:underline;\r\n }\r\n .vc-highlights + .vc-day-content {\r\n @apply hover:bg-accent/5;\r\n }\r\n</style>\r\n',
375
+ },
376
+ ],
377
+ utils: [],
378
+ composables: [],
379
+ },
380
+ {
381
+ name: "Card",
382
+ value: "card",
383
+ deps: ["radix-vue", "tailwind-variants"],
384
+ devDeps: ["nuxt-lodash"],
385
+ nuxtModules: ["nuxt-lodash"],
386
+ files: [
387
+ {
388
+ fileName: "Card/Card.vue",
389
+ dirPath: "components/UI",
390
+ fileContent:
391
+ '<template>\r\n <Primitive :as="as" :as-child="asChild" :class="styles({ class: props.class })">\r\n <slot>\r\n <slot name="header">\r\n <UICardHeader>\r\n <slot name="title">\r\n <UICardTitle v-if="title || $slots.title" :title="title" />\r\n </slot>\r\n <slot name="description">\r\n <UICardDescription\r\n v-if="description || $slots.description"\r\n :description="description"\r\n />\r\n </slot>\r\n </UICardHeader>\r\n </slot>\r\n <slot name="content" v-if="content || $slots.content">\r\n <UICardContent>\r\n <div v-html="content"></div>\r\n </UICardContent>\r\n </slot>\r\n <slot name="footer"></slot>\r\n </slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n title?: string;\r\n description?: string;\r\n content?: string;\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n as: "div",\r\n }\r\n );\r\n\r\n const styles = tv({\r\n base: "rounded-lg border bg-card text-card-foreground shadow-sm",\r\n });\r\n</script>\r\n',
392
+ },
393
+ {
394
+ fileName: "Card/Content.vue",
395
+ dirPath: "components/UI",
396
+ fileContent:
397
+ '<template>\r\n <Primitive :as="as" :as-child="asChild" :class="styles({ class: props.class })">\r\n <slot>\r\n {{ content }}\r\n </slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n content?: string;\r\n class?: any;\r\n }\r\n >(),\r\n { as: "div" }\r\n );\r\n const styles = tv({\r\n base: "p-6 pt-0",\r\n });\r\n</script>\r\n',
398
+ },
399
+ {
400
+ fileName: "Card/Description.vue",
401
+ dirPath: "components/UI",
402
+ fileContent:
403
+ '<template>\r\n <Primitive :class="styles({ class: props.class })" :as="as" :as-child="asChild">\r\n <slot>\r\n {{ description }}\r\n </slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n description?: string;\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n as: "div",\r\n }\r\n );\r\n const styles = tv({\r\n base: "text-sm text-muted-foreground",\r\n });\r\n</script>\r\n',
404
+ },
405
+ {
406
+ fileName: "Card/Footer.vue",
407
+ dirPath: "components/UI",
408
+ fileContent:
409
+ '<template>\r\n <Primitive :class="styles({ class: props.class })" :as="as" :as-child="asChild">\r\n <slot> </slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n class?: any;\r\n }\r\n >(),\r\n { as: "div" }\r\n );\r\n\r\n const styles = tv({\r\n base: "flex items-center p-6 pt-0",\r\n });\r\n</script>\r\n',
410
+ },
411
+ {
412
+ fileName: "Card/Header.vue",
413
+ dirPath: "components/UI",
414
+ fileContent:
415
+ '<template>\r\n <Primitive :class="styles({ class: props.class })" :as="as" :as-child="asChild">\r\n <slot></slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n class?: any;\r\n }\r\n >(),\r\n { as: "div" }\r\n );\r\n\r\n const styles = tv({\r\n base: "flex flex-col space-y-1.5 p-6",\r\n });\r\n</script>\r\n',
416
+ },
417
+ {
418
+ fileName: "Card/Title.vue",
419
+ dirPath: "components/UI",
420
+ fileContent:
421
+ '<template>\r\n <Primitive :class="styles({ class: props.class })" :as="as" :as-child="asChild">\r\n <slot>\r\n {{ title }}\r\n </slot>\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n title?: string;\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n as: "h3",\r\n }\r\n );\r\n\r\n const styles = tv({\r\n base: "text-xl font-semibold leading-none tracking-tight",\r\n });\r\n</script>\r\n',
422
+ },
423
+ ],
424
+ utils: [],
425
+ composables: [],
426
+ },
427
+ {
428
+ name: "Checkbox",
429
+ value: "checkbox",
430
+ deps: ["radix-vue", "tailwind-variants"],
431
+ devDeps: ["nuxt-lodash", "nuxt-icon"],
432
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
433
+ files: [
434
+ {
435
+ fileName: "Checkbox/Checkbox.vue",
436
+ dirPath: "components/UI",
437
+ fileContent:
438
+ '<template>\r\n <CheckboxRoot v-bind="forwarded" :class="styles({ class: props.class })">\r\n <slot>\r\n <Transition enter-active-class="transition" enter-from-class="opacity-0 scale-0">\r\n <UICheckboxIndicator :icon="icon" />\r\n </Transition>\r\n </slot>\r\n </CheckboxRoot>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { CheckboxRoot, useForwardPropsEmits } from "radix-vue";\r\n import type { CheckboxRootEmits, CheckboxRootProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n CheckboxRootProps & {\r\n class?: any;\r\n id?: string;\r\n icon?: string;\r\n }\r\n >();\r\n\r\n const emit = defineEmits<CheckboxRootEmits>();\r\n const forwarded = useForwardPropsEmits(props, emit);\r\n\r\n const styles = tv({\r\n base: "peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",\r\n });\r\n</script>\r\n',
439
+ },
440
+ {
441
+ fileName: "Checkbox/Indicator.vue",
442
+ dirPath: "components/UI",
443
+ fileContent:
444
+ '<template>\r\n <CheckboxIndicator :class="styles({ class: props.class })" v-bind="forwarded">\r\n <slot>\r\n <Icon :name="icon" class="h-4 w-4" />\r\n </slot>\r\n </CheckboxIndicator>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { CheckboxIndicator, useForwardProps } from "radix-vue";\r\n import type { CheckboxIndicatorProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n CheckboxIndicatorProps & {\r\n class?: any;\r\n icon?: string;\r\n }\r\n >(),\r\n {\r\n icon: "lucide:check",\r\n }\r\n );\r\n const forwarded = useForwardProps(useOmit(props, ["icon", "class"]));\r\n\r\n const styles = tv({\r\n base: "flex items-center justify-center text-current",\r\n });\r\n</script>\r\n',
445
+ },
446
+ ],
447
+ utils: [],
448
+ composables: [],
449
+ },
450
+ {
451
+ name: "Collapsible",
452
+ value: "collapsible",
453
+ deps: ["radix-vue", "tailwind-variants"],
454
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
455
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
456
+ instructions: ["Remember to add the collapsile animations to your tailwind.config.js"],
457
+ files: [
458
+ {
459
+ fileName: "Collapsible/Collapsible.vue",
460
+ dirPath: "components/UI",
461
+ fileContent:
462
+ '<template>\n <CollapsibleRoot v-bind="forwarded">\n <slot></slot>\n </CollapsibleRoot>\n</template>\n\n<script lang="ts" setup>\n import { CollapsibleRoot, useForwardPropsEmits } from "radix-vue";\n import type { CollapsibleRootEmits, CollapsibleRootProps } from "radix-vue";\n\n const props = defineProps<CollapsibleRootProps>();\n\n const emit = defineEmits<CollapsibleRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emit);\n</script>\n',
463
+ },
464
+ {
465
+ fileName: "Collapsible/Content.vue",
466
+ dirPath: "components/UI",
467
+ fileContent:
468
+ '<template>\n <CollapsibleContent :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </CollapsibleContent>\n</template>\n\n<script lang="ts" setup>\n import { CollapsibleContent, useForwardProps } from "radix-vue";\n import type { CollapsibleContentProps } from "radix-vue";\n\n const props = defineProps<\n CollapsibleContentProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "overflow-hidden transition will-change-auto data-[state=closed]:animate-collapse-up data-[state=open]:animate-collapse-down",\n });\n</script>\n',
469
+ },
470
+ {
471
+ fileName: "Collapsible/Trigger.vue",
472
+ dirPath: "components/UI",
473
+ fileContent:
474
+ '<template>\n <CollapsibleTrigger v-bind="forwarded">\n <slot></slot>\n </CollapsibleTrigger>\n</template>\n\n<script lang="ts" setup>\n import { CollapsibleTrigger, useForwardProps } from "radix-vue";\n import type { CollapsibleTriggerProps } from "radix-vue";\n\n const props = defineProps<CollapsibleTriggerProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
475
+ },
476
+ ],
477
+ utils: [],
478
+ composables: [],
479
+ },
480
+ {
481
+ name: "Command",
482
+ value: "command",
483
+ deps: ["radix-vue", "tailwind-variants"],
484
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
485
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
486
+ files: [
487
+ {
488
+ fileName: "Command/Cancel.vue",
489
+ dirPath: "components/UI",
490
+ fileContent:
491
+ '<template>\n <ComboboxCancel v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n <Icon name="lucide:x" class="h-4 w-4 text-muted-foreground/70" />\n </slot>\n </ComboboxCancel>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxCancel, useForwardProps } from "radix-vue";\n import type { ComboboxCancelProps } from "radix-vue";\n\n const props = defineProps<ComboboxCancelProps & { class?: any }>();\n const forwarded = useForwardProps(props);\n\n const styles = tv({\n base: "flex items-center justify-center",\n });\n</script>\n',
492
+ },
493
+ {
494
+ fileName: "Command/Command.vue",
495
+ dirPath: "components/UI",
496
+ fileContent:
497
+ '<template>\n <ComboboxRoot v-bind="forwarded" :open="true" :class="styles({ class: props.class })">\n <slot></slot>\n </ComboboxRoot>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxRoot, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxRootEmits, ComboboxRootProps } from "radix-vue";\n\n const props = defineProps<ComboboxRootProps & { class?: any }>();\n const emits = defineEmits<ComboboxRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",\n });\n</script>\n',
498
+ },
499
+ {
500
+ fileName: "Command/Dialog.vue",
501
+ dirPath: "components/UI",
502
+ fileContent:
503
+ '<template>\n <UIDialog v-bind="forwarded">\n <UIDialogContent class="overflow-hidden p-0 shadow-lg">\n <UICommand>\n <slot />\n </UICommand>\n </UIDialogContent>\n </UIDialog>\n</template>\n\n<script lang="ts" setup>\n import { useForwardPropsEmits } from "radix-vue";\n import type { DialogRootEmits, DialogRootProps } from "radix-vue";\n\n const props = defineProps<DialogRootProps>();\n const emits = defineEmits<DialogRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
504
+ },
505
+ {
506
+ fileName: "Command/Empty.vue",
507
+ dirPath: "components/UI",
508
+ fileContent:
509
+ '<template>\n <ComboboxEmpty :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </ComboboxEmpty>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxEmpty, useForwardProps } from "radix-vue";\n import type { ComboboxEmptyProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxEmptyProps & {\n class?: any;\n }\n >();\n\n const forwarded = useForwardProps(props);\n\n const styles = tv({\n base: "py-6 text-center text-sm",\n });\n</script>\n',
510
+ },
511
+ {
512
+ fileName: "Command/Group.vue",
513
+ dirPath: "components/UI",
514
+ fileContent:
515
+ '<template>\n <ComboboxGroup :class="styles({ class: props.class })" v-bind="forwarded">\n <slot name="heading">\n <UICommandLabel v-if="heading" :label="heading" />\n </slot>\n <slot> </slot>\n </ComboboxGroup>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxGroup, useForwardProps } from "radix-vue";\n import type { ComboboxGroupProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxGroupProps & {\n heading?: any;\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["heading", "class"]));\n\n const styles = tv({\n base: "overflow-hidden p-1 text-foreground",\n });\n</script>\n',
516
+ },
517
+ {
518
+ fileName: "Command/Input.vue",
519
+ dirPath: "components/UI",
520
+ fileContent:
521
+ '<template>\n <div class="flex items-center border-b px-3" cmdk-input-wrapper="">\n <Icon :name="icon || \'lucide:search\'" class="mr-2 h-4 w-4 shrink-0 opacity-50" />\n <ComboboxInput\n v-bind="$attrs"\n :type="type ?? \'text\'"\n :disabled="disabled"\n auto-focus\n :class="styles({ class: props.class })"\n />\n <UICommandCancel v-if="showCancel" />\n </div>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxInput } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = defineProps<{\n class?: any;\n icon?: string;\n type?: string;\n disabled?: boolean;\n showCancel?: boolean;\n }>();\n\n const styles = tv({\n base: "flex h-11 w-full rounded-md bg-transparent py-3 outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm",\n });\n</script>\n',
522
+ },
523
+ {
524
+ fileName: "Command/Item.vue",
525
+ dirPath: "components/UI",
526
+ fileContent:
527
+ '<template>\n <ComboboxItem v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n <slot name="icon">\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n </slot>\n {{ text }}\n <slot name="shortcut">\n <UICommandShortcut v-if="shortcut" :shortcut="shortcut" />\n </slot>\n </slot>\n </ComboboxItem>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxItem, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxItemEmits, ComboboxItemProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxItemProps & {\n class?: any;\n icon?: string;\n text?: string;\n shortcut?: string;\n }\n >();\n const emit = defineEmits<ComboboxItemEmits>();\n const forwarded = useForwardPropsEmits(\n useOmit(props, ["class", "icon", "text", "shortcut"]),\n emit\n );\n\n const styles = tv({\n base: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
528
+ },
529
+ {
530
+ fileName: "Command/Label.vue",
531
+ dirPath: "components/UI",
532
+ fileContent:
533
+ '<template>\n <ComboboxLabel :class="styles({ class: props.class })" v-bind="forwarded">\n <slot>{{ label }}</slot>\n </ComboboxLabel>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxLabel, useForwardProps } from "radix-vue";\n import type { ComboboxLabelProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxLabelProps & {\n class?: any;\n label?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["label", "class"]));\n\n const styles = tv({\n base: "px-2 py-1.5 text-xs font-medium text-muted-foreground",\n });\n</script>\n',
534
+ },
535
+ {
536
+ fileName: "Command/List.vue",
537
+ dirPath: "components/UI",
538
+ fileContent:
539
+ '<template>\n <ComboboxContent v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </ComboboxContent>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxContent, useForwardPropsEmits } from "radix-vue";\n import type { ComboboxContentEmits, ComboboxContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = defineProps<\n ComboboxContentProps & {\n class?: any;\n }\n >();\n\n const emits = defineEmits<ComboboxContentEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\n\n const styles = tv({\n base: "max-h-[300px] overflow-y-auto overflow-x-hidden",\n });\n</script>\n',
540
+ },
541
+ {
542
+ fileName: "Command/Separator.vue",
543
+ dirPath: "components/UI",
544
+ fileContent:
545
+ '<template>\n <ComboboxSeparator :as-child="asChild" :class="styles({ class: props.class })">\n <slot></slot>\n </ComboboxSeparator>\n</template>\n\n<script lang="ts" setup>\n import { ComboboxSeparator, useForwardProps } from "radix-vue";\n import type { ComboboxSeparatorProps } from "radix-vue";\n\n const props = defineProps<\n ComboboxSeparatorProps & {\n class?: any;\n }\n >();\n const styles = tv({\n base: "-mx-1 h-px bg-border",\n });\n</script>\n',
546
+ },
547
+ {
548
+ fileName: "Command/Shortcut.vue",
549
+ dirPath: "components/UI",
550
+ fileContent:
551
+ '<template>\n <Primitive :as="as || \'span\'" :as-child="asChild" :class="styles({ class: props.class })">\n <slot>{{ shortcut }}</slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = defineProps<\n PrimitiveProps & {\n class?: any;\n shortcut?: any;\n }\n >();\n const styles = tv({\n base: "ml-auto text-xs tracking-widest text-muted-foreground",\n });\n</script>\n',
552
+ },
553
+ ],
554
+ utils: [],
555
+ composables: [],
556
+ },
557
+ {
558
+ name: "Context Menu",
559
+ value: "context-menu",
560
+ deps: ["radix-vue", "tailwind-variants"],
561
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
562
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
563
+ files: [
564
+ {
565
+ fileName: "ContextMenu/Arrow.vue",
566
+ dirPath: "components/UI",
567
+ fileContent:
568
+ '<template>\n <ContextMenuArrow v-bind="forwarded" :class="styles({ class: props.class })" />\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuArrow, useForwardProps } from "radix-vue";\n import type { ContextMenuArrowProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuArrowProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "border bg-muted",\n });\n</script>\n',
569
+ },
570
+ {
571
+ fileName: "ContextMenu/CheckboxItem.vue",
572
+ dirPath: "components/UI",
573
+ fileContent:
574
+ '<template>\n <ContextMenuCheckboxItem\n v-bind="{ ...props, ...useEmitAsProps(emits) }"\n :class="styles({ class: props.class })"\n >\n <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\n <UIContextMenuItemIndicator icon="lucide:check" />\n </span>\n <slot>\n <span v-if="title">{{ title }}</span>\n </slot>\n <slot name="shortcut">\n <UIContextMenuShortcut v-if="shortcut">{{ shortcut }}</UIContextMenuShortcut>\n </slot>\n </ContextMenuCheckboxItem>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuCheckboxItem, useEmitAsProps } from "radix-vue";\n import type { ContextMenuCheckboxItemEmits, ContextMenuCheckboxItemProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuCheckboxItemProps & {\n class?: any;\n shortcut?: string;\n title?: string;\n }\n >();\n\n const emits = defineEmits<ContextMenuCheckboxItemEmits>();\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:cursor-not-allowed data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
575
+ },
576
+ {
577
+ fileName: "ContextMenu/Content.vue",
578
+ dirPath: "components/UI",
579
+ fileContent:
580
+ '<template>\n <UIContextMenuPortal>\n <ContextMenuContent\n v-bind="{ ...forwarded, ...$attrs }"\n :class="styles({ class: props.class })"\n >\n <slot></slot>\n </ContextMenuContent>\n </UIContextMenuPortal>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuContent, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuContentEmits, ContextMenuContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = withDefaults(\n defineProps<\n ContextMenuContentProps & {\n class?: any;\n }\n >(),\n {\n loop: true,\n avoidCollisions: true,\n collisionPadding: 5,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<ContextMenuContentEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\n\n const styles = tv({\n base: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 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 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",\n });\n</script>\n',
581
+ },
582
+ {
583
+ fileName: "ContextMenu/ContextMenu.vue",
584
+ dirPath: "components/UI",
585
+ fileContent:
586
+ '<template>\n <ContextMenuRoot v-bind="forwarded">\n <slot></slot>\n </ContextMenuRoot>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuRoot, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuRootEmits, ContextMenuRootProps } from "radix-vue";\n\n const props = defineProps<ContextMenuRootProps>();\n const emit = defineEmits<ContextMenuRootEmits>();\n const forwarded = useForwardPropsEmits(props, emit);\n</script>\n',
587
+ },
588
+ {
589
+ fileName: "ContextMenu/Group.vue",
590
+ dirPath: "components/UI",
591
+ fileContent:
592
+ '<template>\n <ContextMenuGroup v-bind="forwarded">\n <slot></slot>\n </ContextMenuGroup>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuGroup, useForwardProps } from "radix-vue";\n import type { ContextMenuGroupProps } from "radix-vue";\n\n const props = defineProps<ContextMenuGroupProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
593
+ },
594
+ {
595
+ fileName: "ContextMenu/Item.vue",
596
+ dirPath: "components/UI",
597
+ fileContent:
598
+ '<template>\n <ContextMenuItem\n v-bind="{ ...forwarded, ...useEmitAsProps(emits) }"\n :class="styles({ inset, class: props.class })"\n >\n <slot>\n <span v-if="title">{{ title }}</span>\n </slot>\n <slot name="shortcut">\n <UIContextMenuShortcut v-if="shortcut">{{ shortcut }}</UIContextMenuShortcut>\n </slot>\n </ContextMenuItem>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuItem, useEmitAsProps } from "radix-vue";\n import type { ContextMenuItemEmits, ContextMenuItemProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuItemProps & {\n class?: any;\n inset?: boolean;\n shortcut?: string;\n title?: string;\n }\n >();\n\n const forwarded = useOmit(props, ["class", "inset", "shortcut", "title"]);\n\n const emits = defineEmits<ContextMenuItemEmits>();\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center gap-2.5 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:cursor-not-allowed data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n variants: {\n inset: {\n true: "pl-8",\n },\n },\n });\n</script>\n',
599
+ },
600
+ {
601
+ fileName: "ContextMenu/ItemIndicator.vue",
602
+ dirPath: "components/UI",
603
+ fileContent:
604
+ '<template>\n <ContextMenuItemIndicator v-bind="forwarded">\n <slot>\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n </slot>\n </ContextMenuItemIndicator>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuItemIndicator, useForwardProps } from "radix-vue";\n import type { ContextMenuItemIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuItemIndicatorProps & {\n icon?: string;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["icon"]));\n</script>\n',
605
+ },
606
+ {
607
+ fileName: "ContextMenu/Label.vue",
608
+ dirPath: "components/UI",
609
+ fileContent:
610
+ '<template>\n <ContextMenuLabel :class="styles({ inset, class: props.class })" v-bind="forwarded">\n <slot>{{ label }}</slot>\n </ContextMenuLabel>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuLabel, useForwardProps } from "radix-vue";\n import type { ContextMenuLabelProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuLabelProps & {\n class?: any;\n inset?: boolean;\n label?: string;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class", "inset", "label"]));\n\n const styles = tv({\n base: "inline-block w-full px-2 py-1.5 text-sm font-semibold text-foreground",\n variants: {\n inset: { true: "pl-8" },\n },\n });\n</script>\n',
611
+ },
612
+ {
613
+ fileName: "ContextMenu/Portal.vue",
614
+ dirPath: "components/UI",
615
+ fileContent:
616
+ '<template>\n <ContextMenuPortal v-bind="props">\n <slot></slot>\n </ContextMenuPortal>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuPortal } from "radix-vue";\n import type { ContextMenuPortalProps } from "radix-vue";\n\n const props = defineProps<ContextMenuPortalProps>();\n</script>\n',
617
+ },
618
+ {
619
+ fileName: "ContextMenu/RadioGroup.vue",
620
+ dirPath: "components/UI",
621
+ fileContent:
622
+ '<template>\n <ContextMenuRadioGroup v-bind="forwarded">\n <slot></slot>\n </ContextMenuRadioGroup>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuRadioGroup, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuRadioGroupEmits, ContextMenuRadioGroupProps } from "radix-vue";\n\n const props = defineProps<ContextMenuRadioGroupProps>();\n\n const emits = defineEmits<ContextMenuRadioGroupEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
623
+ },
624
+ {
625
+ fileName: "ContextMenu/RadioItem.vue",
626
+ dirPath: "components/UI",
627
+ fileContent:
628
+ '<template>\n <ContextMenuRadioItem v-bind="forwarded" :class="styles({ class: props.class })">\n <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\n <UIContextMenuItemIndicator>\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n <Icon v-else name="ph:circle-fill" class="h-2 w-2" />\n </UIContextMenuItemIndicator>\n </span>\n <slot>{{ title }}</slot>\n </ContextMenuRadioItem>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuRadioItem, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuRadioItemEmits, ContextMenuRadioItemProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuRadioItemProps & {\n class?: any;\n icon?: string;\n title?: string;\n }\n >();\n\n const emits = defineEmits<ContextMenuRadioItemEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["icon", "title", "class"]), emits);\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:cursor-not-allowed data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
629
+ },
630
+ {
631
+ fileName: "ContextMenu/Separator.vue",
632
+ dirPath: "components/UI",
633
+ fileContent:
634
+ '<template>\n <ContextMenuSeparator :class="styles({ class: props.class })" v-bind="forwarded" />\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuSeparator, useForwardProps } from "radix-vue";\n import type { ContextMenuSeparatorProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuSeparatorProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "-mx-1 my-1 h-px bg-border",\n });\n</script>\n',
635
+ },
636
+ {
637
+ fileName: "ContextMenu/Shortcut.vue",
638
+ dirPath: "components/UI",
639
+ fileContent:
640
+ '<template>\n <Primitive :as="as || \'span\'" :as-child="asChild" :class="styles({ class: props.class })">\n <slot />\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "ml-auto text-xs tracking-widest text-muted-foreground",\n });\n</script>\n',
641
+ },
642
+ {
643
+ fileName: "ContextMenu/Sub.vue",
644
+ dirPath: "components/UI",
645
+ fileContent:
646
+ '<template>\n <ContextMenuSub v-bind="forwarded">\n <slot></slot>\n </ContextMenuSub>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuSub, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuSubEmits, ContextMenuSubProps } from "radix-vue";\n\n const props = defineProps<ContextMenuSubProps>();\n const emits = defineEmits<ContextMenuSubEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
647
+ },
648
+ {
649
+ fileName: "ContextMenu/SubContent.vue",
650
+ dirPath: "components/UI",
651
+ fileContent:
652
+ '<template>\n <UIContextMenuPortal>\n <ContextMenuSubContent\n v-bind="{ ...forwarded, ...$attrs }"\n :class="styles({ class: props.class })"\n >\n <slot></slot>\n </ContextMenuSubContent>\n </UIContextMenuPortal>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuSubContent, useForwardPropsEmits } from "radix-vue";\n import type { ContextMenuSubContentEmits, ContextMenuSubContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n ContextMenuSubContentProps & {\n class?: any;\n }\n >(),\n {\n loop: true,\n avoidCollisions: true,\n collisionPadding: 8,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<ContextMenuSubContentEmits>();\n\n const styles = tv({\n base: "z-50 min-w-[100px] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 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 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",\n });\n\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\n</script>\n',
653
+ },
654
+ {
655
+ fileName: "ContextMenu/SubTrigger.vue",
656
+ dirPath: "components/UI",
657
+ fileContent:
658
+ '<template>\n <ContextMenuSubTrigger v-bind="props" :class="styles({ inset, class: props.class })">\n <slot>\n <span v-if="title">{{ title }}</span>\n </slot>\n <Icon class="ml-auto h-4 w-4" :name="icon || \'lucide:chevron-right\'" />\n </ContextMenuSubTrigger>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuSubTrigger } from "radix-vue";\n import type { ContextMenuSubTriggerProps } from "radix-vue";\n\n const props = defineProps<\n ContextMenuSubTriggerProps & {\n class?: any;\n inset?: boolean;\n icon?: string;\n title?: string;\n }\n >();\n\n const styles = tv({\n base: "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[highlighted]:bg-accent data-[state=open]:bg-accent data-[highlighted]:text-accent-foreground data-[state=open]:text-accent-foreground",\n variants: {\n inset: {\n true: "pl-8",\n },\n },\n });\n</script>\n',
659
+ },
660
+ {
661
+ fileName: "ContextMenu/Trigger.vue",
662
+ dirPath: "components/UI",
663
+ fileContent:
664
+ '<template>\n <ContextMenuTrigger v-bind="props">\n <slot></slot>\n </ContextMenuTrigger>\n</template>\n\n<script lang="ts" setup>\n import { ContextMenuTrigger } from "radix-vue";\n import type { ContextMenuTriggerProps } from "radix-vue";\n\n const props = defineProps<ContextMenuTriggerProps>();\n</script>\n',
665
+ },
666
+ ],
667
+ utils: [],
668
+ composables: [],
669
+ },
670
+ {
671
+ name: "Datepicker",
672
+ value: "datepicker",
673
+ deps: [],
674
+ devDeps: ["@samk-dev/nuxt-vcalendar"],
675
+ nuxtModules: ["@samk-dev/nuxt-vcalendar"],
676
+ instructions: [
677
+ "You can customize the datepicker by adding options to your nuxt.config.js file",
678
+ ],
679
+ files: [
680
+ {
681
+ fileName: "Datepicker.vue",
682
+ dirPath: "components/UI",
683
+ fileContent:
684
+ '<template>\n <ClientOnly>\n <VDatePicker\n :trimWeeks="props.trimWeeks || true"\n :is-dark="$colorMode.value == \'dark\'"\n v-bind="$attrs"\n >\n <template v-for="(_, slot) in $slots" v-slot:[slot]="scope">\n <slot :name="slot" v-bind="scope"></slot>\n </template>\n </VDatePicker>\n </ClientOnly>\n</template>\n\n<script lang="ts" setup>\n import { Calendar, DatePicker } from "v-calendar";\n\n defineOptions({ inheritAttrs: false });\n\n // @ts-ignore\n interface Props\n extends /* @vue-ignore */ Partial<InstanceType<typeof Calendar>["$props"]>,\n /* @vue-ignore */ Omit<Partial<InstanceType<typeof DatePicker>["$props"]>, "attributes"> {}\n\n const props = defineProps<Props & { trimWeeks?: boolean }>();\n</script>\n\n<style>\n :root {\n --vc-font-family: var(--font-sans);\n --vc-rounded-full: var(--radius);\n --vc-font-bold: 500;\n --vc-font-semibold: 600;\n --vc-text-lg: 16px;\n }\n\n .vc-light,\n .vc-dark {\n --vc-bg: theme("colors.background");\n --vc-border: theme("colors.border");\n --vc-focus-ring: 0 0 0 3px hsl(var(--primary) / 30%);\n --vc-weekday-color: theme("colors.muted.foreground");\n --vc-popover-content-color: theme("colors.popover.foreground");\n --vc-hover-bg: theme("colors.accent.DEFAULT");\n --vc-popover-content-bg: theme("colors.popover.DEFAULT");\n --vc-popover-content-border: theme("colors.border");\n --vc-header-arrow-hover-bg: theme("colors.accent.DEFAULT");\n --vc-weeknumber-color: theme("colors.muted.foreground");\n --vc-nav-hover-bg: theme("colors.accent.DEFAULT");\n\n --vc-nav-item-active-color: theme("colors.primary.foreground");\n --vc-nav-item-active-bg: theme("colors.primary.DEFAULT");\n\n --vc-time-select-group-bg: theme("colors.background");\n --vc-time-select-group-border: theme("colors.border");\n --vc-time-picker-border: theme("colors.border");\n\n &.vc-attr,\n & .vc-attr {\n --vc-content-color: theme("colors.primary.DEFAULT");\n --vc-highlight-outline-bg: theme("colors.primary.DEFAULT");\n --vc-highlight-outline-border: theme("colors.primary.DEFAULT");\n --vc-highlight-outline-content-color: theme("colors.primary.foreground");\n --vc-highlight-light-bg: var(--vc-accent-200); /* Highlighted color between two dates */\n --vc-highlight-light-content-color: theme("colors.secondary.foreground");\n --vc-highlight-solid-bg: theme("colors.primary.DEFAULT");\n --vc-highlight-solid-content-color: theme("colors.primary.foreground");\n }\n }\n\n .vc-blue {\n --vc-accent-200: theme("colors.primary.DEFAULT / 20%");\n --vc-accent-400: theme("colors.primary.DEFAULT");\n --vc-accent-500: theme("colors.primary.DEFAULT");\n --vc-accent-600: theme("colors.primary.DEFAULT / 70%");\n }\n\n .dark {\n .vc-blue {\n --vc-accent-200: theme("colors.primary.DEFAULT / 20%");\n --vc-accent-400: theme("colors.primary.DEFAULT");\n --vc-accent-500: theme("colors.primary.DEFAULT / 70%");\n }\n }\n .vc-header .vc-title {\n @apply font-medium;\n }\n .vc-weekdays {\n @apply my-2 font-normal;\n }\n .vc-day-content,\n .vc-day,\n .vc-highlight {\n @apply h-9 w-9 rounded-md;\n }\n .vc-focus {\n @apply focus-within:shadow-none;\n }\n .vc-day {\n @apply mb-1.5;\n }\n\n .vc-base-icon {\n @apply h-4 w-4 stroke-1;\n }\n .vc-header .vc-arrow,\n .vc-nav-arrow {\n @apply h-7 w-7 rounded-md;\n border: 1px solid hsl(var(--border));\n }\n .vc-header .vc-prev,\n .vc-header .vc-next {\n @apply border;\n }\n .weekday-position-1 .vc-highlights {\n @apply rounded-l-md;\n }\n .weekday-position-7 .vc-highlights {\n @apply rounded-r-md;\n }\n .vc-highlight-bg-light {\n @apply bg-accent;\n }\n .vc-nav-item {\n @apply font-medium;\n }\n .vc-header .vc-title-wrapper {\n @apply decoration-accent-foreground/60 underline-offset-2 hover:underline;\n }\n .vc-highlights + .vc-day-content {\n @apply hover:bg-accent/5;\n }\n</style>\n',
685
+ },
686
+ ],
687
+ utils: [],
688
+ composables: [],
689
+ },
690
+ {
691
+ name: "Dialog",
692
+ value: "dialog",
693
+ deps: ["radix-vue", "tailwind-variants"],
694
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
695
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
696
+ files: [
697
+ {
698
+ fileName: "Dialog/Close.vue",
699
+ dirPath: "components/UI",
700
+ fileContent:
701
+ '<template>\n <DialogClose v-bind="props">\n <slot> </slot>\n </DialogClose>\n</template>\n\n<script lang="ts" setup>\n import { DialogClose } from "radix-vue";\n import type { DialogCloseProps } from "radix-vue";\n\n const props = defineProps<DialogCloseProps>();\n</script>\n',
702
+ },
703
+ {
704
+ fileName: "Dialog/Content.vue",
705
+ dirPath: "components/UI",
706
+ fileContent:
707
+ '<template>\n <UIDialogPortal>\n <UIDialogOverlay />\n <DialogContent :class="styles({ class: props.class })" v-bind="{ ...forwarded, ...$attrs }">\n <slot>\n <slot name="header">\n <UIDialogHeader>\n <slot name="title">\n <UIDialogTitle v-if="title" :title="title" />\n </slot>\n <slot name="description">\n <UIDialogDescription v-if="description" :description="description" />\n </slot>\n </UIDialogHeader>\n </slot>\n <slot name="content"></slot>\n <slot name="footer"></slot>\n </slot>\n <slot name="close">\n <UIDialogClose :icon="icon" />\n </slot>\n <UIDialogClose\n v-if="!hideClose"\n class="absolute right-4 top-2 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"\n >\n <Icon name="lucide:x" class="h-4 w-4" />\n <span class="sr-only">Close</span>\n </UIDialogClose>\n </DialogContent>\n </UIDialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { DialogContent, useForwardPropsEmits } from "radix-vue";\n import type { DialogContentEmits, DialogContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = defineProps<\n DialogContentProps & {\n icon?: string;\n title?: string;\n description?: string;\n class?: any;\n hideClose?: boolean;\n }\n >();\n const emits = defineEmits<DialogContentEmits>();\n const forwarded = useForwardPropsEmits(\n useOmit(props, ["icon", "title", "description", "class", "hideClose"]),\n emits\n );\n\n const styles = tv({\n base: "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",\n });\n</script>\n',
708
+ },
709
+ {
710
+ fileName: "Dialog/Description.vue",
711
+ dirPath: "components/UI",
712
+ fileContent:
713
+ '<template>\n <DialogDescription :class="styles({ class: props.class })" v-bind="forwarded">\n <slot>{{ description }}</slot>\n </DialogDescription>\n</template>\n\n<script lang="ts" setup>\n import { DialogDescription, useForwardProps } from "radix-vue";\n import type { DialogDescriptionProps } from "radix-vue";\n\n const props = defineProps<\n DialogDescriptionProps & {\n class?: any;\n description?: string;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["description", "class"]));\n\n const styles = tv({\n base: "text-sm text-muted-foreground",\n });\n</script>\n',
714
+ },
715
+ {
716
+ fileName: "Dialog/Dialog.vue",
717
+ dirPath: "components/UI",
718
+ fileContent:
719
+ '<template>\n <DialogRoot v-bind="forwarded">\n <slot></slot>\n </DialogRoot>\n</template>\n\n<script lang="ts" setup>\n import { DialogRoot, useForwardPropsEmits } from "radix-vue";\n import type { DialogRootEmits, DialogRootProps } from "radix-vue";\n\n const props = defineProps<DialogRootProps>();\n const emit = defineEmits<DialogRootEmits>();\n const forwarded = useForwardPropsEmits(props, emit);\n</script>\n',
720
+ },
721
+ {
722
+ fileName: "Dialog/Footer.vue",
723
+ dirPath: "components/UI",
724
+ fileContent:
725
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",\n });\n</script>\n',
726
+ },
727
+ {
728
+ fileName: "Dialog/Header.vue",
729
+ dirPath: "components/UI",
730
+ fileContent:
731
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive, useForwardProps } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n\n const styles = tv({\n base: "flex flex-col space-y-1.5 text-center sm:text-left",\n });\n</script>\n',
732
+ },
733
+ {
734
+ fileName: "Dialog/Overlay.vue",
735
+ dirPath: "components/UI",
736
+ fileContent:
737
+ '<template>\n <DialogOverlay :class="styles({ class: props.class })" v-bind="forwarded" />\n</template>\n\n<script lang="ts" setup>\n import { DialogOverlay, useForwardProps } from "radix-vue";\n import type { DialogOverlayProps } from "radix-vue";\n\n const props = defineProps<\n DialogOverlayProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n const styles = tv({\n base: "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-fadeOut data-[state=open]:animate-fadeIn",\n });\n</script>\n',
738
+ },
739
+ {
740
+ fileName: "Dialog/Portal.vue",
741
+ dirPath: "components/UI",
742
+ fileContent:
743
+ '<template>\n <DialogPortal v-bind="props">\n <slot></slot>\n </DialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { DialogPortal, useForwardProps } from "radix-vue";\n import type { DialogPortalProps } from "radix-vue";\n\n const props = defineProps<DialogPortalProps>();\n</script>\n',
744
+ },
745
+ {
746
+ fileName: "Dialog/Title.vue",
747
+ dirPath: "components/UI",
748
+ fileContent:
749
+ '<template>\n <DialogTitle :class="styles({ class: props.class })" v-bind="forwarded">\n <slot>{{ title }}</slot>\n </DialogTitle>\n</template>\n\n<script lang="ts" setup>\n import { DialogTitle, useForwardProps } from "radix-vue";\n import type { DialogTitleProps } from "radix-vue";\n\n const props = defineProps<\n DialogTitleProps & {\n class?: any;\n title?: string;\n }\n >();\n const forwarded = useForwardProps(useOmit(props, ["title", "class"]));\n\n const styles = tv({\n base: "text-lg font-semibold leading-none tracking-tight",\n });\n</script>\n',
750
+ },
751
+ {
752
+ fileName: "Dialog/Trigger.vue",
753
+ dirPath: "components/UI",
754
+ fileContent:
755
+ '<template>\n <DialogTrigger v-bind="props">\n <slot></slot>\n </DialogTrigger>\n</template>\n\n<script lang="ts" setup>\n import { DialogTrigger, useForwardProps } from "radix-vue";\n import type { DialogTriggerProps } from "radix-vue";\n\n const props = defineProps<DialogTriggerProps>();\n</script>\n',
756
+ },
757
+ ],
758
+ utils: [],
759
+ composables: [],
760
+ },
761
+ {
762
+ name: "Dropdown Menu",
763
+ value: "dropdown-menu",
764
+ deps: ["radix-vue", "tailwind-variants"],
765
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
766
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
767
+ files: [
768
+ {
769
+ fileName: "DropdownMenu/Arrow.vue",
770
+ dirPath: "components/UI",
771
+ fileContent:
772
+ '<template>\r\n <DropdownMenuArrow v-bind="forwarded" :class="styles({ class: props.class })" />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuArrow, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuArrowProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n DropdownMenuArrowProps & {\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n asChild: false,\r\n width: 10,\r\n height: 5,\r\n }\r\n );\r\n const forwarded = useForwardProps(useOmit(props, ["class"]));\r\n\r\n const styles = tv({\r\n base: "rotate-45 border bg-muted",\r\n });\r\n</script>\r\n',
773
+ },
774
+ {
775
+ fileName: "DropdownMenu/CheckboxItem.vue",
776
+ dirPath: "components/UI",
777
+ fileContent:
778
+ '<template>\r\n <DropdownMenuCheckboxItem v-bind="forwarded" :class="styles({ class: props.class })">\r\n <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\r\n <UIDropdownMenuItemIndicator icon="lucide:check" />\r\n </span>\r\n <slot>\r\n <span v-if="title">{{ title }}</span>\r\n </slot>\r\n <slot name="shortcut">\r\n <UIDropdownMenuShortcut v-if="shortcut">{{ shortcut }}</UIDropdownMenuShortcut>\r\n </slot>\r\n </DropdownMenuCheckboxItem>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuCheckboxItem, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuCheckboxItemEmits, DropdownMenuCheckboxItemProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuCheckboxItemProps & {\r\n class?: any;\r\n shortcut?: string;\r\n title?: string;\r\n }\r\n >();\r\n const emits = defineEmits<DropdownMenuCheckboxItemEmits>();\r\n const forwarded = useForwardPropsEmits(props, emits);\r\n\r\n const styles = tv({\r\n base: "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",\r\n });\r\n</script>\r\n',
779
+ },
780
+ {
781
+ fileName: "DropdownMenu/Content.vue",
782
+ dirPath: "components/UI",
783
+ fileContent:
784
+ '<template>\r\n <UIDropdownMenuPortal>\r\n <DropdownMenuContent\r\n v-bind="{ ...forwarded, ...$attrs }"\r\n :class="styles({ class: props.class })"\r\n >\r\n <slot></slot>\r\n </DropdownMenuContent>\r\n </UIDropdownMenuPortal>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuContent, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuContentEmits, DropdownMenuContentProps } from "radix-vue";\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n DropdownMenuContentProps & {\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n loop: true,\r\n align: "center",\r\n sideOffset: 5,\r\n side: "bottom",\r\n avoidCollisions: true,\r\n sticky: "partial",\r\n }\r\n );\r\n\r\n const emits = defineEmits<DropdownMenuContentEmits>();\r\n\r\n const styles = tv({\r\n base: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-accent-foreground shadow-md 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 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",\r\n });\r\n\r\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\r\n</script>\r\n',
785
+ },
786
+ {
787
+ fileName: "DropdownMenu/DropdownMenu.vue",
788
+ dirPath: "components/UI",
789
+ fileContent:
790
+ '<template>\r\n <DropdownMenuRoot v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuRoot>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuRoot, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuRootEmits, DropdownMenuRootProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuRootProps>();\r\n\r\n const emit = defineEmits<DropdownMenuRootEmits>();\r\n const forwarded = useForwardPropsEmits(props, emit);\r\n</script>\r\n',
791
+ },
792
+ {
793
+ fileName: "DropdownMenu/Group.vue",
794
+ dirPath: "components/UI",
795
+ fileContent:
796
+ '<template>\r\n <DropdownMenuGroup v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuGroup>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuGroup, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuGroupProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuGroupProps>();\r\n const forwarded = useForwardProps(props);\r\n</script>\r\n',
797
+ },
798
+ {
799
+ fileName: "DropdownMenu/Item.vue",
800
+ dirPath: "components/UI",
801
+ fileContent:
802
+ '<template>\r\n <DropdownMenuItem v-bind="forwarded" :class="styles({ inset, class: props.class })">\r\n <slot>\r\n <slot name="icon">\r\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\r\n </slot>\r\n <slot name="title">\r\n <span v-if="title">{{ title }}</span>\r\n </slot>\r\n </slot>\r\n <slot name="shortcut">\r\n <UIDropdownMenuShortcut v-if="shortcut">{{ shortcut }}</UIDropdownMenuShortcut>\r\n </slot>\r\n </DropdownMenuItem>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuItem, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuItemEmits, DropdownMenuItemProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuItemProps & {\r\n class?: any;\r\n inset?: boolean;\r\n shortcut?: string;\r\n title?: string;\r\n icon?: string;\r\n }\r\n >();\r\n\r\n const emits = defineEmits<DropdownMenuItemEmits>();\r\n const forwarded = useForwardPropsEmits(\r\n useOmit(props, ["class", "inset", "shortcut", "icon"]),\r\n emits\r\n );\r\n\r\n const styles = tv({\r\n base: "relative flex cursor-default select-none items-center gap-3 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",\r\n variants: {\r\n inset: {\r\n true: "pl-8",\r\n },\r\n },\r\n });\r\n</script>\r\n',
803
+ },
804
+ {
805
+ fileName: "DropdownMenu/ItemIndicator.vue",
806
+ dirPath: "components/UI",
807
+ fileContent:
808
+ '<template>\r\n <DropdownMenuItemIndicator v-bind="forwarded">\r\n <slot>\r\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\r\n </slot>\r\n </DropdownMenuItemIndicator>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuItemIndicator, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuItemIndicatorProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuItemIndicatorProps & {\r\n icon?: string;\r\n }\r\n >();\r\n const forwarded = useForwardProps(useOmit(props, ["icon"]));\r\n</script>\r\n',
809
+ },
810
+ {
811
+ fileName: "DropdownMenu/Label.vue",
812
+ dirPath: "components/UI",
813
+ fileContent:
814
+ '<template>\r\n <DropdownMenuLabel :class="styles({ inset, class: props.class })" v-bind="forwarded">\r\n <slot>{{ label }}</slot>\r\n </DropdownMenuLabel>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuLabel, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuLabelProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuLabelProps & {\r\n class?: any;\r\n inset?: boolean;\r\n label?: string;\r\n }\r\n >();\r\n const forwarded = useForwardProps(useOmit(props, ["class", "inset", "label"]));\r\n\r\n const styles = tv({\r\n base: "inline-block w-full px-2 py-1.5 text-sm font-semibold text-foreground",\r\n variants: {\r\n inset: { true: "pl-8" },\r\n },\r\n });\r\n</script>\r\n',
815
+ },
816
+ {
817
+ fileName: "DropdownMenu/Portal.vue",
818
+ dirPath: "components/UI",
819
+ fileContent:
820
+ '<template>\r\n <DropdownMenuPortal v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuPortal>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuPortal, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuPortalProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuPortalProps>();\r\n const forwarded = useForwardProps(props);\r\n</script>\r\n',
821
+ },
822
+ {
823
+ fileName: "DropdownMenu/RadioGroup.vue",
824
+ dirPath: "components/UI",
825
+ fileContent:
826
+ '<template>\r\n <DropdownMenuRadioGroup v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuRadioGroup>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuRadioGroup, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuRadioGroupEmits, DropdownMenuRadioGroupProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuRadioGroupProps>();\r\n\r\n const emits = defineEmits<DropdownMenuRadioGroupEmits>();\r\n\r\n const forwarded = useForwardPropsEmits(props, emits);\r\n</script>\r\n',
827
+ },
828
+ {
829
+ fileName: "DropdownMenu/RadioItem.vue",
830
+ dirPath: "components/UI",
831
+ fileContent:
832
+ '<template>\r\n <DropdownMenuRadioItem v-bind="forwarded" :class="styles({ class: props.class })">\r\n <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\r\n <UIDropdownMenuItemIndicator>\r\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\r\n <Icon v-else name="ph:circle-fill" class="h-2 w-2" />\r\n </UIDropdownMenuItemIndicator>\r\n </span>\r\n <slot>{{ title }}</slot>\r\n </DropdownMenuRadioItem>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuRadioItem, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuRadioItemEmits, DropdownMenuRadioItemProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuRadioItemProps & {\r\n class?: any;\r\n icon?: string;\r\n title?: string;\r\n }\r\n >();\r\n\r\n const emits = defineEmits<DropdownMenuRadioItemEmits>();\r\n const forwarded = useForwardPropsEmits(useOmit(props, ["class", "icon"]), emits);\r\n\r\n const styles = tv({\r\n base: "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",\r\n });\r\n</script>\r\n',
833
+ },
834
+ {
835
+ fileName: "DropdownMenu/Separator.vue",
836
+ dirPath: "components/UI",
837
+ fileContent:
838
+ '<template>\r\n <DropdownMenuSeparator :class="styles({ class: props.class })" v-bind="forwarded" />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuSeparator, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuSeparatorProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuSeparatorProps & {\r\n class?: any;\r\n }\r\n >();\r\n const forwarded = useForwardProps(useOmit(props, ["class"]));\r\n\r\n const styles = tv({\r\n base: "-mx-1 my-1 h-px bg-border",\r\n });\r\n</script>\r\n',
839
+ },
840
+ {
841
+ fileName: "DropdownMenu/Shortcut.vue",
842
+ dirPath: "components/UI",
843
+ fileContent:
844
+ '<template>\r\n <Primitive :class="styles({ class: props.class })" v-bind="forwarded">\r\n <slot />\r\n </Primitive>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Primitive, useForwardProps } from "radix-vue";\r\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n PrimitiveProps & {\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n as: "span",\r\n }\r\n );\r\n const forwarded = useForwardProps(useOmit(props, ["class"]));\r\n\r\n const styles = tv({\r\n base: "ml-auto text-xs tracking-widest opacity-60",\r\n });\r\n</script>\r\n',
845
+ },
846
+ {
847
+ fileName: "DropdownMenu/Sub.vue",
848
+ dirPath: "components/UI",
849
+ fileContent:
850
+ '<template>\r\n <DropdownMenuSub v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuSub>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuSub, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuSubEmits, DropdownMenuSubProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuSubProps>();\r\n const emits = defineEmits<DropdownMenuSubEmits>();\r\n const forwarded = useForwardPropsEmits(props, emits);\r\n</script>\r\n',
851
+ },
852
+ {
853
+ fileName: "DropdownMenu/SubContent.vue",
854
+ dirPath: "components/UI",
855
+ fileContent:
856
+ '<template>\r\n <DropdownMenuPortal>\r\n <DropdownMenuSubContent\r\n v-bind="{ ...forwarded, ...$attrs }"\r\n :class="styles({ class: props.class })"\r\n >\r\n <slot></slot>\r\n </DropdownMenuSubContent>\r\n </DropdownMenuPortal>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuSubContent, useForwardPropsEmits } from "radix-vue";\r\n import type { DropdownMenuSubContentEmits, DropdownMenuSubContentProps } from "radix-vue";\r\n\r\n defineOptions({ inheritAttrs: false });\r\n const props = withDefaults(\r\n defineProps<\r\n DropdownMenuSubContentProps & {\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n loop: true,\r\n sideOffset: 8,\r\n avoidCollisions: true,\r\n collisionPadding: 5,\r\n sticky: "partial",\r\n }\r\n );\r\n\r\n const emits = defineEmits<DropdownMenuSubContentEmits>();\r\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\r\n\r\n const styles = tv({\r\n base: "z-50 min-w-[180px] overflow-hidden rounded-md border bg-popover p-1 text-accent-foreground shadow-lg 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 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",\r\n });\r\n</script>\r\n',
857
+ },
858
+ {
859
+ fileName: "DropdownMenu/SubTrigger.vue",
860
+ dirPath: "components/UI",
861
+ fileContent:
862
+ '<template>\r\n <DropdownMenuSubTrigger v-bind="forwarded" :class="styles({ inset, class: props.class })">\r\n <slot>\r\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\r\n <span v-if="title">{{ title }}</span>\r\n </slot>\r\n <Icon\r\n class="ml-auto h-4 w-4 text-muted-foreground"\r\n :name="trailingIcon || \'lucide:chevron-right\'"\r\n />\r\n </DropdownMenuSubTrigger>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuSubTrigger, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuSubTriggerProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n DropdownMenuSubTriggerProps & {\r\n class?: any;\r\n inset?: boolean;\r\n asChild?: boolean;\r\n icon?: string;\r\n title?: string;\r\n trailingIcon?: string;\r\n }\r\n >();\r\n const forwarded = useForwardProps(\r\n useOmit(props, ["class", "inset", "asChild", "icon", "trailingIcon"])\r\n );\r\n\r\n const styles = tv({\r\n base: "flex cursor-default select-none items-center gap-3 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",\r\n variants: {\r\n inset: {\r\n true: "pl-8",\r\n },\r\n },\r\n });\r\n</script>\r\n',
863
+ },
864
+ {
865
+ fileName: "DropdownMenu/Trigger.vue",
866
+ dirPath: "components/UI",
867
+ fileContent:
868
+ '<template>\r\n <DropdownMenuTrigger v-bind="forwarded">\r\n <slot></slot>\r\n </DropdownMenuTrigger>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { DropdownMenuTrigger, useForwardProps } from "radix-vue";\r\n import type { DropdownMenuTriggerProps } from "radix-vue";\r\n\r\n const props = defineProps<DropdownMenuTriggerProps>();\r\n const forwarded = useForwardProps(props);\r\n</script>\r\n',
869
+ },
870
+ ],
871
+ utils: [],
872
+ composables: [],
873
+ },
874
+ {
875
+ name: "Dropfile",
876
+ value: "dropfile",
877
+ deps: ["tailwind-variants"],
878
+ devDeps: ["nuxt-icon"],
879
+ nuxtModules: ["nuxt-icon"],
880
+ files: [
881
+ {
882
+ fileName: "Dropfile.vue",
883
+ dirPath: "components/UI",
884
+ fileContent:
885
+ '<template>\n <div @click="open()" ref="dropZoneRef" :class="styles({ isOverDropZone, class: props.class })">\n <slot name="message">\n <div class="py-10 text-center">\n <slot name="icon">\n <div\n v-if="icon"\n class="inline-flex items-center justify-center rounded-md border p-2 transition"\n :class="[isOverDropZone && \'animate-bounce border-primary\']"\n >\n <Icon\n :name="icon"\n class="h-7 w-7 opacity-70"\n :class="[isOverDropZone && \'text-primary\']"\n />\n </div>\n </slot>\n <slot name="title">\n <p class="mt-5 text-sm font-medium" v-html="title"></p>\n </slot>\n <slot name="subtext">\n <p class="mt-1 text-sm text-muted-foreground/60" v-html="subtext"></p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang="ts">\n const props = withDefaults(\n defineProps<{\n /**\n * The text to display as the title of the dropzone.\n */\n title?: string;\n /**\n * The text to display as the subtext of the dropzone.\n */\n subtext?: string;\n /**\n * The icon to display in the dropzone.\n */\n icon?: string;\n /**\n * The function to call when files are dropped.\n */\n onDrop?: Function;\n /**\n * Whether or not to allow multiple files to be picked. Does not affect drag and drop.\n */\n multiple?: boolean;\n /**\n * The file types to accept. Does not affect drag and drop.\n */\n accept?: string;\n class?: any;\n }>(),\n {\n title: "Click to upload or drag & drop files.",\n subtext: "All file types accepted",\n icon: "heroicons:cloud-arrow-up",\n multiple: true,\n accept: "*",\n }\n );\n\n const { open, reset, onChange } = useFileDialog({\n multiple: props.multiple,\n accept: props.accept,\n });\n\n onChange((files) => {\n handleDrop(Array.from(files || []));\n reset();\n });\n\n const dropZoneRef = ref<HTMLDivElement>();\n const emits = defineEmits<{\n dropped: [any];\n }>();\n\n const handleDrop = (files: File[] | null) => {\n if (!files) return;\n if (props.onDrop) props.onDrop(files);\n emits("dropped", files);\n };\n\n const { isOverDropZone } = useDropZone(dropZoneRef, handleDrop);\n\n const styles = tv({\n base: "flex w-full cursor-pointer items-center justify-center rounded-md border border-dashed transition hover:border-primary",\n variants: {\n isOverDropZone: { true: "border-primary bg-primary/10" },\n },\n });\n</script>\n',
886
+ },
887
+ ],
888
+ utils: [],
889
+ composables: [],
890
+ },
891
+ {
892
+ name: "Form",
893
+ value: "form",
894
+ deps: ["radix-vue", "tailwind-variants", "@vee-validate/nuxt"],
895
+ devDeps: [],
896
+ nuxtModules: ["@vee-validate/nuxt"],
897
+ composables: [
898
+ {
899
+ fileName: "useFormField.ts",
900
+ dirPath: "composables",
901
+ fileContent:
902
+ 'import { FORM_ITEM_INJECTION_KEY } from "@/components/UI/Form/Item.vue";\r\nimport {\r\n FieldContextKey,\r\n useFieldError,\r\n useIsFieldDirty,\r\n useIsFieldTouched,\r\n useIsFieldValid,\r\n} from "vee-validate";\r\nimport { inject } from "vue";\r\n\r\nexport function useFormField() {\r\n const fieldContext = inject(FieldContextKey);\r\n const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY);\r\n\r\n const fieldState = {\r\n valid: useIsFieldValid(),\r\n isDirty: useIsFieldDirty(),\r\n isTouched: useIsFieldTouched(),\r\n error: useFieldError(),\r\n };\r\n\r\n if (!fieldContext) throw new Error("useFormField should be used within <FormField>");\r\n\r\n const { name } = fieldContext;\r\n const id = fieldItemContext;\r\n\r\n return {\r\n id,\r\n name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n };\r\n}\r\n',
903
+ },
904
+ ],
905
+ files: [
906
+ {
907
+ fileName: "Form/Control.vue",
908
+ dirPath: "components/UI",
909
+ fileContent:
910
+ '<template>\r\n <Slot\r\n :id="formItemId"\r\n :aria-describedby="!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`"\r\n :aria-invalid="!!error"\r\n >\r\n <slot />\r\n </Slot>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Slot } from "radix-vue";\r\n\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\r\n</script>\r\n',
911
+ },
912
+ {
913
+ fileName: "Form/Description.vue",
914
+ dirPath: "components/UI",
915
+ fileContent:
916
+ '<template>\r\n <p :id="formDescriptionId" :class="styles({ class: props.class })" v-bind="$attrs">\r\n <slot>\r\n <ClientOnly>\r\n <p v-html="description"></p>\r\n </ClientOnly>\r\n </slot>\r\n </p>\r\n</template>\r\n<script lang="ts" setup>\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const { formDescriptionId } = useFormField();\r\n const props = defineProps<{ class?: any; description?: string }>();\r\n const styles = tv({ base: "text-sm text-muted-foreground" });\r\n</script>\r\n',
917
+ },
918
+ {
919
+ fileName: "Form/Item.vue",
920
+ dirPath: "components/UI",
921
+ fileContent:
922
+ '<template>\r\n <div :class="styles({ class: props.class })" v-bind="$attrs">\r\n <slot name="label">\r\n <UIFormLabel v-if="label || hint" :label="label" :hint="hint" />\r\n </slot>\r\n <UIFormControl>\r\n <slot />\r\n </UIFormControl>\r\n <slot name="description">\r\n <UIFormDescription v-if="description" :description="description" />\r\n </slot>\r\n <slot name="errorMessage">\r\n <TransitionSlide tag="p">\r\n <UIFormMessage v-if="!hideMessage" />\r\n </TransitionSlide>\r\n </slot>\r\n </div>\r\n</template>\r\n\r\n<script lang="ts">\r\n import { type InjectionKey } from "vue";\r\n\r\n export const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey<string>;\r\n</script>\r\n\r\n<script lang="ts" setup>\r\n import { useId } from "radix-vue";\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const id = useId();\r\n provide(FORM_ITEM_INJECTION_KEY, id);\r\n\r\n const props = defineProps<{\r\n class?: any;\r\n label?: string;\r\n description?: string;\r\n hint?: string;\r\n hideMessage?: boolean;\r\n }>();\r\n\r\n const styles = tv({ base: "space-y-1.5" });\r\n</script>\r\n',
923
+ },
924
+ {
925
+ fileName: "Form/Label.vue",
926
+ dirPath: "components/UI",
927
+ fileContent:
928
+ '<template>\r\n <Label\r\n :class="styles({ error: Boolean(error), class: props.class })"\r\n :for="formItemId"\r\n v-bind="$attrs"\r\n >\r\n <slot\r\n >{{ label }}\r\n <span class="ml-auto font-normal text-muted-foreground/80">{{ hint }}</span></slot\r\n >\r\n </Label>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Label } from "radix-vue";\r\n import type { LabelProps } from "radix-vue";\r\n\r\n defineOptions({ inheritAttrs: false });\r\n const props = defineProps<LabelProps & { class?: any; label?: string; hint?: string }>();\r\n\r\n const { error, formItemId } = useFormField();\r\n\r\n const styles = tv({\r\n base: "flex w-full items-center justify-between text-left text-sm font-medium tracking-tight text-foreground hover:cursor-pointer",\r\n variants: {\r\n error: {\r\n true: "text-destructive",\r\n },\r\n },\r\n });\r\n</script>\r\n',
929
+ },
930
+ {
931
+ fileName: "Form/Message.vue",
932
+ dirPath: "components/UI",
933
+ fileContent:
934
+ '<template>\r\n <ErrorMessage\r\n :id="formMessageId"\r\n as="p"\r\n :name="toValue(name)"\r\n class="text-sm font-medium text-destructive"\r\n />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n const { name, formMessageId } = useFormField();\r\n</script>\r\n',
935
+ },
936
+ ],
937
+ utils: [],
938
+ },
939
+ {
940
+ name: "Hover Card",
941
+ value: "hover-card",
942
+ deps: ["radix-vue", "tailwind-variants"],
943
+ devDeps: [],
944
+ nuxtModules: [],
945
+ files: [
946
+ {
947
+ fileName: "HoverCard/Arrow.vue",
948
+ dirPath: "components/UI",
949
+ fileContent:
950
+ '<template>\n <HoverCardArrow :class="styles({ class: props.class })" v-bind="props" />\n</template>\n\n<script lang="ts" setup>\n import { HoverCardArrow } from "radix-vue";\n import type { HoverCardArrowProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n HoverCardArrowProps & {\n class?: any;\n }\n >(),\n {\n height: 5,\n width: 10,\n }\n );\n\n const styles = tv({\n base: " fill-popover",\n });\n</script>\n',
951
+ },
952
+ {
953
+ fileName: "HoverCard/Content.vue",
954
+ dirPath: "components/UI",
955
+ fileContent:
956
+ '<template>\n <UIHoverCardPortal>\n <HoverCardContent v-bind="{ ...forwarded, ...$attrs }" :class="styles({ class: props.class })">\n <slot></slot>\n </HoverCardContent>\n </UIHoverCardPortal>\n</template>\n\n<script lang="ts" setup>\n import { HoverCardContent, useForwardProps } from "radix-vue";\n import type { HoverCardContentProps } from "radix-vue";\n\n const styles = tv({\n base: "z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none 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 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",\n });\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n HoverCardContentProps & {\n class?: any;\n }\n >(),\n {\n side: "bottom",\n sideOffset: 5,\n align: "center",\n avoidCollisions: true,\n sticky: "partial",\n }\n );\n\n const forwarded = useForwardProps(props);\n</script>\n',
957
+ },
958
+ {
959
+ fileName: "HoverCard/HoverCard.vue",
960
+ dirPath: "components/UI",
961
+ fileContent:
962
+ '<template>\n <HoverCardRoot v-bind="forwarded">\n <slot></slot>\n </HoverCardRoot>\n</template>\n\n<script lang="ts" setup>\n import { HoverCardRoot, useForwardPropsEmits } from "radix-vue";\n import type { HoverCardRootEmits, HoverCardRootProps } from "radix-vue";\n\n const props = withDefaults(defineProps<HoverCardRootProps>(), {\n openDelay: 200,\n closeDelay: 200,\n });\n\n const emits = defineEmits<HoverCardRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
963
+ },
964
+ {
965
+ fileName: "HoverCard/Portal.vue",
966
+ dirPath: "components/UI",
967
+ fileContent:
968
+ '<template>\n <HoverCardPortal v-bind="props">\n <slot></slot>\n </HoverCardPortal>\n</template>\n\n<script lang="ts" setup>\n import { HoverCardPortal } from "radix-vue";\n import type { HoverCardPortalProps } from "radix-vue";\n\n const props = defineProps<HoverCardPortalProps>();\n</script>\n',
969
+ },
970
+ {
971
+ fileName: "HoverCard/Trigger.vue",
972
+ dirPath: "components/UI",
973
+ fileContent:
974
+ '<template>\n <HoverCardTrigger v-bind="props">\n <slot></slot>\n </HoverCardTrigger>\n</template>\n\n<script lang="ts" setup>\n import { HoverCardTrigger } from "radix-vue";\n import type { HoverCardTriggerProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = defineProps<HoverCardTriggerProps>();\n</script>\n',
975
+ },
976
+ ],
977
+ utils: [],
978
+ composables: [],
979
+ },
980
+ {
981
+ name: "Input",
982
+ value: "input",
983
+ deps: ["radix-vue", "tailwind-variants"],
984
+ devDeps: ["nuxt-lodash", "@vueuse/core", "@vueuse/nuxt"],
985
+ nuxtModules: ["nuxt-lodash", "@vueuse/nuxt"],
986
+ files: [
987
+ {
988
+ fileName: "Input.vue",
989
+ dirPath: "components/UI",
990
+ fileContent:
991
+ '<template>\r\n <input :class="styles({ class: props.class })" v-bind="forwarded" v-model="localModel" />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { useForwardPropsEmits } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n class?: any;\r\n id?: string;\r\n name?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n required?: boolean;\r\n type?: string;\r\n modelValue?: any;\r\n }>(),\r\n { type: "text" }\r\n );\r\n const emits = defineEmits<{\r\n "update:modelValue": [value: any];\r\n }>();\r\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\r\n\r\n const localModel = useVModel(props, "modelValue", emits);\r\n\r\n const styles = tv({\r\n base: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground file:hover:cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm",\r\n });\r\n</script>\r\n',
992
+ },
993
+ ],
994
+ utils: [],
995
+ composables: [],
996
+ },
997
+ {
998
+ name: "Keyboard Key",
999
+ value: "kbd",
1000
+ deps: ["radix-vue", "tailwind-variants"],
1001
+ devDeps: [],
1002
+ nuxtModules: [],
1003
+ files: [
1004
+ {
1005
+ fileName: "Kbd.vue",
1006
+ dirPath: "components/UI",
1007
+ fileContent:
1008
+ '<template>\n <Primitive :class="styles({ size, class: props.class })" v-bind="props">\n <slot />\n </Primitive>\n</template>\n<script setup lang="ts">\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n size?: VariantProps<typeof styles>["size"];\n class?: any;\n }\n >(),\n {\n as: "kbd",\n size: "sm",\n }\n );\n\n const styles = tv({\n base: "pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded-md border border-border bg-muted font-sans font-medium",\n variants: {\n size: {\n xs: "h-5 min-h-[16px] px-1 text-[10px]",\n sm: "h-6 min-h-[20px] px-1.5 text-[11px]",\n md: "h-7 min-h-[24px] px-2 text-[12px]",\n },\n },\n defaultVariants: {\n size: "sm",\n },\n });\n</script>\n',
1009
+ },
1010
+ ],
1011
+ utils: [],
1012
+ composables: [],
1013
+ },
1014
+ {
1015
+ name: "Label",
1016
+ value: "label",
1017
+ deps: ["radix-vue", "tailwind-variants"],
1018
+ devDeps: ["nuxt-lodash"],
1019
+ nuxtModules: ["nuxt-lodash"],
1020
+ files: [
1021
+ {
1022
+ fileName: "Label.vue",
1023
+ dirPath: "components/UI",
1024
+ fileContent:
1025
+ '<template>\r\n <Label :class="styles({ class: props.class })" v-bind="forwarded">\r\n <slot />\r\n </Label>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Label, useForwardProps } from "radix-vue";\r\n import type { LabelProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n LabelProps & {\r\n class?: any;\r\n }\r\n >();\r\n const forwarded = useForwardProps(useOmit(props, ["class"]));\r\n\r\n const styles = tv({\r\n base: "inline-block text-sm font-medium leading-none hover:cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-70",\r\n });\r\n</script>\r\n',
1026
+ },
1027
+ ],
1028
+ utils: [],
1029
+ composables: [],
1030
+ },
1031
+ {
1032
+ name: "Menubar",
1033
+ value: "menubar",
1034
+ deps: ["radix-vue", "tailwind-variants"],
1035
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
1036
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
1037
+ files: [
1038
+ {
1039
+ fileName: "Menubar/Arrow.vue",
1040
+ dirPath: "components/UI",
1041
+ fileContent:
1042
+ '<template>\n <MenubarArrow v-bind="props" />\n</template>\n\n<script lang="ts" setup>\n import { MenubarArrow } from "radix-vue";\n import type { MenubarArrowProps } from "radix-vue";\n\n const props = withDefaults(defineProps<MenubarArrowProps>(), {\n width: 10,\n height: 5,\n });\n</script>\n',
1043
+ },
1044
+ {
1045
+ fileName: "Menubar/CheckboxItem.vue",
1046
+ dirPath: "components/UI",
1047
+ fileContent:
1048
+ '<template>\n <MenubarCheckboxItem v-bind="forwarded" :class="styles({ class: props.class })">\n <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\n <UIMenubarItemIndicator>\n <Icon :name="icon || \'lucide:check\'" class="h-4 w-4" />\n </UIMenubarItemIndicator>\n </span>\n <slot>{{ title }}</slot>\n <slot name="shortcut">\n <UIMenubarShortcut v-if="shortcut">{{ shortcut }}</UIMenubarShortcut>\n </slot>\n </MenubarCheckboxItem>\n</template>\n\n<script lang="ts" setup>\n import { MenubarCheckboxItem, useForwardPropsEmits } from "radix-vue";\n import type { MenubarCheckboxItemEmits, MenubarCheckboxItemProps } from "radix-vue";\n\n const props = defineProps<\n MenubarCheckboxItemProps & {\n icon?: string;\n class?: any;\n title?: string;\n shortcut?: string;\n }\n >();\n const emits = defineEmits<MenubarCheckboxItemEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
1049
+ },
1050
+ {
1051
+ fileName: "Menubar/Content.vue",
1052
+ dirPath: "components/UI",
1053
+ fileContent:
1054
+ '<template>\n <UIMenubarPortal :to="to">\n <MenubarContent v-bind="{ ...forwarded, ...$attrs }" :class="styles({ class: props.class })">\n <slot></slot>\n </MenubarContent>\n </UIMenubarPortal>\n</template>\n\n<script lang="ts" setup>\n import { MenubarContent, useForwardPropsEmits } from "radix-vue";\n import type { MenubarContentProps, MenubarSubContentEmits } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n MenubarContentProps & {\n to?: string | HTMLElement;\n class?: any;\n }\n >(),\n {\n loop: true,\n side: "bottom",\n sideOffset: 8,\n align: "start",\n alignOffset: -4,\n avoidCollisions: true,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<MenubarSubContentEmits>();\n\n const forwarded = useForwardPropsEmits(useOmit(props, ["class", "to"]), emits);\n\n const styles = tv({\n base: "z-50 min-w-[220px] overflow-hidden rounded-md border bg-popover p-1 text-accent-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-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",\n });\n</script>\n',
1055
+ },
1056
+ {
1057
+ fileName: "Menubar/Group.vue",
1058
+ dirPath: "components/UI",
1059
+ fileContent:
1060
+ '<template>\n <MenubarGroup v-bind="props">\n <slot></slot>\n </MenubarGroup>\n</template>\n\n<script lang="ts" setup>\n import { MenubarGroup } from "radix-vue";\n import type { MenubarGroupProps } from "radix-vue";\n\n const props = defineProps<MenubarGroupProps>();\n</script>\n',
1061
+ },
1062
+ {
1063
+ fileName: "Menubar/Item.vue",
1064
+ dirPath: "components/UI",
1065
+ fileContent:
1066
+ '<template>\n <MenubarItem v-bind="forwarded" :class="styles({ inset, class: props.class })">\n <slot>\n <slot name="icon">\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n </slot>\n <slot name="title">\n <span v-if="title">{{ title }}</span>\n </slot>\n </slot>\n <slot name="shortcut">\n <UIMenubarShortcut v-if="shortcut">{{ shortcut }}</UIMenubarShortcut>\n </slot>\n </MenubarItem>\n</template>\n\n<script lang="ts" setup>\n import { MenubarItem, useForwardPropsEmits } from "radix-vue";\n import type { MenubarItemEmits, MenubarItemProps } from "radix-vue";\n\n const props = defineProps<\n MenubarItemProps & {\n inset?: boolean;\n class?: any;\n shortcut?: string;\n title?: string;\n icon?: string;\n }\n >();\n\n const emits = defineEmits<MenubarItemEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center gap-3 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n variants: {\n inset: {\n true: "pl-8",\n },\n },\n });\n</script>\n',
1067
+ },
1068
+ {
1069
+ fileName: "Menubar/ItemIndicator.vue",
1070
+ dirPath: "components/UI",
1071
+ fileContent:
1072
+ '<template>\n <MenubarItemIndicator v-bind="props">\n <slot>\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n </slot>\n </MenubarItemIndicator>\n</template>\n\n<script lang="ts" setup>\n import { MenubarItemIndicator } from "radix-vue";\n import type { MenubarItemIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n MenubarItemIndicatorProps & {\n icon?: string;\n }\n >();\n</script>\n',
1073
+ },
1074
+ {
1075
+ fileName: "Menubar/Label.vue",
1076
+ dirPath: "components/UI",
1077
+ fileContent:
1078
+ '<template>\n <MenubarLabel :class="styles({ inset, class: props.class })" v-bind="props">\n <slot></slot>\n </MenubarLabel>\n</template>\n\n<script lang="ts" setup>\n import { MenubarLabel } from "radix-vue";\n import type { MenubarLabelProps } from "radix-vue";\n\n const props = defineProps<\n MenubarLabelProps & {\n class?: any;\n inset?: boolean;\n }\n >();\n\n const styles = tv({\n base: "px-2 py-1.5 text-sm font-semibold",\n variants: {\n inset: {\n true: "pl-8",\n },\n },\n });\n</script>\n',
1079
+ },
1080
+ {
1081
+ fileName: "Menubar/Menu.vue",
1082
+ dirPath: "components/UI",
1083
+ fileContent:
1084
+ '<template>\n <MenubarMenu v-bind="forwarded">\n <slot></slot>\n </MenubarMenu>\n</template>\n\n<script lang="ts" setup>\n import { MenubarMenu, useForwardProps } from "radix-vue";\n import type { MenubarMenuProps } from "radix-vue";\n\n const props = defineProps<MenubarMenuProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
1085
+ },
1086
+ {
1087
+ fileName: "Menubar/Menubar.vue",
1088
+ dirPath: "components/UI",
1089
+ fileContent:
1090
+ '<template>\n <MenubarRoot v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </MenubarRoot>\n</template>\n\n<script lang="ts" setup>\n import { MenubarRoot, useForwardPropsEmits } from "radix-vue";\n import type { MenubarRootEmits, MenubarRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n MenubarRootProps & {\n class?: any;\n }\n >(),\n {\n loop: true,\n }\n );\n\n const emits = defineEmits<MenubarRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "inline-flex h-10 items-center space-x-1 rounded-md border bg-background p-1",\n });\n</script>\n',
1091
+ },
1092
+ {
1093
+ fileName: "Menubar/Portal.vue",
1094
+ dirPath: "components/UI",
1095
+ fileContent:
1096
+ '<template>\n <MenubarPortal v-bind="props">\n <slot></slot>\n </MenubarPortal>\n</template>\n\n<script lang="ts" setup>\n import { type MenubarPortalProps } from "radix-vue";\n\n const props = defineProps<MenubarPortalProps>();\n</script>\n',
1097
+ },
1098
+ {
1099
+ fileName: "Menubar/RadioGroup.vue",
1100
+ dirPath: "components/UI",
1101
+ fileContent:
1102
+ '<template>\n <MenubarRadioGroup v-bind="forwarded">\n <slot></slot>\n </MenubarRadioGroup>\n</template>\n\n<script lang="ts" setup>\n import { MenubarRadioGroup, useForwardPropsEmits } from "radix-vue";\n import type { MenubarRadioGroupEmits, MenubarRadioGroupProps } from "radix-vue";\n\n const props = defineProps<MenubarRadioGroupProps>();\n const emits = defineEmits<MenubarRadioGroupEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1103
+ },
1104
+ {
1105
+ fileName: "Menubar/RadioItem.vue",
1106
+ dirPath: "components/UI",
1107
+ fileContent:
1108
+ '<template>\n <MenubarRadioItem v-bind="forwarded" :class="styles({ class: props.class })">\n <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center text-primary">\n <UIMenubarItemIndicator>\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n <Icon v-else name="ph:circle-fill" class="h-2 w-2" />\n </UIMenubarItemIndicator>\n </span>\n <slot>{{ title }}</slot>\n </MenubarRadioItem>\n</template>\n\n<script lang="ts" setup>\n import { MenubarRadioItem, useForwardPropsEmits } from "radix-vue";\n import type { MenubarRadioItemEmits, MenubarRadioItemProps } from "radix-vue";\n\n const props = defineProps<\n MenubarRadioItemProps & {\n class?: any;\n icon?: string;\n title?: string;\n }\n >();\n\n const emits = defineEmits<MenubarRadioItemEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:opacity-50",\n });\n</script>\n',
1109
+ },
1110
+ {
1111
+ fileName: "Menubar/Separator.vue",
1112
+ dirPath: "components/UI",
1113
+ fileContent:
1114
+ '<template>\n <MenubarSeparator :class="styles({ class: props.class })" v-bind="props" />\n</template>\n\n<script lang="ts" setup>\n import { MenubarSeparator } from "radix-vue";\n import type { MenubarSeparatorProps } from "radix-vue";\n\n const props = defineProps<\n MenubarSeparatorProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "-mx-1 my-1 h-px bg-border",\n });\n</script>\n',
1115
+ },
1116
+ {
1117
+ fileName: "Menubar/Shortcut.vue",
1118
+ dirPath: "components/UI",
1119
+ fileContent:
1120
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="props">\n <slot />\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n { as: "span" }\n );\n\n const styles = tv({\n base: "ml-auto text-xs tracking-widest opacity-60",\n });\n</script>\n',
1121
+ },
1122
+ {
1123
+ fileName: "Menubar/Sub.vue",
1124
+ dirPath: "components/UI",
1125
+ fileContent:
1126
+ '<template>\n <MenubarSub v-bind="forwarded">\n <slot></slot>\n </MenubarSub>\n</template>\n\n<script lang="ts" setup>\n import { MenubarSub, useForwardPropsEmits } from "radix-vue";\n import type { MenubarSubEmits, MenubarSubProps } from "radix-vue";\n\n const props = defineProps<MenubarSubProps>();\n const emits = defineEmits<MenubarSubEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1127
+ },
1128
+ {
1129
+ fileName: "Menubar/SubContent.vue",
1130
+ dirPath: "components/UI",
1131
+ fileContent:
1132
+ '<template>\n <UIMenubarPortal :to="to">\n <MenubarSubContent v-bind="{ ...forwarded, ...$attrs }" :class="styles({ class: props.class })">\n <slot></slot>\n </MenubarSubContent>\n </UIMenubarPortal>\n</template>\n\n<script lang="ts" setup>\n import { MenubarSubContent, useForwardPropsEmits } from "radix-vue";\n import type { MenubarSubContentEmits, MenubarSubContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = withDefaults(\n defineProps<\n MenubarSubContentProps & {\n class?: any;\n to?: string | HTMLElement;\n }\n >(),\n {\n loop: true,\n sideOffset: 5,\n avoidCollisions: true,\n collisionPadding: 8,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<MenubarSubContentEmits>();\n\n const forwarded = useForwardPropsEmits(useOmit(props, ["class", "to"]), emits);\n\n const styles = tv({\n base: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-accent-foreground 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 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",\n });\n</script>\n',
1133
+ },
1134
+ {
1135
+ fileName: "Menubar/SubTrigger.vue",
1136
+ dirPath: "components/UI",
1137
+ fileContent:
1138
+ '<template>\n <MenubarSubTrigger v-bind="props" :class="styles({ inset, class: props.class })">\n <slot>\n <Icon v-if="icon" :name="icon" class="h-4 w-4" />\n <span v-if="title">{{ title }}</span>\n </slot>\n <Icon\n class="ml-auto h-4 w-4 text-muted-foreground"\n :name="trailingIcon || \'lucide:chevron-right\'"\n />\n </MenubarSubTrigger>\n</template>\n\n<script lang="ts" setup>\n import { MenubarSubTrigger } from "radix-vue";\n import type { MenubarSubTriggerProps } from "radix-vue";\n\n const props = defineProps<\n MenubarSubTriggerProps & {\n class?: any;\n inset?: boolean;\n icon?: string;\n title?: string;\n trailingIcon?: string;\n }\n >();\n\n const styles = tv({\n base: "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",\n variants: {\n inset: {\n true: "pl-8",\n },\n },\n });\n</script>\n',
1139
+ },
1140
+ {
1141
+ fileName: "Menubar/Trigger.vue",
1142
+ dirPath: "components/UI",
1143
+ fileContent:
1144
+ '<template>\n <MenubarTrigger :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </MenubarTrigger>\n</template>\n\n<script lang="ts" setup>\n import { MenubarTrigger } from "radix-vue";\n import type { MenubarTriggerProps } from "radix-vue";\n\n const props = defineProps<\n MenubarTriggerProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground data-[highlighted]:bg-accent data-[state=open]:bg-accent data-[highlighted]:text-accent-foreground data-[state=open]:text-accent-foreground",\n });\n</script>\n',
1145
+ },
1146
+ ],
1147
+ utils: [],
1148
+ composables: [],
1149
+ },
1150
+ {
1151
+ name: "Native Select",
1152
+ value: "native-select",
1153
+ deps: ["tailwind-variants"],
1154
+ devDeps: ["nuxt-icon", "@vueuse/core", "@vueuse/nuxt"],
1155
+ nuxtModules: ["nuxt-icon", "@vueuse/nuxt"],
1156
+ files: [
1157
+ {
1158
+ fileName: "NativeSelect.vue",
1159
+ dirPath: "components/UI",
1160
+ fileContent:
1161
+ '<template>\n <div class="relative">\n <select\n ref="select"\n :multiple="multiple"\n :name="name"\n :size="size"\n :id="id"\n :placeholder="placeholder"\n :disabled="disabled"\n :required="required"\n v-model="localModel"\n :class="styles({ class: props.class })"\n >\n <slot></slot>\n </select>\n <span class="pointer-events-none absolute inset-y-0 right-3 flex items-center justify-center">\n <slot name="trailingIcon">\n <Icon\n :name="trailingIcon || \'lucide:chevrons-up-down\'"\n class="h-4 w-4 text-muted-foreground"\n />\n </slot>\n </span>\n </div>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n id?: string;\n name?: string;\n placeholder?: string;\n disabled?: boolean;\n required?: boolean;\n modelValue?: any;\n multiple?: boolean;\n size?: number;\n autofocus?: boolean;\n trailingIcon?: string;\n }>();\n const styles = tv({\n base: "flex h-10 w-full appearance-none rounded-md border border-input bg-background px-3 py-2 pr-10 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm",\n });\n\n const select = ref<HTMLSelectElement | null>(null);\n const emits = defineEmits<{\n "update:modelValue": [value: any];\n }>();\n\n const localModel = useVModel(props, "modelValue", emits);\n\n onMounted(() => {\n if (props.autofocus) {\n select.value?.focus();\n }\n });\n</script>\n',
1162
+ },
1163
+ ],
1164
+ utils: [],
1165
+ composables: [],
1166
+ },
1167
+ {
1168
+ name: "Navigation Menu",
1169
+ value: "navigation-menu",
1170
+ deps: ["radix-vue", "tailwind-variants"],
1171
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
1172
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
1173
+ files: [
1174
+ {
1175
+ fileName: "NavigationMenu/Content.vue",
1176
+ dirPath: "components/UI",
1177
+ fileContent:
1178
+ '<template>\n <NavigationMenuContent v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </NavigationMenuContent>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuContent, useForwardPropsEmits } from "radix-vue";\n import type { NavigationMenuContentEmits, NavigationMenuContentProps } from "radix-vue";\n\n const props = defineProps<\n NavigationMenuContentProps & {\n class?: any;\n }\n >();\n\n const emits = defineEmits<NavigationMenuContentEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto",\n });\n</script>\n',
1179
+ },
1180
+ {
1181
+ fileName: "NavigationMenu/Indicator.vue",
1182
+ dirPath: "components/UI",
1183
+ fileContent:
1184
+ '<template>\n <NavigationMenuIndicator v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n <div class="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />\n </NavigationMenuIndicator>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuIndicator, useForwardProps } from "radix-vue";\n import type { NavigationMenuIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n NavigationMenuIndicatorProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(props);\n\n const styles = tv({\n base: "top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",\n });\n</script>\n',
1185
+ },
1186
+ {
1187
+ fileName: "NavigationMenu/Item.vue",
1188
+ dirPath: "components/UI",
1189
+ fileContent:
1190
+ '<template>\n <NavigationMenuItem v-bind="props">\n <slot></slot>\n </NavigationMenuItem>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuItem } from "radix-vue";\n import type { NavigationMenuItemProps } from "radix-vue";\n\n const props = defineProps<NavigationMenuItemProps>();\n</script>\n',
1191
+ },
1192
+ {
1193
+ fileName: "NavigationMenu/Link.vue",
1194
+ dirPath: "components/UI",
1195
+ fileContent:
1196
+ '<template>\n <NavigationMenuLink v-bind="forwarded">\n <slot></slot>\n </NavigationMenuLink>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuLink, useForwardPropsEmits } from "radix-vue";\n import type { NavigationMenuLinkEmits, NavigationMenuLinkProps } from "radix-vue";\n\n const props = defineProps<NavigationMenuLinkProps>();\n const emits = defineEmits<NavigationMenuLinkEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1197
+ },
1198
+ {
1199
+ fileName: "NavigationMenu/List.vue",
1200
+ dirPath: "components/UI",
1201
+ fileContent:
1202
+ '<template>\n <NavigationMenuList v-bind="props" :class="styles({ class: props.class })">\n <slot></slot>\n </NavigationMenuList>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuList } from "radix-vue";\n import type { NavigationMenuListProps } from "radix-vue";\n\n const props = defineProps<\n NavigationMenuListProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "group flex flex-1 list-none items-center justify-center space-x-1",\n });\n</script>\n',
1203
+ },
1204
+ {
1205
+ fileName: "NavigationMenu/NavigationMenu.vue",
1206
+ dirPath: "components/UI",
1207
+ fileContent:
1208
+ '<template>\n <NavigationMenuRoot :class="styles({ class: props.class })" v-bind="forwarded">\n <slot></slot>\n <UINavigationMenuViewport />\n </NavigationMenuRoot>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuRoot, useForwardPropsEmits } from "radix-vue";\n import type { NavigationMenuRootEmits, NavigationMenuRootProps } from "radix-vue";\n\n const props = defineProps<\n NavigationMenuRootProps & {\n class?: any;\n }\n >();\n const emits = defineEmits<NavigationMenuRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex max-w-max flex-1 items-center justify-center",\n });\n</script>\n',
1209
+ },
1210
+ {
1211
+ fileName: "NavigationMenu/Sub.vue",
1212
+ dirPath: "components/UI",
1213
+ fileContent:
1214
+ '<template>\n <NavigationMenuSub v-bind="forwarded">\n <slot></slot>\n </NavigationMenuSub>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuSub, useForwardPropsEmits } from "radix-vue";\n import type { NavigationMenuSubEmits, NavigationMenuSubProps } from "radix-vue";\n\n const props = defineProps<NavigationMenuSubProps>();\n const emits = defineEmits<NavigationMenuSubEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1215
+ },
1216
+ {
1217
+ fileName: "NavigationMenu/Trigger.vue",
1218
+ dirPath: "components/UI",
1219
+ fileContent:
1220
+ '<template>\n <NavigationMenuTrigger v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>{{ title }}</slot>\n <Icon\n :name="icon || \'lucide:chevron-down\'"\n class="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"\n aria-hidden="true"\n />\n </NavigationMenuTrigger>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuTrigger, useForwardProps } from "radix-vue";\n import type { NavigationMenuTriggerProps } from "radix-vue";\n\n const props = defineProps<\n NavigationMenuTriggerProps & {\n class?: any;\n icon?: string;\n title?: string;\n }\n >();\n const forwarded = useForwardProps(props);\n\n const styles = tv({\n base: "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50",\n });\n</script>\n',
1221
+ },
1222
+ {
1223
+ fileName: "NavigationMenu/Viewport.vue",
1224
+ dirPath: "components/UI",
1225
+ fileContent:
1226
+ '<template>\n <div class="absolute left-0 top-full flex justify-center">\n <NavigationMenuViewport\n v-bind="{ ...forwarded, ...$attrs }"\n :class="styles({ class: props.class })"\n />\n </div>\n</template>\n\n<script lang="ts" setup>\n import { NavigationMenuViewport, useForwardProps } from "radix-vue";\n import type { NavigationMenuViewportProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n const props = defineProps<\n NavigationMenuViewportProps & {\n class?: any;\n }\n >();\n const forwarded = useForwardProps(props);\n const styles = tv({\n base: "origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",\n });\n</script>\n',
1227
+ },
1228
+ ],
1229
+ utils: [],
1230
+ composables: [],
1231
+ },
1232
+ {
1233
+ name: "One-Time Password",
1234
+ value: "otp",
1235
+ deps: ["tailwind-variants", "vue3-otp-input"],
1236
+ devDeps: ["@vueuse/core", "@vueuse/nuxt"],
1237
+ nuxtModules: ["@vueuse/nuxt"],
1238
+ files: [
1239
+ {
1240
+ fileName: "OTP.vue",
1241
+ dirPath: "components/UI",
1242
+ fileContent:
1243
+ '<template>\n <VOtpInput\n ref="otp"\n v-model:value="localModel"\n :input-classes="styles({ separator: Boolean(separator), class: inputClasses })"\n :separator="separator"\n :num-inputs="numInputs"\n :input-type="inputType"\n :inputmode="inputmode"\n :should-auto-focus="shouldAutoFocus"\n :placeholder="placeholder"\n :is-disabled="disabled"\n @on-change="emits(\'change\', $event)"\n @on-complete="emits(\'complete\', $event)"\n />\n</template>\n\n<script lang="ts" setup>\n import VOtpInput from "vue3-otp-input";\n\n const otp = ref<InstanceType<typeof VOtpInput> | null>(null);\n\n const props = withDefaults(\n defineProps<{\n modelValue?: string;\n numInputs?: number;\n separator?: string;\n inputClasses?: any;\n conditionalClass?: any[];\n inputType?: "number" | "tel" | "letter-numeric" | "password";\n inputmode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search";\n shouldAutoFocus?: boolean;\n placeholder?: string[];\n disabled?: boolean;\n }>(),\n {\n numInputs: 4,\n inputType: "letter-numeric",\n inputmode: "text",\n separator: "",\n }\n );\n const emits = defineEmits<{\n "update:modelValue": [any];\n change: [any];\n complete: [any];\n ready: [any];\n }>();\n const localModel = useVModel(props, "modelValue", emits);\n\n const styles = tv({\n base: "mr-3 h-10 w-10 rounded-md border border-input bg-background p-1 text-center font-medium [-moz-appearance:_textfield] selection:bg-primary selection:text-primary-foreground placeholder:text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm [&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none",\n variants: {\n separator: {\n true: "mx-2",\n },\n },\n });\n\n onMounted(() => {\n emits("ready", otp.value);\n });\n</script>\n',
1244
+ },
1245
+ ],
1246
+ utils: [],
1247
+ composables: [],
1248
+ },
1249
+ {
1250
+ name: "Pagination",
1251
+ value: "pagination",
1252
+ deps: ["radix-vue", "tailwind-variants"],
1253
+ devDeps: ["nuxt-icon"],
1254
+ nuxtModules: ["nuxt-icon"],
1255
+ files: [
1256
+ {
1257
+ fileName: "Pagination/Ellipsis.vue",
1258
+ dirPath: "components/UI",
1259
+ fileContent:
1260
+ '<template>\n <PaginationEllipsis v-bind="props">\n <slot>\n <div v-if="icon" class="inline-flex h-9 w-9 items-center justify-center hover:bg-transparent">\n <Icon :name="icon" />\n </div>\n </slot>\n </PaginationEllipsis>\n</template>\n\n<script lang="ts" setup>\n import { PaginationEllipsis } from "radix-vue";\n import type { PaginationEllipsisProps } from "radix-vue";\n\n const props = defineProps<\n PaginationEllipsisProps & {\n icon?: string;\n }\n >();\n</script>\n',
1261
+ },
1262
+ {
1263
+ fileName: "Pagination/First.vue",
1264
+ dirPath: "components/UI",
1265
+ fileContent:
1266
+ '<template>\n <PaginationFirst v-bind="props">\n <slot>\n <UIButton v-if="icon" variant="ghost" size="icon-sm">\n <Icon :name="icon" />\n </UIButton>\n </slot>\n </PaginationFirst>\n</template>\n\n<script lang="ts" setup>\n import { PaginationFirst } from "radix-vue";\n import type { PaginationFirstProps } from "radix-vue";\n\n const props = defineProps<\n PaginationFirstProps & {\n icon?: string;\n }\n >();\n</script>\n',
1267
+ },
1268
+ {
1269
+ fileName: "Pagination/Item.vue",
1270
+ dirPath: "components/UI",
1271
+ fileContent:
1272
+ '<template>\n <PaginationListItem v-bind="props">\n <slot>\n <UIButton\n variant="outline"\n size="icon-sm"\n class="data-[selected=true]:border-transparent data-[selected=true]:bg-primary data-[selected=true]:text-primary-foreground"\n >\n {{ value }}\n </UIButton>\n </slot>\n </PaginationListItem>\n</template>\n\n<script lang="ts" setup>\n import { PaginationListItem } from "radix-vue";\n import type { PaginationListItemProps } from "radix-vue";\n\n const props = defineProps<PaginationListItemProps>();\n</script>\n',
1273
+ },
1274
+ {
1275
+ fileName: "Pagination/Last.vue",
1276
+ dirPath: "components/UI",
1277
+ fileContent:
1278
+ '<template>\n <PaginationLast v-bind="props">\n <slot>\n <UIButton v-if="icon" variant="ghost" size="icon-sm">\n <Icon :name="icon" />\n </UIButton>\n </slot>\n </PaginationLast>\n</template>\n\n<script lang="ts" setup>\n import { PaginationLast } from "radix-vue";\n import type { PaginationLastProps } from "radix-vue";\n\n const props = defineProps<\n PaginationLastProps & {\n icon?: string;\n }\n >();\n</script>\n',
1279
+ },
1280
+ {
1281
+ fileName: "Pagination/List.vue",
1282
+ dirPath: "components/UI",
1283
+ fileContent:
1284
+ '<template>\n <PaginationList v-slot="{ items }" :class="styles({ class: props.class })" v-bind="props">\n <slot :items="items"></slot>\n </PaginationList>\n</template>\n\n<script lang="ts" setup>\n import { PaginationList } from "radix-vue";\n import type { PaginationListProps } from "radix-vue";\n\n const props = defineProps<\n PaginationListProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "flex items-center gap-1",\n });\n</script>\n',
1285
+ },
1286
+ {
1287
+ fileName: "Pagination/Next.vue",
1288
+ dirPath: "components/UI",
1289
+ fileContent:
1290
+ '<template>\n <PaginationNext v-bind="props">\n <slot>\n <UIButton v-if="icon" variant="ghost" size="icon-sm">\n <Icon :name="icon" />\n </UIButton>\n </slot>\n </PaginationNext>\n</template>\n\n<script lang="ts" setup>\n import { PaginationNext } from "radix-vue";\n import type { PaginationNextProps } from "radix-vue";\n\n const props = defineProps<\n PaginationNextProps & {\n icon?: string;\n }\n >();\n</script>\n',
1291
+ },
1292
+ {
1293
+ fileName: "Pagination/Pagination.vue",
1294
+ dirPath: "components/UI",
1295
+ fileContent:
1296
+ '<template>\n <PaginationRoot v-bind="forwarded">\n <slot>\n <UIPaginationList v-slot="{ items }">\n <slot name="first"><UIPaginationFirst asChild :icon="firstIcon" /> </slot>\n <slot name="prev"><UIPaginationPrev asChild :icon="prevIcon" /> </slot>\n\n <template v-for="(page, index) in items" :key="index">\n <UIPaginationItem asChild v-if="page.type === \'page\'" v-bind="page" />\n <UIPaginationEllipsis\n asChild\n v-else-if="page.type === \'ellipsis\'"\n v-bind="page"\n :icon="ellipsisIcon"\n />\n </template>\n <slot name="next"><UIPaginationNext asChild :icon="nextIcon" /> </slot>\n <slot name="last"><UIPaginationLast asChild :icon="lastIcon" /></slot>\n </UIPaginationList>\n </slot>\n </PaginationRoot>\n</template>\n\n<script lang="ts" setup>\n import { PaginationRoot, useForwardPropsEmits } from "radix-vue";\n import type { PaginationRootEmits, PaginationRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n PaginationRootProps & {\n ellipsisIcon?: string;\n firstIcon?: string;\n lastIcon?: string;\n nextIcon?: string;\n prevIcon?: string;\n }\n >(),\n {\n defaultPage: 1,\n total: 10,\n itemsPerPage: 10,\n siblingCount: 3,\n showEdges: true,\n ellipsisIcon: "lucide:more-horizontal",\n firstIcon: "lucide:chevrons-left",\n lastIcon: "lucide:chevrons-right",\n nextIcon: "lucide:chevron-right",\n prevIcon: "lucide:chevron-left",\n }\n );\n\n const emits = defineEmits<PaginationRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1297
+ },
1298
+ {
1299
+ fileName: "Pagination/Prev.vue",
1300
+ dirPath: "components/UI",
1301
+ fileContent:
1302
+ '<template>\n <PaginationPrev v-bind="props">\n <slot>\n <UIButton v-if="icon" variant="ghost" size="icon-sm">\n <Icon :name="icon" />\n </UIButton>\n </slot>\n </PaginationPrev>\n</template>\n\n<script lang="ts" setup>\n import { PaginationPrev } from "radix-vue";\n import type { PaginationPrevProps } from "radix-vue";\n\n const props = defineProps<\n PaginationPrevProps & {\n icon?: string;\n }\n >();\n</script>\n',
1303
+ },
1304
+ ],
1305
+ utils: [],
1306
+ composables: [],
1307
+ },
1308
+ {
1309
+ name: "Popover",
1310
+ value: "popover",
1311
+ deps: ["radix-vue", "tailwind-variants"],
1312
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
1313
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
1314
+ files: [
1315
+ {
1316
+ fileName: "Popover/Anchor.vue",
1317
+ dirPath: "components/UI",
1318
+ fileContent:
1319
+ '<template>\n <PopoverAnchor v-bind="forwarded">\n <slot></slot>\n </PopoverAnchor>\n</template>\n\n<script lang="ts" setup>\n import { PopoverAnchor, useForwardProps } from "radix-vue";\n import type { PopoverAnchorProps } from "radix-vue";\n\n const props = defineProps<PopoverAnchorProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
1320
+ },
1321
+ {
1322
+ fileName: "Popover/Arrow.vue",
1323
+ dirPath: "components/UI",
1324
+ fileContent:
1325
+ '<template>\n <PopoverArrow v-bind="forwarded" />\n</template>\n\n<script lang="ts" setup>\n import { PopoverArrow, useForwardProps } from "radix-vue";\n import type { PopoverArrowProps } from "radix-vue/dist/Popover/PopoverArrow";\n\n const props = withDefaults(defineProps<PopoverArrowProps>(), {\n width: 10,\n height: 5,\n });\n\n const forwarded = useForwardProps(props);\n</script>\n',
1326
+ },
1327
+ {
1328
+ fileName: "Popover/Close.vue",
1329
+ dirPath: "components/UI",
1330
+ fileContent:
1331
+ '<template>\n <PopoverClose v-bind="forwarded">\n <slot> </slot>\n </PopoverClose>\n</template>\n\n<script lang="ts" setup>\n import { PopoverClose, useForwardProps } from "radix-vue";\n import type { PopoverCloseProps } from "radix-vue";\n\n const props = defineProps<PopoverCloseProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
1332
+ },
1333
+ {
1334
+ fileName: "Popover/Content.vue",
1335
+ dirPath: "components/UI",
1336
+ fileContent:
1337
+ '<template>\n <UIPopoverPortal :to="to">\n <PopoverContent v-bind="{ ...forwarded, ...$attrs }" :class="styles({ class: props.class })">\n <slot></slot>\n </PopoverContent>\n </UIPopoverPortal>\n</template>\n\n<script lang="ts" setup>\n import { PopoverContent, useForwardPropsEmits } from "radix-vue";\n import type { PopoverContentEmits, PopoverContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n PopoverContentProps & {\n to?: string | HTMLElement;\n class?: any;\n }\n >(),\n {\n side: "bottom",\n sideOffset: 8,\n align: "start",\n avoidCollisions: true,\n collisionPadding: 0,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<PopoverContentEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "z-50 w-72 rounded-md border bg-popover p-4 text-accent-foreground shadow-md outline-none 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 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",\n });\n</script>\n',
1338
+ },
1339
+ {
1340
+ fileName: "Popover/Popover.vue",
1341
+ dirPath: "components/UI",
1342
+ fileContent:
1343
+ '<template>\n <PopoverRoot v-bind="forwarded">\n <slot></slot>\n </PopoverRoot>\n</template>\n\n<script lang="ts" setup>\n import { PopoverRoot, useForwardPropsEmits } from "radix-vue";\n import type { PopoverRootEmits, PopoverRootProps } from "radix-vue";\n\n const props = defineProps<PopoverRootProps>();\n const emits = defineEmits<PopoverRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1344
+ },
1345
+ {
1346
+ fileName: "Popover/Portal.vue",
1347
+ dirPath: "components/UI",
1348
+ fileContent:
1349
+ '<template>\n <PopoverPortal v-bind="forwarded">\n <slot></slot>\n </PopoverPortal>\n</template>\n\n<script lang="ts" setup>\n import { PopoverPortal, useForwardProps } from "radix-vue";\n import type { PopoverPortalProps } from "radix-vue";\n\n const props = defineProps<PopoverPortalProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
1350
+ },
1351
+ {
1352
+ fileName: "Popover/Trigger.vue",
1353
+ dirPath: "components/UI",
1354
+ fileContent:
1355
+ '<template>\n <PopoverTrigger v-bind="props">\n <slot></slot>\n </PopoverTrigger>\n</template>\n\n<script lang="ts" setup>\n import { PopoverTrigger } from "radix-vue";\n import type { PopoverTriggerProps } from "radix-vue";\n\n const props = defineProps<PopoverTriggerProps>();\n</script>\n',
1356
+ },
1357
+ {
1358
+ fileName: "Popover/X.vue",
1359
+ dirPath: "components/UI",
1360
+ fileContent:
1361
+ '<template>\n <PopoverClose v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n <Icon :name="icon" class="h-4 w-4" />\n <span class="sr-only">{{ srText }}</span>\n </slot>\n </PopoverClose>\n</template>\n\n<script lang="ts" setup>\n import { PopoverClose, useForwardProps } from "radix-vue";\n import type { PopoverCloseProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n PopoverCloseProps & {\n class?: any;\n icon?: string;\n srText?: string;\n }\n >(),\n {\n icon: "heroicons:x-mark",\n srText: "Close",\n }\n );\n\n const styles = tv({\n base: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",\n });\n\n const forwarded = useForwardProps(useOmit(props, ["class", "icon", "srText"]));\n</script>\n',
1362
+ },
1363
+ ],
1364
+ utils: [],
1365
+ composables: [],
1366
+ },
1367
+ {
1368
+ name: "Progress",
1369
+ value: "progress",
1370
+ deps: ["radix-vue", "tailwind-variants"],
1371
+ devDeps: [],
1372
+ nuxtModules: [],
1373
+ files: [
1374
+ {
1375
+ fileName: "Progress/Indicator.vue",
1376
+ dirPath: "components/UI",
1377
+ fileContent:
1378
+ '<template>\n <ProgressIndicator v-bind="props" :class="styles({ class: props.class })">\n <slot></slot>\n </ProgressIndicator>\n</template>\n\n<script lang="ts" setup>\n import { ProgressIndicator } from "radix-vue";\n import type { ProgressIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n ProgressIndicatorProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "h-full w-full flex-1 rounded-full bg-primary transition-all",\n });\n</script>\n',
1379
+ },
1380
+ {
1381
+ fileName: "Progress/Progress.vue",
1382
+ dirPath: "components/UI",
1383
+ fileContent:
1384
+ '<template>\n <ProgressRoot v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n <UIProgressIndicator :style="{ transform: `translateX(-${100 - (modelValue || 0)}%)` }" />\n </slot>\n </ProgressRoot>\n</template>\n\n<script lang="ts" setup>\n import { ProgressRoot, useForwardPropsEmits } from "radix-vue";\n import type { ProgressRootEmits, ProgressRootProps } from "radix-vue";\n\n const props = defineProps<\n ProgressRootProps & {\n class?: any;\n }\n >();\n\n const emits = defineEmits<ProgressRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative h-3 w-full overflow-hidden rounded-full bg-secondary",\n });\n</script>\n',
1385
+ },
1386
+ ],
1387
+ utils: [],
1388
+ composables: [],
1389
+ },
1390
+ {
1391
+ name: "Radio Group",
1392
+ value: "radio-group",
1393
+ deps: ["radix-vue", "tailwind-variants"],
1394
+ devDeps: ["nuxt-icon"],
1395
+ nuxtModules: ["nuxt-icon"],
1396
+ files: [
1397
+ {
1398
+ fileName: "RadioGroup/Indicator.vue",
1399
+ dirPath: "components/UI",
1400
+ fileContent:
1401
+ '<template>\n <RadioGroupIndicator v-bind="props" :class="styles({ class: props.class })">\n <slot>\n <Icon :name="icon || \'ph:circle-fill\'" class="h-2.5 w-2.5 fill-current text-current" />\n </slot>\n </RadioGroupIndicator>\n</template>\n\n<script lang="ts" setup>\n import { RadioGroupIndicator } from "radix-vue";\n import type { RadioGroupIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n RadioGroupIndicatorProps & {\n class?: any;\n icon?: string;\n }\n >();\n\n const styles = tv({\n base: "flex items-center justify-center",\n });\n</script>\n',
1402
+ },
1403
+ {
1404
+ fileName: "RadioGroup/Item.vue",
1405
+ dirPath: "components/UI",
1406
+ fileContent:
1407
+ '<template>\n <RadioGroupItem v-bind="props" :class="styles({ class: props.class })">\n <slot>\n <UIRadioGroupIndicator :icon="props.icon" />\n </slot>\n </RadioGroupItem>\n</template>\n\n<script lang="ts" setup>\n import { RadioGroupItem } from "radix-vue";\n import type { RadioGroupItemProps } from "radix-vue";\n\n const props = defineProps<\n RadioGroupItemProps & {\n class?: any;\n icon?: string;\n }\n >();\n\n const styles = tv({\n base: "aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",\n });\n</script>\n',
1408
+ },
1409
+ {
1410
+ fileName: "RadioGroup/RadioGroup.vue",
1411
+ dirPath: "components/UI",
1412
+ fileContent:
1413
+ '<template>\n <RadioGroupRoot v-bind="forwarded" :class="styles({ class: props.class })">\n <slot></slot>\n </RadioGroupRoot>\n</template>\n\n<script lang="ts" setup>\n import { RadioGroupRoot, useForwardPropsEmits } from "radix-vue";\n import type { RadioGroupRootEmits, RadioGroupRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n RadioGroupRootProps & {\n class?: any;\n }\n >(),\n {\n orientation: "vertical",\n loop: true,\n }\n );\n\n const emits = defineEmits<RadioGroupRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({ base: "grid gap-3" });\n</script>\n',
1414
+ },
1415
+ ],
1416
+ utils: [],
1417
+ composables: [],
1418
+ },
1419
+ {
1420
+ name: "Scroll Area",
1421
+ value: "scroll-area",
1422
+ deps: ["radix-vue", "tailwind-variants"],
1423
+ devDeps: [],
1424
+ nuxtModules: [],
1425
+ files: [
1426
+ {
1427
+ fileName: "ScrollArea/Corner.vue",
1428
+ dirPath: "components/UI",
1429
+ fileContent:
1430
+ '<template>\n <ScrollAreaCorner v-bind="props">\n <slot></slot>\n </ScrollAreaCorner>\n</template>\n\n<script lang="ts" setup>\n import { ScrollAreaCorner } from "radix-vue";\n import type { ScrollAreaCornerProps } from "radix-vue";\n\n const props = defineProps<ScrollAreaCornerProps>();\n</script>\n',
1431
+ },
1432
+ {
1433
+ fileName: "ScrollArea/ScrollArea.vue",
1434
+ dirPath: "components/UI",
1435
+ fileContent:
1436
+ '<template>\n <ScrollAreaRoot v-bind="props" :class="styles({ class: props.class })">\n <UIScrollAreaViewport>\n <slot></slot>\n </UIScrollAreaViewport>\n <UIScrollAreaScrollbar :orientation="orientation" />\n <UIScrollAreaCorner />\n </ScrollAreaRoot>\n</template>\n\n<script lang="ts" setup>\n import { ScrollAreaRoot } from "radix-vue";\n import type { ScrollAreaRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n ScrollAreaRootProps & {\n orientation?: "vertical" | "horizontal";\n class?: any;\n }\n >(),\n {\n orientation: "vertical",\n }\n );\n\n const styles = tv({\n base: "relative overflow-hidden",\n });\n</script>\n',
1437
+ },
1438
+ {
1439
+ fileName: "ScrollArea/Scrollbar.vue",
1440
+ dirPath: "components/UI",
1441
+ fileContent:
1442
+ '<template>\n <ScrollAreaScrollbar v-bind="props" :class="styles({ orientation, class: props.class })">\n <slot></slot>\n <UIScrollAreaThumb />\n </ScrollAreaScrollbar>\n</template>\n\n<script lang="ts" setup>\n import { ScrollAreaScrollbar } from "radix-vue";\n import type { ScrollAreaScrollbarProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n ScrollAreaScrollbarProps & {\n class?: any;\n }\n >(),\n {\n orientation: "vertical",\n }\n );\n\n const styles = tv({\n base: "flex touch-none select-none transition-colors",\n variants: {\n orientation: {\n vertical: "h-full w-2.5 border-l border-l-transparent p-[1px]",\n horizontal: "h-2.5 border-t border-t-transparent p-[1px]",\n },\n },\n });\n</script>\n',
1443
+ },
1444
+ {
1445
+ fileName: "ScrollArea/Thumb.vue",
1446
+ dirPath: "components/UI",
1447
+ fileContent:
1448
+ '<template>\n <ScrollAreaThumb v-bind="props" :class="styles({ orientation, class: props.class })">\n <slot></slot>\n </ScrollAreaThumb>\n</template>\n\n<script lang="ts" setup>\n import { ScrollAreaThumb } from "radix-vue";\n import type { ScrollAreaThumbProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n ScrollAreaThumbProps & {\n class?: any;\n orientation?: "vertical" | "horizontal";\n }\n >(),\n {\n orientation: "vertical",\n }\n );\n\n const styles = tv({\n base: "relative flex-1 rounded-full bg-border",\n variants: {\n orientation: {\n vertical: "flex-1",\n horizontal: "",\n },\n },\n });\n</script>\n',
1449
+ },
1450
+ {
1451
+ fileName: "ScrollArea/Viewport.vue",
1452
+ dirPath: "components/UI",
1453
+ fileContent:
1454
+ '<template>\n <ScrollAreaViewport v-bind="props" :class="styles({ class: props.class })">\n <slot></slot>\n </ScrollAreaViewport>\n</template>\n\n<script lang="ts" setup>\n import { ScrollAreaViewport } from "radix-vue";\n import type { ScrollAreaViewportProps } from "radix-vue";\n\n const props = defineProps<\n ScrollAreaViewportProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "h-full w-full rounded-[inherit]",\n });\n</script>\n',
1455
+ },
1456
+ ],
1457
+ utils: [],
1458
+ composables: [],
1459
+ },
1460
+ {
1461
+ name: "Select",
1462
+ value: "select",
1463
+ deps: ["radix-vue", "tailwind-variants"],
1464
+ devDeps: ["tailwindcss-animate", "nuxt-lodash", "nuxt-icon"],
1465
+ nuxtModules: ["nuxt-lodash", "nuxt-icon"],
1466
+ files: [
1467
+ {
1468
+ fileName: "Select/Arrow.vue",
1469
+ dirPath: "components/UI",
1470
+ fileContent:
1471
+ '<template>\n <SelectArrow v-bind="useForwardProps(props)" />\n</template>\n\n<script lang="ts" setup>\n import { SelectArrow, useForwardProps } from "radix-vue";\n import type { SelectArrowProps } from "radix-vue";\n\n const props = withDefaults(defineProps<SelectArrowProps>(), {\n width: 10,\n height: 5,\n });\n</script>\n',
1472
+ },
1473
+ {
1474
+ fileName: "Select/Content.vue",
1475
+ dirPath: "components/UI",
1476
+ fileContent:
1477
+ '<template>\n <UISelectPortal :to="to">\n <SelectContent\n v-bind="{ ...forwarded, ...$attrs }"\n :class="styles({ position, class: props.class })"\n >\n <UISelectScrollUpButton />\n <UISelectViewport :position="position">\n <slot></slot>\n </UISelectViewport>\n <UISelectScrollDownButton />\n </SelectContent>\n </UISelectPortal>\n</template>\n\n<script lang="ts" setup>\n import { SelectContent, useForwardPropsEmits } from "radix-vue";\n import type { SelectContentEmits, SelectContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n SelectContentProps & {\n to?: string | HTMLElement;\n class?: any;\n }\n >(),\n {\n position: "popper",\n side: "bottom",\n align: "start",\n avoidCollisions: true,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<SelectContentEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-accent-foreground shadow-md 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 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",\n variants: {\n position: {\n popper:\n "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",\n "item-aligned": "",\n },\n },\n });\n</script>\n',
1478
+ },
1479
+ {
1480
+ fileName: "Select/Group.vue",
1481
+ dirPath: "components/UI",
1482
+ fileContent:
1483
+ '<template>\n <SelectGroup v-bind="forwarded">\n <slot></slot>\n </SelectGroup>\n</template>\n\n<script lang="ts" setup>\n import { SelectGroup, useForwardProps } from "radix-vue";\n import type { SelectGroupProps } from "radix-vue";\n\n const props = defineProps<SelectGroupProps>();\n const forwarded = useForwardProps(props);\n</script>\n',
1484
+ },
1485
+ {
1486
+ fileName: "Select/Icon.vue",
1487
+ dirPath: "components/UI",
1488
+ fileContent:
1489
+ '<template>\n <SelectIcon v-bind="forwarded">\n <slot>\n <Icon :class="styles({ class: props.class })" :name="icon || \'lucide:chevrons-up-down\'" />\n </slot>\n </SelectIcon>\n</template>\n\n<script lang="ts" setup>\n import { SelectIcon, useForwardProps } from "radix-vue";\n import type { SelectIconProps } from "radix-vue";\n\n const props = defineProps<\n SelectIconProps & {\n icon?: string;\n class?: any;\n }\n >();\n const forwarded = useForwardProps(props);\n\n const styles = tv({\n base: "h-4 w-4 shrink-0 text-muted-foreground opacity-70",\n });\n</script>\n',
1490
+ },
1491
+ {
1492
+ fileName: "Select/Item.vue",
1493
+ dirPath: "components/UI",
1494
+ fileContent:
1495
+ '<template>\n <SelectItem v-bind="props" :class="styles({ class: props.class })">\n <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">\n <UISelectItemIndicator :icon="icon" />\n </span>\n <UISelectItemText>\n <slot>{{ text }}</slot>\n </UISelectItemText>\n </SelectItem>\n</template>\n\n<script lang="ts" setup>\n import { SelectItem } from "radix-vue";\n import type { SelectItemProps } from "radix-vue";\n\n const props = defineProps<\n SelectItemProps & {\n class?: any;\n icon?: string;\n text?: string;\n }\n >();\n\n const styles = tv({\n base: "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",\n });\n</script>\n',
1496
+ },
1497
+ {
1498
+ fileName: "Select/ItemIndicator.vue",
1499
+ dirPath: "components/UI",
1500
+ fileContent:
1501
+ '<template>\n <SelectItemIndicator v-bind="props">\n <slot>\n <Icon :class="styles({ class: props.class })" :name="icon || \'lucide:check\'" />\n </slot>\n </SelectItemIndicator>\n</template>\n\n<script lang="ts" setup>\n import { SelectItemIndicator } from "radix-vue";\n import type { SelectItemIndicatorProps } from "radix-vue";\n\n const props = defineProps<\n SelectItemIndicatorProps & {\n icon?: string;\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "h-4 w-4",\n });\n</script>\n',
1502
+ },
1503
+ {
1504
+ fileName: "Select/ItemText.vue",
1505
+ dirPath: "components/UI",
1506
+ fileContent:
1507
+ '<template>\n <SelectItemText v-bind="props">\n <slot></slot>\n </SelectItemText>\n</template>\n\n<script lang="ts" setup>\n import { SelectItemText } from "radix-vue";\n import type { SelectItemTextProps } from "radix-vue";\n\n const props = defineProps<SelectItemTextProps>();\n</script>\n',
1508
+ },
1509
+ {
1510
+ fileName: "Select/Label.vue",
1511
+ dirPath: "components/UI",
1512
+ fileContent:
1513
+ '<template>\n <SelectLabel :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SelectLabel>\n</template>\n\n<script lang="ts" setup>\n import { SelectLabel } from "radix-vue";\n import type { SelectLabelProps } from "radix-vue";\n\n const props = defineProps<\n SelectLabelProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "py-1.5 pl-8 pr-2 text-sm font-semibold",\n });\n</script>\n',
1514
+ },
1515
+ {
1516
+ fileName: "Select/Portal.vue",
1517
+ dirPath: "components/UI",
1518
+ fileContent:
1519
+ '<template>\n <SelectPortal v-bind="props">\n <slot></slot>\n </SelectPortal>\n</template>\n\n<script lang="ts" setup>\n import { SelectPortal } from "radix-vue";\n import type { SelectPortalProps } from "radix-vue";\n\n const props = defineProps<SelectPortalProps>();\n</script>\n',
1520
+ },
1521
+ {
1522
+ fileName: "Select/ScrollDownButton.vue",
1523
+ dirPath: "components/UI",
1524
+ fileContent:
1525
+ '<template>\n <SelectScrollDownButton v-bind="props">\n <slot> <Icon :name="icon || \'lucide:chevron-down\'" class="h-5 w-5" /></slot>\n </SelectScrollDownButton>\n</template>\n\n<script lang="ts" setup>\n import { SelectScrollDownButton } from "radix-vue";\n import type { SelectScrollDownButtonProps } from "radix-vue";\n\n const props = defineProps<\n SelectScrollDownButtonProps & {\n icon?: string;\n }\n >();\n</script>\n',
1526
+ },
1527
+ {
1528
+ fileName: "Select/ScrollUpButton.vue",
1529
+ dirPath: "components/UI",
1530
+ fileContent:
1531
+ '<template>\n <SelectScrollUpButton v-bind="props">\n <slot>\n <Icon :name="icon || \'lucide:chevron-up\'" class="h-5 w-5" />\n </slot>\n </SelectScrollUpButton>\n</template>\n\n<script lang="ts" setup>\n import { SelectScrollUpButton } from "radix-vue";\n import type { SelectScrollUpButtonProps } from "radix-vue";\n\n const props = defineProps<\n SelectScrollUpButtonProps & {\n icon?: string;\n }\n >();\n</script>\n',
1532
+ },
1533
+ {
1534
+ fileName: "Select/Select.vue",
1535
+ dirPath: "components/UI",
1536
+ fileContent:
1537
+ '<template>\n <SelectRoot v-bind="forwarded">\n <slot></slot>\n </SelectRoot>\n</template>\n\n<script lang="ts" setup>\n import { SelectRoot, useForwardPropsEmits } from "radix-vue";\n import type { SelectRootEmits, SelectRootProps } from "radix-vue";\n\n const props = defineProps<SelectRootProps>();\n\n const emits = defineEmits<SelectRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1538
+ },
1539
+ {
1540
+ fileName: "Select/Separator.vue",
1541
+ dirPath: "components/UI",
1542
+ fileContent:
1543
+ '<template>\n <SelectSeparator :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SelectSeparator>\n</template>\n\n<script lang="ts" setup>\n import { SelectSeparator } from "radix-vue";\n import type { SelectSeparatorProps } from "radix-vue";\n\n const props = defineProps<\n SelectSeparatorProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "-mx-1 my-1 h-px bg-muted",\n });\n</script>\n',
1544
+ },
1545
+ {
1546
+ fileName: "Select/Trigger.vue",
1547
+ dirPath: "components/UI",
1548
+ fileContent:
1549
+ '<template>\n <SelectTrigger :class="styles({ class: props.class })" v-bind="props">\n <slot>\n <UISelectValue :placeholder="placeholder" />\n </slot>\n <UISelectIcon :icon="icon" />\n </SelectTrigger>\n</template>\n\n<script lang="ts" setup>\n import { SelectTrigger } from "radix-vue";\n import type { SelectTriggerProps } from "radix-vue";\n\n const props = defineProps<\n SelectTriggerProps & {\n class?: any;\n icon?: string;\n placeholder?: string;\n }\n >();\n\n const styles = tv({\n base: "line-clamp-1 flex h-10 w-full items-center justify-between truncate rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground",\n });\n</script>\n',
1550
+ },
1551
+ {
1552
+ fileName: "Select/Value.vue",
1553
+ dirPath: "components/UI",
1554
+ fileContent:
1555
+ '<template>\n <SelectValue v-bind="props">\n <slot></slot>\n </SelectValue>\n</template>\n\n<script lang="ts" setup>\n import { SelectValue } from "radix-vue";\n import type { SelectValueProps } from "radix-vue";\n\n const props = defineProps<SelectValueProps>();\n</script>\n',
1556
+ },
1557
+ {
1558
+ fileName: "Select/Viewport.vue",
1559
+ dirPath: "components/UI",
1560
+ fileContent:
1561
+ '<template>\n <SelectViewport :class="styles({ position, class: props.class })" v-bind="props">\n <slot></slot>\n </SelectViewport>\n</template>\n\n<script lang="ts" setup>\n import { SelectViewport } from "radix-vue";\n import type { SelectViewportProps } from "radix-vue";\n\n const props = defineProps<\n SelectViewportProps & {\n position?: "item-aligned" | "popper";\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "p-1",\n variants: {\n position: {\n popper:\n "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]",\n "item-aligned": "",\n },\n },\n });\n</script>\n',
1562
+ },
1563
+ ],
1564
+ utils: [],
1565
+ composables: [],
1566
+ },
1567
+ {
1568
+ name: "Separator",
1569
+ value: "separator",
1570
+ deps: ["radix-vue", "tailwind-variants"],
1571
+ devDeps: ["nuxt-lodash"],
1572
+ nuxtModules: ["nuxt-lodash"],
1573
+ files: [
1574
+ {
1575
+ fileName: "Separator.vue",
1576
+ dirPath: "components/UI",
1577
+ fileContent:
1578
+ '<template>\n <Separator v-bind="forwarded" :class="styles({ orientation, class: props.class })" />\n</template>\n\n<script lang="ts" setup>\n import { Separator, useForwardProps } from "radix-vue";\n import type { SeparatorProps } from "radix-vue";\n\n const props = withDefaults(defineProps<SeparatorProps & { class?: any }>(), {\n orientation: "horizontal",\n });\n\n const styles = tv({\n base: "shrink-0 bg-border",\n variants: {\n orientation: {\n horizontal: "h-[1px] w-full",\n vertical: "h-full w-[1px]",\n },\n },\n });\n\n const forwarded = useForwardProps(useOmit(props, ["class"]));\n</script>\n',
1579
+ },
1580
+ ],
1581
+ utils: [],
1582
+ composables: [],
1583
+ },
1584
+ {
1585
+ name: "Sheet",
1586
+ value: "sheet",
1587
+ deps: ["radix-vue", "tailwind-variants"],
1588
+ devDeps: ["nuxt-icon"],
1589
+ nuxtModules: ["nuxt-icon"],
1590
+ files: [
1591
+ {
1592
+ fileName: "Sheet/Close.vue",
1593
+ dirPath: "components/UI",
1594
+ fileContent:
1595
+ '<template>\n <DialogClose v-bind="props">\n <slot> </slot>\n </DialogClose>\n</template>\n\n<script lang="ts" setup>\n import { DialogClose } from "radix-vue";\n import type { DialogCloseProps } from "radix-vue";\n\n const props = defineProps<DialogCloseProps>();\n</script>\n',
1596
+ },
1597
+ {
1598
+ fileName: "Sheet/Content.vue",
1599
+ dirPath: "components/UI",
1600
+ fileContent:
1601
+ '<template>\n <UIDialogPortal :to="to">\n <UIDialogOverlay />\n <DialogContent\n :class="styles({ side, class: props.class })"\n v-bind="{ ...forwarded, ...$attrs }"\n >\n <slot>\n <slot name="header">\n <UIDialogHeader>\n <slot name="title">\n <UIDialogTitle v-if="title" :title="title" />\n </slot>\n <slot name="description">\n <UIDialogDescription v-if="description" :description="description" />\n </slot>\n </UIDialogHeader>\n </slot>\n <slot name="content"></slot>\n <slot name="footer"></slot>\n </slot>\n <slot name="close">\n <UIDialogClose :icon="icon" />\n </slot>\n </DialogContent>\n </UIDialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { DialogContent, useForwardPropsEmits } from "radix-vue";\n import type { DialogContentEmits, DialogContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = defineProps<\n DialogContentProps & {\n icon?: string;\n title?: string;\n description?: string;\n class?: any;\n side?: VariantProps<typeof styles>["side"];\n to?: string | HTMLElement;\n }\n >();\n const emits = defineEmits<DialogContentEmits>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["title", "class"]), emits);\n\n const styles = tv({\n base: "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",\n variants: {\n side: {\n top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",\n bottom:\n "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",\n left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",\n right:\n "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",\n },\n },\n defaultVariants: {\n side: "left",\n },\n });\n</script>\n',
1602
+ },
1603
+ {
1604
+ fileName: "Sheet/Description.vue",
1605
+ dirPath: "components/UI",
1606
+ fileContent:
1607
+ '<template>\n <DialogDescription :class="styles({ class: props.class })" v-bind="props">\n <slot>{{ description }}</slot>\n </DialogDescription>\n</template>\n\n<script lang="ts" setup>\n import { DialogDescription } from "radix-vue";\n import type { DialogDescriptionProps } from "radix-vue";\n\n const props = defineProps<\n DialogDescriptionProps & {\n class?: any;\n description?: string;\n }\n >();\n\n const styles = tv({\n base: "text-sm text-muted-foreground",\n });\n</script>\n',
1608
+ },
1609
+ {
1610
+ fileName: "Sheet/Footer.vue",
1611
+ dirPath: "components/UI",
1612
+ fileContent:
1613
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n\n const styles = tv({\n base: "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",\n });\n</script>\n',
1614
+ },
1615
+ {
1616
+ fileName: "Sheet/Header.vue",
1617
+ dirPath: "components/UI",
1618
+ fileContent:
1619
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n\n const styles = tv({\n base: "flex flex-col space-y-2 text-center sm:text-left",\n });\n</script>\n',
1620
+ },
1621
+ {
1622
+ fileName: "Sheet/Overlay.vue",
1623
+ dirPath: "components/UI",
1624
+ fileContent:
1625
+ '<template>\n <DialogOverlay :class="styles({ class: props.class })" v-bind="props" />\n</template>\n\n<script lang="ts" setup>\n import { DialogOverlay } from "radix-vue";\n import type { DialogOverlayProps } from "radix-vue";\n\n const props = defineProps<\n DialogOverlayProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-fadeOut data-[state=open]:animate-fadeIn",\n });\n</script>\n',
1626
+ },
1627
+ {
1628
+ fileName: "Sheet/Portal.vue",
1629
+ dirPath: "components/UI",
1630
+ fileContent:
1631
+ '<template>\n <DialogPortal v-bind="props">\n <slot></slot>\n </DialogPortal>\n</template>\n\n<script lang="ts" setup>\n import { DialogPortal } from "radix-vue";\n import type { DialogPortalProps } from "radix-vue";\n\n const props = defineProps<DialogPortalProps>();\n</script>\n',
1632
+ },
1633
+ {
1634
+ fileName: "Sheet/Sheet.vue",
1635
+ dirPath: "components/UI",
1636
+ fileContent:
1637
+ '<template>\n <DialogRoot v-bind="forwarded">\n <slot></slot>\n </DialogRoot>\n</template>\n\n<script lang="ts" setup>\n import { DialogRoot, useForwardPropsEmits } from "radix-vue";\n import type { DialogRootEmits, DialogRootProps } from "radix-vue";\n\n const props = defineProps<DialogRootProps>();\n const emit = defineEmits<DialogRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emit);\n</script>\n',
1638
+ },
1639
+ {
1640
+ fileName: "Sheet/Title.vue",
1641
+ dirPath: "components/UI",
1642
+ fileContent:
1643
+ '<template>\n <DialogTitle :class="styles({ class: props.class })" v-bind="props">\n <slot>{{ title }}</slot>\n </DialogTitle>\n</template>\n\n<script lang="ts" setup>\n import { DialogTitle } from "radix-vue";\n import type { DialogTitleProps } from "radix-vue";\n\n const props = defineProps<\n DialogTitleProps & {\n class?: any;\n title?: string;\n }\n >();\n\n const styles = tv({\n base: "text-lg font-semibold text-foreground",\n });\n</script>\n',
1644
+ },
1645
+ {
1646
+ fileName: "Sheet/Trigger.vue",
1647
+ dirPath: "components/UI",
1648
+ fileContent:
1649
+ '<template>\n <DialogTrigger v-bind="props">\n <slot></slot>\n </DialogTrigger>\n</template>\n\n<script lang="ts" setup>\n import { DialogTrigger } from "radix-vue";\n import type { DialogTriggerProps } from "radix-vue";\n\n const props = defineProps<DialogTriggerProps>();\n</script>\n',
1650
+ },
1651
+ {
1652
+ fileName: "Sheet/X.vue",
1653
+ dirPath: "components/UI",
1654
+ fileContent:
1655
+ '<template>\n <DialogClose :class="styles({ class: props.class })" v-bind="props">\n <slot>\n <Icon :name="icon" class="h-4 w-4" />\n <span class="sr-only">{{ srText }}</span>\n </slot>\n </DialogClose>\n</template>\n\n<script lang="ts" setup>\n import { DialogClose } from "radix-vue";\n import type { DialogCloseProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n DialogCloseProps & {\n class?: any;\n icon?: string;\n srText?: string;\n }\n >(),\n {\n icon: "heroicons:x-mark",\n srText: "Close",\n }\n );\n\n const styles = tv({\n base: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",\n });\n</script>\n',
1656
+ },
1657
+ ],
1658
+ utils: [],
1659
+ composables: [],
1660
+ },
1661
+ {
1662
+ name: "Skeleton",
1663
+ value: "skeleton",
1664
+ deps: ["radix-vue", "tailwind-variants"],
1665
+ devDeps: [],
1666
+ nuxtModules: [],
1667
+ files: [
1668
+ {
1669
+ fileName: "Skeleton.vue",
1670
+ dirPath: "components/UI",
1671
+ fileContent:
1672
+ '<template>\n <Primitive :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </Primitive>\n</template>\n\n<script lang="ts" setup>\n import { Primitive } from "radix-vue";\n import type { PrimitiveProps } from "radix-vue/dist/Primitive/Primitive";\n\n const styles = tv({\n base: "animate-pulse rounded-md bg-muted",\n });\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n class?: any;\n }\n >(),\n {\n as: "div",\n }\n );\n</script>\n',
1673
+ },
1674
+ ],
1675
+ utils: [],
1676
+ composables: [],
1677
+ },
1678
+ {
1679
+ name: "Slider",
1680
+ value: "slider",
1681
+ deps: ["radix-vue", "tailwind-variants"],
1682
+ devDeps: [],
1683
+ nuxtModules: [],
1684
+ files: [
1685
+ {
1686
+ fileName: "Slider/Range.vue",
1687
+ dirPath: "components/UI",
1688
+ fileContent:
1689
+ '<template>\n <SliderRange :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SliderRange>\n</template>\n\n<script lang="ts" setup>\n import { SliderRange } from "radix-vue";\n import type { SliderRangeProps } from "radix-vue";\n\n const props = defineProps<\n SliderRangeProps & {\n class?: any;\n }\n >();\n const styles = tv({\n base: "absolute h-full bg-primary",\n });\n</script>\n',
1690
+ },
1691
+ {
1692
+ fileName: "Slider/Slider.vue",
1693
+ dirPath: "components/UI",
1694
+ fileContent:
1695
+ '<template>\n <SliderRoot v-bind="forwarded" :class="styles({ class: props.class })">\n <slot>\n <slot name="track">\n <UISliderTrack>\n <slot name="range">\n <UISliderRange />\n </slot>\n </UISliderTrack>\n </slot>\n <slot name="thumb">\n <UISliderThumb v-for="(t, i) in modelValue.length" :key="i" />\n </slot>\n </slot>\n </SliderRoot>\n</template>\n\n<script lang="ts" setup>\n import { SliderRoot, useForwardPropsEmits } from "radix-vue";\n import type { SliderRootEmits, SliderRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n SliderRootProps & {\n class?: any;\n }\n >(),\n {\n orientation: "horizontal",\n min: 0,\n step: 1,\n max: 100,\n modelValue: () => [0],\n }\n );\n\n const emits = defineEmits<SliderRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "relative flex w-full touch-none select-none items-center",\n });\n</script>\n',
1696
+ },
1697
+ {
1698
+ fileName: "Slider/Thumb.vue",
1699
+ dirPath: "components/UI",
1700
+ fileContent:
1701
+ '<template>\n <SliderThumb :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SliderThumb>\n</template>\n\n<script lang="ts" setup>\n import { SliderThumb } from "radix-vue";\n import type { SliderThumbProps } from "radix-vue";\n\n const props = defineProps<\n SliderThumbProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",\n });\n</script>\n',
1702
+ },
1703
+ {
1704
+ fileName: "Slider/Track.vue",
1705
+ dirPath: "components/UI",
1706
+ fileContent:
1707
+ '<template>\n <SliderTrack :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SliderTrack>\n</template>\n\n<script lang="ts" setup>\n import { SliderTrack } from "radix-vue";\n import type { SliderTrackProps } from "radix-vue";\n\n const props = defineProps<\n SliderTrackProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "relative h-2 w-full grow overflow-hidden rounded-full bg-secondary",\n });\n</script>\n',
1708
+ },
1709
+ ],
1710
+ utils: [],
1711
+ composables: [],
1712
+ },
1713
+ {
1714
+ name: "Switch",
1715
+ value: "switch",
1716
+ deps: ["radix-vue", "tailwind-variants"],
1717
+ devDeps: [],
1718
+ nuxtModules: [],
1719
+ files: [
1720
+ {
1721
+ fileName: "Switch/Switch.vue",
1722
+ dirPath: "components/UI",
1723
+ fileContent:
1724
+ '<template>\n <SwitchRoot v-bind="forwarded" :class="styles({ class: props.class })">\n <UISwitchThumb>\n <slot></slot>\n </UISwitchThumb>\n </SwitchRoot>\n</template>\n\n<script lang="ts" setup>\n import { SwitchRoot, useForwardPropsEmits } from "radix-vue";\n import type { SwitchRootEmits, SwitchRootProps } from "radix-vue";\n\n const props = withDefaults(\n defineProps<\n SwitchRootProps & {\n class?: any;\n id?: any;\n }\n >(),\n {\n as: "button",\n }\n );\n const emits = defineEmits<SwitchRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",\n });\n</script>\n',
1725
+ },
1726
+ {
1727
+ fileName: "Switch/Thumb.vue",
1728
+ dirPath: "components/UI",
1729
+ fileContent:
1730
+ '<template>\n <SwitchThumb :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </SwitchThumb>\n</template>\n\n<script lang="ts" setup>\n import { SwitchThumb } from "radix-vue";\n import type { SwitchThumbProps } from "radix-vue";\n\n const props = defineProps<\n SwitchThumbProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",\n });\n</script>\n',
1731
+ },
1732
+ ],
1733
+ utils: [],
1734
+ composables: [],
1735
+ },
1736
+ {
1737
+ name: "Table",
1738
+ value: "table",
1739
+ deps: ["tailwind-variants"],
1740
+ devDeps: [],
1741
+ nuxtModules: [],
1742
+ files: [
1743
+ {
1744
+ fileName: "Table/Body.vue",
1745
+ dirPath: "components/UI",
1746
+ fileContent:
1747
+ '<template>\n <tbody :class="styles({ class: props.class })">\n <slot></slot>\n </tbody>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "[&_tr:last-child]:border-0",\n });\n</script>\n',
1748
+ },
1749
+ {
1750
+ fileName: "Table/Caption.vue",
1751
+ dirPath: "components/UI",
1752
+ fileContent:
1753
+ '<template>\n <caption :class="styles({ class: props.class })">\n <slot></slot>\n </caption>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "mt-4 text-sm text-muted-foreground",\n });\n</script>\n',
1754
+ },
1755
+ {
1756
+ fileName: "Table/Cell.vue",
1757
+ dirPath: "components/UI",
1758
+ fileContent:
1759
+ '<template>\n <td :class="styles({ class: props.class })">\n <slot></slot>\n </td>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "whitespace-nowrap p-4 align-middle",\n });\n</script>\n',
1760
+ },
1761
+ {
1762
+ fileName: "Table/Empty.vue",
1763
+ dirPath: "components/UI",
1764
+ fileContent:
1765
+ '<template>\n <UITableRow>\n <UITableCell :colspan="colspan" :class="styles({ class: props.class })">\n <slot></slot>\n </UITableCell>\n </UITableRow>\n</template>\n\n<script lang="ts" setup>\n const props = withDefaults(\n defineProps<{\n colspan?: number;\n class?: any;\n }>(),\n {\n colspan: 1,\n }\n );\n\n const styles = tv({\n base: "whitespace-nowrap p-4 align-middle text-sm text-foreground",\n });\n</script>\n',
1766
+ },
1767
+ {
1768
+ fileName: "Table/Footer.vue",
1769
+ dirPath: "components/UI",
1770
+ fileContent:
1771
+ '<template>\n <tfoot :class="styles({ class: props.class })">\n <slot></slot>\n </tfoot>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "bg-primary font-medium text-primary-foreground",\n });\n</script>\n',
1772
+ },
1773
+ {
1774
+ fileName: "Table/Head.vue",
1775
+ dirPath: "components/UI",
1776
+ fileContent:
1777
+ '<template>\n <th :class="styles({ class: props.class })">\n <slot></slot>\n </th>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "h-12 px-4 text-left align-middle font-medium text-muted-foreground hover:text-foreground",\n });\n</script>\n',
1778
+ },
1779
+ {
1780
+ fileName: "Table/Header.vue",
1781
+ dirPath: "components/UI",
1782
+ fileContent:
1783
+ '<template>\n <thead :class="styles({ class: props.class })">\n <slot></slot>\n </thead>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "[&_tr]:border-b",\n });\n</script>\n',
1784
+ },
1785
+ {
1786
+ fileName: "Table/Row.vue",
1787
+ dirPath: "components/UI",
1788
+ fileContent:
1789
+ '<template>\n <tr :class="styles({ class: props.class })">\n <slot></slot>\n </tr>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",\n });\n</script>\n',
1790
+ },
1791
+ {
1792
+ fileName: "Table/Table.vue",
1793
+ dirPath: "components/UI",
1794
+ fileContent:
1795
+ '<template>\n <table :class="styles({ class: props.class })">\n <slot></slot>\n </table>\n</template>\n\n<script lang="ts" setup>\n const props = defineProps<{\n class?: any;\n }>();\n\n const styles = tv({\n base: "w-full caption-bottom border-collapse text-sm",\n });\n</script>\n',
1796
+ },
1797
+ ],
1798
+ utils: [],
1799
+ composables: [],
1800
+ },
1801
+ {
1802
+ name: "Tabs",
1803
+ value: "tabs",
1804
+ deps: ["tailwind-variants", "radix-vue"],
1805
+ devDeps: [],
1806
+ nuxtModules: [],
1807
+ files: [
1808
+ {
1809
+ fileName: "Tabs/Content.vue",
1810
+ dirPath: "components/UI",
1811
+ fileContent:
1812
+ '<template>\n <TabsContent v-bind="props" :class="styles({ class: props.class })">\n <slot></slot>\n </TabsContent>\n</template>\n\n<script lang="ts" setup>\n import { TabsContent } from "radix-vue";\n import type { TabsContentProps } from "radix-vue";\n\n const props = defineProps<\n TabsContentProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",\n });\n</script>\n',
1813
+ },
1814
+ {
1815
+ fileName: "Tabs/List.vue",
1816
+ dirPath: "components/UI",
1817
+ fileContent:
1818
+ '<template>\n <TabsList :class="styles({ class: props.class })" v-bind="props">\n <slot></slot>\n </TabsList>\n</template>\n\n<script lang="ts" setup>\n import { TabsList } from "radix-vue";\n import type { TabsListProps } from "radix-vue";\n\n const props = defineProps<\n TabsListProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",\n });\n</script>\n',
1819
+ },
1820
+ {
1821
+ fileName: "Tabs/Tabs.vue",
1822
+ dirPath: "components/UI",
1823
+ fileContent:
1824
+ '<template>\n <TabsRoot v-bind="forwarded">\n <slot></slot>\n </TabsRoot>\n</template>\n\n<script lang="ts" setup>\n import { TabsRoot, useForwardPropsEmits } from "radix-vue";\n import type { TabsRootEmits, TabsRootProps } from "radix-vue";\n\n const props = withDefaults(defineProps<TabsRootProps & {}>(), {\n orientation: "horizontal",\n activationMode: "automatic",\n });\n const emits = defineEmits<TabsRootEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1825
+ },
1826
+ {
1827
+ fileName: "Tabs/Trigger.vue",
1828
+ dirPath: "components/UI",
1829
+ fileContent:
1830
+ '<template>\n <TabsTrigger v-bind="props" :class="styles({ class: props.class })">\n <slot></slot>\n </TabsTrigger>\n</template>\n\n<script lang="ts" setup>\n import { TabsTrigger } from "radix-vue";\n import type { TabsTriggerProps } from "radix-vue";\n\n const props = defineProps<\n TabsTriggerProps & {\n class?: any;\n }\n >();\n\n const styles = tv({\n base: "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",\n });\n</script>\n',
1831
+ },
1832
+ ],
1833
+ utils: [],
1834
+ composables: [],
1835
+ },
1836
+ {
1837
+ name: "Tanstack Table",
1838
+ value: "tanstacktable",
1839
+ deps: ["tailwind-variants", "@tanstack/vue-table"],
1840
+ devDeps: ["nuxt-icon"],
1841
+ nuxtModules: ["nuxt-icon"],
1842
+ components: ["checkbox"],
1843
+ files: [
1844
+ {
1845
+ fileName: "TanStackTable.vue",
1846
+ dirPath: "components/UI",
1847
+ fileContent:
1848
+ '<template>\n <div>\n <div :class="styles({ class: props.class })">\n <UITable :class="tableClass">\n <UITableHeader>\n <UITableRow v-for="headerGroup in table.getHeaderGroups()" :key="headerGroup.id">\n <UITableHead\n v-for="header in headerGroup.headers"\n :key="header.id"\n :colspan="header.colSpan"\n @click="header.column.getToggleSortingHandler()?.($event)"\n :class="[header.column.getCanSort() && \'cursor-pointer select-none\']"\n >\n <template v-if="!header.isPlaceholder">\n <div class="flex items-center gap-3">\n <FlexRender\n :render="header.column.columnDef.header"\n :props="header.getContext()"\n />\n <Icon\n v-if="header.column.getCanSort() && header.column.getIsSorted() === \'asc\'"\n :name="ascIcon"\n class="h-4 w-4"\n />\n <Icon\n v-else-if="header.column.getCanSort() && header.column.getIsSorted() === \'desc\'"\n :name="descIcon"\n class="h-4 w-4"\n />\n <Icon\n v-else-if="header.column.getCanSort() && !header.column.getIsSorted()"\n :name="unsortedIcon"\n class="h-5 w-5"\n />\n </div>\n </template>\n </UITableHead>\n </UITableRow>\n </UITableHeader>\n\n <UITableBody>\n <UITableRow\n v-for="row in table.getRowModel().rows"\n :key="row.id"\n :data-state="row.getIsSelected() ? \'selected\' : \'\'"\n >\n <UITableCell v-for="cell in row.getVisibleCells()" :key="cell.id">\n <FlexRender :render="cell.column.columnDef.cell" :props="cell.getContext()" />\n </UITableCell>\n </UITableRow>\n\n <UITableEmpty\n v-if="table.getRowModel().rows.length === 0"\n :colspan="table.getAllLeafColumns().length"\n >\n <slot :table="table" name="empty"> No data available. </slot>\n </UITableEmpty>\n </UITableBody>\n </UITable>\n </div>\n\n <div\n v-if="showPagination"\n class="my-6 flex flex-col justify-between gap-4 px-2 md:flex-row md:items-center"\n >\n <div class="flex items-center justify-between gap-3">\n <slot name="rowsSelected" :table="table">\n <div v-if="showSelect" class="whitespace-nowrap text-sm text-muted-foreground">\n <span>\n {{ table.getFilteredSelectedRowModel().rows.length }} of {{ " " }}\n {{ table.getFilteredRowModel().rows.length }} row(s) selected\n </span>\n </div>\n </slot>\n <slot name="rowsPerPage" :table="table">\n <div class="flex items-center space-x-2 whitespace-nowrap">\n <p class="hidden text-sm font-medium text-foreground md:inline-block">\n {{ rowsPerPageText }}\n </p>\n <UISelect v-model="pageSize">\n <UISelectTrigger class="h-9 w-[70px]">\n {{ table.getState().pagination.pageSize }}\n </UISelectTrigger>\n <UISelectContent side="top" align="start">\n <UISelectGroup>\n <UISelectItem\n v-for="pageSize in pageSizes"\n :key="pageSize"\n :value="`${pageSize}`"\n >\n {{ pageSize }}\n </UISelectItem>\n </UISelectGroup>\n </UISelectContent>\n </UISelect>\n </div>\n </slot>\n </div>\n\n <div class="flex items-center justify-between gap-3">\n <slot :table="table" name="page">\n <div\n class="flex items-center justify-center whitespace-nowrap text-sm font-medium text-foreground"\n >\n Page {{ table.getState().pagination.pageIndex + 1 }} of\n {{ table.getPageCount() }}\n </div>\n </slot>\n\n <slot :table="table" name="pageButtons">\n <div class="flex items-center space-x-2">\n <UIButton\n variant="outline"\n title="First page"\n class="h-9 w-9 p-0"\n :disabled="!table.getCanPreviousPage()"\n @click="table.setPageIndex(0)"\n >\n <Icon name="lucide:chevrons-left" class="h-4 w-4" />\n </UIButton>\n <UIButton\n variant="outline"\n title="Previous page"\n class="h-9 w-9 p-0"\n :disabled="!table.getCanPreviousPage()"\n @click="table.previousPage()"\n >\n <Icon name="lucide:chevron-left" class="h-4 w-4" />\n </UIButton>\n <UIButton\n variant="outline"\n title="Next page"\n class="h-9 w-9 p-0"\n :disabled="!table.getCanNextPage()"\n @click="table.nextPage()"\n >\n <Icon name="lucide:chevron-right" class="h-4 w-4" />\n </UIButton>\n <UIButton\n variant="outline"\n title="Last page"\n class="h-9 w-9 p-0"\n :disabled="!table.getCanNextPage()"\n @click="table.setPageIndex(table.getPageCount() - 1)"\n >\n <Icon name="lucide:chevrons-right" class="h-4 w-4" />\n </UIButton>\n </div>\n </slot>\n </div>\n </div>\n </div>\n</template>\n\n<script lang="ts" setup generic="T">\n import CheckBox from "@/components/UI/Checkbox/Checkbox.vue";\n import {\n FlexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useVueTable,\n } from "@tanstack/vue-table";\n import type { ColumnDef, SortingState, Table } from "@tanstack/vue-table";\n\n const props = withDefaults(\n defineProps<{\n data?: T[];\n columns?: ColumnDef<T>[];\n search?: string;\n showSelect?: boolean;\n pageSizes?: number[];\n pageSize?: number;\n sorting?: SortingState;\n tableClass?: any;\n ascIcon?: string;\n descIcon?: string;\n unsortedIcon?: string;\n class?: any;\n showPagination?: boolean;\n rowsPerPageText?: string;\n }>(),\n {\n pageSizes: () => [10, 20, 30, 40, 50, 100],\n pageSize: () => 10,\n columns: () => [],\n data: () => [],\n sorting: () => [],\n ascIcon: "heroicons:chevron-up",\n descIcon: "heroicons:chevron-down",\n unsortedIcon: "heroicons:chevron-up-down",\n showPagination: true,\n rowsPerPageText: "Rows per page:",\n }\n );\n\n defineOptions({ inheritAttrs: false });\n\n const styles = tv({\n base: "w-full overflow-x-auto",\n });\n\n const checkBoxHeader: ColumnDef<any> = {\n id: "checkbox",\n header: ({ table }) => {\n return h(CheckBox, {\n checked: table.getIsAllRowsSelected(),\n "onUpdate:checked": (value: boolean) => table.toggleAllPageRowsSelected(!!value),\n ariaLabel: "Select all",\n });\n },\n cell: ({ row }) => {\n return h(CheckBox, {\n checked: row.getIsSelected(),\n "onUpdate:checked": (value) => row.toggleSelected(!!value),\n ariaLabel: "Select row",\n });\n },\n enableSorting: false,\n enableHiding: false,\n };\n\n const localColumns: ColumnDef<T>[] = [...props.columns];\n\n if (props.showSelect) {\n localColumns.unshift(checkBoxHeader);\n }\n\n const emit = defineEmits<{\n ready: [table: Table<T>];\n }>();\n\n const localSorting = ref(props.sorting);\n const globalFilter = ref(props.search);\n const columnVisibility = ref({});\n const rowSelection = ref({});\n\n const table = useVueTable({\n get data() {\n return props.data;\n },\n get columns() {\n return localColumns;\n },\n initialState: {\n pagination: {\n pageSize: props.pageSize,\n },\n rowSelection: rowSelection.value,\n globalFilter: props.search,\n },\n state: {\n get sorting() {\n return localSorting.value;\n },\n get globalFilter() {\n return props.search;\n },\n get columnVisibility() {\n return columnVisibility.value;\n },\n get rowSelection() {\n return rowSelection.value;\n },\n },\n onSortingChange: (updaterOrValue) => {\n localSorting.value =\n typeof updaterOrValue === "function" ? updaterOrValue(localSorting.value) : updaterOrValue;\n },\n onGlobalFilterChange: (updaterOrValue) => {\n globalFilter.value =\n typeof updaterOrValue === "function" ? updaterOrValue(globalFilter.value) : updaterOrValue;\n },\n onRowSelectionChange: (updaterOrValue) => {\n rowSelection.value =\n typeof updaterOrValue === "function" ? updaterOrValue(rowSelection.value) : updaterOrValue;\n },\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n enableRowSelection: () => !!props.showSelect,\n });\n\n function toggleColumnVisibility(column: any) {\n columnVisibility.value = {\n ...columnVisibility.value,\n [column.id]: !column.getIsVisible(),\n };\n }\n\n const pageSize = computed({\n get() {\n return table.getState().pagination.pageSize.toString();\n },\n set(value) {\n table.setPageSize(Number(value));\n },\n });\n\n onMounted(() => {\n emit("ready", table);\n });\n\n defineExpose({ toggleColumnVisibility });\n</script>\n',
1849
+ },
1850
+ ],
1851
+ utils: [],
1852
+ composables: [],
1853
+ },
1854
+ {
1855
+ name: "Textarea",
1856
+ value: "textarea",
1857
+ deps: ["tailwind-variants", "radix-vue"],
1858
+ devDeps: ["@vueuse/core", "@vueuse/nuxt"],
1859
+ nuxtModules: ["@vueuse/nuxt"],
1860
+ files: [
1861
+ {
1862
+ fileName: "Textarea.vue",
1863
+ dirPath: "components/UI",
1864
+ fileContent:
1865
+ '<template>\n <textarea :class="styles({ class: props.class })" v-bind="forwarded" v-model="localModel" />\n</template>\n\n<script lang="ts" setup>\n import { useForwardPropsEmits } from "radix-vue";\n\n const props = defineProps<{\n class?: any;\n name?: string;\n id?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n rows?: number;\n modelValue?: string;\n }>();\n\n const emits = defineEmits<{\n "update:modelValue": [value: any];\n }>();\n const forwarded = useForwardPropsEmits(useOmit(props, ["class"]), emits);\n\n const localModel = useVModel(props, "modelValue", emits);\n\n const styles = tv({\n base: "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm",\n });\n</script>\n',
1866
+ },
1867
+ ],
1868
+ utils: [],
1869
+ composables: [],
1870
+ },
1871
+ {
1872
+ name: "Toast",
1873
+ value: "toast",
1874
+ deps: ["tailwind-variants", "radix-vue"],
1875
+ devDeps: ["nuxt-icon"],
1876
+ nuxtModules: ["nuxt-icon"],
1877
+ composables: [
1878
+ {
1879
+ fileName: "useToast.ts",
1880
+ dirPath: "composables",
1881
+ fileContent:
1882
+ 'import type { ToastProps } from "@/components/UI/Toast/Toast.vue";\n\nconst TOAST_LIMIT = 3;\nconst TOAST_REMOVE_DELAY = 7000;\n\nexport type StringOrVNode = string | VNode | (() => VNode);\n\ntype ToasterToast = ToastProps & {\n id: string;\n title?: string;\n description?: StringOrVNode;\n action?: Component;\n icon?: string;\n};\n\nconst actionTypes = {\n ADD_TOAST: "ADD_TOAST",\n UPDATE_TOAST: "UPDATE_TOAST",\n DISMISS_TOAST: "DISMISS_TOAST",\n REMOVE_TOAST: "REMOVE_TOAST",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n count = (count + 1) % Number.MAX_VALUE;\n return count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n | {\n type: ActionType["ADD_TOAST"];\n toast: ToasterToast;\n }\n | {\n type: ActionType["UPDATE_TOAST"];\n toast: Partial<ToasterToast>;\n }\n | {\n type: ActionType["DISMISS_TOAST"];\n toastId?: ToasterToast["id"];\n }\n | {\n type: ActionType["REMOVE_TOAST"];\n toastId?: ToasterToast["id"];\n };\n\ninterface State {\n toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nfunction addToRemoveQueue(toastId: string) {\n if (toastTimeouts.has(toastId)) return;\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: actionTypes.REMOVE_TOAST,\n toastId,\n });\n }, TOAST_REMOVE_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n}\n\nconst state = ref<State>({\n toasts: [],\n});\n\nfunction dispatch(action: Action) {\n switch (action.type) {\n case actionTypes.ADD_TOAST:\n state.value.toasts = [action.toast, ...state.value.toasts].slice(0, TOAST_LIMIT);\n break;\n\n case actionTypes.UPDATE_TOAST:\n state.value.toasts = state.value.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n );\n break;\n\n case actionTypes.DISMISS_TOAST: {\n const { toastId } = action;\n\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.value.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n state.value.toasts = state.value.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t\n );\n break;\n }\n\n case actionTypes.REMOVE_TOAST:\n if (action.toastId === undefined) state.value.toasts = [];\n else state.value.toasts = state.value.toasts.filter((t) => t.id !== action.toastId);\n\n break;\n }\n}\n\nfunction useToast() {\n return {\n toasts: computed(() => state.value.toasts),\n toast,\n dismiss: (toastId?: string) => dispatch({ type: actionTypes.DISMISS_TOAST, toastId }),\n };\n}\n\ntype Toast = Omit<ToasterToast, "id">;\n\nfunction toast(props: Toast) {\n const id = genId();\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: actionTypes.UPDATE_TOAST,\n toast: { ...props, id },\n });\n\n const dismiss = () => dispatch({ type: actionTypes.DISMISS_TOAST, toastId: id });\n\n dispatch({\n type: actionTypes.ADD_TOAST,\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open: boolean) => {\n if (!open) dismiss();\n },\n },\n });\n\n return {\n id,\n dismiss,\n update,\n };\n}\n\nexport { toast, useToast };\n',
1883
+ },
1884
+ ],
1885
+ instructions: ["Remeber to add <UIToastToaster /> to your app.vue/layout file."],
1886
+ files: [
1887
+ {
1888
+ fileName: "Toast/Action.vue",
1889
+ dirPath: "components/UI",
1890
+ fileContent:
1891
+ '<template>\r\n <ToastAction :class="styles({ class: props.class })" v-bind="props">\r\n <slot></slot>\r\n </ToastAction>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastAction } from "radix-vue";\r\n import type { ToastActionProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n ToastActionProps & {\r\n class?: any;\r\n }\r\n >(),\r\n {\r\n altText: "Action button",\r\n }\r\n );\r\n\r\n const styles = tv({\r\n base: "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-xs 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",\r\n });\r\n</script>\r\n',
1892
+ },
1893
+ {
1894
+ fileName: "Toast/Close.vue",
1895
+ dirPath: "components/UI",
1896
+ fileContent:
1897
+ '<template>\r\n <ToastClose :class="styles({ class: props.class })" v-bind="props">\r\n <slot>\r\n <Icon :name="icon || \'lucide:x\'" class="h-4 w-4" />\r\n </slot>\r\n </ToastClose>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastClose } from "radix-vue";\r\n import type { ToastCloseProps } from "radix-vue";\r\n\r\n const props = withDefaults(\r\n defineProps<\r\n ToastCloseProps & {\r\n class?: any;\r\n icon?: string;\r\n }\r\n >(),\r\n {}\r\n );\r\n\r\n const styles = tv({\r\n base: "absolute right-2 top-2 inline-flex items-center justify-center rounded-md p-1 text-foreground/50 opacity-50 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus-visible:ring-ring group-hover:opacity-100",\r\n });\r\n</script>\r\n',
1898
+ },
1899
+ {
1900
+ fileName: "Toast/Description.vue",
1901
+ dirPath: "components/UI",
1902
+ fileContent:
1903
+ '<template>\r\n <ToastDescription :class="styles({ class: props.class })" v-bind="props">\r\n <slot>{{ description }}</slot>\r\n </ToastDescription>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastDescription } from "radix-vue";\r\n import type { ToastDescriptionProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n ToastDescriptionProps & {\r\n description?: string;\r\n class?: any;\r\n }\r\n >();\r\n\r\n const styles = tv({\r\n base: "text-sm opacity-90",\r\n });\r\n</script>\r\n',
1904
+ },
1905
+ {
1906
+ fileName: "Toast/Provider.vue",
1907
+ dirPath: "components/UI",
1908
+ fileContent:
1909
+ '<template>\r\n <ToastProvider v-bind="props">\r\n <slot></slot>\r\n </ToastProvider>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastProvider } from "radix-vue";\r\n import type { ToastProviderProps } from "radix-vue";\r\n\r\n const props = withDefaults(defineProps<ToastProviderProps>(), {\r\n label: "Notification",\r\n swipeDirection: "right",\r\n });\r\n</script>\r\n',
1910
+ },
1911
+ {
1912
+ fileName: "Toast/Title.vue",
1913
+ dirPath: "components/UI",
1914
+ fileContent:
1915
+ '<template>\r\n <ToastTitle :class="styles({ class: props.class })" v-bind="props">\r\n <slot>{{ title }}</slot>\r\n </ToastTitle>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastTitle } from "radix-vue";\r\n import type { ToastTitleProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n ToastTitleProps & {\r\n title?: string;\r\n class?: any;\r\n }\r\n >();\r\n\r\n const styles = tv({\r\n base: "text-sm font-semibold",\r\n });\r\n</script>\r\n',
1916
+ },
1917
+ {
1918
+ fileName: "Toast/Toast.vue",
1919
+ dirPath: "components/UI",
1920
+ fileContent:
1921
+ '<template>\r\n <ToastRoot\r\n v-bind="forwarded"\r\n :class="styles({ variant, class: props.class })"\r\n @update:open="onOpenChange"\r\n >\r\n <slot></slot>\r\n </ToastRoot>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastRoot, useForwardPropsEmits } from "radix-vue";\r\n import type { ToastRootEmits, ToastRootProps } from "radix-vue";\r\n\r\n export interface ToastProps extends ToastRootProps {\r\n class?: any;\r\n variant?: VariantProps<typeof styles>["variant"];\r\n onOpenChange?: ((value: boolean) => void) | undefined;\r\n }\r\n\r\n const props = withDefaults(defineProps<ToastProps>(), {});\r\n\r\n const emits = defineEmits<ToastRootEmits>();\r\n const forwarded = useForwardPropsEmits(props, emits);\r\n\r\n const styles = tv({\r\n base: "group pointer-events-auto relative flex w-full items-center justify-between gap-4 overflow-hidden rounded-lg border p-4 pr-9 shadow-sm transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-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",\r\n variants: {\r\n variant: {\r\n default: "border bg-background text-foreground",\r\n success:\r\n "success group border-[var(--success-border)] bg-[--success-bg] text-[--success-text]",\r\n info: "info group border-[var(--info-border)] bg-[--info-bg] text-[--info-text]",\r\n warning:\r\n "warning group border-[var(--warning-border)] bg-[--warning-bg] text-[--warning-text]",\r\n destructive:\r\n "destructive group border-[var(--error-border)] bg-[--error-bg] text-[--error-text]",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: "default",\r\n },\r\n });\r\n</script>\r\n',
1922
+ },
1923
+ {
1924
+ fileName: "Toast/Toaster.vue",
1925
+ dirPath: "components/UI",
1926
+ fileContent:
1927
+ '<template>\n <UIToastProvider>\n <template v-for="toast in toasts" :key="toast.id">\n <UIToast v-bind="toast">\n <div class="flex gap-3">\n <Icon\n v-if="toast.icon"\n :name="toast.icon"\n class="h-5 w-5 shrink-0"\n :class="[!!toast.title && !!toast.description && \'mt-0.5\']"\n />\n <div class="flex flex-col gap-1">\n <UIToastTitle v-if="toast.title" :title="toast.title" />\n <template v-if="toast.description">\n <UIToastDescription v-if="isVNode(toast.description)">\n <component :is="toast.description" />\n </UIToastDescription>\n <UIToastDescription v-else>\n {{ toast.description }}\n </UIToastDescription>\n </template>\n <UIToastClose />\n </div>\n </div>\n <component :is="toast.action" />\n </UIToast>\n </template>\n <UIToastViewport />\n </UIToastProvider>\n</template>\n\n<script lang="ts" setup>\n import { isVNode } from "vue";\n\n const { toasts } = useToast();\n</script>\n\n<style>\n :root {\n --success-bg: hsl(143, 85%, 96%);\n --success-border: hsl(145, 92%, 91%);\n --success-text: hsl(140, 100%, 27%);\n\n --info-bg: hsl(208, 100%, 97%);\n --info-border: hsl(221, 91%, 91%);\n --info-text: hsl(210, 92%, 45%);\n\n --warning-bg: hsl(49, 100%, 97%);\n --warning-border: hsl(49, 91%, 91%);\n --warning-text: hsl(31, 92%, 45%);\n\n --error-bg: hsl(359, 100%, 97%);\n --error-border: hsl(359, 100%, 94%);\n --error-text: hsl(360, 100%, 45%);\n }\n .dark {\n --success-bg: hsl(150, 100%, 6%);\n --success-border: hsl(147, 100%, 12%);\n --success-text: hsl(150, 86%, 65%);\n\n --info-bg: hsl(215, 100%, 6%);\n --info-border: hsl(223, 100%, 12%);\n --info-text: hsl(216, 87%, 65%);\n\n --warning-bg: hsl(64, 100%, 6%);\n --warning-border: hsl(60, 100%, 12%);\n --warning-text: hsl(46, 87%, 65%);\n\n --error-bg: hsl(358, 76%, 10%);\n --error-border: hsl(357, 89%, 16%);\n --error-text: hsl(358, 100%, 81%);\n }\n</style>\n',
1928
+ },
1929
+ {
1930
+ fileName: "Toast/Viewport.vue",
1931
+ dirPath: "components/UI",
1932
+ fileContent:
1933
+ '<template>\r\n <ToastViewport :class="styles({ class: props.class })" v-bind="props">\r\n <slot></slot>\r\n </ToastViewport>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { ToastViewport } from "radix-vue";\r\n import type { ToastViewportProps } from "radix-vue";\r\n\r\n const props = defineProps<\r\n ToastViewportProps & {\r\n class?: any;\r\n }\r\n >();\r\n\r\n const styles = tv({\r\n base: "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse gap-4 p-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:bottom-0 sm:right-0 sm:top-0 sm:flex-col md:max-w-[420px]",\r\n });\r\n</script>\r\n',
1934
+ },
1935
+ ],
1936
+ utils: [],
1937
+ },
1938
+ {
1939
+ name: "Toggle",
1940
+ value: "toggle",
1941
+ deps: ["tailwind-variants", "radix-vue"],
1942
+ devDeps: [],
1943
+ nuxtModules: [],
1944
+ files: [
1945
+ {
1946
+ fileName: "Toggle.vue",
1947
+ dirPath: "components/UI",
1948
+ fileContent:
1949
+ '<template>\n <ToggleRoot v-bind="forwarded" :class="styles({ variant, size, class: props.class })">\n <slot></slot>\n </ToggleRoot>\n</template>\n\n<script lang="ts" setup>\n import { Toggle as ToggleRoot, useForwardPropsEmits } from "radix-vue";\n import type { ToggleEmits, ToggleProps } from "radix-vue";\n\n const props = defineProps<\n ToggleProps & {\n class?: any;\n variant?: Props["variant"];\n size?: Props["size"];\n }\n >();\n\n const emits = defineEmits<ToggleEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n type Props = VariantProps<typeof styles>;\n\n const styles = tv({\n base: "inline-flex items-center justify-center rounded-md font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground sm:text-sm",\n variants: {\n variant: {\n default: "bg-transparent",\n outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",\n },\n size: {\n default: "h-10 px-3",\n sm: "h-9 px-2.5",\n lg: "h-11 px-5",\n },\n },\n defaultVariants: {\n variant: "default",\n size: "default",\n },\n });\n</script>\n',
1950
+ },
1951
+ ],
1952
+ utils: [],
1953
+ composables: [],
1954
+ },
1955
+ {
1956
+ name: "Tooltip",
1957
+ value: "tooltip",
1958
+ deps: ["tailwind-variants", "radix-vue"],
1959
+ devDeps: [],
1960
+ nuxtModules: [],
1961
+ files: [
1962
+ {
1963
+ fileName: "Tooltip/Arrow.vue",
1964
+ dirPath: "components/UI",
1965
+ fileContent:
1966
+ '<template>\n <TooltipArrow v-bind="props" />\n</template>\n\n<script lang="ts" setup>\n import { TooltipArrow } from "radix-vue";\n import type { TooltipArrowProps } from "radix-vue";\n\n const props = withDefaults(defineProps<TooltipArrowProps>(), {\n width: 10,\n height: 5,\n });\n</script>\n',
1967
+ },
1968
+ {
1969
+ fileName: "Tooltip/Content.vue",
1970
+ dirPath: "components/UI",
1971
+ fileContent:
1972
+ '<template>\n <UITooltipPortal :to="to">\n <TooltipContent v-bind="{ ...forwarded, ...$attrs }" :class="styles({ class: props.class })">\n <slot></slot>\n </TooltipContent>\n </UITooltipPortal>\n</template>\n\n<script lang="ts" setup>\n import { TooltipContent, useForwardPropsEmits } from "radix-vue";\n import type { TooltipContentEmits, TooltipContentProps } from "radix-vue";\n\n defineOptions({ inheritAttrs: false });\n\n const props = withDefaults(\n defineProps<\n TooltipContentProps & {\n to?: string | HTMLElement;\n class?: any;\n }\n >(),\n {\n side: "top",\n sideOffset: 8,\n align: "start",\n alignOffset: -4,\n avoidCollisions: true,\n collisionBoundary: () => [],\n collisionPadding: 0,\n sticky: "partial",\n }\n );\n\n const emits = defineEmits<TooltipContentEmits>();\n const forwarded = useForwardPropsEmits(props, emits);\n\n const styles = tv({\n base: "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",\n });\n</script>\n',
1973
+ },
1974
+ {
1975
+ fileName: "Tooltip/Portal.vue",
1976
+ dirPath: "components/UI",
1977
+ fileContent:
1978
+ '<template>\n <TooltipPortal v-bind="props">\n <slot></slot>\n </TooltipPortal>\n</template>\n\n<script lang="ts" setup>\n import { TooltipPortal } from "radix-vue";\n import type { TooltipPortalProps } from "radix-vue";\n\n const props = defineProps<TooltipPortalProps>();\n</script>\n',
1979
+ },
1980
+ {
1981
+ fileName: "Tooltip/Provider.vue",
1982
+ dirPath: "components/UI",
1983
+ fileContent:
1984
+ '<template>\n <TooltipProvider v-bind="props">\n <slot></slot>\n </TooltipProvider>\n</template>\n\n<script lang="ts" setup>\n import { TooltipProvider } from "radix-vue";\n import type { TooltipProviderProps } from "radix-vue";\n\n const props = defineProps<TooltipProviderProps>();\n</script>\n',
1985
+ },
1986
+ {
1987
+ fileName: "Tooltip/Tooltip.vue",
1988
+ dirPath: "components/UI",
1989
+ fileContent:
1990
+ '<template>\n <UITooltipProvider v-bind="props">\n <TooltipRoot v-bind="forwarded">\n <slot>\n <slot name="trigger"></slot>\n <slot name="content"></slot>\n </slot>\n </TooltipRoot>\n </UITooltipProvider>\n</template>\n\n<script lang="ts" setup>\n import { TooltipRoot, useForwardPropsEmits } from "radix-vue";\n import type { TooltipProviderProps, TooltipRootEmits, TooltipRootProps } from "radix-vue";\n\n const props = withDefaults(defineProps<TooltipRootProps & TooltipProviderProps>(), {\n delayDuration: 200,\n });\n\n const emits = defineEmits<TooltipRootEmits>();\n\n const forwarded = useForwardPropsEmits(props, emits);\n</script>\n',
1991
+ },
1992
+ {
1993
+ fileName: "Tooltip/Trigger.vue",
1994
+ dirPath: "components/UI",
1995
+ fileContent:
1996
+ '<template>\n <TooltipTrigger v-bind="props">\n <slot></slot>\n </TooltipTrigger>\n</template>\n\n<script lang="ts" setup>\n import { TooltipTrigger } from "radix-vue";\n import type { TooltipTriggerProps } from "radix-vue";\n\n const props = defineProps<TooltipTriggerProps>();\n</script>\n',
1997
+ },
1998
+ ],
1999
+ utils: [],
2000
+ composables: [],
2001
+ },
2002
+ {
2003
+ name: "Vue Sonner",
2004
+ value: "vue-sonner",
2005
+ deps: ["vue-sonner"],
2006
+ devDeps: [],
2007
+ nuxtModules: [],
2008
+ instructions: ["Remember to add the <UIVueSonner /> tag to your app.vue/layout file."],
2009
+ files: [
2010
+ {
2011
+ fileName: "VueSonner.client.vue",
2012
+ dirPath: "components/UI",
2013
+ fileContent:
2014
+ '<template>\r\n <Toaster\r\n position="top-right"\r\n :visible-toasts="5"\r\n rich-colors\r\n :duration="7000"\r\n close-button\r\n :theme="$colorMode.value == \'dark\' ? \'dark\' : \'light\'"\r\n />\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { Toaster } from "vue-sonner";\r\n</script>\r\n<style scoped>\r\n :deep([data-sonner-toaster][data-theme="dark"]),\r\n :deep([data-sonner-toaster][data-theme="light"]) {\r\n --normal-bg: theme("colors.popover.DEFAULT");\r\n --normal-border: theme("colors.border");\r\n --normal-text: theme("colors.popover.foreground");\r\n --border-radius: theme("borderRadius.md");\r\n }\r\n :deep([data-sonner-toaster]) {\r\n @apply font-sans;\r\n }\r\n :deep([data-sonner-toast][data-styled="true"]) {\r\n @apply items-start;\r\n }\r\n :deep([data-sonner-toast] [data-icon]) {\r\n @apply mt-0.5;\r\n }\r\n :deep([data-sonner-toast] [data-title]) {\r\n @apply text-sm font-semibold;\r\n }\r\n :deep([data-sonner-toast] [data-description]) {\r\n @apply text-sm;\r\n }\r\n :deep([data-sonner-toast] [data-close-button]) {\r\n @apply border border-border bg-background text-foreground hover:border-inherit hover:bg-inherit hover:text-accent-foreground;\r\n }\r\n :deep([data-sonner-toast] [data-button]) {\r\n @apply bg-primary text-primary-foreground transition hover:opacity-90 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background;\r\n }\r\n :deep(.sonner-loading-bar) {\r\n @apply bg-muted-foreground;\r\n }\r\n</style>\r\n',
2015
+ },
2016
+ ],
2017
+ utils: [],
2018
+ composables: [],
2019
+ },
2020
+ {
2021
+ name: "VeeCheckbox",
2022
+ value: "vue-checkbox",
2023
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2024
+ askValidator: true,
2025
+ devDeps: ["nuxt-icon"],
2026
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2027
+ components: ["checkbox", "label"],
2028
+ files: [
2029
+ {
2030
+ fileName: "Vee/Checkbox.vue",
2031
+ dirPath: "components/UI",
2032
+ fileContent:
2033
+ '<template>\n <div :class="styles({ class: props.class })">\n <UICheckbox\n :id="inputId"\n v-bind="$attrs"\n :icon="icon"\n :value="value"\n :name="name"\n :required="required"\n :disabled="disabled"\n :checked="checked"\n @update:checked="handleChange"\n />\n <div class="flex flex-col gap-1.5">\n <slot name="label" :errorMessage="errorMessage" :checked="checked">\n <UILabel\n :for="inputId"\n v-if="label"\n class="leading-none"\n :class="[errorMessage && \'text-destructive\']"\n >{{ label }}</UILabel\n >\n </slot>\n <TransitionSlide tag="div" group>\n <slot name="hint" :errorMessage="errorMessage" :checked="checked">\n <p\n key="hint"\n class="text-sm leading-none text-muted-foreground"\n v-if="hint && !errorMessage"\n >\n {{ hint }}\n </p>\n </slot>\n <slot name="errorMessage" :errorMessage="errorMessage" :checked="checked">\n <p key="errorMessage" class="text-sm leading-none text-destructive" v-if="errorMessage">\n {{ errorMessage }}\n </p>\n </slot>\n </TransitionSlide>\n </div>\n </div>\n</template>\n\n<script lang="ts" setup>\n import { useId } from "radix-vue";\n\n const props = defineProps<{\n label?: string;\n icon?: string;\n hint?: string;\n modelValue?: string;\n name?: string;\n id?: string;\n rules?: any;\n validateOnMount?: boolean;\n type?: string;\n placeholder?: string;\n value?: any;\n required?: boolean;\n disabled?: boolean;\n class?: any;\n }>();\n const styles = tv({\n base: "flex gap-3",\n });\n\n defineOptions({ inheritAttrs: false });\n\n const inputId = useId(props.id);\n\n const { errorMessage, checked, handleChange } = useField(\n () => props.name || inputId,\n props.rules,\n {\n initialValue: props.modelValue,\n label: props.label,\n validateOnMount: props.validateOnMount,\n type: "checkbox",\n checkedValue: props.value || true,\n syncVModel: true,\n }\n );\n</script>\n',
2034
+ },
2035
+ ],
2036
+ utils: [],
2037
+ composables: [],
2038
+ },
2039
+ {
2040
+ name: "VeeFileInput",
2041
+ value: "vue-file-input",
2042
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2043
+ askValidator: true,
2044
+ devDeps: ["nuxt-icon"],
2045
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2046
+ components: ["input", "label"],
2047
+ files: [
2048
+ {
2049
+ fileName: "Vee/FileInput.vue",
2050
+ dirPath: "components/UI",
2051
+ fileContent:
2052
+ '<template>\r\n <div class="w-full">\r\n <UILabel :for="inputId" v-if="label" :class="[errorMessage && \'text-destructive\', \'mb-2\']">{{\r\n label\r\n }}</UILabel>\r\n <div class="relative">\r\n <slot name="icon">\r\n <span v-if="hasIcon" class="absolute inset-y-0 left-3 flex items-center justify-center">\r\n <Icon :name="icon" v-if="icon" class="h-4 w-4 text-muted-foreground/70" />\r\n </span>\r\n </slot>\r\n <UIInput\r\n type="file"\r\n @change="\r\n handleChange($event);\r\n emits(\'change\', $event.target.files);\r\n "\r\n @blur="\r\n handleBlur($event);\r\n emits(\'blur\', $event);\r\n "\r\n :id="inputId"\r\n :name="name"\r\n v-bind="$attrs"\r\n :multiple="multiple"\r\n :class="[hasIcon && \'pl-9\']"\r\n :accept="accept"\r\n />\r\n </div>\r\n <TransitionSlide group tag="div">\r\n <p key="hint" class="mt-1.5 text-sm text-muted-foreground" v-if="hint && !errorMessage">\r\n {{ hint }}\r\n </p>\r\n\r\n <p key="errorMessage" class="mt-1.5 text-sm text-destructive" v-if="errorMessage">\r\n {{ errorMessage }}\r\n </p>\r\n </TransitionSlide>\r\n </div>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { useId } from "radix-vue";\r\n\r\n const props = defineProps<{\r\n label?: string;\r\n icon?: string;\r\n hint?: string;\r\n name: string;\r\n id?: string;\r\n rules?: any;\r\n validateOnMount?: boolean;\r\n multiple?: boolean;\r\n accept?: string;\r\n }>();\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const emits = defineEmits<{\r\n change: [files?: FileList | File | File[] | null];\r\n blur: [event?: FocusEvent];\r\n }>();\r\n\r\n const inputId = useId(props.id);\r\n\r\n const hasIcon = computed(() => Boolean(props.icon) || Boolean(useSlots().icon));\r\n\r\n const { errorMessage, handleChange, handleBlur } = useField(() => props.name, props.rules, {\r\n label: props.label,\r\n validateOnMount: props.validateOnMount,\r\n });\r\n</script>\r\n',
2053
+ },
2054
+ ],
2055
+ utils: [],
2056
+ composables: [],
2057
+ },
2058
+ {
2059
+ name: "VeeInput",
2060
+ value: "vue-input",
2061
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2062
+ askValidator: true,
2063
+ devDeps: ["nuxt-icon"],
2064
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2065
+ components: ["input", "label"],
2066
+ files: [
2067
+ {
2068
+ fileName: "Vee/Input.vue",
2069
+ dirPath: "components/UI",
2070
+ fileContent:
2071
+ '<template>\r\n <div class="w-full">\r\n <UILabel :for="inputId" v-if="label" :class="[errorMessage && \'text-destructive\', \'mb-2\']">{{\r\n label\r\n }}</UILabel>\r\n <div class="relative">\r\n <slot name="icon">\r\n <span v-if="hasIcon" class="absolute inset-y-0 left-3 flex items-center justify-center">\r\n <Icon :name="icon" v-if="icon" class="h-4 w-4 text-muted-foreground/70" />\r\n </span>\r\n </slot>\r\n <UIInput\r\n :type="type"\r\n v-model="value"\r\n @blur="handleBlur"\r\n :id="inputId"\r\n :name="name"\r\n v-bind="$attrs"\r\n :class="[hasIcon && \'pl-9\']"\r\n :placeholder="placeholder"\r\n />\r\n </div>\r\n <TransitionSlide group tag="div">\r\n <p key="hint" class="mt-1.5 text-sm text-muted-foreground" v-if="hint && !errorMessage">\r\n {{ hint }}\r\n </p>\r\n\r\n <p key="errorMessage" class="mt-1.5 text-sm text-destructive" v-if="errorMessage">\r\n {{ errorMessage }}\r\n </p>\r\n </TransitionSlide>\r\n </div>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { useId } from "radix-vue";\r\n\r\n const props = defineProps<{\r\n label?: string;\r\n icon?: string;\r\n hint?: string;\r\n modelValue?: string;\r\n name?: string;\r\n id?: string;\r\n rules?: any;\r\n validateOnMount?: boolean;\r\n type?: string;\r\n placeholder?: string;\r\n }>();\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const inputId = useId(props.id);\r\n\r\n const hasIcon = computed(() => Boolean(props.icon) || Boolean(useSlots().icon));\r\n\r\n const { errorMessage, value, handleBlur } = useField(() => props.name || inputId, props.rules, {\r\n initialValue: props.modelValue,\r\n label: props.label,\r\n validateOnMount: props.validateOnMount,\r\n syncVModel: true,\r\n });\r\n</script>\r\n',
2072
+ },
2073
+ ],
2074
+ utils: [],
2075
+ composables: [],
2076
+ },
2077
+ {
2078
+ name: "VeeRadioGroup",
2079
+ value: "vue-radio-group",
2080
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2081
+ askValidator: true,
2082
+ devDeps: ["nuxt-icon"],
2083
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2084
+ components: ["radio-group", "label"],
2085
+ files: [
2086
+ {
2087
+ fileName: "Vee/RadioGroup.vue",
2088
+ dirPath: "components/UI",
2089
+ fileContent:
2090
+ '<template>\n <div :class="styles({ class: props.class })">\n <slot name="label" :errorMessage="errorMessage" :value="value">\n <UILabel\n v-if="label"\n class="mb-5 leading-none"\n :class="[errorMessage && \'text-destructive\']"\n >{{ label }}</UILabel\n >\n </slot>\n <UIRadioGroup v-bind="{ ...forwarded, ...$attrs }" v-model="value">\n <slot></slot>\n </UIRadioGroup>\n <div class="flex flex-col gap-1.5">\n <TransitionSlide tag="div" group>\n <slot name="hint" :errorMessage="errorMessage" :value="value">\n <p\n key="hint"\n class="mt-1.5 text-sm leading-none text-muted-foreground"\n v-if="hint && !errorMessage"\n >\n {{ hint }}\n </p>\n </slot>\n <slot name="errorMessage" :errorMessage="errorMessage" :value="value">\n <p\n key="errorMessage"\n class="mt-1.5 text-sm leading-none text-destructive"\n v-if="errorMessage"\n >\n {{ errorMessage }}\n </p>\n </slot>\n </TransitionSlide>\n </div>\n </div>\n</template>\n\n<script lang="ts" setup>\n import { useForwardProps } from "radix-vue";\n import type { RadioGroupRootProps } from "radix-vue";\n\n const props = defineProps<\n RadioGroupRootProps & {\n label?: string;\n hint?: string;\n id?: string;\n rules?: any;\n validateOnMount?: boolean;\n class?: any;\n name: string;\n }\n >();\n\n const forwarded = useForwardProps(\n useOmit(props, ["label", "hint", "id", "rules", "validateOnMount", "class"])\n );\n const styles = tv({\n base: "flex flex-col",\n });\n\n defineOptions({ inheritAttrs: false });\n\n const { errorMessage, value } = useField(() => props.name, props.rules, {\n initialValue: props.modelValue,\n label: props.label,\n validateOnMount: props.validateOnMount,\n type: "radio",\n syncVModel: true,\n });\n</script>\n',
2091
+ },
2092
+ ],
2093
+ utils: [],
2094
+ composables: [],
2095
+ },
2096
+ {
2097
+ name: "VeeSelect",
2098
+ value: "vue-select",
2099
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2100
+ askValidator: true,
2101
+ devDeps: ["nuxt-icon"],
2102
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2103
+ components: ["native-select", "label"],
2104
+ files: [
2105
+ {
2106
+ fileName: "Vee/Select.vue",
2107
+ dirPath: "components/UI",
2108
+ fileContent:
2109
+ '<template>\r\n <div class="w-full">\r\n <UILabel :for="inputId" v-if="label" :class="[errorMessage && \'text-destructive\', \'mb-2\']">{{\r\n label\r\n }}</UILabel>\r\n <div class="relative">\r\n <slot name="icon">\r\n <span v-if="hasIcon" lass="absolute inset-y-0 left-3 flex items-center justify-center">\r\n <Icon :name="icon" v-if="icon" class="h-4 w-4 text-muted-foreground" />\r\n </span>\r\n </slot>\r\n <UINativeSelect\r\n :trailingIcon="trailingIcon"\r\n v-model="value"\r\n @blur="handleBlur"\r\n :id="inputId"\r\n :name="name"\r\n v-bind="$attrs"\r\n :class="[hasIcon && \'pl-9\']"\r\n >\r\n <slot></slot>\r\n </UINativeSelect>\r\n </div>\r\n <TransitionSlide group tag="div">\r\n <p key="hint" class="mt-1.5 text-sm text-muted-foreground" v-if="hint && !errorMessage">\r\n {{ hint }}\r\n </p>\r\n\r\n <p key="errorMessage" class="mt-1.5 text-sm text-destructive" v-if="errorMessage">\r\n {{ errorMessage }}\r\n </p>\r\n </TransitionSlide>\r\n </div>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { useId } from "radix-vue";\r\n\r\n const props = defineProps<{\r\n label?: string;\r\n icon?: string;\r\n hint?: string;\r\n modelValue?: string;\r\n name?: string;\r\n id?: string;\r\n rules?: any;\r\n validateOnMount?: boolean;\r\n type?: string;\r\n trailingIcon?: string;\r\n }>();\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const inputId = useId(props.id);\r\n\r\n const hasIcon = computed(() => Boolean(props.icon) || Boolean(useSlots().icon));\r\n\r\n const { errorMessage, value, handleBlur } = useField(() => props.name || inputId, props.rules, {\r\n initialValue: props.modelValue,\r\n label: props.label,\r\n validateOnMount: props.validateOnMount,\r\n syncVModel: true,\r\n });\r\n</script>\r\n',
2110
+ },
2111
+ ],
2112
+ utils: [],
2113
+ composables: [],
2114
+ },
2115
+ {
2116
+ name: "VeeTextarea",
2117
+ value: "vue-textarea",
2118
+ deps: ["@vee-validate/nuxt", "radix-vue", "@morev/vue-transitions", "tailwind-variants"],
2119
+ askValidator: true,
2120
+ devDeps: ["nuxt-icon"],
2121
+ nuxtModules: ["@vee-validate/nuxt", "@morev/vue-transitions/nuxt", "nuxt-icon"],
2122
+ components: ["textarea", "label"],
2123
+ files: [
2124
+ {
2125
+ fileName: "Vee/Textarea.vue",
2126
+ dirPath: "components/UI",
2127
+ fileContent:
2128
+ '<template>\r\n <div class="w-full">\r\n <UILabel :for="inputId" v-if="label" :class="[errorMessage && \'text-destructive\', \'mb-2\']">{{\r\n label\r\n }}</UILabel>\r\n <div class="relative">\r\n <slot name="icon">\r\n <span v-if="hasIcon" class="absolute left-3 top-3 flex items-center justify-center">\r\n <Icon :name="icon" v-if="icon" class="h-4 w-4 text-muted-foreground/70" />\r\n </span>\r\n </slot>\r\n <UITextarea\r\n :rows="rows"\r\n v-model="value"\r\n @blur="handleBlur"\r\n :id="inputId"\r\n :name="name"\r\n v-bind="$attrs"\r\n :class="[hasIcon && \'pl-9\']"\r\n :placeholder="placeholder"\r\n />\r\n </div>\r\n <TransitionSlide group tag="div">\r\n <p key="hint" class="mt-1.5 text-sm text-muted-foreground" v-if="hint && !errorMessage">\r\n {{ hint }}\r\n </p>\r\n\r\n <p key="errorMessage" class="mt-1.5 text-sm text-destructive" v-if="errorMessage">\r\n {{ errorMessage }}\r\n </p>\r\n </TransitionSlide>\r\n </div>\r\n</template>\r\n\r\n<script lang="ts" setup>\r\n import { useId } from "radix-vue";\r\n\r\n const props = defineProps<{\r\n label?: string;\r\n icon?: string;\r\n hint?: string;\r\n modelValue?: string;\r\n name?: string;\r\n id?: string;\r\n rules?: any;\r\n validateOnMount?: boolean;\r\n placeholder?: string;\r\n rows?: number;\r\n }>();\r\n\r\n defineOptions({ inheritAttrs: false });\r\n\r\n const inputId = useId(props.id);\r\n\r\n const hasIcon = computed(() => Boolean(props.icon) || Boolean(useSlots().icon));\r\n\r\n const { errorMessage, value, handleBlur } = useField(() => props.name || inputId, props.rules, {\r\n initialValue: props.modelValue,\r\n label: props.label,\r\n validateOnMount: props.validateOnMount,\r\n syncVModel: true,\r\n });\r\n</script>\r\n',
2129
+ },
2130
+ ],
2131
+ utils: [],
2132
+ composables: [],
2133
+ },
2134
+ ];