|
1 | 1 | {# @prop variant 'default'|'secondary'|'destructive'|'outline'|'ghost'|'link' The variant, default to `default` #} |
2 | | -{# @prop size 'default'|'sm'|'lg'|'icon' The size, default to `default` #} |
3 | | -{# @prop as 'button' The HTML tag to use, default to `button` #} |
| 2 | +{# @prop size 'default'|'sm'|'lg'|'icon'|'icon-sm'|'icon-lg' The size, default to `default` #} |
4 | 3 | {# @block content The default block #} |
5 | | -{%- props variant = 'default', size = 'default', as = 'button' -%} |
| 4 | +{%- props variant = 'default', size = 'default' -%} |
6 | 5 | {%- set style = html_cva( |
7 | | - base: 'inline-flex items-center justify-center gap-2 whitespace-nowrap 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 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', |
| 6 | + base: "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", |
8 | 7 | variants: { |
9 | 8 | variant: { |
10 | 9 | default: 'bg-primary text-primary-foreground hover:bg-primary/90', |
11 | 10 | secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', |
12 | | - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90', |
13 | | - outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', |
14 | | - ghost: 'hover:bg-accent hover:text-accent-foreground', |
| 11 | + destructive: 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', |
| 12 | + outline: 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', |
| 13 | + ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', |
15 | 14 | link: 'text-primary underline-offset-4 hover:underline', |
16 | 15 | }, |
17 | 16 | size: { |
18 | | - default: 'h-10 px-4 py-2', |
19 | | - sm: 'h-9 rounded-md px-3', |
20 | | - lg: 'h-11 rounded-md px-8', |
21 | | - icon: 'h-10 w-10', |
| 17 | + default: 'h-9 px-4 py-2 has-[>svg]:px-3', |
| 18 | + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', |
| 19 | + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', |
| 20 | + icon: 'size-9', |
| 21 | + 'icon-sm': 'size-8', |
| 22 | + 'icon-lg': 'size-10', |
22 | 23 | }, |
23 | 24 | }, |
24 | 25 | ) -%} |
| 26 | +{%- set as = attributes.has('href') ? 'a' : 'button' -%} |
25 | 27 |
|
26 | 28 | <{{ as }} |
| 29 | + data-slot="button" |
27 | 30 | class="{{ style.apply({variant: variant, size: size}, attributes.render('class'))|tailwind_merge }}" |
28 | 31 | {{ attributes }} |
29 | 32 | > |
|
0 commit comments