@brijbyte/agentic-ui 0.0.1-beta → 0.0.2

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 (375) hide show
  1. package/README.md +808 -0
  2. package/dist/accordion/accordion.css +85 -0
  3. package/dist/accordion/accordion.d.ts +28 -0
  4. package/dist/accordion/accordion.d.ts.map +1 -0
  5. package/dist/accordion/accordion.js +51 -0
  6. package/dist/accordion/accordion.js.map +1 -0
  7. package/dist/accordion/accordion.module.css.d.ts +2 -0
  8. package/dist/accordion/accordion.module.js +14 -0
  9. package/dist/accordion/accordion.module.js.map +1 -0
  10. package/dist/accordion/index.d.ts +3 -0
  11. package/dist/accordion/index.js +4 -0
  12. package/dist/accordion/parts.d.ts +28 -0
  13. package/dist/accordion/parts.d.ts.map +1 -0
  14. package/dist/accordion/parts.js +55 -0
  15. package/dist/accordion/parts.js.map +1 -0
  16. package/dist/alert-dialog/alert-dialog.css +84 -0
  17. package/dist/alert-dialog/alert-dialog.d.ts +44 -0
  18. package/dist/alert-dialog/alert-dialog.d.ts.map +1 -0
  19. package/dist/alert-dialog/alert-dialog.js +46 -0
  20. package/dist/alert-dialog/alert-dialog.js.map +1 -0
  21. package/dist/alert-dialog/alert-dialog.module.css.d.ts +2 -0
  22. package/dist/alert-dialog/alert-dialog.module.js +14 -0
  23. package/dist/alert-dialog/alert-dialog.module.js.map +1 -0
  24. package/dist/alert-dialog/index.d.ts +3 -0
  25. package/dist/alert-dialog/index.js +4 -0
  26. package/dist/alert-dialog/parts.d.ts +28 -0
  27. package/dist/alert-dialog/parts.d.ts.map +1 -0
  28. package/dist/alert-dialog/parts.js +62 -0
  29. package/dist/alert-dialog/parts.js.map +1 -0
  30. package/dist/badge/badge.css +66 -0
  31. package/dist/badge/badge.d.ts +20 -0
  32. package/dist/badge/badge.d.ts.map +1 -0
  33. package/dist/badge/badge.js +21 -0
  34. package/dist/badge/badge.js.map +1 -0
  35. package/dist/badge/badge.module.css.d.ts +2 -0
  36. package/dist/badge/badge.module.js +16 -0
  37. package/dist/badge/badge.module.js.map +1 -0
  38. package/dist/badge/index.d.ts +2 -0
  39. package/dist/badge/index.js +3 -0
  40. package/dist/button/button.css +242 -0
  41. package/dist/button/button.d.ts +28 -0
  42. package/dist/button/button.d.ts.map +1 -0
  43. package/dist/button/button.js +34 -0
  44. package/dist/button/button.js.map +1 -0
  45. package/dist/button/button.module.css.d.ts +2 -0
  46. package/dist/button/button.module.js +27 -0
  47. package/dist/button/button.module.js.map +1 -0
  48. package/dist/button/index.d.ts +2 -0
  49. package/dist/button/index.js +3 -0
  50. package/dist/card/card.css +64 -0
  51. package/dist/card/card.d.ts +41 -0
  52. package/dist/card/card.d.ts.map +1 -0
  53. package/dist/card/card.js +50 -0
  54. package/dist/card/card.js.map +1 -0
  55. package/dist/card/card.module.css.d.ts +2 -0
  56. package/dist/card/card.module.js +15 -0
  57. package/dist/card/card.module.js.map +1 -0
  58. package/dist/card/index.d.ts +2 -0
  59. package/dist/card/index.js +3 -0
  60. package/dist/checkbox/checkbox.css +72 -0
  61. package/dist/checkbox/checkbox.d.ts +29 -0
  62. package/dist/checkbox/checkbox.d.ts.map +1 -0
  63. package/dist/checkbox/checkbox.js +40 -0
  64. package/dist/checkbox/checkbox.js.map +1 -0
  65. package/dist/checkbox/checkbox.module.css.d.ts +2 -0
  66. package/dist/checkbox/checkbox.module.js +11 -0
  67. package/dist/checkbox/checkbox.module.js.map +1 -0
  68. package/dist/checkbox/index.d.ts +3 -0
  69. package/dist/checkbox/index.js +4 -0
  70. package/dist/checkbox/parts.d.ts +20 -0
  71. package/dist/checkbox/parts.d.ts.map +1 -0
  72. package/dist/checkbox/parts.js +51 -0
  73. package/dist/checkbox/parts.js.map +1 -0
  74. package/dist/collapsible/collapsible.css +88 -0
  75. package/dist/collapsible/collapsible.d.ts +24 -0
  76. package/dist/collapsible/collapsible.d.ts.map +1 -0
  77. package/dist/collapsible/collapsible.js +44 -0
  78. package/dist/collapsible/collapsible.js.map +1 -0
  79. package/dist/collapsible/collapsible.module.css.d.ts +2 -0
  80. package/dist/collapsible/collapsible.module.js +12 -0
  81. package/dist/collapsible/collapsible.module.js.map +1 -0
  82. package/dist/collapsible/index.d.ts +3 -0
  83. package/dist/collapsible/index.js +4 -0
  84. package/dist/collapsible/parts.d.ts +23 -0
  85. package/dist/collapsible/parts.d.ts.map +1 -0
  86. package/dist/collapsible/parts.js +44 -0
  87. package/dist/collapsible/parts.js.map +1 -0
  88. package/dist/context-menu/context-menu.css +151 -0
  89. package/dist/context-menu/context-menu.d.ts +36 -0
  90. package/dist/context-menu/context-menu.d.ts.map +1 -0
  91. package/dist/context-menu/context-menu.js +54 -0
  92. package/dist/context-menu/context-menu.js.map +1 -0
  93. package/dist/context-menu/context-menu.module.css.d.ts +2 -0
  94. package/dist/context-menu/context-menu.module.js +18 -0
  95. package/dist/context-menu/context-menu.module.js.map +1 -0
  96. package/dist/context-menu/index.d.ts +3 -0
  97. package/dist/context-menu/index.js +4 -0
  98. package/dist/context-menu/parts.d.ts +38 -0
  99. package/dist/context-menu/parts.d.ts.map +1 -0
  100. package/dist/context-menu/parts.js +91 -0
  101. package/dist/context-menu/parts.js.map +1 -0
  102. package/dist/dialog/dialog.css +125 -0
  103. package/dist/dialog/dialog.d.ts +40 -0
  104. package/dist/dialog/dialog.d.ts.map +1 -0
  105. package/dist/dialog/dialog.js +57 -0
  106. package/dist/dialog/dialog.js.map +1 -0
  107. package/dist/dialog/dialog.module.css.d.ts +2 -0
  108. package/dist/dialog/dialog.module.js +17 -0
  109. package/dist/dialog/dialog.module.js.map +1 -0
  110. package/dist/dialog/index.d.ts +3 -0
  111. package/dist/dialog/index.js +4 -0
  112. package/dist/dialog/parts.d.ts +38 -0
  113. package/dist/dialog/parts.d.ts.map +1 -0
  114. package/dist/dialog/parts.js +75 -0
  115. package/dist/dialog/parts.js.map +1 -0
  116. package/dist/drawer/drawer.css +253 -0
  117. package/dist/drawer/drawer.d.ts +38 -0
  118. package/dist/drawer/drawer.d.ts.map +1 -0
  119. package/dist/drawer/drawer.js +87 -0
  120. package/dist/drawer/drawer.js.map +1 -0
  121. package/dist/drawer/drawer.module.css.d.ts +2 -0
  122. package/dist/drawer/drawer.module.js +20 -0
  123. package/dist/drawer/drawer.module.js.map +1 -0
  124. package/dist/drawer/index.d.ts +3 -0
  125. package/dist/drawer/index.js +4 -0
  126. package/dist/drawer/parts.d.ts +58 -0
  127. package/dist/drawer/parts.d.ts.map +1 -0
  128. package/dist/drawer/parts.js +107 -0
  129. package/dist/drawer/parts.js.map +1 -0
  130. package/dist/index.css +2701 -0
  131. package/dist/index.d.ts +39 -0
  132. package/dist/index.js +62 -0
  133. package/dist/input/index.d.ts +2 -0
  134. package/dist/input/index.js +3 -0
  135. package/dist/input/input.css +103 -0
  136. package/dist/input/input.d.ts +17 -0
  137. package/dist/input/input.d.ts.map +1 -0
  138. package/dist/input/input.js +37 -0
  139. package/dist/input/input.js.map +1 -0
  140. package/dist/input/input.module.css.d.ts +2 -0
  141. package/dist/input/input.module.js +18 -0
  142. package/dist/input/input.module.js.map +1 -0
  143. package/dist/layer-order.css +22 -0
  144. package/dist/menu/index.d.ts +4 -0
  145. package/dist/menu/index.js +5 -0
  146. package/dist/menu/menu.css +154 -0
  147. package/dist/menu/menu.d.ts +50 -0
  148. package/dist/menu/menu.d.ts.map +1 -0
  149. package/dist/menu/menu.js +69 -0
  150. package/dist/menu/menu.js.map +1 -0
  151. package/dist/menu/menu.module.css.d.ts +2 -0
  152. package/dist/menu/menu.module.js +19 -0
  153. package/dist/menu/menu.module.js.map +1 -0
  154. package/dist/menu/menuitemshortcut.d.ts +9 -0
  155. package/dist/menu/menuitemshortcut.d.ts.map +1 -0
  156. package/dist/menu/menuitemshortcut.js +15 -0
  157. package/dist/menu/menuitemshortcut.js.map +1 -0
  158. package/dist/menu/parts.d.ts +39 -0
  159. package/dist/menu/parts.d.ts.map +1 -0
  160. package/dist/menu/parts.js +76 -0
  161. package/dist/menu/parts.js.map +1 -0
  162. package/dist/number-field/index.d.ts +3 -0
  163. package/dist/number-field/index.js +4 -0
  164. package/dist/number-field/number-field.css +111 -0
  165. package/dist/number-field/number-field.d.ts +31 -0
  166. package/dist/number-field/number-field.d.ts.map +1 -0
  167. package/dist/number-field/number-field.js +78 -0
  168. package/dist/number-field/number-field.js.map +1 -0
  169. package/dist/number-field/number-field.module.css.d.ts +2 -0
  170. package/dist/number-field/number-field.module.js +16 -0
  171. package/dist/number-field/number-field.module.js.map +1 -0
  172. package/dist/number-field/parts.d.ts +38 -0
  173. package/dist/number-field/parts.d.ts.map +1 -0
  174. package/dist/number-field/parts.js +74 -0
  175. package/dist/number-field/parts.js.map +1 -0
  176. package/dist/progress/index.d.ts +3 -0
  177. package/dist/progress/index.js +4 -0
  178. package/dist/progress/parts.d.ts +20 -0
  179. package/dist/progress/parts.d.ts.map +1 -0
  180. package/dist/progress/parts.js +42 -0
  181. package/dist/progress/parts.js.map +1 -0
  182. package/dist/progress/progress.css +71 -0
  183. package/dist/progress/progress.d.ts +27 -0
  184. package/dist/progress/progress.d.ts.map +1 -0
  185. package/dist/progress/progress.js +27 -0
  186. package/dist/progress/progress.js.map +1 -0
  187. package/dist/progress/progress.module.css.d.ts +2 -0
  188. package/dist/progress/progress.module.js +19 -0
  189. package/dist/progress/progress.module.js.map +1 -0
  190. package/dist/reset.css +91 -0
  191. package/dist/select/index.d.ts +3 -0
  192. package/dist/select/index.js +4 -0
  193. package/dist/select/parts.d.ts +65 -0
  194. package/dist/select/parts.d.ts.map +1 -0
  195. package/dist/select/parts.js +134 -0
  196. package/dist/select/parts.js.map +1 -0
  197. package/dist/select/select.css +157 -0
  198. package/dist/select/select.d.ts +41 -0
  199. package/dist/select/select.d.ts.map +1 -0
  200. package/dist/select/select.js +89 -0
  201. package/dist/select/select.js.map +1 -0
  202. package/dist/select/select.module.css.d.ts +2 -0
  203. package/dist/select/select.module.js +17 -0
  204. package/dist/select/select.module.js.map +1 -0
  205. package/dist/separator/index.d.ts +2 -0
  206. package/dist/separator/index.js +3 -0
  207. package/dist/separator/separator.css +16 -0
  208. package/dist/separator/separator.d.ts +16 -0
  209. package/dist/separator/separator.d.ts.map +1 -0
  210. package/dist/separator/separator.js +17 -0
  211. package/dist/separator/separator.js.map +1 -0
  212. package/dist/separator/separator.module.css.d.ts +2 -0
  213. package/dist/separator/separator.module.js +6 -0
  214. package/dist/separator/separator.module.js.map +1 -0
  215. package/dist/slider/index.d.ts +3 -0
  216. package/dist/slider/index.js +4 -0
  217. package/dist/slider/parts.d.ts +38 -0
  218. package/dist/slider/parts.d.ts.map +1 -0
  219. package/dist/slider/parts.js +69 -0
  220. package/dist/slider/parts.js.map +1 -0
  221. package/dist/slider/slider.css +97 -0
  222. package/dist/slider/slider.d.ts +38 -0
  223. package/dist/slider/slider.d.ts.map +1 -0
  224. package/dist/slider/slider.js +41 -0
  225. package/dist/slider/slider.js.map +1 -0
  226. package/dist/slider/slider.module.css.d.ts +2 -0
  227. package/dist/slider/slider.module.js +15 -0
  228. package/dist/slider/slider.module.js.map +1 -0
  229. package/dist/styles/reset.css +69 -0
  230. package/dist/styles/tokens.css +276 -0
  231. package/dist/switch/index.d.ts +3 -0
  232. package/dist/switch/index.js +4 -0
  233. package/dist/switch/parts.d.ts +18 -0
  234. package/dist/switch/parts.d.ts.map +1 -0
  235. package/dist/switch/parts.js +39 -0
  236. package/dist/switch/parts.js.map +1 -0
  237. package/dist/switch/switch.css +64 -0
  238. package/dist/switch/switch.d.ts +28 -0
  239. package/dist/switch/switch.d.ts.map +1 -0
  240. package/dist/switch/switch.js +26 -0
  241. package/dist/switch/switch.js.map +1 -0
  242. package/dist/switch/switch.module.css.d.ts +2 -0
  243. package/dist/switch/switch.module.js +11 -0
  244. package/dist/switch/switch.module.js.map +1 -0
  245. package/dist/tabs/index.d.ts +3 -0
  246. package/dist/tabs/index.js +4 -0
  247. package/dist/tabs/parts.d.ts +23 -0
  248. package/dist/tabs/parts.d.ts.map +1 -0
  249. package/dist/tabs/parts.js +48 -0
  250. package/dist/tabs/parts.js.map +1 -0
  251. package/dist/tabs/tabs.css +86 -0
  252. package/dist/tabs/tabs.d.ts +28 -0
  253. package/dist/tabs/tabs.d.ts.map +1 -0
  254. package/dist/tabs/tabs.js +30 -0
  255. package/dist/tabs/tabs.js.map +1 -0
  256. package/dist/tabs/tabs.module.css.d.ts +2 -0
  257. package/dist/tabs/tabs.module.js +11 -0
  258. package/dist/tabs/tabs.module.js.map +1 -0
  259. package/dist/tailwind-theme.css +142 -0
  260. package/dist/toast/index.d.ts +3 -0
  261. package/dist/toast/index.js +4 -0
  262. package/dist/toast/parts.d.ts +33 -0
  263. package/dist/toast/parts.d.ts.map +1 -0
  264. package/dist/toast/parts.js +62 -0
  265. package/dist/toast/parts.js.map +1 -0
  266. package/dist/toast/toast.css +207 -0
  267. package/dist/toast/toast.d.ts +43 -0
  268. package/dist/toast/toast.d.ts.map +1 -0
  269. package/dist/toast/toast.js +156 -0
  270. package/dist/toast/toast.js.map +1 -0
  271. package/dist/toast/toast.module.css.d.ts +2 -0
  272. package/dist/toast/toast.module.js +25 -0
  273. package/dist/toast/toast.module.js.map +1 -0
  274. package/dist/tokens.css +404 -0
  275. package/dist/tooltip/index.d.ts +3 -0
  276. package/dist/tooltip/index.js +4 -0
  277. package/dist/tooltip/parts.d.ts +23 -0
  278. package/dist/tooltip/parts.d.ts.map +1 -0
  279. package/dist/tooltip/parts.js +53 -0
  280. package/dist/tooltip/parts.js.map +1 -0
  281. package/dist/tooltip/tooltip.css +60 -0
  282. package/dist/tooltip/tooltip.d.ts +22 -0
  283. package/dist/tooltip/tooltip.d.ts.map +1 -0
  284. package/dist/tooltip/tooltip.js +23 -0
  285. package/dist/tooltip/tooltip.js.map +1 -0
  286. package/dist/tooltip/tooltip.module.css.d.ts +2 -0
  287. package/dist/tooltip/tooltip.module.js +10 -0
  288. package/dist/tooltip/tooltip.module.js.map +1 -0
  289. package/package.json +153 -4
  290. package/src/accordion/accordion.module.css +75 -0
  291. package/src/accordion/accordion.tsx +50 -0
  292. package/src/accordion/index.ts +6 -0
  293. package/src/accordion/parts.tsx +68 -0
  294. package/src/alert-dialog/alert-dialog.module.css +91 -0
  295. package/src/alert-dialog/alert-dialog.tsx +69 -0
  296. package/src/alert-dialog/index.ts +7 -0
  297. package/src/alert-dialog/parts.tsx +73 -0
  298. package/src/badge/badge.module.css +60 -0
  299. package/src/badge/badge.tsx +19 -0
  300. package/src/badge/index.ts +3 -0
  301. package/src/button/button.module.css +229 -0
  302. package/src/button/button.tsx +67 -0
  303. package/src/button/index.ts +3 -0
  304. package/src/card/card.module.css +56 -0
  305. package/src/card/card.tsx +54 -0
  306. package/src/card/index.ts +3 -0
  307. package/src/checkbox/checkbox.module.css +69 -0
  308. package/src/checkbox/checkbox.tsx +38 -0
  309. package/src/checkbox/index.ts +6 -0
  310. package/src/checkbox/parts.tsx +54 -0
  311. package/src/collapsible/collapsible.module.css +81 -0
  312. package/src/collapsible/collapsible.tsx +38 -0
  313. package/src/collapsible/index.ts +6 -0
  314. package/src/collapsible/parts.tsx +52 -0
  315. package/src/context-menu/context-menu.module.css +168 -0
  316. package/src/context-menu/context-menu.tsx +75 -0
  317. package/src/context-menu/index.ts +21 -0
  318. package/src/context-menu/parts.tsx +99 -0
  319. package/src/css.d.ts +8 -0
  320. package/src/dialog/dialog.module.css +116 -0
  321. package/src/dialog/dialog.tsx +73 -0
  322. package/src/dialog/index.ts +13 -0
  323. package/src/dialog/parts.tsx +96 -0
  324. package/src/drawer/drawer.module.css +240 -0
  325. package/src/drawer/drawer.tsx +96 -0
  326. package/src/drawer/index.ts +24 -0
  327. package/src/drawer/parts.tsx +122 -0
  328. package/src/index.ts +237 -0
  329. package/src/input/index.ts +3 -0
  330. package/src/input/input.module.css +93 -0
  331. package/src/input/input.tsx +39 -0
  332. package/src/menu/index.ts +7 -0
  333. package/src/menu/menu.module.css +142 -0
  334. package/src/menu/menu.tsx +108 -0
  335. package/src/menu/menuitemshortcut.tsx +9 -0
  336. package/src/menu/parts.tsx +90 -0
  337. package/src/number-field/index.ts +20 -0
  338. package/src/number-field/number-field.module.css +98 -0
  339. package/src/number-field/number-field.tsx +75 -0
  340. package/src/number-field/parts.tsx +91 -0
  341. package/src/progress/index.ts +6 -0
  342. package/src/progress/parts.tsx +51 -0
  343. package/src/progress/progress.module.css +61 -0
  344. package/src/progress/progress.tsx +42 -0
  345. package/src/select/index.ts +30 -0
  346. package/src/select/parts.tsx +171 -0
  347. package/src/select/select.module.css +146 -0
  348. package/src/select/select.tsx +98 -0
  349. package/src/separator/index.ts +3 -0
  350. package/src/separator/separator.module.css +14 -0
  351. package/src/separator/separator.tsx +20 -0
  352. package/src/slider/index.ts +14 -0
  353. package/src/slider/parts.tsx +90 -0
  354. package/src/slider/slider.module.css +110 -0
  355. package/src/slider/slider.tsx +68 -0
  356. package/src/styles/layer-order.css +22 -0
  357. package/src/styles/reset.css +91 -0
  358. package/src/styles/tailwind-theme.css +142 -0
  359. package/src/styles/tokens.css +404 -0
  360. package/src/switch/index.ts +6 -0
  361. package/src/switch/parts.tsx +44 -0
  362. package/src/switch/switch.module.css +57 -0
  363. package/src/switch/switch.tsx +33 -0
  364. package/src/tabs/index.ts +6 -0
  365. package/src/tabs/parts.tsx +48 -0
  366. package/src/tabs/tabs.module.css +79 -0
  367. package/src/tabs/tabs.tsx +48 -0
  368. package/src/toast/index.ts +6 -0
  369. package/src/toast/parts.tsx +76 -0
  370. package/src/toast/toast.module.css +212 -0
  371. package/src/toast/toast.tsx +129 -0
  372. package/src/tooltip/index.ts +6 -0
  373. package/src/tooltip/parts.tsx +62 -0
  374. package/src/tooltip/tooltip.module.css +56 -0
  375. package/src/tooltip/tooltip.tsx +30 -0
@@ -0,0 +1,48 @@
1
+ import type { ReactNode } from "react";
2
+ import { Tabs as BaseTabs } from "@base-ui/react/tabs";
3
+ import styles from "./tabs.module.css";
4
+
5
+ export interface TabItem {
6
+ value: string;
7
+ label: ReactNode;
8
+ content: ReactNode;
9
+ disabled?: boolean;
10
+ icon?: ReactNode;
11
+ }
12
+
13
+ export interface TabsProps {
14
+ items: TabItem[];
15
+ value?: string;
16
+ defaultValue?: string;
17
+ /** `eventDetails` is the base-ui event details object. */
18
+ onValueChange?: (value: unknown, eventDetails: unknown) => void;
19
+ className?: string;
20
+ }
21
+
22
+ export function Tabs({ items, className, ...props }: TabsProps) {
23
+ const defaultVal = props.defaultValue ?? items[0]?.value;
24
+
25
+ return (
26
+ <BaseTabs.Root
27
+ className={`${styles.root} ${className ?? ""}`}
28
+ defaultValue={defaultVal}
29
+ onValueChange={props.onValueChange as never}
30
+ value={props.value}
31
+ >
32
+ <BaseTabs.List className={styles.list}>
33
+ {items.map((item) => (
34
+ <BaseTabs.Tab key={item.value} value={item.value} disabled={item.disabled} className={styles.tab}>
35
+ {item.icon}
36
+ {item.label}
37
+ </BaseTabs.Tab>
38
+ ))}
39
+ </BaseTabs.List>
40
+ {items.map((item) => (
41
+ <BaseTabs.Panel key={item.value} value={item.value} className={styles.panel}>
42
+ {item.content}
43
+ </BaseTabs.Panel>
44
+ ))}
45
+ </BaseTabs.Root>
46
+ );
47
+ }
48
+ export { styles as TabsStyles };
@@ -0,0 +1,6 @@
1
+ export { ToastViewport, ToastProvider, useToastManager } from "./toast";
2
+ export type { ToastType, ToastViewportProps, ToastProviderProps } from "./toast";
3
+
4
+ export { ToastRoot, ToastTitle, ToastDescription, ToastClose, ToastViewportPart } from "./parts";
5
+ export type { ToastRootProps, ToastTitleProps, ToastDescriptionProps, ToastCloseProps, ToastViewportPartProps } from "./parts";
6
+ export { ToastStyles } from "./toast";
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Styled primitives for Toast.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Toast } from '@base-ui/react/toast';
7
+ * import { ToastRoot, ToastTitle, ToastDescription, ToastClose } from '@brijbyte/agentic-ui/toast';
8
+ *
9
+ * // Inside a Toast.Viewport or custom viewport:
10
+ * manager.toasts.map((toast) => (
11
+ * <ToastRoot key={toast.id} toast={toast}>
12
+ * <ToastTitle />
13
+ * <ToastDescription />
14
+ * <ToastClose aria-label="Dismiss" />
15
+ * </ToastRoot>
16
+ * ))
17
+ * ```
18
+ */
19
+ import { forwardRef } from "react";
20
+ import type { ComponentRef, ComponentPropsWithoutRef } from "react";
21
+ import { Toast as BaseToast } from "@base-ui/react/toast";
22
+ import styles from "./toast.module.css";
23
+
24
+ type BaseRootProps = ComponentPropsWithoutRef<typeof BaseToast.Root>;
25
+ type BaseTitleProps = ComponentPropsWithoutRef<typeof BaseToast.Title>;
26
+ type BaseDescriptionProps = ComponentPropsWithoutRef<typeof BaseToast.Description>;
27
+ type BaseCloseProps = ComponentPropsWithoutRef<typeof BaseToast.Close>;
28
+ type BaseViewportProps = ComponentPropsWithoutRef<typeof BaseToast.Viewport>;
29
+
30
+ export interface ToastRootProps extends Omit<BaseRootProps, "className"> {
31
+ className?: string;
32
+ }
33
+ export interface ToastTitleProps extends Omit<BaseTitleProps, "className"> {
34
+ className?: string;
35
+ }
36
+ export interface ToastDescriptionProps extends Omit<BaseDescriptionProps, "className"> {
37
+ className?: string;
38
+ }
39
+ export interface ToastCloseProps extends Omit<BaseCloseProps, "className"> {
40
+ className?: string;
41
+ }
42
+ export interface ToastViewportPartProps extends Omit<BaseViewportProps, "className"> {
43
+ className?: string;
44
+ }
45
+
46
+ export const ToastRoot = forwardRef<ComponentRef<typeof BaseToast.Root>, ToastRootProps>(function ToastRoot({ className, ...props }, ref) {
47
+ return <BaseToast.Root ref={ref} className={`${styles.toast} ${className ?? ""}`} {...props} />;
48
+ });
49
+
50
+ export const ToastTitle = forwardRef<ComponentRef<typeof BaseToast.Title>, ToastTitleProps>(function ToastTitle(
51
+ { className, ...props },
52
+ ref,
53
+ ) {
54
+ return <BaseToast.Title ref={ref} className={`${styles.title} ${className ?? ""}`} {...props} />;
55
+ });
56
+
57
+ export const ToastDescription = forwardRef<ComponentRef<typeof BaseToast.Description>, ToastDescriptionProps>(function ToastDescription(
58
+ { className, ...props },
59
+ ref,
60
+ ) {
61
+ return <BaseToast.Description ref={ref} className={`${styles.description} ${className ?? ""}`} {...props} />;
62
+ });
63
+
64
+ export const ToastClose = forwardRef<ComponentRef<typeof BaseToast.Close>, ToastCloseProps>(function ToastClose(
65
+ { className, ...props },
66
+ ref,
67
+ ) {
68
+ return <BaseToast.Close ref={ref} className={`${styles.close} ${className ?? ""}`} {...props} />;
69
+ });
70
+
71
+ export const ToastViewportPart = forwardRef<ComponentRef<typeof BaseToast.Viewport>, ToastViewportPartProps>(function ToastViewportPart(
72
+ { className, ...props },
73
+ ref,
74
+ ) {
75
+ return <BaseToast.Viewport ref={ref} className={`${styles.viewport} ${className ?? ""}`} {...props} />;
76
+ });
@@ -0,0 +1,212 @@
1
+ @layer components {
2
+ /* ─── Viewport ───────────────────────────────────────────────────── */
3
+ .viewport {
4
+ position: fixed;
5
+ bottom: var(--space-4);
6
+ right: var(--space-4);
7
+ z-index: var(--z-toast);
8
+ display: flex;
9
+ flex-direction: column;
10
+ width: 360px;
11
+ max-width: calc(100vw - var(--space-8));
12
+ list-style: none;
13
+ pointer-events: none;
14
+ outline: none;
15
+ }
16
+ /* List variant — toasts sit in a normal column */
17
+ .viewport-list {
18
+ gap: var(--space-2);
19
+ }
20
+ /* Stacked variant — toasts overlap; viewport height = frontmost toast */
21
+ .viewport-stacked {
22
+ gap: 0;
23
+ }
24
+ /* ─── Toast base ─────────────────────────────────────────────────── */
25
+ .toast {
26
+ display: flex;
27
+ align-items: flex-start;
28
+ gap: var(--space-3);
29
+ padding: var(--space-3) var(--space-4);
30
+ background-color: var(--color-overlay);
31
+ border: var(--border-width-base) solid var(--color-line);
32
+ border-radius: var(--radius-xl);
33
+ box-shadow: var(--shadow-popover);
34
+ pointer-events: auto;
35
+ cursor: default;
36
+ width: 100%;
37
+ }
38
+ @supports (backdrop-filter: blur(12px)) {
39
+ .toast {
40
+ backdrop-filter: blur(12px) saturate(1.5);
41
+ -webkit-backdrop-filter: blur(12px) saturate(1.5);
42
+ }
43
+ }
44
+ /* ─── List mode animations ───────────────────────────────────────── */
45
+ .viewport-list .toast {
46
+ transform-origin: bottom right;
47
+ opacity: 1;
48
+ transform: translateX(0);
49
+ transition:
50
+ opacity 300ms var(--easing-ease-out),
51
+ transform 300ms var(--easing-spring);
52
+ @starting-style {
53
+ opacity: 0;
54
+ transform: translateX(calc(100% + var(--space-4)));
55
+ }
56
+ }
57
+ .viewport-list .toast[data-ending-style] {
58
+ opacity: 0;
59
+ transform: translateX(calc(100% + var(--space-4)));
60
+ transition:
61
+ opacity 200ms var(--easing-ease-in),
62
+ transform 200ms var(--easing-ease-in);
63
+ }
64
+ /* ─── Stacked mode ───────────────────────────────────────────────── */
65
+ /*
66
+ * Base UI provides on each toast root (as inline styles):
67
+ * --toast-index : plain integer, 0 = frontmost/newest
68
+ * --toast-offset-y: "Npx" — cumulative height of all toasts above
69
+ * --toast-height : "Npx" — this toast's measured height
70
+ *
71
+ * Base UI provides on the viewport:
72
+ * --toast-frontmost-height: "Npx" — height of index-0 toast
73
+ *
74
+ * Collapsed: toasts sit at bottom:0, stacked via scale+translate.
75
+ * Expanded (data-expanded): each toast moves to its offset position.
76
+ */
77
+ .viewport-stacked {
78
+ height: calc(var(--toast-frontmost-height, 64px) + 20px);
79
+ padding-top: 20px;
80
+ box-sizing: content-box;
81
+ clip-path: inset(0 0 0 0 round var(--radius-xl));
82
+ transition:
83
+ clip-path 200ms var(--easing-ease-out),
84
+ height 200ms var(--easing-ease-out);
85
+ }
86
+ .viewport-stacked[data-expanded] {
87
+ clip-path: inset(-9999px 0 0 0 round var(--radius-xl));
88
+ height: calc(var(--toast-frontmost-height, 64px) + 20px);
89
+ }
90
+ /* Fill the gaps between expanded toasts so the mouse doesn't leave
91
+ the viewport as it moves between them, which would collapse the stack */
92
+ .viewport-stacked[data-expanded]::after {
93
+ content: "";
94
+ position: absolute;
95
+ inset: -9999px 0 0 0;
96
+ pointer-events: auto;
97
+ z-index: 0;
98
+ }
99
+ .toast-stacked {
100
+ position: absolute;
101
+ bottom: 0;
102
+ left: 0;
103
+ right: 0;
104
+ z-index: calc(50 - var(--toast-index));
105
+ transform: translateY(calc(var(--toast-index) * -8px)) scale(calc(1 - var(--toast-index) * 0.04));
106
+ transform-origin: bottom center;
107
+ opacity: calc(1 - var(--toast-index) * 0.15);
108
+ transition:
109
+ transform 200ms var(--easing-ease-out),
110
+ opacity 200ms var(--easing-ease-out);
111
+ }
112
+ /* Expanded: each toast animates to its stacked position with a gap */
113
+ .viewport-stacked[data-expanded] .toast-stacked {
114
+ transform: translateY(calc((var(--toast-offset-y) + var(--toast-index) * 8px) * -1));
115
+ opacity: 1;
116
+ pointer-events: auto;
117
+ }
118
+ /* Enter: new toast slides up from below */
119
+ .viewport-stacked .toast-stacked {
120
+ @starting-style {
121
+ opacity: 0;
122
+ transform: translateY(16px) scale(calc(1 - var(--toast-index) * 0.04));
123
+ }
124
+ }
125
+ /* Exit: dismissed toast slides right */
126
+ .viewport-stacked .toast-stacked[data-ending-style] {
127
+ opacity: 0;
128
+ transform: translateX(calc(100% + var(--space-4)));
129
+ transition:
130
+ opacity 150ms var(--easing-ease-in),
131
+ transform 150ms var(--easing-ease-in);
132
+ }
133
+ /* ─── Variant tints ──────────────────────────────────────────────── */
134
+ .toast-success {
135
+ background-color: color-mix(in srgb, var(--color-success-solid) 6%, var(--color-overlay));
136
+ }
137
+ .toast-error {
138
+ background-color: color-mix(in srgb, var(--color-error-solid) 6%, var(--color-overlay));
139
+ }
140
+ .toast-warning {
141
+ background-color: color-mix(in srgb, var(--color-warning-solid) 6%, var(--color-overlay));
142
+ }
143
+ .toast-info {
144
+ background-color: color-mix(in srgb, var(--color-info-solid) 6%, var(--color-overlay));
145
+ }
146
+ /* ─── Icon ───────────────────────────────────────────────────────── */
147
+ .icon {
148
+ flex-shrink: 0;
149
+ width: 16px;
150
+ height: 16px;
151
+ margin-top: 1px;
152
+ }
153
+ .icon-success {
154
+ color: var(--color-success-solid);
155
+ }
156
+ .icon-warning {
157
+ color: var(--color-warning-solid);
158
+ }
159
+ .icon-error {
160
+ color: var(--color-error-solid);
161
+ }
162
+ .icon-info {
163
+ color: var(--color-info-solid);
164
+ }
165
+ /* ─── Content ────────────────────────────────────────────────────── */
166
+ .content {
167
+ flex: 1;
168
+ display: flex;
169
+ flex-direction: column;
170
+ gap: var(--space-0-5);
171
+ min-width: 0;
172
+ }
173
+ .title {
174
+ font-family: var(--font-mono);
175
+ font-size: var(--font-size-sm);
176
+ font-weight: var(--font-weight-medium);
177
+ color: var(--color-primary);
178
+ line-height: var(--line-height-normal);
179
+ }
180
+ .description {
181
+ font-family: var(--font-mono);
182
+ font-size: var(--font-size-xs);
183
+ color: var(--color-secondary);
184
+ line-height: var(--line-height-relaxed);
185
+ }
186
+ /* ─── Close button ───────────────────────────────────────────────── */
187
+ .close {
188
+ flex-shrink: 0;
189
+ width: 20px;
190
+ height: 20px;
191
+ border-radius: var(--radius-sm);
192
+ border: none;
193
+ background: transparent;
194
+ color: var(--color-tertiary);
195
+ cursor: pointer;
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ outline: none;
200
+ transition:
201
+ background-color var(--duration-fast) var(--easing-standard),
202
+ color var(--duration-fast) var(--easing-standard);
203
+ margin-top: 1px;
204
+ }
205
+ .close:hover {
206
+ background-color: var(--color-hover);
207
+ color: var(--color-primary);
208
+ }
209
+ .close:focus-visible {
210
+ box-shadow: var(--shadow-focus);
211
+ }
212
+ }
@@ -0,0 +1,129 @@
1
+ import type { ReactNode } from "react";
2
+ import { Toast as BaseToast } from "@base-ui/react/toast";
3
+ import styles from "./toast.module.css";
4
+
5
+ export type ToastType = "default" | "success" | "warning" | "error" | "info";
6
+
7
+ // Re-export for consumer convenience
8
+ export const useToastManager = BaseToast.useToastManager;
9
+
10
+ function XIcon() {
11
+ return (
12
+ <svg width="10" height="10" viewBox="0 0 10 10" fill="none">
13
+ <path d="M1 1L9 9M9 1L1 9" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
14
+ </svg>
15
+ );
16
+ }
17
+
18
+ function StatusIcon({ type }: { type: string }) {
19
+ if (type === "success") {
20
+ return (
21
+ <svg viewBox="0 0 16 16" fill="none" className={`${styles.icon} ${styles["icon-success"]}`}>
22
+ <circle cx="8" cy="8" r="7" stroke="currentColor" strokeWidth="1.5" />
23
+ <path d="M4.5 8L6.5 10.5L11 5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
24
+ </svg>
25
+ );
26
+ }
27
+ if (type === "error") {
28
+ return (
29
+ <svg viewBox="0 0 16 16" fill="none" className={`${styles.icon} ${styles["icon-error"]}`}>
30
+ <circle cx="8" cy="8" r="7" stroke="currentColor" strokeWidth="1.5" />
31
+ <path d="M5.5 5.5L10.5 10.5M10.5 5.5L5.5 10.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
32
+ </svg>
33
+ );
34
+ }
35
+ if (type === "warning") {
36
+ return (
37
+ <svg viewBox="0 0 16 16" fill="none" className={`${styles.icon} ${styles["icon-warning"]}`}>
38
+ <path d="M8 2L14.5 13H1.5L8 2Z" stroke="currentColor" strokeWidth="1.5" strokeLinejoin="round" />
39
+ <path d="M8 6.5V9" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
40
+ <circle cx="8" cy="11" r="0.75" fill="currentColor" />
41
+ </svg>
42
+ );
43
+ }
44
+ if (type === "info") {
45
+ return (
46
+ <svg viewBox="0 0 16 16" fill="none" className={`${styles.icon} ${styles["icon-info"]}`}>
47
+ <circle cx="8" cy="8" r="7" stroke="currentColor" strokeWidth="1.5" />
48
+ <path d="M8 7V11" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
49
+ <circle cx="8" cy="5" r="0.75" fill="currentColor" />
50
+ </svg>
51
+ );
52
+ }
53
+ return null;
54
+ }
55
+
56
+ export interface ToastViewportProps {
57
+ /**
58
+ * "stacked" — toasts fan out behind each other like Sonner.
59
+ * Collapsed: only the front toast is fully visible; others peek as
60
+ * scaled-down cards behind it. Hover/focus expands the full stack.
61
+ *
62
+ * "list" — toasts stack vertically, each fully visible (default behaviour).
63
+ */
64
+ variant?: "stacked" | "list";
65
+ /**
66
+ * Maximum number of toasts shown at once.
67
+ * Defaults to 5 for "stacked", 3 for "list".
68
+ * Oldest toasts are removed when the limit is exceeded.
69
+ */
70
+ limit?: number;
71
+ }
72
+
73
+ const DEFAULT_LIMIT: Record<NonNullable<ToastViewportProps["variant"]>, number> = {
74
+ stacked: 5,
75
+ list: 3,
76
+ };
77
+
78
+ export interface ToastProviderProps {
79
+ children: ReactNode;
80
+ variant?: ToastViewportProps["variant"];
81
+ limit?: number;
82
+ timeout?: number;
83
+ }
84
+
85
+ /**
86
+ * Drop-in provider that wires limit defaults to the chosen variant.
87
+ * Use this instead of base-ui's Toast.Provider when using ToastViewport.
88
+ */
89
+ const MAX_LIMIT: Record<NonNullable<ToastViewportProps["variant"]>, number> = {
90
+ stacked: 10,
91
+ list: 5,
92
+ };
93
+
94
+ export function ToastProvider({ children, variant = "list", limit, timeout }: ToastProviderProps) {
95
+ const resolvedLimit = Math.min(limit ?? DEFAULT_LIMIT[variant], MAX_LIMIT[variant]);
96
+ return (
97
+ <BaseToast.Provider limit={resolvedLimit} timeout={timeout}>
98
+ {children}
99
+ </BaseToast.Provider>
100
+ );
101
+ }
102
+
103
+ export function ToastViewport({ variant = "list", limit: _limit }: ToastViewportProps) {
104
+ const manager = useToastManager();
105
+ const isStacked = variant === "stacked";
106
+
107
+ return (
108
+ <BaseToast.Viewport className={`${styles.viewport} ${isStacked ? styles["viewport-stacked"] : styles["viewport-list"]}`}>
109
+ {manager.toasts.map((toast) => (
110
+ <BaseToast.Root
111
+ key={toast.id}
112
+ toast={toast}
113
+ className={`${styles.toast} ${isStacked ? styles["toast-stacked"] : ""} ${styles[`toast-${toast.type ?? "default"}`]}`}
114
+ swipeDirection={isStacked ? ["right", "down"] : ["right", "down"]}
115
+ >
116
+ {toast.type && toast.type !== "default" && <StatusIcon type={toast.type} />}
117
+ <div className={styles.content}>
118
+ {toast.title && <BaseToast.Title className={styles.title} />}
119
+ {toast.description && <BaseToast.Description className={styles.description} />}
120
+ </div>
121
+ <BaseToast.Close className={styles.close} aria-label="Dismiss">
122
+ <XIcon />
123
+ </BaseToast.Close>
124
+ </BaseToast.Root>
125
+ ))}
126
+ </BaseToast.Viewport>
127
+ );
128
+ }
129
+ export { styles as ToastStyles };
@@ -0,0 +1,6 @@
1
+ export { Tooltip } from "./tooltip";
2
+ export type { TooltipProps } from "./tooltip";
3
+
4
+ export { TooltipPositioner, TooltipPopup, TooltipArrow } from "./parts";
5
+ export type { TooltipPositionerProps, TooltipPopupProps, TooltipArrowProps } from "./parts";
6
+ export { TooltipStyles } from "./tooltip";
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Styled primitives for Tooltip.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Tooltip } from '@base-ui/react/tooltip';
7
+ * import { TooltipPositioner, TooltipPopup, TooltipArrow } from '@brijbyte/agentic-ui/tooltip';
8
+ *
9
+ * <Tooltip.Provider>
10
+ * <Tooltip.Root>
11
+ * <Tooltip.Trigger render={<button>Hover me</button>} />
12
+ * <Tooltip.Portal>
13
+ * <TooltipPositioner side="top" sideOffset={6}>
14
+ * <TooltipPopup>
15
+ * <TooltipArrow />
16
+ * Tooltip content
17
+ * </TooltipPopup>
18
+ * </TooltipPositioner>
19
+ * </Tooltip.Portal>
20
+ * </Tooltip.Root>
21
+ * </Tooltip.Provider>
22
+ * ```
23
+ */
24
+ import { forwardRef } from "react";
25
+ import type { ComponentRef, ComponentPropsWithoutRef } from "react";
26
+ import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
27
+ import styles from "./tooltip.module.css";
28
+
29
+ type BasePositionerProps = ComponentPropsWithoutRef<typeof BaseTooltip.Positioner>;
30
+ type BasePopupProps = ComponentPropsWithoutRef<typeof BaseTooltip.Popup>;
31
+ type BaseArrowProps = ComponentPropsWithoutRef<typeof BaseTooltip.Arrow>;
32
+
33
+ export interface TooltipPositionerProps extends Omit<BasePositionerProps, "className"> {
34
+ className?: string;
35
+ }
36
+ export interface TooltipPopupProps extends Omit<BasePopupProps, "className"> {
37
+ className?: string;
38
+ }
39
+ export interface TooltipArrowProps extends Omit<BaseArrowProps, "className"> {
40
+ className?: string;
41
+ }
42
+
43
+ export const TooltipPositioner = forwardRef<ComponentRef<typeof BaseTooltip.Positioner>, TooltipPositionerProps>(function TooltipPositioner(
44
+ { className, ...props },
45
+ ref,
46
+ ) {
47
+ return <BaseTooltip.Positioner ref={ref} className={`${styles.positioner} ${className ?? ""}`} {...props} />;
48
+ });
49
+
50
+ export const TooltipPopup = forwardRef<ComponentRef<typeof BaseTooltip.Popup>, TooltipPopupProps>(function TooltipPopup(
51
+ { className, ...props },
52
+ ref,
53
+ ) {
54
+ return <BaseTooltip.Popup ref={ref} className={`${styles.popup} ${className ?? ""}`} {...props} />;
55
+ });
56
+
57
+ export const TooltipArrow = forwardRef<ComponentRef<typeof BaseTooltip.Arrow>, TooltipArrowProps>(function TooltipArrow(
58
+ { className, ...props },
59
+ ref,
60
+ ) {
61
+ return <BaseTooltip.Arrow ref={ref} className={`${styles.arrow} ${className ?? ""}`} {...props} />;
62
+ });
@@ -0,0 +1,56 @@
1
+ @layer components {
2
+ .positioner {
3
+ z-index: var(--z-tooltip);
4
+ }
5
+ .popup {
6
+ background-color: var(--color-surface-3);
7
+ border: var(--border-width-base) solid var(--color-line);
8
+ border-radius: var(--radius-sm);
9
+ box-shadow: var(--shadow-sm);
10
+ padding: var(--space-1) var(--space-2);
11
+ font-family: var(--font-mono);
12
+ font-size: var(--font-size-xs);
13
+ color: var(--color-primary);
14
+ line-height: var(--line-height-normal);
15
+ max-width: 240px;
16
+ word-break: break-word;
17
+ transform-origin: var(--transform-origin);
18
+ transition:
19
+ opacity 150ms var(--easing-ease-out),
20
+ transform 300ms var(--easing-spring);
21
+ }
22
+ /* Skip animation when moving between tooltips quickly */
23
+ .popup[data-instant] {
24
+ transition-duration: 0ms;
25
+ }
26
+ .popup[data-starting-style] {
27
+ opacity: 0;
28
+ transform: scale(0.85);
29
+ }
30
+ .popup[data-ending-style] {
31
+ opacity: 0;
32
+ transform: scale(0.95);
33
+ transition:
34
+ opacity 75ms var(--easing-ease-in),
35
+ transform 75ms var(--easing-ease-in);
36
+ }
37
+ @media (prefers-reduced-motion: reduce) {
38
+ .popup {
39
+ transition: opacity 125ms var(--easing-ease-out);
40
+ }
41
+ .popup[data-ending-style] {
42
+ transition: opacity 75ms var(--easing-ease-in);
43
+ }
44
+ .popup[data-starting-style],
45
+ .popup[data-ending-style] {
46
+ transform: none;
47
+ }
48
+ }
49
+ .arrow {
50
+ width: 8px;
51
+ height: 8px;
52
+ fill: var(--color-surface-3);
53
+ stroke: var(--color-line);
54
+ stroke-width: 1;
55
+ }
56
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactNode, ReactElement } from "react";
2
+ import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
3
+ import styles from "./tooltip.module.css";
4
+
5
+ export interface TooltipProps {
6
+ content: ReactNode;
7
+ children: ReactElement;
8
+ delay?: number;
9
+ side?: "top" | "bottom" | "left" | "right";
10
+ align?: "start" | "center" | "end";
11
+ }
12
+
13
+ export function Tooltip({ content, children, delay = 400, side = "top", align = "center" }: TooltipProps) {
14
+ return (
15
+ <BaseTooltip.Provider delay={delay}>
16
+ <BaseTooltip.Root>
17
+ <BaseTooltip.Trigger render={children} />
18
+ <BaseTooltip.Portal>
19
+ <BaseTooltip.Positioner className={styles.positioner} side={side} align={align} sideOffset={6}>
20
+ <BaseTooltip.Popup className={styles.popup}>
21
+ <BaseTooltip.Arrow className={styles.arrow} />
22
+ {content}
23
+ </BaseTooltip.Popup>
24
+ </BaseTooltip.Positioner>
25
+ </BaseTooltip.Portal>
26
+ </BaseTooltip.Root>
27
+ </BaseTooltip.Provider>
28
+ );
29
+ }
30
+ export { styles as TooltipStyles };