-
{{ token }}
+
+
+
+ {{ $t('tools.token-generator.title') }}
+
+
+ {{ $t('tools.token-generator.description') }}
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
length = v?.[0] ?? 1"
+ />
+
+
+
+
+
+
{{ $t('tools.token-generator.format') }}
+
+
+ {{ label }}
+
+
+
+
+
+
{{ $t('tools.token-generator.quantity') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/button/index.ts b/packages/app/src/modules/ui/components/button/index.ts
index 81921174..640289ee 100644
--- a/packages/app/src/modules/ui/components/button/index.ts
+++ b/packages/app/src/modules/ui/components/button/index.ts
@@ -7,10 +7,10 @@ export const buttonVariants = cva(
{
variants: {
variant: {
- default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
- destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
- outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
- secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
+ destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
+ outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
+ secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
},
diff --git a/packages/app/src/modules/ui/components/card/Card.vue b/packages/app/src/modules/ui/components/card/Card.vue
index 540ebe12..a591a15f 100644
--- a/packages/app/src/modules/ui/components/card/Card.vue
+++ b/packages/app/src/modules/ui/components/card/Card.vue
@@ -11,7 +11,7 @@ const props = defineProps<{
+import type { CheckboxRootEmits, CheckboxRootProps } from 'radix-vue';
+import { cn } from '@/src/modules/shared/style/cn';
+import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from 'radix-vue';
+import { computed, type HTMLAttributes } from 'vue';
+
+const props = defineProps
();
+const emits = defineEmits();
+
+const delegatedProps = computed(() => {
+ const { class: _, ...delegated } = props;
+
+ return delegated;
+});
+
+const forwarded = useForwardPropsEmits(delegatedProps, emits);
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/checkbox/index.ts b/packages/app/src/modules/ui/components/checkbox/index.ts
new file mode 100644
index 00000000..8c28c286
--- /dev/null
+++ b/packages/app/src/modules/ui/components/checkbox/index.ts
@@ -0,0 +1 @@
+export { default as Checkbox } from './Checkbox.vue'
diff --git a/packages/app/src/modules/ui/components/command/Command.vue b/packages/app/src/modules/ui/components/command/Command.vue
new file mode 100644
index 00000000..23dcf196
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/Command.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandDialog.vue b/packages/app/src/modules/ui/components/command/CommandDialog.vue
new file mode 100644
index 00000000..babc140d
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandDialog.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandEmpty.vue b/packages/app/src/modules/ui/components/command/CommandEmpty.vue
new file mode 100644
index 00000000..13fd2726
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandEmpty.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandGroup.vue b/packages/app/src/modules/ui/components/command/CommandGroup.vue
new file mode 100644
index 00000000..535c3ee9
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandGroup.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+ {{ heading }}
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandInput.vue b/packages/app/src/modules/ui/components/command/CommandInput.vue
new file mode 100644
index 00000000..7f53b9d6
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandInput.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandItem.vue b/packages/app/src/modules/ui/components/command/CommandItem.vue
new file mode 100644
index 00000000..703e4c94
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandItem.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandList.vue b/packages/app/src/modules/ui/components/command/CommandList.vue
new file mode 100644
index 00000000..c7eabe4d
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandList.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandSeparator.vue b/packages/app/src/modules/ui/components/command/CommandSeparator.vue
new file mode 100644
index 00000000..358297fa
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandSeparator.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/CommandShortcut.vue b/packages/app/src/modules/ui/components/command/CommandShortcut.vue
new file mode 100644
index 00000000..dab23f03
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/CommandShortcut.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/command/index.ts b/packages/app/src/modules/ui/components/command/index.ts
new file mode 100644
index 00000000..0e35f4b9
--- /dev/null
+++ b/packages/app/src/modules/ui/components/command/index.ts
@@ -0,0 +1,9 @@
+export { default as Command } from './Command.vue'
+export { default as CommandDialog } from './CommandDialog.vue'
+export { default as CommandEmpty } from './CommandEmpty.vue'
+export { default as CommandGroup } from './CommandGroup.vue'
+export { default as CommandInput } from './CommandInput.vue'
+export { default as CommandItem } from './CommandItem.vue'
+export { default as CommandList } from './CommandList.vue'
+export { default as CommandSeparator } from './CommandSeparator.vue'
+export { default as CommandShortcut } from './CommandShortcut.vue'
diff --git a/packages/app/src/modules/ui/components/dialog/Dialog.vue b/packages/app/src/modules/ui/components/dialog/Dialog.vue
new file mode 100644
index 00000000..a04c0262
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/Dialog.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogClose.vue b/packages/app/src/modules/ui/components/dialog/DialogClose.vue
new file mode 100644
index 00000000..a64703e5
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogClose.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogContent.vue b/packages/app/src/modules/ui/components/dialog/DialogContent.vue
new file mode 100644
index 00000000..9311108d
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogContent.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+ Close
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogDescription.vue b/packages/app/src/modules/ui/components/dialog/DialogDescription.vue
new file mode 100644
index 00000000..6d0b1aa7
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogDescription.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogFooter.vue b/packages/app/src/modules/ui/components/dialog/DialogFooter.vue
new file mode 100644
index 00000000..88218a6c
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogFooter.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogHeader.vue b/packages/app/src/modules/ui/components/dialog/DialogHeader.vue
new file mode 100644
index 00000000..e6e0009f
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogHeader.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogScrollContent.vue b/packages/app/src/modules/ui/components/dialog/DialogScrollContent.vue
new file mode 100644
index 00000000..1bab783e
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogScrollContent.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+ {
+ const originalEvent = event.detail.originalEvent;
+ const target = originalEvent.target as HTMLElement;
+ if (originalEvent.offsetX > target.clientWidth || originalEvent.offsetY > target.clientHeight) {
+ event.preventDefault();
+ }
+ }"
+ >
+
+
+
+
+ Close
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogTitle.vue b/packages/app/src/modules/ui/components/dialog/DialogTitle.vue
new file mode 100644
index 00000000..a3810570
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogTitle.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/DialogTrigger.vue b/packages/app/src/modules/ui/components/dialog/DialogTrigger.vue
new file mode 100644
index 00000000..ee0c12ff
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/DialogTrigger.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/dialog/index.ts b/packages/app/src/modules/ui/components/dialog/index.ts
new file mode 100644
index 00000000..ca8cfeae
--- /dev/null
+++ b/packages/app/src/modules/ui/components/dialog/index.ts
@@ -0,0 +1,9 @@
+export { default as Dialog } from './Dialog.vue'
+export { default as DialogClose } from './DialogClose.vue'
+export { default as DialogContent } from './DialogContent.vue'
+export { default as DialogDescription } from './DialogDescription.vue'
+export { default as DialogFooter } from './DialogFooter.vue'
+export { default as DialogHeader } from './DialogHeader.vue'
+export { default as DialogScrollContent } from './DialogScrollContent.vue'
+export { default as DialogTitle } from './DialogTitle.vue'
+export { default as DialogTrigger } from './DialogTrigger.vue'
diff --git a/packages/app/src/modules/ui/components/number-field/NumberField.vue b/packages/app/src/modules/ui/components/number-field/NumberField.vue
new file mode 100644
index 00000000..89323138
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/NumberField.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/number-field/NumberFieldContent.vue b/packages/app/src/modules/ui/components/number-field/NumberFieldContent.vue
new file mode 100644
index 00000000..88f754f1
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/NumberFieldContent.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/number-field/NumberFieldDecrement.vue b/packages/app/src/modules/ui/components/number-field/NumberFieldDecrement.vue
new file mode 100644
index 00000000..cfdd1074
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/NumberFieldDecrement.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/number-field/NumberFieldIncrement.vue b/packages/app/src/modules/ui/components/number-field/NumberFieldIncrement.vue
new file mode 100644
index 00000000..d583a8cf
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/NumberFieldIncrement.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/number-field/NumberFieldInput.vue b/packages/app/src/modules/ui/components/number-field/NumberFieldInput.vue
new file mode 100644
index 00000000..4c72f209
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/NumberFieldInput.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/number-field/index.ts b/packages/app/src/modules/ui/components/number-field/index.ts
new file mode 100644
index 00000000..5489697d
--- /dev/null
+++ b/packages/app/src/modules/ui/components/number-field/index.ts
@@ -0,0 +1,5 @@
+export { default as NumberField } from './NumberField.vue'
+export { default as NumberFieldContent } from './NumberFieldContent.vue'
+export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue'
+export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue'
+export { default as NumberFieldInput } from './NumberFieldInput.vue'
diff --git a/packages/app/src/modules/ui/components/select/Select.vue b/packages/app/src/modules/ui/components/select/Select.vue
new file mode 100644
index 00000000..adc42fdf
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/Select.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectContent.vue b/packages/app/src/modules/ui/components/select/SelectContent.vue
new file mode 100644
index 00000000..56cc55d1
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectContent.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectGroup.vue b/packages/app/src/modules/ui/components/select/SelectGroup.vue
new file mode 100644
index 00000000..ef4474a6
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectGroup.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectItem.vue b/packages/app/src/modules/ui/components/select/SelectItem.vue
new file mode 100644
index 00000000..91f1aedd
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectItem.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectItemText.vue b/packages/app/src/modules/ui/components/select/SelectItemText.vue
new file mode 100644
index 00000000..a0bb5c24
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectItemText.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectLabel.vue b/packages/app/src/modules/ui/components/select/SelectLabel.vue
new file mode 100644
index 00000000..7ca1ca62
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectLabel.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectScrollDownButton.vue b/packages/app/src/modules/ui/components/select/SelectScrollDownButton.vue
new file mode 100644
index 00000000..8853a086
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectScrollDownButton.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectScrollUpButton.vue b/packages/app/src/modules/ui/components/select/SelectScrollUpButton.vue
new file mode 100644
index 00000000..c8179938
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectScrollUpButton.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectSeparator.vue b/packages/app/src/modules/ui/components/select/SelectSeparator.vue
new file mode 100644
index 00000000..ff2ee6c8
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectSeparator.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectTrigger.vue b/packages/app/src/modules/ui/components/select/SelectTrigger.vue
new file mode 100644
index 00000000..91589c99
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectTrigger.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/SelectValue.vue b/packages/app/src/modules/ui/components/select/SelectValue.vue
new file mode 100644
index 00000000..4bc37dd8
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/SelectValue.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/select/index.ts b/packages/app/src/modules/ui/components/select/index.ts
new file mode 100644
index 00000000..31b92946
--- /dev/null
+++ b/packages/app/src/modules/ui/components/select/index.ts
@@ -0,0 +1,11 @@
+export { default as Select } from './Select.vue'
+export { default as SelectContent } from './SelectContent.vue'
+export { default as SelectGroup } from './SelectGroup.vue'
+export { default as SelectItem } from './SelectItem.vue'
+export { default as SelectItemText } from './SelectItemText.vue'
+export { default as SelectLabel } from './SelectLabel.vue'
+export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue'
+export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue'
+export { default as SelectSeparator } from './SelectSeparator.vue'
+export { default as SelectTrigger } from './SelectTrigger.vue'
+export { default as SelectValue } from './SelectValue.vue'
diff --git a/packages/app/src/modules/ui/components/sheet/Sheet.vue b/packages/app/src/modules/ui/components/sheet/Sheet.vue
new file mode 100644
index 00000000..a04c0262
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/Sheet.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetClose.vue b/packages/app/src/modules/ui/components/sheet/SheetClose.vue
new file mode 100644
index 00000000..a64703e5
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetClose.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetContent.vue b/packages/app/src/modules/ui/components/sheet/SheetContent.vue
new file mode 100644
index 00000000..f7f95507
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetContent.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetDescription.vue b/packages/app/src/modules/ui/components/sheet/SheetDescription.vue
new file mode 100644
index 00000000..8f128ff8
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetDescription.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetFooter.vue b/packages/app/src/modules/ui/components/sheet/SheetFooter.vue
new file mode 100644
index 00000000..88218a6c
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetFooter.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetHeader.vue b/packages/app/src/modules/ui/components/sheet/SheetHeader.vue
new file mode 100644
index 00000000..978f1269
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetHeader.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetTitle.vue b/packages/app/src/modules/ui/components/sheet/SheetTitle.vue
new file mode 100644
index 00000000..a48a617c
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetTitle.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/SheetTrigger.vue b/packages/app/src/modules/ui/components/sheet/SheetTrigger.vue
new file mode 100644
index 00000000..ee0c12ff
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/SheetTrigger.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/sheet/index.ts b/packages/app/src/modules/ui/components/sheet/index.ts
new file mode 100644
index 00000000..4c4e77af
--- /dev/null
+++ b/packages/app/src/modules/ui/components/sheet/index.ts
@@ -0,0 +1,31 @@
+import { cva, type VariantProps } from 'class-variance-authority'
+
+export { default as Sheet } from './Sheet.vue'
+export { default as SheetClose } from './SheetClose.vue'
+export { default as SheetContent } from './SheetContent.vue'
+export { default as SheetDescription } from './SheetDescription.vue'
+export { default as SheetFooter } from './SheetFooter.vue'
+export { default as SheetHeader } from './SheetHeader.vue'
+export { default as SheetTitle } from './SheetTitle.vue'
+export { default as SheetTrigger } from './SheetTrigger.vue'
+
+export const sheetVariants = cva(
+ 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500',
+ {
+ variants: {
+ side: {
+ top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
+ bottom:
+ 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
+ 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',
+ right:
+ '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',
+ },
+ },
+ defaultVariants: {
+ side: 'right',
+ },
+ },
+)
+
+export type SheetVariants = VariantProps
diff --git a/packages/app/src/modules/ui/components/slider/Slider.vue b/packages/app/src/modules/ui/components/slider/Slider.vue
new file mode 100644
index 00000000..7b27d67c
--- /dev/null
+++ b/packages/app/src/modules/ui/components/slider/Slider.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/slider/index.ts b/packages/app/src/modules/ui/components/slider/index.ts
new file mode 100644
index 00000000..1c945deb
--- /dev/null
+++ b/packages/app/src/modules/ui/components/slider/index.ts
@@ -0,0 +1 @@
+export { default as Slider } from './Slider.vue'
diff --git a/packages/app/src/modules/ui/components/textarea/Textarea.vue b/packages/app/src/modules/ui/components/textarea/Textarea.vue
new file mode 100644
index 00000000..a084dff9
--- /dev/null
+++ b/packages/app/src/modules/ui/components/textarea/Textarea.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/textarea/index.ts b/packages/app/src/modules/ui/components/textarea/index.ts
new file mode 100644
index 00000000..6a7ab2a7
--- /dev/null
+++ b/packages/app/src/modules/ui/components/textarea/index.ts
@@ -0,0 +1 @@
+export { default as Textarea } from './Textarea.vue'
diff --git a/packages/app/src/modules/ui/components/toggle-group/ToggleGroup.vue b/packages/app/src/modules/ui/components/toggle-group/ToggleGroup.vue
new file mode 100644
index 00000000..3f31a5f3
--- /dev/null
+++ b/packages/app/src/modules/ui/components/toggle-group/ToggleGroup.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/toggle-group/ToggleGroupItem.vue b/packages/app/src/modules/ui/components/toggle-group/ToggleGroupItem.vue
new file mode 100644
index 00000000..adcbb217
--- /dev/null
+++ b/packages/app/src/modules/ui/components/toggle-group/ToggleGroupItem.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/toggle-group/index.ts b/packages/app/src/modules/ui/components/toggle-group/index.ts
new file mode 100644
index 00000000..9f89ad77
--- /dev/null
+++ b/packages/app/src/modules/ui/components/toggle-group/index.ts
@@ -0,0 +1,2 @@
+export { default as ToggleGroup } from './ToggleGroup.vue'
+export { default as ToggleGroupItem } from './ToggleGroupItem.vue'
diff --git a/packages/app/src/modules/ui/components/toggle/Toggle.vue b/packages/app/src/modules/ui/components/toggle/Toggle.vue
new file mode 100644
index 00000000..e40f326d
--- /dev/null
+++ b/packages/app/src/modules/ui/components/toggle/Toggle.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
diff --git a/packages/app/src/modules/ui/components/toggle/index.ts b/packages/app/src/modules/ui/components/toggle/index.ts
new file mode 100644
index 00000000..043172e4
--- /dev/null
+++ b/packages/app/src/modules/ui/components/toggle/index.ts
@@ -0,0 +1,27 @@
+import { cva, type VariantProps } from 'class-variance-authority';
+
+export { default as Toggle } from './Toggle.vue';
+
+export const toggleVariants = cva(
+ 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground',
+ {
+ variants: {
+ variant: {
+ default: 'bg-transparent',
+ outline:
+ 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',
+ },
+ size: {
+ default: 'h-9 px-3',
+ sm: 'h-8 px-2',
+ lg: 'h-10 px-3',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ },
+);
+
+export type ToggleVariants = VariantProps;