@suphark/ui 0.18.0 → 0.20.0

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 (82) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/package.json +14 -13
  3. package/scripts/audit.mjs +0 -0
  4. package/src/components/app-shell/app-shell.tsx +15 -9
  5. package/src/components/app-shell/index.ts +1 -0
  6. package/src/components/app-shell/mobile-tab-bar.tsx +104 -0
  7. package/src/components/shared/action-menu.tsx +155 -0
  8. package/src/components/shared/confirm-dialog.tsx +41 -2
  9. package/src/components/shared/count-badge.tsx +41 -0
  10. package/src/components/shared/filter-bar.tsx +108 -0
  11. package/src/components/shared/form/slider-field.tsx +79 -0
  12. package/src/components/shared/form-dialog.tsx +43 -4
  13. package/src/components/shared/month-stepper.tsx +124 -0
  14. package/src/components/shared/save-status.tsx +99 -0
  15. package/src/components/shared/segmented-control.tsx +73 -0
  16. package/src/components/shared/settings-layout.tsx +170 -0
  17. package/src/components/shared/settings-row.tsx +118 -0
  18. package/src/components/shared/setup-checklist.tsx +104 -0
  19. package/src/components/shared/simple-dialog.tsx +172 -0
  20. package/src/components/shared/simple-pagination.tsx +109 -0
  21. package/src/components/shared/simple-table.tsx +93 -0
  22. package/src/components/shared/simple-tabs.tsx +118 -0
  23. package/src/components/shared/simple-tooltip.tsx +87 -0
  24. package/src/components/shared/skip-link.tsx +30 -0
  25. package/src/components/shared/stat.tsx +110 -6
  26. package/src/components/shared/ui-text.tsx +35 -0
  27. package/src/components/shared/user-identity.tsx +61 -0
  28. package/src/components/ui/accordion.tsx +2 -2
  29. package/src/components/ui/alert-dialog.tsx +4 -4
  30. package/src/components/ui/alert.tsx +2 -2
  31. package/src/components/ui/attachment.tsx +9 -9
  32. package/src/components/ui/avatar.tsx +4 -4
  33. package/src/components/ui/badge.tsx +1 -1
  34. package/src/components/ui/breadcrumb.tsx +1 -1
  35. package/src/components/ui/bubble.tsx +123 -0
  36. package/src/components/ui/button-group.tsx +2 -2
  37. package/src/components/ui/button.tsx +6 -6
  38. package/src/components/ui/calendar.tsx +9 -9
  39. package/src/components/ui/card.tsx +3 -3
  40. package/src/components/ui/chart.tsx +2 -2
  41. package/src/components/ui/checkbox.tsx +1 -1
  42. package/src/components/ui/combobox.tsx +6 -6
  43. package/src/components/ui/command.tsx +4 -4
  44. package/src/components/ui/context-menu.tsx +7 -7
  45. package/src/components/ui/dialog.tsx +4 -4
  46. package/src/components/ui/direction.tsx +6 -0
  47. package/src/components/ui/drawer.tsx +10 -10
  48. package/src/components/ui/dropdown-menu.tsx +8 -8
  49. package/src/components/ui/empty.tsx +4 -4
  50. package/src/components/ui/field.tsx +8 -8
  51. package/src/components/ui/hover-card.tsx +1 -2
  52. package/src/components/ui/input-group.tsx +3 -3
  53. package/src/components/ui/input-otp.tsx +1 -1
  54. package/src/components/ui/input.tsx +1 -1
  55. package/src/components/ui/item.tsx +4 -4
  56. package/src/components/ui/kbd.tsx +1 -1
  57. package/src/components/ui/label.tsx +1 -1
  58. package/src/components/ui/marker.tsx +67 -0
  59. package/src/components/ui/menubar.tsx +9 -9
  60. package/src/components/ui/message-scroller.tsx +129 -0
  61. package/src/components/ui/message.tsx +84 -0
  62. package/src/components/ui/native-select.tsx +1 -1
  63. package/src/components/ui/navigation-menu.tsx +6 -6
  64. package/src/components/ui/popover.tsx +1 -1
  65. package/src/components/ui/progress.tsx +2 -3
  66. package/src/components/ui/questionnaire.tsx +314 -0
  67. package/src/components/ui/radio-group.tsx +1 -2
  68. package/src/components/ui/resizable.tsx +1 -1
  69. package/src/components/ui/select.tsx +4 -4
  70. package/src/components/ui/separator.tsx +0 -1
  71. package/src/components/ui/sheet.tsx +3 -3
  72. package/src/components/ui/sidebar.tsx +14 -14
  73. package/src/components/ui/switch.tsx +2 -3
  74. package/src/components/ui/textarea.tsx +1 -1
  75. package/src/components/ui/toast.tsx +221 -0
  76. package/src/components/ui/toggle-group.tsx +2 -2
  77. package/src/components/ui/toggle.tsx +1 -1
  78. package/src/components/ui/tooltip.tsx +0 -1
  79. package/src/hooks/use-confirm.tsx +2 -0
  80. package/src/index.ts +48 -1
  81. package/src/lib/month.ts +60 -0
  82. package/src/styles.css +10 -0
@@ -6,14 +6,14 @@ import { cva, type VariantProps } from "class-variance-authority";
6
6
  import type * as React from "react";
7
7
 
8
8
  const attachmentVariants = cva(
9
- "group/attachment relative flex w-fit min-w-0 max-w-full shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed",
9
+ "group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed",
10
10
  {
11
11
  variants: {
12
12
  size: {
13
13
  default:
14
- "gap-2 text-sm has-data-[slot=attachment-media]:p-2 has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2",
15
- sm: "gap-2.5 text-xs has-data-[slot=attachment-media]:p-1.5 has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5",
16
- xs: "gap-1.5 rounded-lg text-xs has-data-[slot=attachment-media]:p-1 has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1",
14
+ "gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2",
15
+ sm: "gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5",
16
+ xs: "gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1",
17
17
  },
18
18
  orientation: {
19
19
  horizontal: "min-w-40 items-center",
@@ -46,7 +46,7 @@ function Attachment({
46
46
  }
47
47
 
48
48
  const attachmentMediaVariants = cva(
49
- "relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5 [&_svg]:pointer-events-none",
49
+ "relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5",
50
50
  {
51
51
  variants: {
52
52
  variant: {
@@ -81,7 +81,7 @@ function AttachmentContent({ className, ...props }: React.ComponentProps<"div">)
81
81
  <div
82
82
  data-slot="attachment-content"
83
83
  className={cn(
84
- "min-w-0 max-w-full flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1",
84
+ "max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1",
85
85
  className,
86
86
  )}
87
87
  {...props}
@@ -94,7 +94,7 @@ function AttachmentTitle({ className, ...props }: React.ComponentProps<"span">)
94
94
  <span
95
95
  data-slot="attachment-title"
96
96
  className={cn(
97
- "group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer block min-w-0 max-w-full truncate font-medium",
97
+ "block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer",
98
98
  className,
99
99
  )}
100
100
  {...props}
@@ -107,7 +107,7 @@ function AttachmentDescription({ className, ...props }: React.ComponentProps<"sp
107
107
  <span
108
108
  data-slot="attachment-description"
109
109
  className={cn(
110
- "mt-0.5 block min-w-0 truncate text-muted-foreground text-xs group-data-[state=error]/attachment:text-destructive/80",
110
+ "mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80",
111
111
  "max-w-full",
112
112
  className,
113
113
  )}
@@ -173,7 +173,7 @@ function AttachmentGroup({ className, ...props }: React.ComponentProps<"div">) {
173
173
  <div
174
174
  data-slot="attachment-group"
175
175
  className={cn(
176
- "scroll-fade-x scrollbar-none flex min-w-0 snap-x snap-mandatory scroll-px-1 gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start",
176
+ "flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start",
177
177
  className,
178
178
  )}
179
179
  {...props}
@@ -16,7 +16,7 @@ function Avatar({
16
16
  data-slot="avatar"
17
17
  data-size={size}
18
18
  className={cn(
19
- "group/avatar relative flex size-8 shrink-0 select-none rounded-full after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
19
+ "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
20
20
  className,
21
21
  )}
22
22
  {...props}
@@ -39,7 +39,7 @@ function AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props)
39
39
  <AvatarPrimitive.Fallback
40
40
  data-slot="avatar-fallback"
41
41
  className={cn(
42
- "flex size-full items-center justify-center rounded-full bg-muted text-muted-foreground text-sm group-data-[size=sm]/avatar:text-xs",
42
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
43
43
  className,
44
44
  )}
45
45
  {...props}
@@ -52,7 +52,7 @@ function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
52
52
  <span
53
53
  data-slot="avatar-badge"
54
54
  className={cn(
55
- "absolute right-0 bottom-0 z-10 inline-flex select-none items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background",
55
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none",
56
56
  "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
57
57
  "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
58
58
  "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
@@ -81,7 +81,7 @@ function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">)
81
81
  <div
82
82
  data-slot="avatar-group-count"
83
83
  className={cn(
84
- "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground text-sm ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
84
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
85
85
  className,
86
86
  )}
87
87
  {...props}
@@ -4,7 +4,7 @@ import { cn } from "@suphark/ui/lib/utils";
4
4
  import { cva, type VariantProps } from "class-variance-authority";
5
5
 
6
6
  const badgeVariants = cva(
7
- "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-4xl border border-transparent px-2 py-0.5 font-medium text-xs transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
7
+ "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
8
8
  {
9
9
  variants: {
10
10
  variant: {
@@ -15,7 +15,7 @@ function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
15
15
  <ol
16
16
  data-slot="breadcrumb-list"
17
17
  className={cn(
18
- "wrap-break-word flex flex-wrap items-center gap-1.5 text-muted-foreground text-sm",
18
+ "flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground",
19
19
  className,
20
20
  )}
21
21
  {...props}
@@ -0,0 +1,123 @@
1
+ import { mergeProps } from "@base-ui/react/merge-props";
2
+ import { useRender } from "@base-ui/react/use-render";
3
+ import { cn } from "@suphark/ui/lib/utils";
4
+ import { cva, type VariantProps } from "class-variance-authority";
5
+ import type * as React from "react";
6
+
7
+ function BubbleGroup({ className, ...props }: React.ComponentProps<"div">) {
8
+ return (
9
+ <div
10
+ data-slot="bubble-group"
11
+ className={cn("flex min-w-0 flex-col gap-2", className)}
12
+ {...props}
13
+ />
14
+ );
15
+ }
16
+
17
+ const bubbleVariants = cva(
18
+ "group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full",
19
+ {
20
+ variants: {
21
+ variant: {
22
+ default:
23
+ "*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80",
24
+ secondary:
25
+ "*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",
26
+ muted:
27
+ "*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]",
28
+ tinted:
29
+ "*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]",
30
+ outline:
31
+ "*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30",
32
+ ghost:
33
+ "border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50",
34
+ destructive:
35
+ "*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30",
36
+ },
37
+ },
38
+ defaultVariants: {
39
+ variant: "default",
40
+ },
41
+ },
42
+ );
43
+
44
+ function Bubble({
45
+ variant = "default",
46
+ align = "start",
47
+ className,
48
+ ...props
49
+ }: React.ComponentProps<"div"> &
50
+ VariantProps<typeof bubbleVariants> & {
51
+ align?: "start" | "end";
52
+ }) {
53
+ return (
54
+ <div
55
+ data-slot="bubble"
56
+ data-variant={variant}
57
+ data-align={align}
58
+ className={cn(bubbleVariants({ variant }), className)}
59
+ {...props}
60
+ />
61
+ );
62
+ }
63
+
64
+ function BubbleContent({ className, render, ...props }: useRender.ComponentProps<"div">) {
65
+ return useRender({
66
+ defaultTagName: "div",
67
+ props: mergeProps<"div">(
68
+ {
69
+ className: cn(
70
+ "w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/50",
71
+ className,
72
+ ),
73
+ },
74
+ props,
75
+ ),
76
+ render,
77
+ state: {
78
+ slot: "bubble-content",
79
+ },
80
+ });
81
+ }
82
+
83
+ const bubbleReactionsVariants = cva(
84
+ "absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0",
85
+ {
86
+ variants: {
87
+ side: {
88
+ top: "top-0 -translate-y-3/4",
89
+ bottom: "bottom-0 translate-y-3/4",
90
+ },
91
+ align: {
92
+ start: "left-3",
93
+ end: "right-3",
94
+ },
95
+ },
96
+ defaultVariants: {
97
+ side: "bottom",
98
+ align: "end",
99
+ },
100
+ },
101
+ );
102
+
103
+ function BubbleReactions({
104
+ side = "bottom",
105
+ align = "end",
106
+ className,
107
+ ...props
108
+ }: React.ComponentProps<"div"> & {
109
+ align?: "start" | "end";
110
+ side?: "top" | "bottom";
111
+ }) {
112
+ return (
113
+ <div
114
+ data-slot="bubble-reactions"
115
+ data-align={align}
116
+ data-side={side}
117
+ className={cn(bubbleReactionsVariants({ side, align }), className)}
118
+ {...props}
119
+ />
120
+ );
121
+ }
122
+
123
+ export { Bubble, BubbleContent, BubbleGroup, BubbleReactions };
@@ -43,7 +43,7 @@ function ButtonGroupText({ className, render, ...props }: useRender.ComponentPro
43
43
  props: mergeProps<"div">(
44
44
  {
45
45
  className: cn(
46
- "flex items-center gap-2 rounded-lg border bg-muted px-2.5 font-medium text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none",
46
+ "flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
47
47
  className,
48
48
  ),
49
49
  },
@@ -66,7 +66,7 @@ function ButtonGroupSeparator({
66
66
  data-slot="button-group-separator"
67
67
  orientation={orientation}
68
68
  className={cn(
69
- "relative self-stretch bg-input data-horizontal:mx-px data-vertical:my-px data-vertical:h-auto data-horizontal:w-auto",
69
+ "relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto",
70
70
  className,
71
71
  )}
72
72
  {...props}
@@ -3,7 +3,7 @@ import { cn } from "@suphark/ui/lib/utils";
3
3
  import { cva, type VariantProps } from "class-variance-authority";
4
4
 
5
5
  const buttonVariants = cva(
6
- "group/button inline-flex shrink-0 select-none items-center justify-center whitespace-nowrap rounded-lg border border-transparent bg-clip-padding font-medium text-sm outline-none transition-all 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:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
6
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all 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",
7
7
  {
8
8
  variants: {
9
9
  variant: {
@@ -15,20 +15,20 @@ const buttonVariants = cva(
15
15
  ghost:
16
16
  "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
17
17
  destructive:
18
- "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 dark:hover:bg-destructive/30",
18
+ "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
19
19
  link: "text-primary underline-offset-4 hover:underline",
20
20
  },
21
21
  size: {
22
22
  default:
23
23
  "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
24
- xs: "h-6 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
25
- sm: "h-7 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
24
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
25
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
26
26
  lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
27
27
  icon: "size-8",
28
28
  "icon-xs":
29
- "size-6 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] [&_svg:not([class*='size-'])]:size-3",
29
+ "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
30
30
  "icon-sm":
31
- "size-7 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)]",
31
+ "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
32
32
  "icon-lg": "size-9",
33
33
  },
34
34
  },
@@ -25,7 +25,7 @@ function Calendar({
25
25
  <DayPicker
26
26
  showOutsideDays={showOutsideDays}
27
27
  className={cn(
28
- "group/calendar bg-background in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)]",
28
+ "group/calendar bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent",
29
29
  String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
30
30
  String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
31
31
  className,
@@ -46,12 +46,12 @@ function Calendar({
46
46
  ),
47
47
  button_previous: cn(
48
48
  buttonVariants({ variant: buttonVariant }),
49
- "size-(--cell-size) select-none p-0 aria-disabled:opacity-50",
49
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
50
50
  defaultClassNames.button_previous,
51
51
  ),
52
52
  button_next: cn(
53
53
  buttonVariants({ variant: buttonVariant }),
54
- "size-(--cell-size) select-none p-0 aria-disabled:opacity-50",
54
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
55
55
  defaultClassNames.button_next,
56
56
  ),
57
57
  month_caption: cn(
@@ -59,13 +59,13 @@ function Calendar({
59
59
  defaultClassNames.month_caption,
60
60
  ),
61
61
  dropdowns: cn(
62
- "flex h-(--cell-size) w-full items-center justify-center gap-1.5 font-medium text-sm",
62
+ "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium",
63
63
  defaultClassNames.dropdowns,
64
64
  ),
65
65
  dropdown_root: cn("relative rounded-(--cell-radius)", defaultClassNames.dropdown_root),
66
66
  dropdown: cn("absolute inset-0 bg-popover opacity-0", defaultClassNames.dropdown),
67
67
  caption_label: cn(
68
- "select-none font-medium",
68
+ "font-medium select-none",
69
69
  captionLayout === "label"
70
70
  ? "text-sm"
71
71
  : "flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
@@ -74,17 +74,17 @@ function Calendar({
74
74
  month_grid: cn("w-full border-collapse", defaultClassNames.month_grid),
75
75
  weekdays: cn("flex", defaultClassNames.weekdays),
76
76
  weekday: cn(
77
- "flex-1 select-none rounded-(--cell-radius) font-normal text-[0.8rem] text-muted-foreground",
77
+ "flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none",
78
78
  defaultClassNames.weekday,
79
79
  ),
80
80
  week: cn("mt-2 flex w-full", defaultClassNames.week),
81
81
  week_number_header: cn("w-(--cell-size) select-none", defaultClassNames.week_number_header),
82
82
  week_number: cn(
83
- "select-none text-[0.8rem] text-muted-foreground",
83
+ "text-[0.8rem] text-muted-foreground select-none",
84
84
  defaultClassNames.week_number,
85
85
  ),
86
86
  day: cn(
87
- "group/day relative aspect-square h-full w-full select-none rounded-(--cell-radius) p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)",
87
+ "group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)",
88
88
  props.showWeekNumber
89
89
  ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)"
90
90
  : "[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)",
@@ -172,7 +172,7 @@ function CalendarDayButton({
172
172
  data-range-end={modifiers.range_end}
173
173
  data-range-middle={modifiers.range_middle}
174
174
  className={cn(
175
- "relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 font-normal leading-none data-[range-end=true]:rounded-(--cell-radius) data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-end=true]:bg-primary data-[range-middle=true]:bg-muted data-[range-start=true]:bg-primary data-[selected-single=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:text-foreground data-[range-start=true]:text-primary-foreground data-[selected-single=true]:text-primary-foreground group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70",
175
+ "relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70",
176
176
  defaultClassNames.day,
177
177
  className,
178
178
  )}
@@ -11,7 +11,7 @@ function Card({
11
11
  data-slot="card"
12
12
  data-size={size}
13
13
  className={cn(
14
- "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-card-foreground text-sm ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-[>img:first-child]:pt-0 has-data-[slot=card-footer]:pb-0 data-[size=sm]:has-data-[slot=card-footer]:pb-0 data-[size=sm]:[--card-spacing:--spacing(3)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
14
+ "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
15
15
  className,
16
16
  )}
17
17
  {...props}
@@ -37,7 +37,7 @@ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
37
37
  <div
38
38
  data-slot="card-title"
39
39
  className={cn(
40
- "font-medium text-base leading-snug group-data-[size=sm]/card:text-sm",
40
+ "text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
41
41
  className,
42
42
  )}
43
43
  {...props}
@@ -49,7 +49,7 @@ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
49
49
  return (
50
50
  <div
51
51
  data-slot="card-description"
52
- className={cn("text-muted-foreground text-sm", className)}
52
+ className={cn("text-sm text-muted-foreground", className)}
53
53
  {...props}
54
54
  />
55
55
  );
@@ -62,7 +62,7 @@ function ChartContainer({
62
62
  data-slot="chart"
63
63
  data-chart={chartId}
64
64
  className={cn(
65
- "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-hidden [&_.recharts-surface]:outline-hidden",
65
+ "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
66
66
  className,
67
67
  )}
68
68
  {...props}
@@ -229,7 +229,7 @@ function ChartTooltipContent({
229
229
  </span>
230
230
  </div>
231
231
  {item.value != null && (
232
- <span className="font-medium font-mono text-foreground tabular-nums">
232
+ <span className="font-mono font-medium text-foreground tabular-nums">
233
233
  {typeof item.value === "number"
234
234
  ? item.value.toLocaleString()
235
235
  : String(item.value)}
@@ -9,7 +9,7 @@ function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {
9
9
  <CheckboxPrimitive.Root
10
10
  data-slot="checkbox"
11
11
  className={cn(
12
- "peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input outline-none transition-colors after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 group-has-[:focus-visible]/field-label:not-data-checked:border-input group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:bg-input/30 dark:data-checked:bg-primary dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
12
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary",
13
13
  className,
14
14
  )}
15
15
  {...props}
@@ -103,7 +103,7 @@ function ComboboxContent({
103
103
  data-slot="combobox-content"
104
104
  data-chips={!!anchor}
105
105
  className={cn(
106
- "group/combobox-content data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 relative max-h-(--available-height) w-(--anchor-width) min-w-[calc(var(--anchor-width)+--spacing(7))] max-w-(--available-width) origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-closed:animate-out data-open:animate-in *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none",
106
+ "group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
107
107
  className,
108
108
  )}
109
109
  {...props}
@@ -131,7 +131,7 @@ function ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.
131
131
  <ComboboxPrimitive.Item
132
132
  data-slot="combobox-item"
133
133
  className={cn(
134
- "relative flex w-full cursor-default select-none items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-50 not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
134
+ "relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
135
135
  className,
136
136
  )}
137
137
  {...props}
@@ -158,7 +158,7 @@ function ComboboxLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Pro
158
158
  return (
159
159
  <ComboboxPrimitive.GroupLabel
160
160
  data-slot="combobox-label"
161
- className={cn("px-2 py-1.5 text-muted-foreground text-xs", className)}
161
+ className={cn("px-2 py-1.5 text-xs text-muted-foreground", className)}
162
162
  {...props}
163
163
  />
164
164
  );
@@ -173,7 +173,7 @@ function ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {
173
173
  <ComboboxPrimitive.Empty
174
174
  data-slot="combobox-empty"
175
175
  className={cn(
176
- "hidden w-full justify-center py-2 text-center text-muted-foreground text-sm group-data-empty/combobox-content:flex",
176
+ "hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex",
177
177
  className,
178
178
  )}
179
179
  {...props}
@@ -199,7 +199,7 @@ function ComboboxChips({
199
199
  <ComboboxPrimitive.Chips
200
200
  data-slot="combobox-chips"
201
201
  className={cn(
202
- "flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-data-[slot=combobox-chip]:px-1 has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40",
202
+ "flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40",
203
203
  className,
204
204
  )}
205
205
  {...props}
@@ -219,7 +219,7 @@ function ComboboxChip({
219
219
  <ComboboxPrimitive.Chip
220
220
  data-slot="combobox-chip"
221
221
  className={cn(
222
- "flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 whitespace-nowrap rounded-sm bg-muted px-1.5 font-medium text-foreground text-xs has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-data-[slot=combobox-chip-remove]:pr-0 has-disabled:opacity-50",
222
+ "flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0",
223
223
  className,
224
224
  )}
225
225
  {...props}
@@ -84,7 +84,7 @@ function CommandList({ className, ...props }: React.ComponentProps<typeof Comman
84
84
  <CommandPrimitive.List
85
85
  data-slot="command-list"
86
86
  className={cn(
87
- "no-scrollbar max-h-72 scroll-py-1 overflow-y-auto overflow-x-hidden outline-none",
87
+ "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",
88
88
  className,
89
89
  )}
90
90
  {...props}
@@ -113,7 +113,7 @@ function CommandGroup({
113
113
  <CommandPrimitive.Group
114
114
  data-slot="command-group"
115
115
  className={cn(
116
- "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground **:[[cmdk-group-heading]]:text-xs",
116
+ "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",
117
117
  className,
118
118
  )}
119
119
  {...props}
@@ -143,7 +143,7 @@ function CommandItem({
143
143
  <CommandPrimitive.Item
144
144
  data-slot="command-item"
145
145
  className={cn(
146
- "group/command-item relative flex cursor-default select-none items-center gap-2 in-data-[slot=dialog-content]:rounded-lg! rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled=true]:pointer-events-none data-selected:bg-muted data-selected:text-foreground data-[disabled=true]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-selected:*:[svg]:text-foreground",
146
+ "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",
147
147
  className,
148
148
  )}
149
149
  {...props}
@@ -159,7 +159,7 @@ function CommandShortcut({ className, ...props }: React.ComponentProps<"span">)
159
159
  <span
160
160
  data-slot="command-shortcut"
161
161
  className={cn(
162
- "ml-auto text-muted-foreground text-xs tracking-widest group-data-selected/command-item:text-foreground",
162
+ "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
163
163
  className,
164
164
  )}
165
165
  {...props}
@@ -44,7 +44,7 @@ function ContextMenuContent({
44
44
  <ContextMenuPrimitive.Popup
45
45
  data-slot="context-menu-content"
46
46
  className={cn(
47
- "data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-y-auto overflow-x-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md outline-none ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in",
47
+ "z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
48
48
  className,
49
49
  )}
50
50
  {...props}
@@ -70,7 +70,7 @@ function ContextMenuLabel({
70
70
  data-slot="context-menu-label"
71
71
  data-inset={inset}
72
72
  className={cn(
73
- "px-1.5 py-1 font-medium text-muted-foreground text-xs data-inset:pl-7",
73
+ "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",
74
74
  className,
75
75
  )}
76
76
  {...props}
@@ -93,7 +93,7 @@ function ContextMenuItem({
93
93
  data-inset={inset}
94
94
  data-variant={variant}
95
95
  className={cn(
96
- "group/context-menu-item relative flex cursor-default select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-[variant=destructive]:text-destructive data-disabled:opacity-50 data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
96
+ "group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
97
97
  className,
98
98
  )}
99
99
  {...props}
@@ -118,7 +118,7 @@ function ContextMenuSubTrigger({
118
118
  data-slot="context-menu-sub-trigger"
119
119
  data-inset={inset}
120
120
  className={cn(
121
- "flex cursor-default select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-inset:pl-7 data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
121
+ "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
122
122
  className,
123
123
  )}
124
124
  {...props}
@@ -154,7 +154,7 @@ function ContextMenuCheckboxItem({
154
154
  data-slot="context-menu-checkbox-item"
155
155
  data-inset={inset}
156
156
  className={cn(
157
- "relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
157
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
158
158
  className,
159
159
  )}
160
160
  checked={checked}
@@ -187,7 +187,7 @@ function ContextMenuRadioItem({
187
187
  data-slot="context-menu-radio-item"
188
188
  data-inset={inset}
189
189
  className={cn(
190
- "relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
190
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
191
191
  className,
192
192
  )}
193
193
  {...props}
@@ -217,7 +217,7 @@ function ContextMenuShortcut({ className, ...props }: React.ComponentProps<"span
217
217
  <span
218
218
  data-slot="context-menu-shortcut"
219
219
  className={cn(
220
- "ml-auto text-muted-foreground text-xs tracking-widest group-focus/context-menu-item:text-accent-foreground",
220
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground",
221
221
  className,
222
222
  )}
223
223
  {...props}