@codefast/ui 0.4.0-canary.4 → 0.4.0-canary.6

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 (117) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/components/accordion.mjs +1 -1
  3. package/dist/components/alert-dialog.mjs +2 -2
  4. package/dist/components/alert.mjs +1 -1
  5. package/dist/components/avatar.mjs +1 -1
  6. package/dist/components/calendar.mjs +5 -5
  7. package/dist/components/carousel.mjs +4 -4
  8. package/dist/components/checkbox-cards.mjs +6 -6
  9. package/dist/components/checkbox-group.mjs +6 -6
  10. package/dist/components/checkbox.mjs +6 -6
  11. package/dist/components/command.mjs +3 -3
  12. package/dist/components/context-menu.mjs +9 -9
  13. package/dist/components/dialog.mjs +2 -2
  14. package/dist/components/drawer.mjs +2 -2
  15. package/dist/components/dropdown-menu.mjs +9 -9
  16. package/dist/components/field.mjs +2 -2
  17. package/dist/components/input-otp.mjs +1 -1
  18. package/dist/components/item.mjs +1 -1
  19. package/dist/components/menubar.mjs +9 -9
  20. package/dist/components/native-select.mjs +2 -2
  21. package/dist/components/navigation-menu.mjs +4 -4
  22. package/dist/components/pagination.mjs +2 -2
  23. package/dist/components/radio-cards.mjs +1 -1
  24. package/dist/components/radio-group.mjs +2 -2
  25. package/dist/components/radio.mjs +1 -1
  26. package/dist/components/resizable.mjs +1 -1
  27. package/dist/components/select.mjs +4 -4
  28. package/dist/components/sheet.mjs +1 -1
  29. package/dist/components/sidebar.mjs +7 -7
  30. package/dist/components/switch.mjs +2 -2
  31. package/dist/components/table.mjs +2 -2
  32. package/dist/components/tabs.mjs +1 -1
  33. package/dist/components/toggle-group.mjs +1 -1
  34. package/dist/components/tooltip.mjs +1 -1
  35. package/dist/variants/alert.mjs +1 -1
  36. package/dist/variants/badge.mjs +1 -1
  37. package/dist/variants/button-group.mjs +2 -2
  38. package/dist/variants/button.mjs +4 -4
  39. package/dist/variants/input-group.mjs +3 -3
  40. package/dist/variants/input-number.mjs +3 -3
  41. package/dist/variants/scroll-area.mjs +1 -1
  42. package/dist/variants/sheet.mjs +2 -2
  43. package/dist/variants/sidebar.mjs +1 -1
  44. package/dist/variants/toggle.mjs +3 -3
  45. package/package.json +12 -12
  46. package/src/components/accordion.tsx +1 -1
  47. package/src/components/alert-dialog.tsx +2 -2
  48. package/src/components/alert.tsx +1 -1
  49. package/src/components/avatar.tsx +1 -1
  50. package/src/components/calendar.tsx +7 -7
  51. package/src/components/carousel.tsx +6 -6
  52. package/src/components/checkbox-cards.tsx +6 -5
  53. package/src/components/checkbox-group.tsx +5 -4
  54. package/src/components/checkbox.tsx +5 -4
  55. package/src/components/command.tsx +3 -3
  56. package/src/components/context-menu.tsx +9 -9
  57. package/src/components/dialog.tsx +2 -2
  58. package/src/components/drawer.tsx +2 -2
  59. package/src/components/dropdown-menu.tsx +9 -9
  60. package/src/components/field.tsx +2 -2
  61. package/src/components/input-otp.tsx +1 -1
  62. package/src/components/item.tsx +1 -1
  63. package/src/components/menubar.tsx +9 -9
  64. package/src/components/native-select.tsx +2 -2
  65. package/src/components/navigation-menu.tsx +4 -4
  66. package/src/components/pagination.tsx +2 -2
  67. package/src/components/radio-cards.tsx +1 -1
  68. package/src/components/radio-group.tsx +4 -2
  69. package/src/components/radio.tsx +1 -1
  70. package/src/components/resizable.tsx +1 -1
  71. package/src/components/select.tsx +4 -4
  72. package/src/components/sheet.tsx +1 -1
  73. package/src/components/sidebar.tsx +7 -7
  74. package/src/components/switch.tsx +2 -2
  75. package/src/components/table.tsx +2 -2
  76. package/src/components/tabs.tsx +2 -2
  77. package/src/components/toggle-group.tsx +1 -1
  78. package/src/components/tooltip.tsx +1 -1
  79. package/src/css/foundation/base.css +24 -0
  80. package/src/css/foundation/motion.css +48 -15
  81. package/src/css/foundation/source.css +7 -0
  82. package/src/css/foundation/tokens.css +36 -0
  83. package/src/css/foundation/variants.css +13 -5
  84. package/src/css/preset.css +8 -0
  85. package/src/css/style.css +8 -0
  86. package/src/css/themes/amber.css +29 -0
  87. package/src/css/themes/blue.css +29 -0
  88. package/src/css/themes/cyan.css +29 -0
  89. package/src/css/themes/emerald.css +29 -0
  90. package/src/css/themes/fuchsia.css +29 -0
  91. package/src/css/themes/gray.css +29 -0
  92. package/src/css/themes/green.css +29 -0
  93. package/src/css/themes/indigo.css +29 -0
  94. package/src/css/themes/lime.css +29 -0
  95. package/src/css/themes/neutral.css +29 -0
  96. package/src/css/themes/orange.css +29 -0
  97. package/src/css/themes/pink.css +29 -0
  98. package/src/css/themes/purple.css +29 -0
  99. package/src/css/themes/red.css +29 -0
  100. package/src/css/themes/rose.css +29 -0
  101. package/src/css/themes/sky.css +29 -0
  102. package/src/css/themes/slate.css +29 -0
  103. package/src/css/themes/stone.css +29 -0
  104. package/src/css/themes/teal.css +29 -0
  105. package/src/css/themes/violet.css +29 -0
  106. package/src/css/themes/yellow.css +29 -0
  107. package/src/css/themes/zinc.css +29 -0
  108. package/src/variants/alert.ts +1 -1
  109. package/src/variants/badge.ts +1 -1
  110. package/src/variants/button-group.ts +2 -2
  111. package/src/variants/button.ts +4 -4
  112. package/src/variants/input-group.ts +3 -3
  113. package/src/variants/input-number.ts +3 -3
  114. package/src/variants/scroll-area.ts +1 -1
  115. package/src/variants/sheet.ts +2 -2
  116. package/src/variants/sidebar.ts +1 -1
  117. package/src/variants/toggle.ts +3 -3
@@ -133,7 +133,7 @@ function MenubarSubTrigger({ children, className, inset, ...props }: MenubarSubT
133
133
  return (
134
134
  <MenubarPrimitive.SubTrigger
135
135
  className={cn(
136
- "flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
136
+ "flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-8 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
137
137
  className,
138
138
  )}
139
139
  data-inset={inset}
@@ -141,7 +141,7 @@ function MenubarSubTrigger({ children, className, inset, ...props }: MenubarSubT
141
141
  {...props}
142
142
  >
143
143
  {children}
144
- <ChevronRightIcon className="ml-auto size-4 rtl:rotate-180" />
144
+ <ChevronRightIcon className="ms-auto size-4 rtl:rotate-180" />
145
145
  </MenubarPrimitive.SubTrigger>
146
146
  );
147
147
  }
@@ -228,7 +228,7 @@ function MenubarItem({ className, inset, variant = "default", ...props }: Menuba
228
228
  return (
229
229
  <MenubarPrimitive.Item
230
230
  className={cn(
231
- "group/menubar-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 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 data-[variant=destructive]:*:[svg]:text-destructive!",
231
+ "group/menubar-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-8 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 data-[variant=destructive]:*:[svg]:text-destructive!",
232
232
  className,
233
233
  )}
234
234
  data-inset={inset}
@@ -258,14 +258,14 @@ function MenubarCheckboxItem({ checked, children, className, inset, ...props }:
258
258
  <MenubarPrimitive.CheckboxItem
259
259
  checked={checked}
260
260
  className={cn(
261
- "relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0",
261
+ "relative flex cursor-default items-center gap-2 rounded-md py-1.5 ps-8 pe-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-8 data-disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0",
262
262
  className,
263
263
  )}
264
264
  data-inset={inset}
265
265
  data-slot="menubar-checkbox-item"
266
266
  {...props}
267
267
  >
268
- <span className="pointer-events-none absolute left-2 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
268
+ <span className="pointer-events-none absolute start-2 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
269
269
  <MenubarPrimitive.ItemIndicator>
270
270
  <CheckIcon />
271
271
  </MenubarPrimitive.ItemIndicator>
@@ -293,14 +293,14 @@ function MenubarRadioItem({ children, className, inset, ...props }: MenubarRadio
293
293
  return (
294
294
  <MenubarPrimitive.RadioItem
295
295
  className={cn(
296
- "relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
296
+ "relative flex cursor-default items-center gap-2 rounded-md py-1.5 ps-8 pe-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
297
297
  className,
298
298
  )}
299
299
  data-inset={inset}
300
300
  data-slot="menubar-radio-item"
301
301
  {...props}
302
302
  >
303
- <span className="pointer-events-none absolute left-2 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
303
+ <span className="pointer-events-none absolute start-2 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
304
304
  <MenubarPrimitive.ItemIndicator>
305
305
  <CheckIcon />
306
306
  </MenubarPrimitive.ItemIndicator>
@@ -327,7 +327,7 @@ interface MenubarLabelProps extends ComponentProps<typeof MenubarPrimitive.Label
327
327
  function MenubarLabel({ className, inset, ...props }: MenubarLabelProps): JSX.Element {
328
328
  return (
329
329
  <MenubarPrimitive.Label
330
- className={cn("px-2 py-1.5 text-sm font-medium data-inset:pl-8", className)}
330
+ className={cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:ps-8", className)}
331
331
  data-inset={inset}
332
332
  data-slot="menubar-label"
333
333
  {...props}
@@ -373,7 +373,7 @@ function MenubarShortcut({ className, ...props }: MenubarShortcutProps): JSX.Ele
373
373
  return (
374
374
  <span
375
375
  className={cn(
376
- "ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground",
376
+ "ms-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground",
377
377
  className,
378
378
  )}
379
379
  data-slot="menubar-shortcut"
@@ -25,14 +25,14 @@ function NativeSelect({ className, size = "default", ...props }: NativeSelectPro
25
25
  data-slot="native-select-wrapper"
26
26
  >
27
27
  <select
28
- className="h-9 w-full min-w-0 appearance-none rounded-md border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-8 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
28
+ className="h-9 w-full min-w-0 appearance-none rounded-md border border-input bg-transparent py-1 ps-2.5 pe-8 text-sm shadow-xs transition-[color,box-shadow] outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-8 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
29
29
  data-size={size}
30
30
  data-slot="native-select"
31
31
  {...props}
32
32
  />
33
33
  <ChevronDownIcon
34
34
  aria-hidden="true"
35
- className="pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none"
35
+ className="pointer-events-none absolute end-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground select-none"
36
36
  data-slot="native-select-icon"
37
37
  />
38
38
  </div>
@@ -98,7 +98,7 @@ function NavigationMenuTrigger({ children, className, ...props }: NavigationMenu
98
98
  {children}{" "}
99
99
  <ChevronDownIcon
100
100
  aria-hidden="true"
101
- className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180"
101
+ className="relative top-px ms-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180"
102
102
  />
103
103
  </NavigationMenuPrimitive.Trigger>
104
104
  );
@@ -120,7 +120,7 @@ function NavigationMenuContent({ className, ...props }: NavigationMenuContentPro
120
120
  return (
121
121
  <NavigationMenuPrimitive.Content
122
122
  className={cn(
123
- "top-0 left-0 w-full p-2 pr-2.5 ease-snappy group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:animation-duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:ease-exit data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 data-closed:ease-exit group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
123
+ "start-0 top-0 w-full p-2 pe-2.5 ease-snappy group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:animation-duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:ease-exit data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 data-closed:ease-exit group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
124
124
  className,
125
125
  )}
126
126
  data-slot="navigation-menu-content"
@@ -168,7 +168,7 @@ type NavigationMenuViewportProps = ComponentProps<typeof NavigationMenuPrimitive
168
168
  */
169
169
  function NavigationMenuViewport({ className, ...props }: NavigationMenuViewportProps): JSX.Element {
170
170
  return (
171
- <div className="absolute top-full left-0 isolate z-50 flex justify-center">
171
+ <div className="absolute start-0 top-full isolate z-50 flex justify-center">
172
172
  <NavigationMenuPrimitive.Viewport
173
173
  className={cn(
174
174
  "relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full origin-[top_center] overflow-hidden rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[width,height] duration-100 ease-snappy md:w-(--radix-navigation-menu-viewport-width) data-open:animate-in data-open:animation-duration-100 data-open:zoom-in-90 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-100 data-closed:zoom-out-90",
@@ -203,7 +203,7 @@ function NavigationMenuIndicator({ className, ...props }: NavigationMenuIndicato
203
203
  data-slot="navigation-menu-indicator"
204
204
  {...props}
205
205
  >
206
- <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
206
+ <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-ss-sm bg-border shadow-md" />
207
207
  </NavigationMenuPrimitive.Indicator>
208
208
  );
209
209
  }
@@ -107,7 +107,7 @@ function PaginationPrevious({ className, text = "Previous", ...props }: Paginati
107
107
  return (
108
108
  <PaginationLink
109
109
  aria-label="Go to previous page"
110
- className={cn("pl-2!", className)}
110
+ className={cn("ps-2!", className)}
111
111
  data-slot="pagination-previous"
112
112
  size="default"
113
113
  {...props}
@@ -137,7 +137,7 @@ function PaginationNext({ className, text = "Next", ...props }: PaginationNextPr
137
137
  return (
138
138
  <PaginationLink
139
139
  aria-label="Go to next page"
140
- className={cn("pr-2!", className)}
140
+ className={cn("pe-2!", className)}
141
141
  data-slot="pagination-next"
142
142
  size="default"
143
143
  {...props}
@@ -50,7 +50,7 @@ function RadioCardsItem({ children, className, ...props }: RadioCardsItemProps):
50
50
  className="flex size-4 items-center justify-center"
51
51
  data-slot="radio-card-indicator"
52
52
  >
53
- <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
53
+ <span className="absolute start-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 animate-in rounded-full bg-primary-foreground duration-control-indicator ease-spring zoom-in-50 rtl:translate-x-1/2" />
54
54
  </RadioGroupPrimitive.Indicator>
55
55
  </RadioGroupPrimitive.Item>
56
56
  {children}
@@ -16,7 +16,9 @@ type RadioGroupProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
16
16
  * @since 0.3.16-canary.0
17
17
  */
18
18
  function RadioGroup({ className, ...props }: RadioGroupProps): JSX.Element {
19
- return <RadioGroupPrimitive.Root className={cn("grid w-full gap-3", className)} data-slot="radio-group" {...props} />;
19
+ return (
20
+ <RadioGroupPrimitive.Root className={cn("flex flex-col gap-3", className)} data-slot="radio-group" {...props} />
21
+ );
20
22
  }
21
23
 
22
24
  /* -----------------------------------------------------------------------------
@@ -45,7 +47,7 @@ function RadioGroupItem({ className, ...props }: RadioGroupItemProps): JSX.Eleme
45
47
  className="flex size-4 items-center justify-center"
46
48
  data-slot="radio-group-indicator"
47
49
  >
48
- <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
50
+ <span className="absolute start-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 animate-in rounded-full bg-primary-foreground duration-control-indicator ease-spring zoom-in-50 rtl:translate-x-1/2" />
49
51
  </RadioGroupPrimitive.Indicator>
50
52
  </RadioGroupPrimitive.Item>
51
53
  );
@@ -21,7 +21,7 @@ function Radio({ className, onChange, onValueChange, ...props }: RadioProps): JS
21
21
  return (
22
22
  <input
23
23
  className={cn(
24
- "peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-full border border-input shadow-xs outline-none before:size-full before:rounded-full before:bg-background after:absolute after:-inset-x-3 after:-inset-y-2 checked:border-primary checked:bg-primary checked:before:size-2 checked:before:bg-primary-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:not-checked:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 checked:aria-invalid:bg-destructive dark:not-checked:before:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
24
+ "peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-full border border-input bg-background shadow-xs outline-none before:size-2 before:scale-0 before:rounded-full before:bg-primary-foreground before:transition-transform before:duration-control-indicator before:ease-spring after:absolute after:-inset-x-3 after:-inset-y-2 checked:border-primary checked:bg-primary checked:before:scale-100 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:not-checked:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 checked:aria-invalid:bg-destructive dark:not-checked:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
25
25
  className,
26
26
  )}
27
27
  data-slot="radio"
@@ -59,7 +59,7 @@ function ResizableSeparator({ className, withHandle, ...props }: ResizableSepara
59
59
  return (
60
60
  <ResizablePrimitive.Separator
61
61
  className={cn(
62
- "relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90",
62
+ "relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:start-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:start-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 rtl:after:translate-x-1/2 rtl:aria-[orientation=horizontal]:after:-translate-x-0 [&[aria-orientation=horizontal]>div]:rotate-90",
63
63
  className,
64
64
  )}
65
65
  data-slot="resizable-separator"
@@ -70,7 +70,7 @@ function SelectTrigger({ children, className, size = "default", ...props }: Sele
70
70
  return (
71
71
  <SelectPrimitive.Trigger
72
72
  className={cn(
73
- "flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none 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 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 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",
73
+ "flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 ps-2.5 pe-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none 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 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 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",
74
74
  className,
75
75
  )}
76
76
  data-size={size}
@@ -165,7 +165,7 @@ function SelectContent({
165
165
  className={cn(
166
166
  "relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 ease-snappy data-[align-trigger=true]:animate-none data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2",
167
167
  position === "popper" &&
168
- "data-side-top:-translate-y-1 data-side-right:translate-x-1 data-side-bottom:translate-y-1 data-side-left:-translate-x-1",
168
+ "data-side-top:-translate-y-1 data-side-right:translate-x-1 rtl:data-side-right:-translate-x-1 data-side-bottom:translate-y-1 data-side-left:-translate-x-1 rtl:data-side-left:translate-x-1",
169
169
  className,
170
170
  )}
171
171
  data-align-trigger={position === "item-aligned"}
@@ -227,13 +227,13 @@ function SelectItem({ children, className, ...props }: SelectItemProps): JSX.Ele
227
227
  return (
228
228
  <SelectPrimitive.Item
229
229
  className={cn(
230
- "relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**: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 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
230
+ "relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 ps-2 pe-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**: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 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
231
231
  className,
232
232
  )}
233
233
  data-slot="select-item"
234
234
  {...props}
235
235
  >
236
- <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center">
236
+ <span className="pointer-events-none absolute end-2 flex size-4 items-center justify-center">
237
237
  <SelectPrimitive.ItemIndicator>
238
238
  <CheckIcon className="pointer-events-none" />
239
239
  </SelectPrimitive.ItemIndicator>
@@ -79,7 +79,7 @@ function SheetContent({
79
79
  {showCloseButton ? (
80
80
  <SheetPrimitive.Close
81
81
  className={buttonVariants({
82
- className: "absolute top-4 right-4",
82
+ className: "absolute top-4 end-4",
83
83
  size: "icon-sm",
84
84
  variant: "ghost",
85
85
  })}
@@ -310,7 +310,7 @@ function SidebarRail({ className, ...props }: SidebarRailProps): JSX.Element {
310
310
  return (
311
311
  <button
312
312
  className={cn(
313
- "absolute inset-y-0 z-20 hidden w-4 transition-all ease-gentle group-data-[collapsible=offcanvas]:translate-x-0 group-data-side-right:left-0 group-data-side-left:-right-4 after:absolute after:inset-y-0 after:inset-s-1/2 after:w-0.5 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar hover:after:bg-sidebar-border in-data-side-right:cursor-e-resize in-data-side-left:cursor-w-resize sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 [[data-side=left][data-collapsible=offcanvas]_&]:-right-2 [[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-collapsible=offcanvas]_&]:-left-2 [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
313
+ "absolute inset-y-0 z-20 hidden w-4 transition-all ease-gentle group-data-[collapsible=offcanvas]:translate-x-0 group-data-side-right:left-0 group-data-side-left:-right-4 after:absolute after:inset-y-0 after:inset-s-1/2 after:w-0.5 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar hover:after:bg-sidebar-border in-data-side-right:cursor-e-resize in-data-side-left:cursor-w-resize sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 rtl:group-data-[collapsible=offcanvas]:-translate-x-0 rtl:in-data-side-right:cursor-w-resize rtl:in-data-side-left:cursor-e-resize [[data-side=left][data-collapsible=offcanvas]_&]:-right-2 [[data-side=left][data-state=collapsed]_&]:cursor-e-resize rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize [[data-side=right][data-collapsible=offcanvas]_&]:-left-2 [[data-side=right][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-e-resize",
314
314
  className,
315
315
  )}
316
316
  data-sidebar="rail"
@@ -339,7 +339,7 @@ function SidebarInset({ className, ...props }: SidebarInsetProps): JSX.Element {
339
339
  return (
340
340
  <main
341
341
  className={cn(
342
- "relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-collapsed:ml-2",
342
+ "relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-collapsed:ms-2",
343
343
  className,
344
344
  )}
345
345
  data-slot="sidebar-inset"
@@ -539,7 +539,7 @@ function SidebarGroupAction({ asChild = false, className, ...props }: SidebarGro
539
539
  return (
540
540
  <Component
541
541
  className={cn(
542
- "absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
542
+ "absolute end-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
543
543
  className,
544
544
  )}
545
545
  data-sidebar="group-action"
@@ -703,7 +703,7 @@ function SidebarMenuAction({
703
703
  return (
704
704
  <Component
705
705
  className={cn(
706
- "absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
706
+ "absolute end-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
707
707
  showOnHover &&
708
708
  "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0",
709
709
  className,
@@ -731,7 +731,7 @@ function SidebarMenuBadge({ className, ...props }: SidebarMenuBadgeProps): JSX.E
731
731
  return (
732
732
  <div
733
733
  className={cn(
734
- "pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground",
734
+ "pointer-events-none absolute end-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground",
735
735
  className,
736
736
  )}
737
737
  data-sidebar="menu-badge"
@@ -796,7 +796,7 @@ function SidebarMenuSub({ className, ...props }: SidebarMenuSubProps): JSX.Eleme
796
796
  return (
797
797
  <ul
798
798
  className={cn(
799
- "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden",
799
+ "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-s border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden rtl:-translate-x-px",
800
800
  className,
801
801
  )}
802
802
  data-sidebar="menu-sub"
@@ -857,7 +857,7 @@ function SidebarMenuSubButton({
857
857
  return (
858
858
  <Component
859
859
  className={cn(
860
- "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
860
+ "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs rtl:translate-x-px data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
861
861
  className,
862
862
  )}
863
863
  data-active={isActive}
@@ -21,7 +21,7 @@ function Switch({ className, size = "default", ...props }: SwitchProps): JSX.Ele
21
21
  return (
22
22
  <SwitchPrimitives.Root
23
23
  className={cn(
24
- "peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
24
+ "peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all duration-control ease-snappy outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-4.5 data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
25
25
  className,
26
26
  )}
27
27
  data-size={size}
@@ -29,7 +29,7 @@ function Switch({ className, size = "default", ...props }: SwitchProps): JSX.Ele
29
29
  {...props}
30
30
  >
31
31
  <SwitchPrimitives.Thumb
32
- className="pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"
32
+ className="pointer-events-none block rounded-full bg-background ring-0 transition-transform duration-control-indicator ease-spring group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-3.5 group-data-[size=sm]/switch:data-checked:translate-x-2.5 rtl:group-data-[size=default]/switch:data-checked:-translate-x-3.5 rtl:group-data-[size=sm]/switch:data-checked:-translate-x-2.5 dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 rtl:group-data-[size=default]/switch:data-unchecked:-translate-x-0 rtl:group-data-[size=sm]/switch:data-unchecked:-translate-x-0 dark:data-unchecked:bg-foreground"
33
33
  data-slot="switch-thumb"
34
34
  />
35
35
  </SwitchPrimitives.Root>
@@ -117,7 +117,7 @@ function TableHead({ className, ...props }: TableHeadProps): JSX.Element {
117
117
  return (
118
118
  <th
119
119
  className={cn(
120
- "h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
120
+ "h-10 px-2 text-start align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pe-0",
121
121
  className,
122
122
  )}
123
123
  data-slot="table-head"
@@ -141,7 +141,7 @@ type TableCellProps = ComponentProps<"td">;
141
141
  function TableCell({ className, ...props }: TableCellProps): JSX.Element {
142
142
  return (
143
143
  <td
144
- className={cn("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", className)}
144
+ className={cn("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pe-0", className)}
145
145
  data-slot="table-cell"
146
146
  {...props}
147
147
  />
@@ -68,10 +68,10 @@ function TabsTrigger({ className, ...props }: TabsTriggerProps): JSX.Element {
68
68
  return (
69
69
  <TabsPrimitive.Trigger
70
70
  className={cn(
71
- "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
71
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
72
72
  "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent",
73
73
  "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground",
74
- "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:-bottom-1.25 group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
74
+ "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:-bottom-1.25 group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-end-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
75
75
  className,
76
76
  )}
77
77
  data-slot="tabs-trigger"
@@ -112,7 +112,7 @@ function ToggleGroupItem({
112
112
  return (
113
113
  <ToggleGroupPrimitive.Item
114
114
  className={cn(
115
- "shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:shadow-none focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-md group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-md group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-md group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-md group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t data-on:bg-muted",
115
+ "shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:shadow-none focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pe-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:ps-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-s-md group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-md group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-e-md group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-md group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-s-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-s group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t data-on:bg-muted",
116
116
  toggleVariants({
117
117
  className,
118
118
  size: context.size ?? size,
@@ -68,7 +68,7 @@ function TooltipContent({ children, className, sideOffset = 0, ...props }: Toolt
68
68
  <TooltipPrimitive.Portal data-slot="tooltip-portal">
69
69
  <TooltipPrimitive.Content
70
70
  className={cn(
71
- "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background ease-snappy has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2 data-delayed-open:animate-in data-delayed-open:animation-duration-menu-in data-delayed-open:fade-in-0 data-delayed-open:zoom-in-95 data-delayed-open:data-side-top:slide-in-from-bottom-2 data-delayed-open:data-side-right:slide-in-from-left-2 data-delayed-open:data-side-bottom:slide-in-from-top-2 data-delayed-open:data-side-left:slide-in-from-right-2",
71
+ "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background ease-snappy has-data-[slot=kbd]:pe-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2 data-delayed-open:animate-in data-delayed-open:animation-duration-menu-in data-delayed-open:fade-in-0 data-delayed-open:zoom-in-95 data-delayed-open:data-side-top:slide-in-from-bottom-2 data-delayed-open:data-side-right:slide-in-from-left-2 data-delayed-open:data-side-bottom:slide-in-from-top-2 data-delayed-open:data-side-left:slide-in-from-right-2",
72
72
  className,
73
73
  )}
74
74
  data-slot="tooltip-content"
@@ -1,4 +1,16 @@
1
+ /* -------------------------------------------------------------------------
2
+ * Base
3
+ *
4
+ * Global element defaults layered into Tailwind's `base` cascade: default
5
+ * border/outline colors, scrollbar styling, document background, and
6
+ * native input appearance resets.
7
+ * ------------------------------------------------------------------------- */
8
+
1
9
  @layer base {
10
+ /* ----------------------------------------------------------------------
11
+ * Default border & focus-ring colors for every element
12
+ * ---------------------------------------------------------------------- */
13
+
2
14
  *,
3
15
  ::after,
4
16
  ::before,
@@ -8,6 +20,10 @@
8
20
  outline-color: --alpha(var(--color-ring) / 20%);
9
21
  }
10
22
 
23
+ /* ----------------------------------------------------------------------
24
+ * Scrollbars — WebKit (size + colors) and Firefox (thin + colors)
25
+ * ---------------------------------------------------------------------- */
26
+
11
27
  ::-webkit-scrollbar {
12
28
  @apply size-2;
13
29
  }
@@ -25,12 +41,20 @@
25
41
  scrollbar-color: var(--color-border) transparent;
26
42
  }
27
43
 
44
+ /* ----------------------------------------------------------------------
45
+ * Document
46
+ * ---------------------------------------------------------------------- */
47
+
28
48
  html,
29
49
  body {
30
50
  background-color: var(--color-background);
31
51
  color: var(--color-foreground);
32
52
  }
33
53
 
54
+ /* ----------------------------------------------------------------------
55
+ * Inputs — strip native search & number-spinner affordances
56
+ * ---------------------------------------------------------------------- */
57
+
34
58
  input {
35
59
  &::-webkit-search-cancel-button,
36
60
  &::-webkit-search-decoration {
@@ -1,28 +1,61 @@
1
+ /* -------------------------------------------------------------------------
2
+ * Motion
3
+ *
4
+ * Easing curves, semantic durations, and keyframes for @codefast/ui. Tokens
5
+ * are exposed through Tailwind's @theme so they mint matching `ease-*`,
6
+ * `duration-*`, and `animate-*` utilities.
7
+ * ------------------------------------------------------------------------- */
8
+
1
9
  @theme {
2
- /* Enter curves — decelerate into place. */
3
- --ease-ui: cubic-bezier(0.32, 0.72, 0, 1); /* large surfaces: dialog, sheet */
4
- --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* playful overshoot, opt-in */
5
- --ease-snappy: cubic-bezier(0.23, 1, 0.32, 1); /* small popups: menu, tooltip */
6
- --ease-gentle: cubic-bezier(0.4, 0, 0.2, 1); /* continuous layout shifts, fades */
10
+ /* ----------------------------------------------------------------------
11
+ * Easing enter curves (decelerate into place)
12
+ * ---------------------------------------------------------------------- */
13
+
14
+ --ease-ui: cubic-bezier(0.32, 0.72, 0, 1); /* Large surfaces: dialog, sheet */
15
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* Playful overshoot (opt-in) */
16
+ --ease-snappy: cubic-bezier(0.23, 1, 0.32, 1); /* Small popups: menu, tooltip */
17
+ --ease-gentle: cubic-bezier(0.4, 0, 0.2, 1); /* Continuous layout shifts, fades */
18
+
19
+ /* ----------------------------------------------------------------------
20
+ * Easing — exit curve (accelerate away; pair with `data-closed:`)
21
+ * ---------------------------------------------------------------------- */
7
22
 
8
- /* Exit curve — accelerate away; pair with data-closed:. */
9
23
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);
10
24
 
11
- /*
12
- * Semantic durations — enter/exit pairs per surface role.
13
- * Exit ≈ 60% of enter to offset the slow start of the accelerating exit curve.
14
- */
15
- --animation-duration-menu-in: 150ms; /* menus, tooltip — instant tools */
25
+ /* ----------------------------------------------------------------------
26
+ * Durations — enter/exit pairs per surface role
27
+ *
28
+ * Exit ≈ 60% of enter to offset the slow start of the accelerating exit
29
+ * curve.
30
+ * ---------------------------------------------------------------------- */
31
+
32
+ --animation-duration-menu-in: 150ms; /* Menus, tooltip — instant tools */
16
33
  --animation-duration-menu-out: 100ms;
17
- --animation-duration-popup-in: 200ms; /* popover, hover card — content surfaces */
34
+ --animation-duration-popup-in: 200ms; /* Popover, hover card — content surfaces */
18
35
  --animation-duration-popup-out: 120ms;
19
- --animation-duration-overlay-in: 220ms; /* dialog content + backdrop */
36
+ --animation-duration-overlay-in: 220ms; /* Dialog content + backdrop */
20
37
  --animation-duration-overlay-out: 150ms;
21
- --animation-duration-panel-in: 320ms; /* sheet, drawer — large sliding panels */
38
+ --animation-duration-panel-in: 320ms; /* Sheet, drawer — large sliding panels */
22
39
  --animation-duration-panel-out: 220ms;
23
- --animation-duration-expand-in: 200ms; /* accordion, inline disclosure */
40
+ --animation-duration-expand-in: 200ms; /* Accordion, inline disclosure */
24
41
  --animation-duration-expand-out: 150ms;
25
42
 
43
+ /* ----------------------------------------------------------------------
44
+ * Durations — form controls (switch, checkbox, radio)
45
+ *
46
+ * Defined in the transition-duration namespace so they mint clean
47
+ * `duration-control*` utilities; `animate-in` also picks them up via its
48
+ * --tw-duration fallback, so a single utility drives both the state
49
+ * transition and the indicator keyframe.
50
+ * ---------------------------------------------------------------------- */
51
+
52
+ --transition-duration-control: 100ms; /* Container / ring: switch track, checkbox & radio box */
53
+ --transition-duration-control-indicator: 200ms; /* Moving part: switch thumb, check, radio dot */
54
+
55
+ /* ----------------------------------------------------------------------
56
+ * Keyframes
57
+ * ---------------------------------------------------------------------- */
58
+
26
59
  --animate-shimmer: shimmer 2.2s linear infinite;
27
60
 
28
61
  @keyframes shimmer {
@@ -1,3 +1,10 @@
1
+ /* -------------------------------------------------------------------------
2
+ * Source
3
+ *
4
+ * Third-party imports and the Tailwind content source scanned for class
5
+ * usage across the package.
6
+ * ------------------------------------------------------------------------- */
7
+
1
8
  @import "tw-animate-css";
2
9
 
3
10
  @source "../../**/*.{ts,tsx}";