diff --git a/resources/js/components/ui/button/Button.vue b/resources/js/components/ui/button/Button.vue
index c6691f6..374320b 100644
--- a/resources/js/components/ui/button/Button.vue
+++ b/resources/js/components/ui/button/Button.vue
@@ -1,17 +1,19 @@
diff --git a/resources/js/components/ui/button/index.ts b/resources/js/components/ui/button/index.ts
index 751d3fd..26e2c55 100644
--- a/resources/js/components/ui/button/index.ts
+++ b/resources/js/components/ui/button/index.ts
@@ -1,42 +1,38 @@
-import { cva, type VariantProps } from 'class-variance-authority'
+import type { VariantProps } from "class-variance-authority"
+import { cva } from "class-variance-authority"
-export { default as Button } from './Button.vue'
+export { default as Button } from "./Button.vue"
export const buttonVariants = cva(
- 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium shadow-sm active:shadow-none active:inset-shadow-2xs active:inset-shadow-black/15 active:border-none transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default:
- 'bg-slate-100 hover:bg-slate-200 dark:bg-neutral-700 dark:hover:bg-neutral-700/66 border-b-1 border-t-1 border-t-white/75 border-b-slate-300 dark:border-t-neutral-600 dark:border-b-neutral-800',
- action:
- 'bg-blue-600 border-b-1 border-t-1 border-t-blue-400 border-b-blue-800 active:bg-blue-700 hover:bg-blue-500 text-white',
+ "bg-primary text-primary-foreground hover:bg-primary/90",
destructive:
- 'bg-destructive dark:bg-red-700 text-white border-b-1 border-t-1 border-t-red-200 border-b-red-700 dark:border-t-red-400 dark:border-b-red-800 hover:bg-red-600 active:bg-red-500 active:inset-shadow-red-950 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',
- success:
- 'bg-success text-success-foreground border-b-1 border-t-1 border-t-lime-200 border-b-lime-500 dark:border-t-lime-400 dark:border-b-lime-800 hover:bg-lime-500 active:bg-lime-500 active:inset-shadow-lime-600 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
- 'border bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary:
- 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost:
- 'border-none shadow-none hover:bg-slate-100 hover:text-accent-foreground dark:hover:bg-accent/50',
- link: 'text-primary underline-offset-4 hover:underline',
- pressed:
- 'bg-slate-100 dark:bg-neutral-700 shadow-none inset-shadow-2xs inset-shadow-black/15 border-none',
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
},
size: {
- default: 'h-8 px-6 active:pt-[1px] has-[>svg]:px-3',
- sm: 'h-7 px-4 rounded-md gap-1.5 has-[>svg]:px-2.5',
- lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
- icon: 'size-9',
+ "default": "h-9 px-4 py-2 has-[>svg]:px-3",
+ "sm": "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+ "lg": "h-10 rounded-md px-6 has-[>svg]:px-4",
+ "icon": "size-9",
+ "icon-sm": "size-8",
+ "icon-lg": "size-10",
},
},
defaultVariants: {
- variant: 'default',
- size: 'default',
+ variant: "default",
+ size: "default",
},
},
)
-
export type ButtonVariants = VariantProps
diff --git a/resources/js/components/ui/crm-button/Button.vue b/resources/js/components/ui/crm-button/Button.vue
new file mode 100644
index 0000000..c6691f6
--- /dev/null
+++ b/resources/js/components/ui/crm-button/Button.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-button/index.ts b/resources/js/components/ui/crm-button/index.ts
new file mode 100644
index 0000000..751d3fd
--- /dev/null
+++ b/resources/js/components/ui/crm-button/index.ts
@@ -0,0 +1,42 @@
+import { cva, type VariantProps } from 'class-variance-authority'
+
+export { default as Button } from './Button.vue'
+
+export const buttonVariants = cva(
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium shadow-sm active:shadow-none active:inset-shadow-2xs active:inset-shadow-black/15 active:border-none transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
+ {
+ variants: {
+ variant: {
+ default:
+ 'bg-slate-100 hover:bg-slate-200 dark:bg-neutral-700 dark:hover:bg-neutral-700/66 border-b-1 border-t-1 border-t-white/75 border-b-slate-300 dark:border-t-neutral-600 dark:border-b-neutral-800',
+ action:
+ 'bg-blue-600 border-b-1 border-t-1 border-t-blue-400 border-b-blue-800 active:bg-blue-700 hover:bg-blue-500 text-white',
+ destructive:
+ 'bg-destructive dark:bg-red-700 text-white border-b-1 border-t-1 border-t-red-200 border-b-red-700 dark:border-t-red-400 dark:border-b-red-800 hover:bg-red-600 active:bg-red-500 active:inset-shadow-red-950 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',
+ success:
+ 'bg-success text-success-foreground border-b-1 border-t-1 border-t-lime-200 border-b-lime-500 dark:border-t-lime-400 dark:border-b-lime-800 hover:bg-lime-500 active:bg-lime-500 active:inset-shadow-lime-600 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',
+ outline:
+ 'border bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
+ secondary:
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ ghost:
+ 'border-none shadow-none hover:bg-slate-100 hover:text-accent-foreground dark:hover:bg-accent/50',
+ link: 'text-primary underline-offset-4 hover:underline',
+ pressed:
+ 'bg-slate-100 dark:bg-neutral-700 shadow-none inset-shadow-2xs inset-shadow-black/15 border-none',
+ },
+ size: {
+ default: 'h-8 px-6 active:pt-[1px] has-[>svg]:px-3',
+ sm: 'h-7 px-4 rounded-md gap-1.5 has-[>svg]:px-2.5',
+ lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
+ icon: 'size-9',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ },
+)
+
+export type ButtonVariants = VariantProps
diff --git a/resources/js/components/ui/crm-input-group/InputGroup.vue b/resources/js/components/ui/crm-input-group/InputGroup.vue
new file mode 100644
index 0000000..5490005
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroup.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/InputGroupAddon.vue b/resources/js/components/ui/crm-input-group/InputGroupAddon.vue
new file mode 100644
index 0000000..709f482
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroupAddon.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/InputGroupButton.vue b/resources/js/components/ui/crm-input-group/InputGroupButton.vue
new file mode 100644
index 0000000..f9225ad
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroupButton.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/InputGroupInput.vue b/resources/js/components/ui/crm-input-group/InputGroupInput.vue
new file mode 100644
index 0000000..a6cfac0
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroupInput.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/InputGroupText.vue b/resources/js/components/ui/crm-input-group/InputGroupText.vue
new file mode 100644
index 0000000..e317337
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroupText.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/InputGroupTextarea.vue b/resources/js/components/ui/crm-input-group/InputGroupTextarea.vue
new file mode 100644
index 0000000..b58a86f
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/InputGroupTextarea.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input-group/index.ts b/resources/js/components/ui/crm-input-group/index.ts
new file mode 100644
index 0000000..d0fdb4c
--- /dev/null
+++ b/resources/js/components/ui/crm-input-group/index.ts
@@ -0,0 +1,59 @@
+import type { VariantProps } from "class-variance-authority"
+import type { HTMLAttributes } from "vue"
+import type { ButtonVariants } from '@/components/ui/crm-button'
+import { cva } from "class-variance-authority"
+
+export { default as InputGroup } from "./InputGroup.vue"
+export { default as InputGroupAddon } from "./InputGroupAddon.vue"
+export { default as InputGroupButton } from "./InputGroupButton.vue"
+export { default as InputGroupInput } from "./InputGroupInput.vue"
+export { default as InputGroupText } from "./InputGroupText.vue"
+export { default as InputGroupTextarea } from "./InputGroupTextarea.vue"
+
+export const inputGroupAddonVariants = cva(
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50",
+ {
+ variants: {
+ align: {
+ "inline-start":
+ "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
+ "inline-end":
+ "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
+ "block-start":
+ "order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5",
+ "block-end":
+ "order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5",
+ },
+ },
+ defaultVariants: {
+ align: "inline-start",
+ },
+ },
+)
+
+export type InputGroupVariants = VariantProps
+
+export const inputGroupButtonVariants = cva(
+ "text-sm shadow-none flex gap-2 items-center",
+ {
+ variants: {
+ size: {
+ "xs": "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
+ "sm": "h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
+ },
+ },
+ defaultVariants: {
+ size: "xs",
+ },
+ },
+)
+
+export type InputGroupButtonVariants = VariantProps
+
+export interface InputGroupButtonProps {
+ variant?: ButtonVariants["variant"]
+ size?: InputGroupButtonVariants["size"]
+ class?: HTMLAttributes["class"]
+}
diff --git a/resources/js/components/ui/crm-input/Input.vue b/resources/js/components/ui/crm-input/Input.vue
new file mode 100644
index 0000000..142a5a2
--- /dev/null
+++ b/resources/js/components/ui/crm-input/Input.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/crm-input/index.ts b/resources/js/components/ui/crm-input/index.ts
new file mode 100644
index 0000000..9976b86
--- /dev/null
+++ b/resources/js/components/ui/crm-input/index.ts
@@ -0,0 +1 @@
+export { default as Input } from "./Input.vue"
diff --git a/resources/js/components/ui/input-group/InputGroup.vue b/resources/js/components/ui/input-group/InputGroup.vue
new file mode 100644
index 0000000..5490005
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroup.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/InputGroupAddon.vue b/resources/js/components/ui/input-group/InputGroupAddon.vue
new file mode 100644
index 0000000..709f482
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroupAddon.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/InputGroupButton.vue b/resources/js/components/ui/input-group/InputGroupButton.vue
new file mode 100644
index 0000000..4e82e09
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroupButton.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/InputGroupInput.vue b/resources/js/components/ui/input-group/InputGroupInput.vue
new file mode 100644
index 0000000..50a696e
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroupInput.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/InputGroupText.vue b/resources/js/components/ui/input-group/InputGroupText.vue
new file mode 100644
index 0000000..e317337
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroupText.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/InputGroupTextarea.vue b/resources/js/components/ui/input-group/InputGroupTextarea.vue
new file mode 100644
index 0000000..b58a86f
--- /dev/null
+++ b/resources/js/components/ui/input-group/InputGroupTextarea.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/resources/js/components/ui/input-group/index.ts b/resources/js/components/ui/input-group/index.ts
new file mode 100644
index 0000000..7c1f18e
--- /dev/null
+++ b/resources/js/components/ui/input-group/index.ts
@@ -0,0 +1,59 @@
+import type { VariantProps } from "class-variance-authority"
+import type { HTMLAttributes } from "vue"
+import type { ButtonVariants } from '@/components/ui/button'
+import { cva } from "class-variance-authority"
+
+export { default as InputGroup } from "./InputGroup.vue"
+export { default as InputGroupAddon } from "./InputGroupAddon.vue"
+export { default as InputGroupButton } from "./InputGroupButton.vue"
+export { default as InputGroupInput } from "./InputGroupInput.vue"
+export { default as InputGroupText } from "./InputGroupText.vue"
+export { default as InputGroupTextarea } from "./InputGroupTextarea.vue"
+
+export const inputGroupAddonVariants = cva(
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50",
+ {
+ variants: {
+ align: {
+ "inline-start":
+ "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
+ "inline-end":
+ "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
+ "block-start":
+ "order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5",
+ "block-end":
+ "order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5",
+ },
+ },
+ defaultVariants: {
+ align: "inline-start",
+ },
+ },
+)
+
+export type InputGroupVariants = VariantProps
+
+export const inputGroupButtonVariants = cva(
+ "text-sm shadow-none flex gap-2 items-center",
+ {
+ variants: {
+ size: {
+ "xs": "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
+ "sm": "h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
+ },
+ },
+ defaultVariants: {
+ size: "xs",
+ },
+ },
+)
+
+export type InputGroupButtonVariants = VariantProps
+
+export interface InputGroupButtonProps {
+ variant?: ButtonVariants["variant"]
+ size?: InputGroupButtonVariants["size"]
+ class?: HTMLAttributes["class"]
+}
diff --git a/resources/js/components/ui/input/Input.vue b/resources/js/components/ui/input/Input.vue
index 142a5a2..e5135c1 100644
--- a/resources/js/components/ui/input/Input.vue
+++ b/resources/js/components/ui/input/Input.vue
@@ -1,19 +1,19 @@