azamat-ui-kit-cli 0.2.2 → 0.3.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/README.md +11 -0
- package/dist/index.cjs +452 -0
- package/package.json +2 -2
- package/vendor/src/components/actions/action-menu.tsx +21 -18
- package/vendor/src/components/calendar/calendar.tsx +153 -102
- package/vendor/src/components/calendar/date-picker.tsx +24 -14
- package/vendor/src/components/calendar/date-range-picker.tsx +137 -58
- package/vendor/src/components/charts/charts.tsx +32 -21
- package/vendor/src/components/command/command-palette.tsx +68 -57
- package/vendor/src/components/data-table/data-table-bulk-actions.tsx +23 -20
- package/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +21 -10
- package/vendor/src/components/data-table/data-table-pagination.tsx +6 -6
- package/vendor/src/components/data-table/data-table-toolbar.tsx +72 -44
- package/vendor/src/components/data-table/data-table.tsx +15 -11
- package/vendor/src/components/data-table/table-export-menu.tsx +1 -1
- package/vendor/src/components/data-table/table-import-button.tsx +1 -1
- package/vendor/src/components/display/data-state.tsx +20 -8
- package/vendor/src/components/display/index.ts +19 -15
- package/vendor/src/components/display/metric-card.tsx +35 -0
- package/vendor/src/components/display/progress-circle.tsx +24 -0
- package/vendor/src/components/display/smart-card.tsx +49 -27
- package/vendor/src/components/display/status-dot.tsx +45 -0
- package/vendor/src/components/display/user-card.tsx +30 -0
- package/vendor/src/components/feedback/alert.tsx +21 -11
- package/vendor/src/components/feedback/empty-state.tsx +2 -2
- package/vendor/src/components/feedback/loading-state.tsx +2 -2
- package/vendor/src/components/feedback/page-state.tsx +19 -15
- package/vendor/src/components/feedback/status-badge.tsx +43 -43
- package/vendor/src/components/form/form-app-input.tsx +147 -0
- package/vendor/src/components/form/form-date-input.tsx +16 -19
- package/vendor/src/components/form/form-field-shell.tsx +11 -8
- package/vendor/src/components/form/form-field-utils.ts +76 -0
- package/vendor/src/components/form/form-input.tsx +423 -44
- package/vendor/src/components/form/form-number-input.tsx +16 -15
- package/vendor/src/components/form/form-phone-input.tsx +15 -9
- package/vendor/src/components/form/form-search-input.tsx +16 -19
- package/vendor/src/components/form/form-select.tsx +4 -3
- package/vendor/src/components/form/public.ts +16 -14
- package/vendor/src/components/form/smart-form-shell.tsx +13 -12
- package/vendor/src/components/inputs/app-input.tsx +27 -0
- package/vendor/src/components/inputs/async-select.tsx +113 -84
- package/vendor/src/components/inputs/clearable-input.tsx +81 -61
- package/vendor/src/components/inputs/date-input.tsx +21 -17
- package/vendor/src/components/inputs/date-range-input.tsx +10 -10
- package/vendor/src/components/inputs/index.ts +1 -0
- package/vendor/src/components/inputs/input-decorator.tsx +101 -57
- package/vendor/src/components/inputs/masked-input.tsx +20 -20
- package/vendor/src/components/inputs/money-input.tsx +2 -2
- package/vendor/src/components/inputs/number-input.tsx +29 -19
- package/vendor/src/components/inputs/password-input.tsx +82 -45
- package/vendor/src/components/inputs/phone-input.tsx +24 -2
- package/vendor/src/components/inputs/quantity-input.tsx +2 -2
- package/vendor/src/components/inputs/search-input.tsx +54 -3
- package/vendor/src/components/inputs/simple-select.tsx +110 -22
- package/vendor/src/components/layout/app-shell.tsx +2 -2
- package/vendor/src/components/layout/index.ts +5 -4
- package/vendor/src/components/layout/page-header.tsx +79 -35
- package/vendor/src/components/layout/public.ts +12 -10
- package/vendor/src/components/layout/section-header.tsx +56 -0
- package/vendor/src/components/layout/stack.tsx +106 -0
- package/vendor/src/components/layout/stat-card.tsx +66 -29
- package/vendor/src/components/navigation/index.ts +1 -0
- package/vendor/src/components/navigation/nav-tabs.tsx +60 -0
- package/vendor/src/components/navigation/page-tabs.tsx +41 -26
- package/vendor/src/components/navigation/pagination.tsx +14 -10
- package/vendor/src/components/overlay/alert-dialog.tsx +65 -0
- package/vendor/src/components/overlay/drawer.tsx +71 -0
- package/vendor/src/components/overlay/index.ts +4 -2
- package/vendor/src/components/patterns/data-view.tsx +13 -8
- package/vendor/src/components/ui/badge.tsx +96 -52
- package/vendor/src/components/ui/button.tsx +99 -61
- package/vendor/src/components/ui/card.tsx +84 -25
- package/vendor/src/components/ui/checkbox.tsx +68 -68
- package/vendor/src/components/ui/command.tsx +32 -32
- package/vendor/src/components/ui/dialog.tsx +135 -138
- package/vendor/src/components/ui/dropdown-menu.tsx +21 -21
- package/vendor/src/components/ui/hover-card.tsx +49 -0
- package/vendor/src/components/ui/input-primitive.tsx +24 -0
- package/vendor/src/components/ui/input.tsx +191 -20
- package/vendor/src/components/ui/kbd.tsx +33 -0
- package/vendor/src/components/ui/popover.tsx +11 -11
- package/vendor/src/components/ui/radio-group.tsx +102 -0
- package/vendor/src/components/ui/right-click-menu.tsx +60 -0
- package/vendor/src/components/ui/scroll-box.tsx +27 -0
- package/vendor/src/components/ui/segmented-control.tsx +21 -17
- package/vendor/src/components/ui/select.tsx +187 -189
- package/vendor/src/components/ui/skeleton.tsx +2 -2
- package/vendor/src/components/ui/switch.tsx +60 -60
- package/vendor/src/components/ui/table.tsx +114 -114
- package/vendor/src/components/ui/tabs.tsx +2 -2
- package/vendor/src/components/ui/textarea.tsx +1 -1
- package/vendor/src/components/upload/file-dropzone.tsx +38 -0
- package/vendor/src/components/upload/file-upload.tsx +4 -4
- package/vendor/src/components/upload/image-upload.tsx +22 -19
- package/vendor/src/components/upload/index.ts +2 -0
- package/vendor/src/families/catalog.ts +1 -0
- package/vendor/src/families/docs-groups.ts +10 -1
- package/vendor/src/families/member-metadata.ts +24 -0
- package/vendor/src/families/member-snippets.ts +41 -2
- package/vendor/src/families/migration-map.ts +3 -0
- package/vendor/src/index.ts +23 -18
- package/vendor/templates/styles/globals.css +253 -0
- package/dist/index.js +0 -432
|
@@ -1,61 +1,99 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"icon-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { Button as ButtonPrimitive } from "@base-ui/react/button"
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
|
|
7
|
+
const buttonVariants = cva(
|
|
8
|
+
"group/button inline-flex shrink-0 items-center justify-center rounded-xl border border-transparent bg-clip-padding text-sm font-semibold whitespace-nowrap transition-[transform,background-color,border-color,color,box-shadow,opacity] outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
variant: {
|
|
12
|
+
default:
|
|
13
|
+
"border-primary/78 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--primary),white_12%),var(--primary))] text-primary-foreground shadow-[0_1px_0_rgba(255,255,255,0.18),0_14px_34px_color-mix(in_oklch,var(--primary),transparent_72%)] hover:-translate-y-px hover:bg-[linear-gradient(180deg,color-mix(in_oklch,var(--primary),white_18%),color-mix(in_oklch,var(--primary),white_4%))] hover:shadow-[0_1px_0_rgba(255,255,255,0.22),0_18px_38px_color-mix(in_oklch,var(--primary),transparent_66%)]",
|
|
14
|
+
outline:
|
|
15
|
+
"border-border/90 bg-background/96 text-foreground shadow-[0_1px_0_rgba(255,255,255,0.08)] hover:-translate-y-px hover:border-ring/35 hover:bg-accent hover:text-foreground hover:shadow-[0_10px_20px_rgba(15,23,42,0.08)] aria-expanded:border-ring/35 aria-expanded:bg-accent aria-expanded:text-foreground dark:border-white/12 dark:bg-white/6 dark:hover:bg-white/10 dark:hover:text-foreground",
|
|
16
|
+
secondary:
|
|
17
|
+
"border-border/60 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--secondary),white_24%),var(--secondary))] text-secondary-foreground shadow-[0_1px_0_rgba(255,255,255,0.1)] hover:-translate-y-px hover:bg-[linear-gradient(180deg,color-mix(in_oklch,var(--secondary),white_18%),color-mix(in_oklch,var(--secondary),var(--foreground)_6%))] hover:text-secondary-foreground aria-expanded:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_6%)] aria-expanded:text-secondary-foreground",
|
|
18
|
+
ghost:
|
|
19
|
+
"border-transparent bg-transparent text-foreground/86 shadow-none hover:border-border/60 hover:bg-accent/88 hover:text-foreground aria-expanded:border-border/60 aria-expanded:bg-accent/88 aria-expanded:text-foreground dark:text-foreground/84 dark:hover:bg-white/8",
|
|
20
|
+
destructive:
|
|
21
|
+
"border-destructive/34 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--destructive),white_8%),var(--destructive))] text-white shadow-[0_1px_0_rgba(255,255,255,0.16),0_14px_34px_color-mix(in_oklch,var(--destructive),transparent_74%)] hover:-translate-y-px hover:bg-[linear-gradient(180deg,color-mix(in_oklch,var(--destructive),white_6%),color-mix(in_oklch,var(--destructive),black_6%))] hover:shadow-[0_1px_0_rgba(255,255,255,0.2),0_18px_38px_color-mix(in_oklch,var(--destructive),transparent_68%)] focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
|
|
22
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
23
|
+
},
|
|
24
|
+
size: {
|
|
25
|
+
default:
|
|
26
|
+
"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5",
|
|
27
|
+
xs: "h-7 gap-1 rounded-[min(var(--radius-lg),12px)] px-2.5 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3",
|
|
28
|
+
sm: "h-8 gap-1 rounded-[min(var(--radius-lg),14px)] px-3 text-[0.82rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3.5",
|
|
29
|
+
md: "h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5",
|
|
30
|
+
lg: "h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
|
|
31
|
+
xl: "h-11 gap-2 px-5 text-base has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4",
|
|
32
|
+
icon: "size-9",
|
|
33
|
+
"icon-xs":
|
|
34
|
+
"size-7 rounded-[min(var(--radius-lg),12px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
|
|
35
|
+
"icon-sm":
|
|
36
|
+
"size-8 rounded-[min(var(--radius-lg),14px)] in-data-[slot=button-group]:rounded-lg",
|
|
37
|
+
"icon-lg": "size-10",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
defaultVariants: {
|
|
41
|
+
variant: "default",
|
|
42
|
+
size: "default",
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
export type ButtonProps = ButtonPrimitive.Props &
|
|
48
|
+
VariantProps<typeof buttonVariants> & {
|
|
49
|
+
loading?: boolean
|
|
50
|
+
loadingLabel?: string
|
|
51
|
+
leftIcon?: React.ReactNode
|
|
52
|
+
rightIcon?: React.ReactNode
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function Button({
|
|
56
|
+
className,
|
|
57
|
+
variant = "default",
|
|
58
|
+
size = "default",
|
|
59
|
+
disabled,
|
|
60
|
+
loading = false,
|
|
61
|
+
loadingLabel = "Loading",
|
|
62
|
+
leftIcon,
|
|
63
|
+
rightIcon,
|
|
64
|
+
children,
|
|
65
|
+
...props
|
|
66
|
+
}: ButtonProps) {
|
|
67
|
+
const isDisabled = disabled || loading
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<ButtonPrimitive
|
|
71
|
+
data-slot="button"
|
|
72
|
+
data-loading={loading || undefined}
|
|
73
|
+
disabled={isDisabled}
|
|
74
|
+
aria-busy={loading || undefined}
|
|
75
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
76
|
+
{...props}
|
|
77
|
+
>
|
|
78
|
+
{loading ? (
|
|
79
|
+
<span
|
|
80
|
+
data-slot="button-spinner"
|
|
81
|
+
aria-hidden="true"
|
|
82
|
+
className="size-4 animate-spin rounded-full border-2 border-current border-t-transparent opacity-80"
|
|
83
|
+
/>
|
|
84
|
+
) : leftIcon ? (
|
|
85
|
+
<span data-icon="inline-start" data-slot="button-icon" className="inline-flex shrink-0 items-center justify-center">
|
|
86
|
+
{leftIcon}
|
|
87
|
+
</span>
|
|
88
|
+
) : null}
|
|
89
|
+
{children ? <span data-slot="button-label">{loading ? loadingLabel : children}</span> : null}
|
|
90
|
+
{!loading && rightIcon ? (
|
|
91
|
+
<span data-icon="inline-end" data-slot="button-icon" className="inline-flex shrink-0 items-center justify-center">
|
|
92
|
+
{rightIcon}
|
|
93
|
+
</span>
|
|
94
|
+
) : null}
|
|
95
|
+
</ButtonPrimitive>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { Button, buttonVariants }
|
|
@@ -1,20 +1,87 @@
|
|
|
1
1
|
import * as React from "react"
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
2
3
|
|
|
3
4
|
import { cn } from "@/lib/utils"
|
|
4
5
|
|
|
6
|
+
const cardVariants = cva(
|
|
7
|
+
"group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-[var(--radius-2xl)] border py-(--card-spacing) text-sm text-card-foreground transition-[background-color,border-color,box-shadow,transform,opacity] [--card-spacing:--spacing(5)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 *:[img:first-child]:rounded-t-[var(--radius-2xl)] *:[img:last-child]:rounded-b-[var(--radius-2xl)]",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default:
|
|
12
|
+
"border-border/80 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),white_14%),var(--card))] shadow-sm ring-1 ring-foreground/5",
|
|
13
|
+
elevated:
|
|
14
|
+
"border-border/70 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),white_18%),var(--card))] shadow-[0_1px_2px_rgba(15,23,42,0.06),0_18px_45px_rgba(15,23,42,0.08)] ring-1 ring-foreground/5",
|
|
15
|
+
outline: "border-border bg-card shadow-none",
|
|
16
|
+
soft: "border-transparent bg-muted/45 shadow-none",
|
|
17
|
+
ghost: "border-transparent bg-transparent shadow-none",
|
|
18
|
+
},
|
|
19
|
+
size: {
|
|
20
|
+
sm: "[--card-spacing:--spacing(4)] data-[has-footer=true]:pb-0",
|
|
21
|
+
default: "[--card-spacing:--spacing(5)]",
|
|
22
|
+
lg: "[--card-spacing:--spacing(6)]",
|
|
23
|
+
},
|
|
24
|
+
density: {
|
|
25
|
+
compact: "text-xs",
|
|
26
|
+
default: "text-sm",
|
|
27
|
+
comfortable: "text-base",
|
|
28
|
+
},
|
|
29
|
+
tone: {
|
|
30
|
+
neutral: "",
|
|
31
|
+
info: "border-blue-500/20 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),oklch(0.94_0.03_235)_32%),var(--card))]",
|
|
32
|
+
success: "border-emerald-500/20 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),oklch(0.94_0.04_155)_34%),var(--card))]",
|
|
33
|
+
warning: "border-amber-500/24 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),oklch(0.94_0.05_85)_34%),var(--card))]",
|
|
34
|
+
danger: "border-destructive/24 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--card),var(--destructive)_10%),var(--card))]",
|
|
35
|
+
},
|
|
36
|
+
interactive: {
|
|
37
|
+
true: "cursor-pointer hover:-translate-y-0.5 hover:border-ring/35 hover:shadow-[0_14px_34px_rgba(15,23,42,0.10)] focus-visible:outline-none focus-visible:ring-3 focus-visible:ring-ring/35",
|
|
38
|
+
false: "",
|
|
39
|
+
},
|
|
40
|
+
selected: {
|
|
41
|
+
true: "border-primary/40 ring-2 ring-primary/18",
|
|
42
|
+
false: "",
|
|
43
|
+
},
|
|
44
|
+
disabled: {
|
|
45
|
+
true: "pointer-events-none opacity-55",
|
|
46
|
+
false: "",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
defaultVariants: {
|
|
50
|
+
variant: "default",
|
|
51
|
+
size: "default",
|
|
52
|
+
density: "default",
|
|
53
|
+
tone: "neutral",
|
|
54
|
+
interactive: false,
|
|
55
|
+
selected: false,
|
|
56
|
+
disabled: false,
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
export type CardProps = React.ComponentProps<"div"> & VariantProps<typeof cardVariants>
|
|
62
|
+
|
|
5
63
|
function Card({
|
|
6
64
|
className,
|
|
7
|
-
|
|
65
|
+
variant,
|
|
66
|
+
size,
|
|
67
|
+
density,
|
|
68
|
+
tone,
|
|
69
|
+
interactive,
|
|
70
|
+
selected,
|
|
71
|
+
disabled,
|
|
72
|
+
tabIndex,
|
|
8
73
|
...props
|
|
9
|
-
}:
|
|
74
|
+
}: CardProps) {
|
|
10
75
|
return (
|
|
11
76
|
<div
|
|
12
|
-
data-slot="card"
|
|
13
|
-
data-size={size}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
77
|
+
data-slot="card"
|
|
78
|
+
data-size={size ?? "default"}
|
|
79
|
+
data-interactive={interactive || undefined}
|
|
80
|
+
data-selected={selected || undefined}
|
|
81
|
+
data-disabled={disabled || undefined}
|
|
82
|
+
aria-disabled={disabled || undefined}
|
|
83
|
+
tabIndex={interactive && !disabled ? tabIndex ?? 0 : tabIndex}
|
|
84
|
+
className={cn(cardVariants({ variant, size, density, tone, interactive, selected, disabled }), className)}
|
|
18
85
|
{...props}
|
|
19
86
|
/>
|
|
20
87
|
)
|
|
@@ -25,7 +92,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
25
92
|
<div
|
|
26
93
|
data-slot="card-header"
|
|
27
94
|
className={cn(
|
|
28
|
-
"group/card-header @container/card-header grid auto-rows-min items-start gap-1.5 rounded-t-[var(--radius-2xl)] px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
|
|
95
|
+
"group/card-header @container/card-header grid auto-rows-min items-start gap-1.5 rounded-t-[var(--radius-2xl)] px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
|
|
29
96
|
className
|
|
30
97
|
)}
|
|
31
98
|
{...props}
|
|
@@ -38,7 +105,7 @@ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
38
105
|
<div
|
|
39
106
|
data-slot="card-title"
|
|
40
107
|
className={cn(
|
|
41
|
-
"font-heading text-[1.05rem] leading-snug font-semibold tracking-tight group-data-[size=sm]/card:text-sm",
|
|
108
|
+
"font-heading text-[1.05rem] leading-snug font-semibold tracking-tight group-data-[size=sm]/card:text-sm group-data-[size=lg]/card:text-xl",
|
|
42
109
|
className
|
|
43
110
|
)}
|
|
44
111
|
{...props}
|
|
@@ -50,7 +117,7 @@ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
50
117
|
return (
|
|
51
118
|
<div
|
|
52
119
|
data-slot="card-description"
|
|
53
|
-
className={cn("text-sm leading-6 text-muted-foreground", className)}
|
|
120
|
+
className={cn("text-sm leading-6 text-muted-foreground", className)}
|
|
54
121
|
{...props}
|
|
55
122
|
/>
|
|
56
123
|
)
|
|
@@ -60,23 +127,14 @@ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
60
127
|
return (
|
|
61
128
|
<div
|
|
62
129
|
data-slot="card-action"
|
|
63
|
-
className={cn(
|
|
64
|
-
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
65
|
-
className
|
|
66
|
-
)}
|
|
130
|
+
className={cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className)}
|
|
67
131
|
{...props}
|
|
68
132
|
/>
|
|
69
133
|
)
|
|
70
134
|
}
|
|
71
135
|
|
|
72
136
|
function CardContent({ className, ...props }: React.ComponentProps<"div">) {
|
|
73
|
-
return (
|
|
74
|
-
<div
|
|
75
|
-
data-slot="card-content"
|
|
76
|
-
className={cn("px-(--card-spacing)", className)}
|
|
77
|
-
{...props}
|
|
78
|
-
/>
|
|
79
|
-
)
|
|
137
|
+
return <div data-slot="card-content" className={cn("px-(--card-spacing)", className)} {...props} />
|
|
80
138
|
}
|
|
81
139
|
|
|
82
140
|
function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
@@ -84,9 +142,9 @@ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
84
142
|
<div
|
|
85
143
|
data-slot="card-footer"
|
|
86
144
|
className={cn(
|
|
87
|
-
"flex items-center rounded-b-[var(--radius-2xl)] border-t border-border/
|
|
88
|
-
className
|
|
89
|
-
)}
|
|
145
|
+
"flex items-center rounded-b-[var(--radius-2xl)] border-t border-border/75 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--muted),transparent_24%),color-mix(in_oklch,var(--muted),transparent_8%))] p-(--card-spacing)",
|
|
146
|
+
className
|
|
147
|
+
)}
|
|
90
148
|
{...props}
|
|
91
149
|
/>
|
|
92
150
|
)
|
|
@@ -100,4 +158,5 @@ export {
|
|
|
100
158
|
CardAction,
|
|
101
159
|
CardDescription,
|
|
102
160
|
CardContent,
|
|
161
|
+
cardVariants,
|
|
103
162
|
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import { CheckIcon, MinusIcon } from "lucide-react"
|
|
3
|
-
|
|
4
|
-
import { cn } from "@/lib/utils"
|
|
5
|
-
|
|
6
|
-
export type CheckboxCheckedState = boolean | "indeterminate"
|
|
7
|
-
|
|
8
|
-
export type CheckboxProps = Omit<
|
|
9
|
-
React.ComponentPropsWithoutRef<"button">,
|
|
10
|
-
"checked" | "defaultChecked" | "onChange" | "value"
|
|
11
|
-
> & {
|
|
12
|
-
checked?: CheckboxCheckedState
|
|
13
|
-
defaultChecked?: CheckboxCheckedState
|
|
14
|
-
onCheckedChange?: (checked: boolean) => void
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function getNextCheckedState(checked: CheckboxCheckedState) {
|
|
18
|
-
return checked === true ? false : true
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
|
|
22
|
-
(
|
|
23
|
-
{
|
|
24
|
-
className,
|
|
25
|
-
checked,
|
|
26
|
-
defaultChecked = false,
|
|
27
|
-
onCheckedChange,
|
|
28
|
-
disabled,
|
|
29
|
-
onClick,
|
|
30
|
-
children,
|
|
31
|
-
...props
|
|
32
|
-
},
|
|
33
|
-
ref
|
|
34
|
-
) => {
|
|
35
|
-
const isControlled = checked !== undefined
|
|
36
|
-
const [internalChecked, setInternalChecked] = React.useState<CheckboxCheckedState>(defaultChecked)
|
|
37
|
-
const currentChecked = isControlled ? checked : internalChecked
|
|
38
|
-
const dataState = currentChecked === "indeterminate" ? "indeterminate" : currentChecked ? "checked" : "unchecked"
|
|
39
|
-
|
|
40
|
-
const handleClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {
|
|
41
|
-
const nextChecked = getNextCheckedState(currentChecked)
|
|
42
|
-
|
|
43
|
-
if (!isControlled) {
|
|
44
|
-
setInternalChecked(nextChecked)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
onCheckedChange?.(nextChecked)
|
|
48
|
-
onClick?.(event)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<button
|
|
53
|
-
ref={ref}
|
|
54
|
-
type="button"
|
|
55
|
-
role="checkbox"
|
|
56
|
-
aria-checked={currentChecked === "indeterminate" ? "mixed" : currentChecked}
|
|
57
|
-
data-state={dataState}
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { CheckIcon, MinusIcon } from "lucide-react"
|
|
3
|
+
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
|
|
6
|
+
export type CheckboxCheckedState = boolean | "indeterminate"
|
|
7
|
+
|
|
8
|
+
export type CheckboxProps = Omit<
|
|
9
|
+
React.ComponentPropsWithoutRef<"button">,
|
|
10
|
+
"checked" | "defaultChecked" | "onChange" | "value"
|
|
11
|
+
> & {
|
|
12
|
+
checked?: CheckboxCheckedState
|
|
13
|
+
defaultChecked?: CheckboxCheckedState
|
|
14
|
+
onCheckedChange?: (checked: boolean) => void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function getNextCheckedState(checked: CheckboxCheckedState) {
|
|
18
|
+
return checked === true ? false : true
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
|
|
22
|
+
(
|
|
23
|
+
{
|
|
24
|
+
className,
|
|
25
|
+
checked,
|
|
26
|
+
defaultChecked = false,
|
|
27
|
+
onCheckedChange,
|
|
28
|
+
disabled,
|
|
29
|
+
onClick,
|
|
30
|
+
children,
|
|
31
|
+
...props
|
|
32
|
+
},
|
|
33
|
+
ref
|
|
34
|
+
) => {
|
|
35
|
+
const isControlled = checked !== undefined
|
|
36
|
+
const [internalChecked, setInternalChecked] = React.useState<CheckboxCheckedState>(defaultChecked)
|
|
37
|
+
const currentChecked = isControlled ? checked : internalChecked
|
|
38
|
+
const dataState = currentChecked === "indeterminate" ? "indeterminate" : currentChecked ? "checked" : "unchecked"
|
|
39
|
+
|
|
40
|
+
const handleClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {
|
|
41
|
+
const nextChecked = getNextCheckedState(currentChecked)
|
|
42
|
+
|
|
43
|
+
if (!isControlled) {
|
|
44
|
+
setInternalChecked(nextChecked)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
onCheckedChange?.(nextChecked)
|
|
48
|
+
onClick?.(event)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<button
|
|
53
|
+
ref={ref}
|
|
54
|
+
type="button"
|
|
55
|
+
role="checkbox"
|
|
56
|
+
aria-checked={currentChecked === "indeterminate" ? "mixed" : currentChecked}
|
|
57
|
+
data-state={dataState}
|
|
58
58
|
data-slot="checkbox"
|
|
59
59
|
disabled={disabled}
|
|
60
60
|
className={cn(
|
|
61
|
-
"peer flex size-5 shrink-0 items-center justify-center rounded-[min(var(--radius-lg),8px)] border border-input/90 bg-background
|
|
61
|
+
"peer flex size-5 shrink-0 items-center justify-center rounded-[min(var(--radius-lg),8px)] border border-input/90 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--background),white_12%),var(--background))] text-primary-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.16),0_1px_0_rgba(255,255,255,0.08)] outline-none transition-[background-color,border-color,box-shadow,color,transform] hover:border-ring/30 hover:bg-background focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/45 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary/85 data-[state=checked]:bg-primary data-[state=checked]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_80%)] data-[state=indeterminate]:border-primary/85 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_80%)] dark:border-white/12 dark:bg-[linear-gradient(180deg,rgba(255,255,255,0.08),rgba(255,255,255,0.05))] dark:hover:bg-white/8",
|
|
62
62
|
className
|
|
63
63
|
)}
|
|
64
|
-
onClick={handleClick}
|
|
65
|
-
{...props}
|
|
66
|
-
>
|
|
64
|
+
onClick={handleClick}
|
|
65
|
+
{...props}
|
|
66
|
+
>
|
|
67
67
|
{children ?? (
|
|
68
68
|
<span className="flex items-center justify-center">
|
|
69
69
|
{currentChecked === "indeterminate" ? (
|
|
@@ -73,10 +73,10 @@ const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(
|
|
|
73
73
|
) : null}
|
|
74
74
|
</span>
|
|
75
75
|
)}
|
|
76
|
-
</button>
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
)
|
|
80
|
-
Checkbox.displayName = "Checkbox"
|
|
81
|
-
|
|
82
|
-
export { Checkbox }
|
|
76
|
+
</button>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
Checkbox.displayName = "Checkbox"
|
|
81
|
+
|
|
82
|
+
export { Checkbox }
|
|
@@ -20,13 +20,13 @@ function Command({
|
|
|
20
20
|
...props
|
|
21
21
|
}: React.ComponentProps<typeof CommandPrimitive>) {
|
|
22
22
|
return (
|
|
23
|
-
<CommandPrimitive
|
|
24
|
-
data-slot="command"
|
|
25
|
-
className={cn(
|
|
26
|
-
"flex size-full flex-col overflow-hidden rounded-
|
|
27
|
-
className
|
|
28
|
-
)}
|
|
29
|
-
{...props}
|
|
23
|
+
<CommandPrimitive
|
|
24
|
+
data-slot="command"
|
|
25
|
+
className={cn(
|
|
26
|
+
"flex size-full flex-col overflow-hidden rounded-[var(--radius-3xl)]! border border-border/80 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--popover),white_10%),var(--popover))] p-2 text-popover-foreground shadow-[0_24px_80px_rgba(15,23,42,0.18)] backdrop-blur",
|
|
27
|
+
className
|
|
28
|
+
)}
|
|
29
|
+
{...props}
|
|
30
30
|
/>
|
|
31
31
|
)
|
|
32
32
|
}
|
|
@@ -51,12 +51,12 @@ function CommandDialog({
|
|
|
51
51
|
<DialogTitle>{title}</DialogTitle>
|
|
52
52
|
<DialogDescription>{description}</DialogDescription>
|
|
53
53
|
</DialogHeader>
|
|
54
|
-
<DialogContent
|
|
55
|
-
className={cn(
|
|
56
|
-
"top-1/3 translate-y-0 overflow-hidden rounded-
|
|
57
|
-
className
|
|
58
|
-
)}
|
|
59
|
-
showCloseButton={showCloseButton}
|
|
54
|
+
<DialogContent
|
|
55
|
+
className={cn(
|
|
56
|
+
"top-1/3 translate-y-0 overflow-hidden rounded-[var(--radius-3xl)]! border-border/80 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--popover),white_10%),var(--popover))] p-0 shadow-[0_28px_90px_rgba(15,23,42,0.24)] backdrop-blur",
|
|
57
|
+
className
|
|
58
|
+
)}
|
|
59
|
+
showCloseButton={showCloseButton}
|
|
60
60
|
>
|
|
61
61
|
{children}
|
|
62
62
|
</DialogContent>
|
|
@@ -69,11 +69,11 @@ function CommandInput({
|
|
|
69
69
|
...props
|
|
70
70
|
}: React.ComponentProps<typeof CommandPrimitive.Input>) {
|
|
71
71
|
return (
|
|
72
|
-
<div data-slot="command-input-wrapper" className="p-1 pb-0">
|
|
73
|
-
<InputGroup className="h-
|
|
74
|
-
<CommandPrimitive.Input
|
|
75
|
-
data-slot="command-input"
|
|
76
|
-
className={cn(
|
|
72
|
+
<div data-slot="command-input-wrapper" className="p-1 pb-0">
|
|
73
|
+
<InputGroup className="h-11! rounded-full! border-border/80 bg-[linear-gradient(180deg,color-mix(in_oklch,var(--background),white_12%),var(--background))] shadow-[inset_0_1px_0_rgba(255,255,255,0.14),0_1px_0_rgba(255,255,255,0.05)]! *:data-[slot=input-group-addon]:pl-3!">
|
|
74
|
+
<CommandPrimitive.Input
|
|
75
|
+
data-slot="command-input"
|
|
76
|
+
className={cn(
|
|
77
77
|
"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
|
|
78
78
|
className
|
|
79
79
|
)}
|
|
@@ -121,13 +121,13 @@ function CommandGroup({
|
|
|
121
121
|
...props
|
|
122
122
|
}: React.ComponentProps<typeof CommandPrimitive.Group>) {
|
|
123
123
|
return (
|
|
124
|
-
<CommandPrimitive.Group
|
|
125
|
-
data-slot="command-group"
|
|
126
|
-
className={cn(
|
|
127
|
-
"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-
|
|
128
|
-
className
|
|
129
|
-
)}
|
|
130
|
-
{...props}
|
|
124
|
+
<CommandPrimitive.Group
|
|
125
|
+
data-slot="command-group"
|
|
126
|
+
className={cn(
|
|
127
|
+
"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-2 **:[[cmdk-group-heading]]:text-[11px] **:[[cmdk-group-heading]]:font-semibold **:[[cmdk-group-heading]]:uppercase **:[[cmdk-group-heading]]:tracking-[0.22em] **:[[cmdk-group-heading]]:text-muted-foreground",
|
|
128
|
+
className
|
|
129
|
+
)}
|
|
130
|
+
{...props}
|
|
131
131
|
/>
|
|
132
132
|
)
|
|
133
133
|
}
|
|
@@ -151,13 +151,13 @@ function CommandItem({
|
|
|
151
151
|
...props
|
|
152
152
|
}: React.ComponentProps<typeof CommandPrimitive.Item>) {
|
|
153
153
|
return (
|
|
154
|
-
<CommandPrimitive.Item
|
|
155
|
-
data-slot="command-item"
|
|
156
|
-
className={cn(
|
|
157
|
-
"group/command-item relative flex cursor-default items-center gap-2 rounded-
|
|
158
|
-
className
|
|
159
|
-
)}
|
|
160
|
-
{...props}
|
|
154
|
+
<CommandPrimitive.Item
|
|
155
|
+
data-slot="command-item"
|
|
156
|
+
className={cn(
|
|
157
|
+
"group/command-item relative flex cursor-default items-center gap-2 rounded-[min(var(--radius-xl),16px)] border border-transparent px-3 py-2.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-[min(var(--radius-xl),16px)]! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:border-border/70 data-selected:bg-muted/55 data-selected:text-foreground data-selected:shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",
|
|
158
|
+
className
|
|
159
|
+
)}
|
|
160
|
+
{...props}
|
|
161
161
|
>
|
|
162
162
|
{children}
|
|
163
163
|
<CheckIcon className="ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100" />
|