@agent-native/toolkit 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +12 -3
  2. package/agent-native.eject.json +71 -0
  3. package/dist/chat-history/ChatHistoryRail.d.ts +33 -0
  4. package/dist/chat-history/ChatHistoryRail.d.ts.map +1 -0
  5. package/dist/chat-history/ChatHistoryRail.js +35 -0
  6. package/dist/chat-history/ChatHistoryRail.js.map +1 -0
  7. package/dist/chat-history/ChatHistoryRail.spec.d.ts +2 -0
  8. package/dist/chat-history/ChatHistoryRail.spec.d.ts.map +1 -0
  9. package/dist/chat-history/ChatHistoryRail.spec.js +157 -0
  10. package/dist/chat-history/ChatHistoryRail.spec.js.map +1 -0
  11. package/dist/chat-history/index.d.ts +2 -0
  12. package/dist/chat-history/index.d.ts.map +1 -1
  13. package/dist/chat-history/index.js +2 -0
  14. package/dist/chat-history/index.js.map +1 -1
  15. package/dist/chat-history/useChatHistoryRailController.d.ts +26 -0
  16. package/dist/chat-history/useChatHistoryRailController.d.ts.map +1 -0
  17. package/dist/chat-history/useChatHistoryRailController.js +36 -0
  18. package/dist/chat-history/useChatHistoryRailController.js.map +1 -0
  19. package/dist/chat-history/useChatHistoryRailController.spec.d.ts +2 -0
  20. package/dist/chat-history/useChatHistoryRailController.spec.d.ts.map +1 -0
  21. package/dist/chat-history/useChatHistoryRailController.spec.js +101 -0
  22. package/dist/chat-history/useChatHistoryRailController.spec.js.map +1 -0
  23. package/dist/chat-history.css +61 -0
  24. package/dist/composer/ComposerPlusMenu.js +1 -1
  25. package/dist/composer/ComposerPlusMenu.js.map +1 -1
  26. package/dist/composer/PromptComposer.d.ts.map +1 -1
  27. package/dist/composer/PromptComposer.js +22 -4
  28. package/dist/composer/PromptComposer.js.map +1 -1
  29. package/dist/composer/RealtimeVoiceMode.d.ts +5 -1
  30. package/dist/composer/RealtimeVoiceMode.d.ts.map +1 -1
  31. package/dist/composer/RealtimeVoiceMode.js +27 -8
  32. package/dist/composer/RealtimeVoiceMode.js.map +1 -1
  33. package/dist/composer/RealtimeVoiceMode.spec.js +51 -11
  34. package/dist/composer/RealtimeVoiceMode.spec.js.map +1 -1
  35. package/dist/composer/VoiceButton.d.ts +2 -0
  36. package/dist/composer/VoiceButton.d.ts.map +1 -1
  37. package/dist/composer/VoiceButton.js +33 -1
  38. package/dist/composer/VoiceButton.js.map +1 -1
  39. package/dist/composer/VoiceButton.spec.js +9 -1
  40. package/dist/composer/VoiceButton.spec.js.map +1 -1
  41. package/dist/composer/realtime-voice-audio-level.d.ts.map +1 -1
  42. package/dist/composer/realtime-voice-audio-level.js +2 -1
  43. package/dist/composer/realtime-voice-audio-level.js.map +1 -1
  44. package/dist/composer/realtime-voice-audio-level.spec.js +7 -0
  45. package/dist/composer/realtime-voice-audio-level.spec.js.map +1 -1
  46. package/dist/composer/useRealtimeVoiceMode.d.ts +7 -0
  47. package/dist/composer/useRealtimeVoiceMode.d.ts.map +1 -1
  48. package/dist/composer/useRealtimeVoiceMode.js +95 -23
  49. package/dist/composer/useRealtimeVoiceMode.js.map +1 -1
  50. package/dist/composer/useRealtimeVoiceMode.spec.js +58 -9
  51. package/dist/composer/useRealtimeVoiceMode.spec.js.map +1 -1
  52. package/dist/conformance/__fixtures__/css-in-js-adapter.d.ts +7 -0
  53. package/dist/conformance/__fixtures__/css-in-js-adapter.d.ts.map +1 -0
  54. package/dist/conformance/__fixtures__/css-in-js-adapter.js +84 -0
  55. package/dist/conformance/__fixtures__/css-in-js-adapter.js.map +1 -0
  56. package/dist/conformance/conformance.spec.d.ts +2 -0
  57. package/dist/conformance/conformance.spec.d.ts.map +1 -0
  58. package/dist/conformance/conformance.spec.js +58 -0
  59. package/dist/conformance/conformance.spec.js.map +1 -0
  60. package/dist/conformance/index.d.ts +4 -0
  61. package/dist/conformance/index.d.ts.map +1 -0
  62. package/dist/conformance/index.js +4 -0
  63. package/dist/conformance/index.js.map +1 -0
  64. package/dist/conformance/runner.d.ts +12 -0
  65. package/dist/conformance/runner.d.ts.map +1 -0
  66. package/dist/conformance/runner.js +441 -0
  67. package/dist/conformance/runner.js.map +1 -0
  68. package/dist/conformance/types.d.ts +26 -0
  69. package/dist/conformance/types.d.ts.map +1 -0
  70. package/dist/conformance/types.js +13 -0
  71. package/dist/conformance/types.js.map +1 -0
  72. package/dist/conformance/version.d.ts +6 -0
  73. package/dist/conformance/version.d.ts.map +1 -0
  74. package/dist/conformance/version.js +14 -0
  75. package/dist/conformance/version.js.map +1 -0
  76. package/dist/design-system/components.d.ts +64 -0
  77. package/dist/design-system/components.d.ts.map +1 -0
  78. package/dist/design-system/components.js +50 -0
  79. package/dist/design-system/components.js.map +1 -0
  80. package/dist/design-system/context.d.ts +11 -0
  81. package/dist/design-system/context.d.ts.map +1 -0
  82. package/dist/design-system/context.js +17 -0
  83. package/dist/design-system/context.js.map +1 -0
  84. package/dist/design-system/default-adapter.d.ts +3 -0
  85. package/dist/design-system/default-adapter.d.ts.map +1 -0
  86. package/dist/design-system/default-adapter.js +166 -0
  87. package/dist/design-system/default-adapter.js.map +1 -0
  88. package/dist/design-system/default-adapter.spec.d.ts +2 -0
  89. package/dist/design-system/default-adapter.spec.d.ts.map +1 -0
  90. package/dist/design-system/default-adapter.spec.js +96 -0
  91. package/dist/design-system/default-adapter.spec.js.map +1 -0
  92. package/dist/design-system/definition.d.ts +9 -0
  93. package/dist/design-system/definition.d.ts.map +1 -0
  94. package/dist/design-system/definition.js +4 -0
  95. package/dist/design-system/definition.js.map +1 -0
  96. package/dist/design-system/design-system.spec.d.ts +2 -0
  97. package/dist/design-system/design-system.spec.d.ts.map +1 -0
  98. package/dist/design-system/design-system.spec.js +121 -0
  99. package/dist/design-system/design-system.spec.js.map +1 -0
  100. package/dist/design-system/error-boundary.d.ts +18 -0
  101. package/dist/design-system/error-boundary.d.ts.map +1 -0
  102. package/dist/design-system/error-boundary.js +16 -0
  103. package/dist/design-system/error-boundary.js.map +1 -0
  104. package/dist/design-system/index.d.ts +8 -0
  105. package/dist/design-system/index.d.ts.map +1 -0
  106. package/dist/design-system/index.js +8 -0
  107. package/dist/design-system/index.js.map +1 -0
  108. package/dist/design-system/theme.d.ts +30 -0
  109. package/dist/design-system/theme.d.ts.map +1 -0
  110. package/dist/design-system/theme.js +95 -0
  111. package/dist/design-system/theme.js.map +1 -0
  112. package/dist/design-system/theme.spec.d.ts +2 -0
  113. package/dist/design-system/theme.spec.d.ts.map +1 -0
  114. package/dist/design-system/theme.spec.js +43 -0
  115. package/dist/design-system/theme.spec.js.map +1 -0
  116. package/dist/design-system/types.d.ts +288 -0
  117. package/dist/design-system/types.d.ts.map +1 -0
  118. package/dist/design-system/types.js +2 -0
  119. package/dist/design-system/types.js.map +1 -0
  120. package/dist/provider.d.ts +4 -3
  121. package/dist/provider.d.ts.map +1 -1
  122. package/dist/provider.js +46 -4
  123. package/dist/provider.js.map +1 -1
  124. package/dist/styles.css +35 -0
  125. package/dist/ui/button.d.ts +5 -0
  126. package/dist/ui/button.d.ts.map +1 -1
  127. package/dist/ui/button.js +25 -4
  128. package/dist/ui/button.js.map +1 -1
  129. package/dist/ui/dialog.d.ts +4 -0
  130. package/dist/ui/dialog.d.ts.map +1 -1
  131. package/dist/ui/dialog.js +2 -2
  132. package/dist/ui/dialog.js.map +1 -1
  133. package/dist/ui/popover.d.ts +1 -0
  134. package/dist/ui/popover.d.ts.map +1 -1
  135. package/dist/ui/popover.js +2 -2
  136. package/dist/ui/popover.js.map +1 -1
  137. package/dist/ui/select.d.ts +3 -1
  138. package/dist/ui/select.d.ts.map +1 -1
  139. package/dist/ui/select.js +1 -1
  140. package/dist/ui/select.js.map +1 -1
  141. package/dist/ui/sidebar.d.ts +6 -2
  142. package/dist/ui/sidebar.d.ts.map +1 -1
  143. package/dist/ui/sidebar.js +12 -15
  144. package/dist/ui/sidebar.js.map +1 -1
  145. package/dist/ui/tooltip.d.ts +3 -1
  146. package/dist/ui/tooltip.d.ts.map +1 -1
  147. package/dist/ui/tooltip.js +2 -2
  148. package/dist/ui/tooltip.js.map +1 -1
  149. package/package.json +31 -1
  150. package/src/chat-history/ChatHistoryRail.spec.tsx +312 -0
  151. package/src/chat-history/ChatHistoryRail.tsx +150 -0
  152. package/src/chat-history/index.ts +14 -0
  153. package/src/chat-history/useChatHistoryRailController.spec.tsx +131 -0
  154. package/src/chat-history/useChatHistoryRailController.ts +76 -0
  155. package/src/chat-history.css +61 -0
  156. package/src/composer/ComposerPlusMenu.tsx +11 -8
  157. package/src/composer/PromptComposer.tsx +27 -6
  158. package/src/composer/RealtimeVoiceMode.spec.tsx +116 -11
  159. package/src/composer/RealtimeVoiceMode.tsx +106 -36
  160. package/src/composer/VoiceButton.spec.ts +17 -1
  161. package/src/composer/VoiceButton.tsx +49 -0
  162. package/src/composer/realtime-voice-audio-level.spec.ts +15 -0
  163. package/src/composer/realtime-voice-audio-level.ts +2 -1
  164. package/src/composer/useRealtimeVoiceMode.spec.ts +82 -8
  165. package/src/composer/useRealtimeVoiceMode.tsx +112 -25
  166. package/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  167. package/src/conformance/conformance.spec.tsx +83 -0
  168. package/src/conformance/index.ts +3 -0
  169. package/src/conformance/runner.tsx +710 -0
  170. package/src/conformance/types.ts +45 -0
  171. package/src/conformance/version.ts +22 -0
  172. package/src/design-system/components.tsx +146 -0
  173. package/src/design-system/context.tsx +31 -0
  174. package/src/design-system/default-adapter.spec.tsx +143 -0
  175. package/src/design-system/default-adapter.tsx +915 -0
  176. package/src/design-system/definition.ts +14 -0
  177. package/src/design-system/design-system.spec.tsx +183 -0
  178. package/src/design-system/error-boundary.tsx +37 -0
  179. package/src/design-system/index.ts +7 -0
  180. package/src/design-system/theme.spec.ts +61 -0
  181. package/src/design-system/theme.ts +145 -0
  182. package/src/design-system/types.ts +363 -0
  183. package/src/provider.tsx +98 -5
  184. package/src/styles.css +35 -0
  185. package/src/ui/button.tsx +95 -6
  186. package/src/ui/dialog.tsx +48 -23
  187. package/src/ui/popover.tsx +16 -2
  188. package/src/ui/select.tsx +7 -3
  189. package/src/ui/sidebar.tsx +47 -48
  190. package/src/ui/tooltip.tsx +7 -3
package/src/ui/dialog.tsx CHANGED
@@ -47,34 +47,59 @@ interface DialogContentProps extends React.ComponentPropsWithoutRef<
47
47
  hideClose?: boolean;
48
48
  // High-frequency keyboard surfaces can opt out without changing ordinary dialogs.
49
49
  motion?: DialogMotion;
50
+ container?: React.ComponentPropsWithoutRef<
51
+ typeof DialogPrimitive.Portal
52
+ >["container"];
53
+ closeLabel?: string;
54
+ overlayClassName?: string;
55
+ overlayStyle?: React.CSSProperties;
50
56
  }
51
57
 
52
58
  const DialogContent = React.forwardRef<
53
59
  React.ElementRef<typeof DialogPrimitive.Content>,
54
60
  DialogContentProps
55
- >(({ className, children, hideClose, motion = "default", ...props }, ref) => (
56
- <DialogPortal>
57
- <DialogOverlay motion={motion} />
58
- <DialogPrimitive.Content
59
- ref={ref}
60
- className={cn(
61
- "fixed left-1/2 top-1/2 z-[280] grid max-h-[min(760px,calc(100vh-32px))] w-[calc(100vw-24px)] max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 overflow-hidden rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none",
62
- motion === "default" &&
63
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-150 data-[state=open]:duration-200 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
64
- className,
65
- )}
66
- {...props}
67
- >
68
- {children}
69
- {!hideClose && (
70
- <DialogPrimitive.Close className="absolute end-3 top-3 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring">
71
- <IconX className="h-4 w-4" />
72
- <span className="sr-only">Close</span>
73
- </DialogPrimitive.Close>
74
- )}
75
- </DialogPrimitive.Content>
76
- </DialogPortal>
77
- ));
61
+ >(
62
+ (
63
+ {
64
+ className,
65
+ children,
66
+ hideClose,
67
+ motion = "default",
68
+ container,
69
+ closeLabel = "Close",
70
+ overlayClassName,
71
+ overlayStyle,
72
+ ...props
73
+ },
74
+ ref,
75
+ ) => (
76
+ <DialogPortal container={container}>
77
+ <DialogOverlay
78
+ motion={motion}
79
+ className={overlayClassName}
80
+ style={overlayStyle}
81
+ />
82
+ <DialogPrimitive.Content
83
+ ref={ref}
84
+ className={cn(
85
+ "fixed left-1/2 top-1/2 z-[280] grid max-h-[min(760px,calc(100vh-32px))] w-[calc(100vw-24px)] max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 overflow-hidden rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none",
86
+ motion === "default" &&
87
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-150 data-[state=open]:duration-200 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
88
+ className,
89
+ )}
90
+ {...props}
91
+ >
92
+ {children}
93
+ {!hideClose && (
94
+ <DialogPrimitive.Close className="absolute end-3 top-3 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring">
95
+ <IconX className="h-4 w-4" />
96
+ <span className="sr-only">{closeLabel}</span>
97
+ </DialogPrimitive.Close>
98
+ )}
99
+ </DialogPrimitive.Content>
100
+ </DialogPortal>
101
+ ),
102
+ );
78
103
  DialogContent.displayName = DialogPrimitive.Content.displayName;
79
104
 
80
105
  const DialogHeader = ({
@@ -15,10 +15,20 @@ const PopoverContent = React.forwardRef<
15
15
  // When false, renders inline without a portal — useful inside overflow-hidden
16
16
  // containers where a portalled overlay would escape the clip boundary.
17
17
  portalled?: boolean;
18
+ container?: React.ComponentPropsWithoutRef<
19
+ typeof PopoverPrimitive.Portal
20
+ >["container"];
18
21
  }
19
22
  >(
20
23
  (
21
- { className, align = "center", sideOffset = 4, portalled = true, ...props },
24
+ {
25
+ className,
26
+ align = "center",
27
+ sideOffset = 4,
28
+ portalled = true,
29
+ container,
30
+ ...props
31
+ },
22
32
  ref,
23
33
  ) => {
24
34
  const content = (
@@ -36,7 +46,11 @@ const PopoverContent = React.forwardRef<
36
46
 
37
47
  if (!portalled) return content;
38
48
 
39
- return <PopoverPrimitive.Portal>{content}</PopoverPrimitive.Portal>;
49
+ return (
50
+ <PopoverPrimitive.Portal container={container}>
51
+ {content}
52
+ </PopoverPrimitive.Portal>
53
+ );
40
54
  },
41
55
  );
42
56
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
package/src/ui/select.tsx CHANGED
@@ -67,9 +67,13 @@ SelectScrollDownButton.displayName =
67
67
 
68
68
  const SelectContent = React.forwardRef<
69
69
  React.ElementRef<typeof SelectPrimitive.Content>,
70
- React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
71
- >(({ className, children, position = "popper", ...props }, ref) => (
72
- <SelectPrimitive.Portal>
70
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & {
71
+ container?: React.ComponentPropsWithoutRef<
72
+ typeof SelectPrimitive.Portal
73
+ >["container"];
74
+ }
75
+ >(({ className, children, position = "popper", container, ...props }, ref) => (
76
+ <SelectPrimitive.Portal container={container}>
73
77
  <SelectPrimitive.Content
74
78
  ref={ref}
75
79
  className={cn(
@@ -3,19 +3,22 @@ import { IconLayoutSidebar } from "@tabler/icons-react";
3
3
  import { VariantProps, cva } from "class-variance-authority";
4
4
  import * as React from "react";
5
5
 
6
+ import {
7
+ Skeleton as DesignSystemSkeleton,
8
+ Tooltip as DesignSystemTooltip,
9
+ } from "../design-system/components.js";
6
10
  import { useIsMobile } from "../hooks/use-mobile.js";
7
11
  import { cn } from "../utils.js";
8
12
  import { Button } from "./button.js";
9
13
  import { Input } from "./input.js";
10
14
  import { Separator } from "./separator.js";
11
15
  import { Sheet, SheetContent, SheetDescription, SheetTitle } from "./sheet.js";
12
- import { Skeleton } from "./skeleton.js";
13
- import {
14
- Tooltip,
15
- TooltipContent,
16
- TooltipProvider,
17
- TooltipTrigger,
18
- } from "./tooltip.js";
16
+
17
+ type SidebarTooltip = {
18
+ children?: React.ReactNode;
19
+ hidden?: boolean;
20
+ [key: string]: unknown;
21
+ };
19
22
 
20
23
  const SIDEBAR_COOKIE_NAME = "sidebar:state";
21
24
  const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
@@ -137,25 +140,23 @@ const SidebarProvider = React.forwardRef<
137
140
 
138
141
  return (
139
142
  <SidebarContext.Provider value={contextValue}>
140
- <TooltipProvider delayDuration={0}>
141
- <div
142
- style={
143
- {
144
- "--sidebar-width": SIDEBAR_WIDTH,
145
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
146
- ...style,
147
- } as React.CSSProperties
148
- }
149
- className={cn(
150
- "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
151
- className,
152
- )}
153
- ref={ref}
154
- {...props}
155
- >
156
- {children}
157
- </div>
158
- </TooltipProvider>
143
+ <div
144
+ style={
145
+ {
146
+ "--sidebar-width": SIDEBAR_WIDTH,
147
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
148
+ ...style,
149
+ } as React.CSSProperties
150
+ }
151
+ className={cn(
152
+ "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
153
+ className,
154
+ )}
155
+ ref={ref}
156
+ {...props}
157
+ >
158
+ {children}
159
+ </div>
159
160
  </SidebarContext.Provider>
160
161
  );
161
162
  },
@@ -302,8 +303,8 @@ const SidebarRail = React.forwardRef<
302
303
  const { toggleSidebar } = useSidebar();
303
304
 
304
305
  return (
305
- <Tooltip>
306
- <TooltipTrigger asChild>
306
+ <DesignSystemTooltip
307
+ trigger={
307
308
  <button
308
309
  ref={ref}
309
310
  data-sidebar="rail"
@@ -321,9 +322,10 @@ const SidebarRail = React.forwardRef<
321
322
  )}
322
323
  {...props}
323
324
  />
324
- </TooltipTrigger>
325
- <TooltipContent>Toggle Sidebar</TooltipContent>
326
- </Tooltip>
325
+ }
326
+ content="Toggle Sidebar"
327
+ placement="top"
328
+ />
327
329
  );
328
330
  });
329
331
  SidebarRail.displayName = "SidebarRail";
@@ -552,7 +554,7 @@ const SidebarMenuButton = React.forwardRef<
552
554
  React.ComponentProps<"button"> & {
553
555
  asChild?: boolean;
554
556
  isActive?: boolean;
555
- tooltip?: string | React.ComponentProps<typeof TooltipContent>;
557
+ tooltip?: string | SidebarTooltip;
556
558
  } & VariantProps<typeof sidebarMenuButtonVariants>
557
559
  >(
558
560
  (
@@ -585,22 +587,17 @@ const SidebarMenuButton = React.forwardRef<
585
587
  return button;
586
588
  }
587
589
 
588
- if (typeof tooltip === "string") {
589
- tooltip = {
590
- children: tooltip,
591
- };
592
- }
590
+ const tooltipText =
591
+ typeof tooltip === "string" ? tooltip : tooltip.children;
592
+ if (!tooltipText || state !== "collapsed" || isMobile) return button;
593
593
 
594
594
  return (
595
- <Tooltip>
596
- <TooltipTrigger asChild>{button}</TooltipTrigger>
597
- <TooltipContent
598
- side="right"
599
- align="center"
600
- hidden={state !== "collapsed" || isMobile}
601
- {...tooltip}
602
- />
603
- </Tooltip>
595
+ <DesignSystemTooltip
596
+ trigger={button}
597
+ content={tooltipText}
598
+ placement="right"
599
+ align="center"
600
+ />
604
601
  );
605
602
  },
606
603
  );
@@ -677,13 +674,15 @@ const SidebarMenuSkeleton = React.forwardRef<
677
674
  {...props}
678
675
  >
679
676
  {showIcon && (
680
- <Skeleton
677
+ <DesignSystemSkeleton
681
678
  className="size-4 rounded-md"
679
+ shape="rectangle"
682
680
  data-sidebar="menu-skeleton-icon"
683
681
  />
684
682
  )}
685
- <Skeleton
683
+ <DesignSystemSkeleton
686
684
  className="h-4 flex-1 max-w-[--skeleton-width]"
685
+ shape="line"
687
686
  data-sidebar="menu-skeleton-text"
688
687
  style={
689
688
  {
@@ -21,12 +21,16 @@ function normalizeTooltipText(text: string): string {
21
21
 
22
22
  const TooltipContent = React.forwardRef<
23
23
  React.ElementRef<typeof TooltipPrimitive.Content>,
24
- React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
25
- >(({ className, sideOffset = 6, children, ...props }, ref) => {
24
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> & {
25
+ container?: React.ComponentPropsWithoutRef<
26
+ typeof TooltipPrimitive.Portal
27
+ >["container"];
28
+ }
29
+ >(({ className, sideOffset = 6, children, container, ...props }, ref) => {
26
30
  const normalizedChildren =
27
31
  typeof children === "string" ? normalizeTooltipText(children) : children;
28
32
  return (
29
- <TooltipPrimitive.Portal>
33
+ <TooltipPrimitive.Portal container={container}>
30
34
  <TooltipPrimitive.Content
31
35
  ref={ref}
32
36
  sideOffset={sideOffset}