azamat-ui-kit-cli 0.2.2 → 0.3.4

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.
Files changed (103) hide show
  1. package/README.md +11 -0
  2. package/dist/index.cjs +452 -0
  3. package/package.json +2 -2
  4. package/vendor/src/components/actions/action-menu.tsx +21 -18
  5. package/vendor/src/components/calendar/calendar.tsx +153 -102
  6. package/vendor/src/components/calendar/date-picker.tsx +24 -14
  7. package/vendor/src/components/calendar/date-range-picker.tsx +137 -58
  8. package/vendor/src/components/charts/charts.tsx +32 -21
  9. package/vendor/src/components/command/command-palette.tsx +68 -57
  10. package/vendor/src/components/data-table/data-table-bulk-actions.tsx +23 -20
  11. package/vendor/src/components/data-table/data-table-column-visibility-menu.tsx +21 -10
  12. package/vendor/src/components/data-table/data-table-pagination.tsx +6 -6
  13. package/vendor/src/components/data-table/data-table-toolbar.tsx +72 -44
  14. package/vendor/src/components/data-table/data-table.tsx +15 -11
  15. package/vendor/src/components/data-table/table-export-menu.tsx +1 -1
  16. package/vendor/src/components/data-table/table-import-button.tsx +1 -1
  17. package/vendor/src/components/display/data-state.tsx +20 -8
  18. package/vendor/src/components/display/index.ts +19 -15
  19. package/vendor/src/components/display/metric-card.tsx +35 -0
  20. package/vendor/src/components/display/progress-circle.tsx +24 -0
  21. package/vendor/src/components/display/smart-card.tsx +49 -27
  22. package/vendor/src/components/display/status-dot.tsx +45 -0
  23. package/vendor/src/components/display/user-card.tsx +30 -0
  24. package/vendor/src/components/feedback/alert.tsx +21 -11
  25. package/vendor/src/components/feedback/empty-state.tsx +2 -2
  26. package/vendor/src/components/feedback/loading-state.tsx +2 -2
  27. package/vendor/src/components/feedback/page-state.tsx +19 -15
  28. package/vendor/src/components/feedback/status-badge.tsx +43 -43
  29. package/vendor/src/components/form/form-app-input.tsx +147 -0
  30. package/vendor/src/components/form/form-date-input.tsx +16 -19
  31. package/vendor/src/components/form/form-field-shell.tsx +11 -8
  32. package/vendor/src/components/form/form-field-utils.ts +76 -0
  33. package/vendor/src/components/form/form-input.tsx +423 -44
  34. package/vendor/src/components/form/form-number-input.tsx +16 -15
  35. package/vendor/src/components/form/form-phone-input.tsx +15 -9
  36. package/vendor/src/components/form/form-search-input.tsx +16 -19
  37. package/vendor/src/components/form/form-select.tsx +4 -3
  38. package/vendor/src/components/form/public.ts +16 -14
  39. package/vendor/src/components/form/smart-form-shell.tsx +13 -12
  40. package/vendor/src/components/inputs/app-input.tsx +27 -0
  41. package/vendor/src/components/inputs/async-select.tsx +113 -84
  42. package/vendor/src/components/inputs/clearable-input.tsx +81 -61
  43. package/vendor/src/components/inputs/date-input.tsx +21 -17
  44. package/vendor/src/components/inputs/date-range-input.tsx +10 -10
  45. package/vendor/src/components/inputs/index.ts +1 -0
  46. package/vendor/src/components/inputs/input-decorator.tsx +101 -57
  47. package/vendor/src/components/inputs/masked-input.tsx +20 -20
  48. package/vendor/src/components/inputs/money-input.tsx +2 -2
  49. package/vendor/src/components/inputs/number-input.tsx +29 -19
  50. package/vendor/src/components/inputs/password-input.tsx +82 -45
  51. package/vendor/src/components/inputs/phone-input.tsx +24 -2
  52. package/vendor/src/components/inputs/quantity-input.tsx +2 -2
  53. package/vendor/src/components/inputs/search-input.tsx +54 -3
  54. package/vendor/src/components/inputs/simple-select.tsx +110 -22
  55. package/vendor/src/components/layout/app-shell.tsx +2 -2
  56. package/vendor/src/components/layout/index.ts +5 -4
  57. package/vendor/src/components/layout/page-header.tsx +79 -35
  58. package/vendor/src/components/layout/public.ts +12 -10
  59. package/vendor/src/components/layout/section-header.tsx +56 -0
  60. package/vendor/src/components/layout/stack.tsx +106 -0
  61. package/vendor/src/components/layout/stat-card.tsx +66 -29
  62. package/vendor/src/components/navigation/index.ts +1 -0
  63. package/vendor/src/components/navigation/nav-tabs.tsx +60 -0
  64. package/vendor/src/components/navigation/page-tabs.tsx +41 -26
  65. package/vendor/src/components/navigation/pagination.tsx +14 -10
  66. package/vendor/src/components/overlay/alert-dialog.tsx +65 -0
  67. package/vendor/src/components/overlay/drawer.tsx +71 -0
  68. package/vendor/src/components/overlay/index.ts +4 -2
  69. package/vendor/src/components/patterns/data-view.tsx +13 -8
  70. package/vendor/src/components/ui/badge.tsx +96 -52
  71. package/vendor/src/components/ui/button.tsx +99 -61
  72. package/vendor/src/components/ui/card.tsx +84 -25
  73. package/vendor/src/components/ui/checkbox.tsx +68 -68
  74. package/vendor/src/components/ui/command.tsx +32 -32
  75. package/vendor/src/components/ui/dialog.tsx +135 -138
  76. package/vendor/src/components/ui/dropdown-menu.tsx +21 -21
  77. package/vendor/src/components/ui/hover-card.tsx +49 -0
  78. package/vendor/src/components/ui/input-primitive.tsx +24 -0
  79. package/vendor/src/components/ui/input.tsx +191 -20
  80. package/vendor/src/components/ui/kbd.tsx +33 -0
  81. package/vendor/src/components/ui/popover.tsx +11 -11
  82. package/vendor/src/components/ui/radio-group.tsx +102 -0
  83. package/vendor/src/components/ui/right-click-menu.tsx +60 -0
  84. package/vendor/src/components/ui/scroll-box.tsx +27 -0
  85. package/vendor/src/components/ui/segmented-control.tsx +21 -17
  86. package/vendor/src/components/ui/select.tsx +187 -189
  87. package/vendor/src/components/ui/skeleton.tsx +2 -2
  88. package/vendor/src/components/ui/switch.tsx +60 -60
  89. package/vendor/src/components/ui/table.tsx +114 -114
  90. package/vendor/src/components/ui/tabs.tsx +2 -2
  91. package/vendor/src/components/ui/textarea.tsx +1 -1
  92. package/vendor/src/components/upload/file-dropzone.tsx +38 -0
  93. package/vendor/src/components/upload/file-upload.tsx +4 -4
  94. package/vendor/src/components/upload/image-upload.tsx +22 -19
  95. package/vendor/src/components/upload/index.ts +2 -0
  96. package/vendor/src/families/catalog.ts +1 -0
  97. package/vendor/src/families/docs-groups.ts +10 -1
  98. package/vendor/src/families/member-metadata.ts +24 -0
  99. package/vendor/src/families/member-snippets.ts +41 -2
  100. package/vendor/src/families/migration-map.ts +3 -0
  101. package/vendor/src/index.ts +23 -18
  102. package/vendor/templates/styles/globals.css +253 -0
  103. package/dist/index.js +0 -432
@@ -1,61 +1,99 @@
1
- import { Button as ButtonPrimitive } from "@base-ui/react/button"
2
- import { cva, type VariantProps } from "class-variance-authority"
3
-
4
- import { cn } from "@/lib/utils"
5
-
6
- const buttonVariants = cva(
7
- "group/button inline-flex shrink-0 items-center justify-center rounded-xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-[transform,background-color,border-color,color,box-shadow] 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-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",
8
- {
9
- variants: {
10
- variant: {
11
- default:
12
- "border-primary/90 bg-primary text-primary-foreground shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_78%)] hover:bg-[color-mix(in_oklch,var(--primary),white_8%)] hover:shadow-[0_14px_30px_color-mix(in_oklch,var(--primary),transparent_72%)]",
13
- outline:
14
- "border-border/80 bg-background/92 text-foreground shadow-sm hover:border-border hover:bg-accent/70 hover:text-foreground aria-expanded:bg-accent/70 aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/55",
15
- secondary:
16
- "border-transparent bg-secondary text-secondary-foreground shadow-sm hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_4%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
17
- ghost:
18
- "border-transparent bg-transparent hover:bg-accent/70 hover:text-foreground aria-expanded:bg-accent/70 aria-expanded:text-foreground dark:hover:bg-muted/50",
19
- destructive:
20
- "border-destructive/15 bg-destructive text-white shadow-[0_10px_24px_color-mix(in_oklch,var(--destructive),transparent_78%)] hover:bg-[color-mix(in_oklch,var(--destructive),black_6%)] focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
21
- link: "text-primary underline-offset-4 hover:underline",
22
- },
23
- size: {
24
- default:
25
- "h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5",
26
- 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",
27
- 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",
28
- lg: "h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
29
- icon: "size-9",
30
- "icon-xs":
31
- "size-7 rounded-[min(var(--radius-lg),12px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
32
- "icon-sm":
33
- "size-8 rounded-[min(var(--radius-lg),14px)] in-data-[slot=button-group]:rounded-lg",
34
- "icon-lg": "size-10",
35
- },
36
- },
37
- defaultVariants: {
38
- variant: "default",
39
- size: "default",
40
- },
41
- }
42
- )
43
-
44
- export type ButtonProps = ButtonPrimitive.Props & VariantProps<typeof buttonVariants>
45
-
46
- function Button({
47
- className,
48
- variant = "default",
49
- size = "default",
50
- ...props
51
- }: ButtonProps) {
52
- return (
53
- <ButtonPrimitive
54
- data-slot="button"
55
- className={cn(buttonVariants({ variant, size, className }))}
56
- {...props}
57
- />
58
- )
59
- }
60
-
61
- export { Button, buttonVariants }
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
- size = "default",
65
+ variant,
66
+ size,
67
+ density,
68
+ tone,
69
+ interactive,
70
+ selected,
71
+ disabled,
72
+ tabIndex,
8
73
  ...props
9
- }: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
74
+ }: CardProps) {
10
75
  return (
11
76
  <div
12
- data-slot="card"
13
- data-size={size}
14
- className={cn(
15
- "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-[var(--radius-2xl)] border border-border/75 bg-card/98 py-(--card-spacing) text-sm text-card-foreground shadow-sm [--card-spacing:--spacing(5)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-[var(--radius-2xl)] *:[img:last-child]:rounded-b-[var(--radius-2xl)]",
16
- className
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/70 bg-muted/45 p-(--card-spacing)",
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/92 text-primary-foreground shadow-sm outline-none transition-[background-color,border-color,box-shadow,color] hover:border-border 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 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 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:shadow-[0_10px_24px_color-mix(in_oklch,var(--primary),transparent_80%)]",
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-xl! bg-popover p-1 text-popover-foreground",
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-xl! p-0",
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-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!">
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-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
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-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",
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" />