gladvn 0.2.19 → 0.2.21

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 (208) hide show
  1. package/README.md +1 -0
  2. package/bin/cli.js +15 -5
  3. package/dist/components/macro/accordion-preset.d.ts.map +1 -1
  4. package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -1
  5. package/dist/components/macro/alert-preset.d.ts.map +1 -1
  6. package/dist/components/macro/avatar-preset.d.ts.map +1 -1
  7. package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -1
  8. package/dist/components/macro/card-preset.d.ts.map +1 -1
  9. package/dist/components/macro/carousel-preset.d.ts.map +1 -1
  10. package/dist/components/macro/checkbox-preset.d.ts.map +1 -1
  11. package/dist/components/macro/combobox-preset.d.ts.map +1 -1
  12. package/dist/components/macro/command-preset.d.ts +1 -1
  13. package/dist/components/macro/command-preset.d.ts.map +1 -1
  14. package/dist/components/macro/date-picker.d.ts.map +1 -1
  15. package/dist/components/macro/dialog-preset.d.ts.map +1 -1
  16. package/dist/components/macro/empty-preset.d.ts +1 -1
  17. package/dist/components/macro/empty-preset.d.ts.map +1 -1
  18. package/dist/components/macro/field-preset.d.ts.map +1 -1
  19. package/dist/components/macro/input-otp-preset.d.ts.map +1 -1
  20. package/dist/components/macro/input-preset.d.ts.map +1 -1
  21. package/dist/components/macro/pagination-preset.d.ts.map +1 -1
  22. package/dist/components/macro/progress-preset.d.ts.map +1 -1
  23. package/dist/components/macro/radio-group-preset.d.ts.map +1 -1
  24. package/dist/components/macro/select-preset.d.ts.map +1 -1
  25. package/dist/components/macro/slider-preset.d.ts.map +1 -1
  26. package/dist/components/macro/switch-preset.d.ts.map +1 -1
  27. package/dist/components/macro/tabs-preset.d.ts.map +1 -1
  28. package/dist/components/micro/alert-dialog.d.ts +4 -4
  29. package/dist/components/micro/alert-dialog.d.ts.map +1 -1
  30. package/dist/components/micro/combobox.d.ts +4 -3
  31. package/dist/components/micro/combobox.d.ts.map +1 -1
  32. package/dist/components/micro/context-menu.d.ts +4 -6
  33. package/dist/components/micro/context-menu.d.ts.map +1 -1
  34. package/dist/components/micro/dialog.d.ts +4 -3
  35. package/dist/components/micro/dialog.d.ts.map +1 -1
  36. package/dist/components/micro/drawer.d.ts +4 -3
  37. package/dist/components/micro/drawer.d.ts.map +1 -1
  38. package/dist/components/micro/dropdown-menu.d.ts +7 -4
  39. package/dist/components/micro/dropdown-menu.d.ts.map +1 -1
  40. package/dist/components/micro/hover-card.d.ts +4 -3
  41. package/dist/components/micro/hover-card.d.ts.map +1 -1
  42. package/dist/components/micro/menubar.d.ts +2 -3
  43. package/dist/components/micro/menubar.d.ts.map +1 -1
  44. package/dist/components/micro/navigation-menu.d.ts +4 -3
  45. package/dist/components/micro/navigation-menu.d.ts.map +1 -1
  46. package/dist/components/micro/popover.d.ts +4 -3
  47. package/dist/components/micro/popover.d.ts.map +1 -1
  48. package/dist/components/micro/select.d.ts +4 -3
  49. package/dist/components/micro/select.d.ts.map +1 -1
  50. package/dist/components/micro/sheet.d.ts +3 -3
  51. package/dist/components/micro/sheet.d.ts.map +1 -1
  52. package/dist/components/micro/tooltip.d.ts +4 -3
  53. package/dist/components/micro/tooltip.d.ts.map +1 -1
  54. package/dist/dev/App.d.ts.map +1 -1
  55. package/dist/dev/data.d.ts.map +1 -1
  56. package/dist/dev/showcase/accordion.d.ts.map +1 -1
  57. package/dist/dev/showcase/alert-dialog.d.ts.map +1 -1
  58. package/dist/dev/showcase/alert.d.ts.map +1 -1
  59. package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -1
  60. package/dist/dev/showcase/avatar.d.ts.map +1 -1
  61. package/dist/dev/showcase/badge.d.ts.map +1 -1
  62. package/dist/dev/showcase/breadcrumb.d.ts.map +1 -1
  63. package/dist/dev/showcase/button.d.ts.map +1 -1
  64. package/dist/dev/showcase/calendar.d.ts.map +1 -1
  65. package/dist/dev/showcase/card.d.ts.map +1 -1
  66. package/dist/dev/showcase/carousel.d.ts.map +1 -1
  67. package/dist/dev/showcase/chart.d.ts.map +1 -1
  68. package/dist/dev/showcase/checkbox.d.ts.map +1 -1
  69. package/dist/dev/showcase/collapsible.d.ts.map +1 -1
  70. package/dist/dev/showcase/combobox.d.ts.map +1 -1
  71. package/dist/dev/showcase/command.d.ts.map +1 -1
  72. package/dist/dev/showcase/context-menu.d.ts.map +1 -1
  73. package/dist/dev/showcase/dialog.d.ts.map +1 -1
  74. package/dist/dev/showcase/drawer.d.ts.map +1 -1
  75. package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -1
  76. package/dist/dev/showcase/empty.d.ts.map +1 -1
  77. package/dist/dev/showcase/hover-card.d.ts.map +1 -1
  78. package/dist/dev/showcase/input-group.d.ts.map +1 -1
  79. package/dist/dev/showcase/input-otp.d.ts.map +1 -1
  80. package/dist/dev/showcase/input.d.ts.map +1 -1
  81. package/dist/dev/showcase/item.d.ts.map +1 -1
  82. package/dist/dev/showcase/kbd.d.ts.map +1 -1
  83. package/dist/dev/showcase/label.d.ts.map +1 -1
  84. package/dist/dev/showcase/menubar.d.ts.map +1 -1
  85. package/dist/dev/showcase/navigation-menu.d.ts.map +1 -1
  86. package/dist/dev/showcase/overview.d.ts.map +1 -1
  87. package/dist/dev/showcase/pagination.d.ts.map +1 -1
  88. package/dist/dev/showcase/popover.d.ts.map +1 -1
  89. package/dist/dev/showcase/progress.d.ts.map +1 -1
  90. package/dist/dev/showcase/radio-group.d.ts.map +1 -1
  91. package/dist/dev/showcase/resizable.d.ts.map +1 -1
  92. package/dist/dev/showcase/scroll-area.d.ts.map +1 -1
  93. package/dist/dev/showcase/select.d.ts.map +1 -1
  94. package/dist/dev/showcase/separator.d.ts.map +1 -1
  95. package/dist/dev/showcase/sheet.d.ts.map +1 -1
  96. package/dist/dev/showcase/sidebar.d.ts.map +1 -1
  97. package/dist/dev/showcase/skeleton.d.ts.map +1 -1
  98. package/dist/dev/showcase/slider.d.ts.map +1 -1
  99. package/dist/dev/showcase/sonner.d.ts.map +1 -1
  100. package/dist/dev/showcase/spinner.d.ts.map +1 -1
  101. package/dist/dev/showcase/switch.d.ts.map +1 -1
  102. package/dist/dev/showcase/table.d.ts.map +1 -1
  103. package/dist/dev/showcase/tabs.d.ts.map +1 -1
  104. package/dist/dev/showcase/textarea.d.ts.map +1 -1
  105. package/dist/dev/showcase/toast.d.ts.map +1 -1
  106. package/dist/dev/showcase/toggle-group.d.ts.map +1 -1
  107. package/dist/dev/showcase/toggle.d.ts.map +1 -1
  108. package/dist/dev/showcase/tooltip.d.ts.map +1 -1
  109. package/dist/index.cjs +256 -256
  110. package/dist/index.cjs.map +1 -1
  111. package/dist/index.js +257 -244
  112. package/dist/index.js.map +1 -1
  113. package/package.json +2 -2
  114. package/src/components/macro/accordion-preset.test.tsx +1 -2
  115. package/src/components/macro/accordion-preset.tsx +1 -2
  116. package/src/components/macro/alert-dialog-preset.tsx +7 -12
  117. package/src/components/macro/alert-preset.tsx +1 -2
  118. package/src/components/macro/avatar-preset.tsx +2 -4
  119. package/src/components/macro/breadcrumb-preset.tsx +1 -2
  120. package/src/components/macro/card-preset.tsx +1 -2
  121. package/src/components/macro/carousel-preset.tsx +1 -2
  122. package/src/components/macro/checkbox-preset.tsx +1 -2
  123. package/src/components/macro/combobox-preset.tsx +8 -14
  124. package/src/components/macro/command-preset.tsx +18 -24
  125. package/src/components/macro/date-picker.tsx +14 -23
  126. package/src/components/macro/dialog-preset.tsx +45 -49
  127. package/src/components/macro/empty-preset.tsx +2 -4
  128. package/src/components/macro/field-preset.tsx +1 -2
  129. package/src/components/macro/input-otp-preset.tsx +1 -2
  130. package/src/components/macro/input-preset.tsx +1 -2
  131. package/src/components/macro/pagination-preset.tsx +3 -6
  132. package/src/components/macro/progress-preset.tsx +1 -2
  133. package/src/components/macro/radio-group-preset.tsx +2 -4
  134. package/src/components/macro/select-preset.tsx +7 -12
  135. package/src/components/macro/slider-preset.tsx +1 -2
  136. package/src/components/macro/switch-preset.tsx +1 -2
  137. package/src/components/macro/tabs-preset.tsx +1 -2
  138. package/src/components/micro/alert-dialog.tsx +16 -14
  139. package/src/components/micro/combobox.tsx +28 -22
  140. package/src/components/micro/context-menu.tsx +52 -36
  141. package/src/components/micro/dialog.tsx +23 -19
  142. package/src/components/micro/drawer.tsx +23 -19
  143. package/src/components/micro/dropdown-menu.tsx +23 -18
  144. package/src/components/micro/hover-card.tsx +31 -23
  145. package/src/components/micro/menubar.tsx +0 -8
  146. package/src/components/micro/navigation-menu.tsx +26 -19
  147. package/src/components/micro/popover.tsx +31 -25
  148. package/src/components/micro/select.tsx +36 -29
  149. package/src/components/micro/sheet.tsx +36 -31
  150. package/src/components/micro/tooltip.tsx +28 -23
  151. package/src/dev/App.tsx +36 -10
  152. package/src/dev/data.ts +0 -8
  153. package/src/dev/showcase/accordion.tsx +47 -94
  154. package/src/dev/showcase/alert-dialog.tsx +27 -39
  155. package/src/dev/showcase/alert.tsx +5 -10
  156. package/src/dev/showcase/aspect-ratio.tsx +1 -2
  157. package/src/dev/showcase/avatar.tsx +5 -10
  158. package/src/dev/showcase/badge.tsx +2 -4
  159. package/src/dev/showcase/breadcrumb.tsx +8 -11
  160. package/src/dev/showcase/button.tsx +2 -4
  161. package/src/dev/showcase/calendar.tsx +5 -10
  162. package/src/dev/showcase/card.tsx +4 -8
  163. package/src/dev/showcase/carousel.tsx +40 -80
  164. package/src/dev/showcase/chart.tsx +7 -16
  165. package/src/dev/showcase/checkbox.tsx +7 -14
  166. package/src/dev/showcase/collapsible.tsx +3 -6
  167. package/src/dev/showcase/combobox.tsx +27 -43
  168. package/src/dev/showcase/command.tsx +4 -8
  169. package/src/dev/showcase/context-menu.tsx +13 -19
  170. package/src/dev/showcase/dialog.tsx +19 -33
  171. package/src/dev/showcase/drawer.tsx +19 -27
  172. package/src/dev/showcase/dropdown-menu.tsx +19 -29
  173. package/src/dev/showcase/empty.tsx +3 -6
  174. package/src/dev/showcase/hover-card.tsx +24 -36
  175. package/src/dev/showcase/input-group.tsx +4 -8
  176. package/src/dev/showcase/input-otp.tsx +5 -10
  177. package/src/dev/showcase/input.tsx +5 -10
  178. package/src/dev/showcase/item.tsx +3 -6
  179. package/src/dev/showcase/kbd.tsx +12 -16
  180. package/src/dev/showcase/label.tsx +2 -4
  181. package/src/dev/showcase/menubar.tsx +17 -19
  182. package/src/dev/showcase/navigation-menu.tsx +12 -15
  183. package/src/dev/showcase/overview.tsx +17 -30
  184. package/src/dev/showcase/pagination.tsx +4 -8
  185. package/src/dev/showcase/popover.tsx +21 -27
  186. package/src/dev/showcase/progress.tsx +4 -8
  187. package/src/dev/showcase/radio-group.tsx +8 -16
  188. package/src/dev/showcase/resizable.tsx +2 -4
  189. package/src/dev/showcase/scroll-area.tsx +1 -2
  190. package/src/dev/showcase/select.tsx +27 -39
  191. package/src/dev/showcase/separator.tsx +1 -2
  192. package/src/dev/showcase/sheet.tsx +22 -33
  193. package/src/dev/showcase/sidebar.tsx +2 -4
  194. package/src/dev/showcase/skeleton.tsx +1 -2
  195. package/src/dev/showcase/slider.tsx +5 -10
  196. package/src/dev/showcase/sonner.tsx +18 -38
  197. package/src/dev/showcase/spinner.tsx +2 -4
  198. package/src/dev/showcase/switch.tsx +6 -12
  199. package/src/dev/showcase/table.tsx +3 -6
  200. package/src/dev/showcase/tabs.tsx +20 -40
  201. package/src/dev/showcase/textarea.tsx +5 -10
  202. package/src/dev/showcase/toast.tsx +4 -10
  203. package/src/dev/showcase/toggle-group.tsx +4 -8
  204. package/src/dev/showcase/toggle.tsx +2 -4
  205. package/src/dev/showcase/tooltip.tsx +34 -43
  206. package/dist/dev/showcase/theme-provider.d.ts +0 -2
  207. package/dist/dev/showcase/theme-provider.d.ts.map +0 -1
  208. package/src/dev/showcase/theme-provider.tsx +0 -956
@@ -11,6 +11,7 @@ import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/naviga
11
11
  import { ChevronDownIcon } from "lucide-react";
12
12
 
13
13
  import { cn } from "../../lib/utils";
14
+ import { ThemeWrapper } from "./theme-provider";
14
15
 
15
16
  /**
16
17
  * @description A collection of links for navigating websites.
@@ -117,7 +118,9 @@ NavigationMenuContent.displayName = "NavigationMenuContent";
117
118
 
118
119
  const NavigationMenuPositioner = React.forwardRef<
119
120
  React.ComponentRef<typeof NavigationMenuPrimitive.Positioner>,
120
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Positioner>
121
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Positioner> & {
122
+ container?: React.ComponentProps<typeof NavigationMenuPrimitive.Portal>["container"];
123
+ }
121
124
  >(
122
125
  (
123
126
  {
@@ -126,27 +129,32 @@ const NavigationMenuPositioner = React.forwardRef<
126
129
  sideOffset = 8,
127
130
  align = "start",
128
131
  alignOffset = 0,
132
+ container,
129
133
  ...props
130
134
  },
131
135
  ref,
132
136
  ) => {
133
137
  return (
134
- <NavigationMenuPrimitive.Positioner
135
- ref={ref}
136
- side={side}
137
- sideOffset={sideOffset}
138
- align={align}
139
- alignOffset={alignOffset}
140
- className={cn(
141
- "isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0",
142
- className,
143
- )}
144
- {...props}
145
- >
146
- <NavigationMenuPrimitive.Popup className="data-ending-style:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0">
147
- <NavigationMenuViewport />
148
- </NavigationMenuPrimitive.Popup>
149
- </NavigationMenuPrimitive.Positioner>
138
+ <NavigationMenuPrimitive.Portal container={container}>
139
+ <ThemeWrapper>
140
+ <NavigationMenuPrimitive.Positioner
141
+ ref={ref}
142
+ side={side}
143
+ sideOffset={sideOffset}
144
+ align={align}
145
+ alignOffset={alignOffset}
146
+ className={cn(
147
+ "isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0",
148
+ className,
149
+ )}
150
+ {...props}
151
+ >
152
+ <NavigationMenuPrimitive.Popup className="data-ending-style:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0">
153
+ <NavigationMenuViewport />
154
+ </NavigationMenuPrimitive.Popup>
155
+ </NavigationMenuPrimitive.Positioner>
156
+ </ThemeWrapper>
157
+ </NavigationMenuPrimitive.Portal>
150
158
  );
151
159
  },
152
160
  );
@@ -182,7 +190,7 @@ const NavigationMenuLink = React.forwardRef<
182
190
  });
183
191
  NavigationMenuLink.displayName = "NavigationMenuLink";
184
192
 
185
- const NavigationMenuPortal = NavigationMenuPrimitive.Portal;
193
+
186
194
 
187
195
  export {
188
196
  NavigationMenu,
@@ -190,7 +198,6 @@ export {
190
198
  NavigationMenuItem,
191
199
  NavigationMenuLink,
192
200
  NavigationMenuList,
193
- NavigationMenuPortal,
194
201
  NavigationMenuPositioner,
195
202
  NavigationMenuTrigger,
196
203
  navigationMenuTriggerStyle,
@@ -13,6 +13,7 @@ import * as React from "react";
13
13
  import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
14
14
 
15
15
  import { cn } from "../../lib/utils";
16
+ import { ThemeWrapper } from "./theme-provider";
16
17
 
17
18
  function Popover(props: React.ComponentProps<typeof PopoverPrimitive.Root>) {
18
19
  return <PopoverPrimitive.Root {...props} />;
@@ -32,15 +33,15 @@ const PopoverTrigger = React.forwardRef<
32
33
  });
33
34
  PopoverTrigger.displayName = "PopoverTrigger";
34
35
 
35
- const PopoverPortal = PopoverPrimitive.Portal;
36
-
37
36
  const PopoverContent = React.forwardRef<
38
37
  HTMLDivElement,
39
38
  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Popup> &
40
39
  Pick<
41
40
  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Positioner>,
42
41
  "align" | "alignOffset" | "side" | "sideOffset"
43
- >
42
+ > & {
43
+ container?: React.ComponentProps<typeof PopoverPrimitive.Portal>["container"];
44
+ }
44
45
  >(
45
46
  (
46
47
  {
@@ -49,30 +50,36 @@ const PopoverContent = React.forwardRef<
49
50
  alignOffset = 0,
50
51
  side = "bottom",
51
52
  sideOffset = 4,
53
+ container,
54
+ children,
52
55
  ...props
53
56
  },
54
57
  ref,
55
- ) => {
56
- return (
57
- <PopoverPrimitive.Positioner
58
- align={align}
59
- alignOffset={alignOffset}
60
- side={side}
61
- sideOffset={sideOffset}
62
- className="isolate z-50"
63
- >
64
- <PopoverPrimitive.Popup
65
- ref={ref}
66
- data-slot="popover-content"
67
- className={cn(
68
- "flex origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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",
69
- className,
70
- )}
71
- {...props}
72
- />
73
- </PopoverPrimitive.Positioner>
74
- );
75
- },
58
+ ) => (
59
+ <PopoverPrimitive.Portal container={container}>
60
+ <ThemeWrapper>
61
+ <PopoverPrimitive.Positioner
62
+ align={align}
63
+ alignOffset={alignOffset}
64
+ side={side}
65
+ sideOffset={sideOffset}
66
+ className="isolate z-50"
67
+ >
68
+ <PopoverPrimitive.Popup
69
+ ref={ref}
70
+ data-slot="popover-content"
71
+ className={cn(
72
+ "flex origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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",
73
+ className,
74
+ )}
75
+ {...props}
76
+ >
77
+ {children}
78
+ </PopoverPrimitive.Popup>
79
+ </PopoverPrimitive.Positioner>
80
+ </ThemeWrapper>
81
+ </PopoverPrimitive.Portal>
82
+ ),
76
83
  );
77
84
  PopoverContent.displayName = "PopoverContent";
78
85
 
@@ -126,7 +133,6 @@ export {
126
133
  PopoverContent,
127
134
  PopoverDescription,
128
135
  PopoverHeader,
129
- PopoverPortal,
130
136
  PopoverTitle,
131
137
  PopoverTrigger,
132
138
  };
@@ -14,6 +14,7 @@ import { type VariantProps, cva } from "class-variance-authority";
14
14
  import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
15
15
 
16
16
  import { cn } from "../../lib/utils";
17
+ import { ThemeWrapper } from "./theme-provider";
17
18
 
18
19
  const Select = SelectPrimitive.Root;
19
20
 
@@ -43,7 +44,7 @@ const SelectValue = React.forwardRef<
43
44
  ));
44
45
  SelectValue.displayName = "SelectValue";
45
46
 
46
- const SelectPortal = SelectPrimitive.Portal;
47
+
47
48
 
48
49
  const selectTriggerVariants = cva(
49
50
  "inline-flex items-center justify-between rounded-lg border border-input bg-transparent text-foreground text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-3 aria-invalid:focus-visible:ring-destructive/50 data-placeholder:text-muted-foreground [&_[data-slot=select-value]]:line-clamp-1 [&_[data-slot=select-value]]:flex [&_[data-slot=select-value]]:items-center [&>svg]:pointer-events-none [&>svg]:shrink-0 [&>svg:not([class*='size-'])]:size-4 dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:focus-visible:ring-destructive/50",
@@ -85,7 +86,9 @@ const SelectContent = React.forwardRef<
85
86
  Pick<
86
87
  SelectPrimitive.Positioner.Props,
87
88
  "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger"
88
- >
89
+ > & {
90
+ container?: React.ComponentProps<typeof SelectPrimitive.Portal>["container"];
91
+ }
89
92
  >(
90
93
  (
91
94
  {
@@ -96,36 +99,41 @@ const SelectContent = React.forwardRef<
96
99
  align = "center",
97
100
  alignOffset = 0,
98
101
  alignItemWithTrigger = false,
102
+ container,
99
103
  ...props
100
104
  },
101
105
  ref,
102
106
  ) => (
103
- <SelectPrimitive.Positioner
104
- side={side}
105
- sideOffset={sideOffset}
106
- align={align}
107
- alignOffset={alignOffset}
108
- alignItemWithTrigger={alignItemWithTrigger}
109
- className="isolate z-50"
110
- >
111
- <SelectPrimitive.Popup
112
- ref={ref}
113
- data-slot="select-content"
114
- data-align-trigger={alignItemWithTrigger}
115
- className={cn(
116
- "relative isolate z-50 max-h-(--available-height) w-[calc(var(--anchor-width)+8px)] overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 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",
117
- alignItemWithTrigger
118
- ? "origin-(--transform-origin) data-[align-trigger=true]:animate-none"
119
- : "",
120
- className,
121
- )}
122
- {...props}
123
- >
124
- <SelectScrollUpButton />
125
- <SelectPrimitive.List>{children}</SelectPrimitive.List>
126
- <SelectScrollDownButton />
127
- </SelectPrimitive.Popup>
128
- </SelectPrimitive.Positioner>
107
+ <SelectPrimitive.Portal container={container}>
108
+ <ThemeWrapper>
109
+ <SelectPrimitive.Positioner
110
+ side={side}
111
+ sideOffset={sideOffset}
112
+ align={align}
113
+ alignOffset={alignOffset}
114
+ alignItemWithTrigger={alignItemWithTrigger}
115
+ className="isolate z-50"
116
+ >
117
+ <SelectPrimitive.Popup
118
+ ref={ref}
119
+ data-slot="select-content"
120
+ data-align-trigger={alignItemWithTrigger}
121
+ className={cn(
122
+ "relative isolate z-50 max-h-(--available-height) w-[calc(var(--anchor-width)+8px)] overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 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",
123
+ alignItemWithTrigger
124
+ ? "origin-(--transform-origin) data-[align-trigger=true]:animate-none"
125
+ : "",
126
+ className,
127
+ )}
128
+ {...props}
129
+ >
130
+ <SelectScrollUpButton />
131
+ <SelectPrimitive.List>{children}</SelectPrimitive.List>
132
+ <SelectScrollDownButton />
133
+ </SelectPrimitive.Popup>
134
+ </SelectPrimitive.Positioner>
135
+ </ThemeWrapper>
136
+ </SelectPrimitive.Portal>
129
137
  ),
130
138
  );
131
139
  SelectContent.displayName = "SelectContent";
@@ -225,7 +233,6 @@ export {
225
233
  SelectGroup,
226
234
  SelectItem,
227
235
  SelectLabel,
228
- SelectPortal,
229
236
  SelectScrollDownButton,
230
237
  SelectScrollUpButton,
231
238
  SelectSeparator,
@@ -14,6 +14,7 @@ import { XIcon } from "lucide-react";
14
14
 
15
15
  import { Button } from "../../components/micro/button";
16
16
  import { cn } from "../../lib/utils";
17
+ import { ThemeWrapper } from "./theme-provider";
17
18
 
18
19
  function Sheet({ ...props }: SheetPrimitive.Root.Props) {
19
20
  return <SheetPrimitive.Root data-slot="sheet" {...props} />;
@@ -27,7 +28,7 @@ function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
27
28
  return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
28
29
  }
29
30
 
30
- const SheetPortal = SheetPrimitive.Portal;
31
+
31
32
 
32
33
  function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
33
34
  return (
@@ -47,41 +48,46 @@ function SheetContent({
47
48
  children,
48
49
  side = "right",
49
50
  showCloseButton = true,
51
+ container,
50
52
  ...props
51
53
  }: SheetPrimitive.Popup.Props & {
52
54
  side?: "top" | "right" | "bottom" | "left";
53
55
  showCloseButton?: boolean;
56
+ container?: React.ComponentProps<typeof SheetPrimitive.Portal>["container"];
54
57
  }) {
55
58
  return (
56
- <>
57
- <SheetOverlay />
58
- <SheetPrimitive.Popup
59
- data-slot="sheet-content"
60
- data-side={side}
61
- className={cn(
62
- "fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm motion-reduce:transition-none",
63
- className,
64
- )}
65
- {...props}
66
- >
67
- {children}
68
- {showCloseButton && (
69
- <SheetPrimitive.Close
70
- data-slot="sheet-close"
71
- render={
72
- <Button
73
- variant="ghost"
74
- className="absolute top-4 right-4"
75
- size="sm"
76
- />
77
- }
78
- >
79
- <XIcon aria-hidden="true" />
80
- <span className="sr-only">Close</span>
81
- </SheetPrimitive.Close>
82
- )}
83
- </SheetPrimitive.Popup>
84
- </>
59
+ <SheetPrimitive.Portal container={container}>
60
+ <ThemeWrapper>
61
+ <SheetOverlay />
62
+ <SheetPrimitive.Popup
63
+ data-slot="sheet-content"
64
+ data-side={side}
65
+ className={cn(
66
+ "fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm motion-reduce:transition-none",
67
+ className,
68
+ )}
69
+ {...props}
70
+ >
71
+ {children}
72
+ {showCloseButton && (
73
+ <SheetPrimitive.Close
74
+ data-slot="sheet-close"
75
+ render={
76
+ <Button
77
+ variant="ghost"
78
+ className="absolute top-4 right-4"
79
+ size="sm"
80
+ iconOnly
81
+ />
82
+ }
83
+ >
84
+ <XIcon aria-hidden="true" />
85
+ <span className="sr-only">Close</span>
86
+ </SheetPrimitive.Close>
87
+ )}
88
+ </SheetPrimitive.Popup>
89
+ </ThemeWrapper>
90
+ </SheetPrimitive.Portal>
85
91
  );
86
92
  }
87
93
 
@@ -139,7 +145,6 @@ export {
139
145
  SheetFooter,
140
146
  SheetHeader,
141
147
  SheetOverlay,
142
- SheetPortal,
143
148
  SheetTitle,
144
149
  SheetTrigger,
145
150
  };
@@ -12,6 +12,7 @@ import * as React from "react";
12
12
  import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
13
13
 
14
14
  import { cn } from "../../lib/utils";
15
+ import { ThemeWrapper } from "./theme-provider";
15
16
 
16
17
  /**
17
18
  * @description A popup that displays information related to an element.
@@ -55,15 +56,15 @@ const TooltipTrigger = React.forwardRef<
55
56
  });
56
57
  TooltipTrigger.displayName = "TooltipTrigger";
57
58
 
58
- const TooltipPortal = TooltipPrimitive.Portal;
59
-
60
59
  const TooltipContent = React.forwardRef<
61
60
  HTMLDivElement,
62
61
  React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Popup> &
63
62
  Pick<
64
63
  React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Positioner>,
65
64
  "align" | "alignOffset" | "side" | "sideOffset"
66
- >
65
+ > & {
66
+ container?: React.ComponentProps<typeof TooltipPrimitive.Portal>["container"];
67
+ }
67
68
  >(
68
69
  (
69
70
  {
@@ -72,31 +73,36 @@ const TooltipContent = React.forwardRef<
72
73
  sideOffset = 4,
73
74
  align = "center",
74
75
  alignOffset = 0,
76
+ container,
75
77
  children,
76
78
  ...props
77
79
  },
78
80
  ref,
79
81
  ) => {
80
82
  return (
81
- <TooltipPrimitive.Positioner
82
- align={align}
83
- alignOffset={alignOffset}
84
- side={side}
85
- sideOffset={sideOffset}
86
- className="isolate z-50"
87
- >
88
- <TooltipPrimitive.Popup
89
- ref={ref}
90
- data-slot="tooltip-content"
91
- className={cn(
92
- "z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background 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",
93
- className,
94
- )}
95
- {...props}
96
- >
97
- {children}
98
- </TooltipPrimitive.Popup>
99
- </TooltipPrimitive.Positioner>
83
+ <TooltipPrimitive.Portal container={container}>
84
+ <ThemeWrapper>
85
+ <TooltipPrimitive.Positioner
86
+ align={align}
87
+ alignOffset={alignOffset}
88
+ side={side}
89
+ sideOffset={sideOffset}
90
+ className="isolate z-50"
91
+ >
92
+ <TooltipPrimitive.Popup
93
+ ref={ref}
94
+ data-slot="tooltip-content"
95
+ className={cn(
96
+ "z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background 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",
97
+ className,
98
+ )}
99
+ {...props}
100
+ >
101
+ {children}
102
+ </TooltipPrimitive.Popup>
103
+ </TooltipPrimitive.Positioner>
104
+ </ThemeWrapper>
105
+ </TooltipPrimitive.Portal>
100
106
  );
101
107
  },
102
108
  );
@@ -105,7 +111,6 @@ TooltipContent.displayName = "TooltipContent";
105
111
  export {
106
112
  Tooltip,
107
113
  TooltipContent,
108
- TooltipPortal,
109
114
  TooltipProvider,
110
115
  TooltipTrigger,
111
116
  };
package/src/dev/App.tsx CHANGED
@@ -78,7 +78,14 @@ export default function App() {
78
78
  const [active, setActiveState] = useState(() => {
79
79
  if (typeof window !== "undefined") {
80
80
  const params = new URLSearchParams(window.location.search);
81
- return params.get("component") || "overview";
81
+ const queryComp = params.get("component");
82
+ if (queryComp) {
83
+ // Redirect legacy search params to new path structure automatically
84
+ window.history.replaceState({}, "", `/${queryComp}`);
85
+ return queryComp;
86
+ }
87
+ const pathComp = window.location.pathname.replace(/^\/+/, "");
88
+ return pathComp || "overview";
82
89
  }
83
90
  return "overview";
84
91
  });
@@ -89,7 +96,8 @@ export default function App() {
89
96
  setCmdOpen(false);
90
97
  if (typeof window !== "undefined") {
91
98
  const url = new URL(window.location.href);
92
- url.searchParams.set("component", id);
99
+ url.searchParams.delete("component");
100
+ url.pathname = id === "overview" ? "/" : `/${id}`;
93
101
  window.history.pushState({}, "", url);
94
102
 
95
103
  setTimeout(() => {
@@ -102,20 +110,25 @@ export default function App() {
102
110
  }, []);
103
111
 
104
112
  useEffect(() => {
105
- const params = new URLSearchParams(window.location.search);
106
- const comp = params.get("component");
107
- if (comp) {
108
- setTimeout(() => {
109
- const el = document.getElementById(comp);
110
- if (el) el.scrollIntoView({ behavior: "smooth" });
111
- }, 100);
113
+ if (typeof window !== "undefined") {
114
+ const params = new URLSearchParams(window.location.search);
115
+ const queryComp = params.get("component");
116
+ const comp = queryComp || window.location.pathname.replace(/^\/+/, "");
117
+
118
+ if (comp && comp !== "overview") {
119
+ setTimeout(() => {
120
+ const el = document.getElementById(comp);
121
+ if (el) el.scrollIntoView({ behavior: "smooth" });
122
+ }, 100);
123
+ }
112
124
  }
113
125
  }, []);
114
126
 
115
127
  useEffect(() => {
116
128
  const handlePopState = () => {
117
129
  const params = new URLSearchParams(window.location.search);
118
- const comp = params.get("component") || "overview";
130
+ const queryComp = params.get("component");
131
+ const comp = queryComp || window.location.pathname.replace(/^\/+/, "") || "overview";
119
132
  setActiveState(comp);
120
133
  const el = document.getElementById(comp);
121
134
  if (el) el.scrollIntoView({ behavior: "smooth" });
@@ -148,6 +161,19 @@ export default function App() {
148
161
  return () => document.removeEventListener("keydown", down);
149
162
  }, []);
150
163
 
164
+ useEffect(() => {
165
+ if (typeof window !== "undefined") {
166
+ if (active === "overview") {
167
+ document.title = "gladvn — Tailwind CSS React Components";
168
+ } else {
169
+ const compDef = COMPONENTS.find((c) => c.id === active);
170
+ if (compDef) {
171
+ document.title = `${compDef.label} — gladvn Components`;
172
+ }
173
+ }
174
+ }
175
+ }, [active]);
176
+
151
177
  return (
152
178
  <div className="min-h-screen bg-background text-foreground">
153
179
  {/* Top nav */}
package/src/dev/data.ts CHANGED
@@ -475,14 +475,6 @@ export const COMPONENTS = [
475
475
  status: "stable",
476
476
  hasSize: true,
477
477
  },
478
- {
479
- id: "theme-provider",
480
- category: "Data Display",
481
- label: "Theme Provider",
482
- hasMicro: true,
483
- hasMacro: false,
484
- status: "stable",
485
- },
486
478
  {
487
479
  id: "tooltip",
488
480
  category: "Feedback & Overlays",