@brijbyte/agentic-ui 0.0.1-beta → 0.0.1

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 (319) hide show
  1. package/README.md +736 -0
  2. package/dist/accordion/accordion.css +89 -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/badge/badge.css +70 -0
  17. package/dist/badge/badge.d.ts +20 -0
  18. package/dist/badge/badge.d.ts.map +1 -0
  19. package/dist/badge/badge.js +21 -0
  20. package/dist/badge/badge.js.map +1 -0
  21. package/dist/badge/badge.module.css.d.ts +2 -0
  22. package/dist/badge/badge.module.js +16 -0
  23. package/dist/badge/badge.module.js.map +1 -0
  24. package/dist/badge/index.d.ts +2 -0
  25. package/dist/badge/index.js +3 -0
  26. package/dist/button/button.css +242 -0
  27. package/dist/button/button.d.ts +28 -0
  28. package/dist/button/button.d.ts.map +1 -0
  29. package/dist/button/button.js +34 -0
  30. package/dist/button/button.js.map +1 -0
  31. package/dist/button/button.module.css.d.ts +2 -0
  32. package/dist/button/button.module.js +27 -0
  33. package/dist/button/button.module.js.map +1 -0
  34. package/dist/button/index.d.ts +2 -0
  35. package/dist/button/index.js +3 -0
  36. package/dist/card/card.css +68 -0
  37. package/dist/card/card.d.ts +41 -0
  38. package/dist/card/card.d.ts.map +1 -0
  39. package/dist/card/card.js +50 -0
  40. package/dist/card/card.js.map +1 -0
  41. package/dist/card/card.module.css.d.ts +2 -0
  42. package/dist/card/card.module.js +15 -0
  43. package/dist/card/card.module.js.map +1 -0
  44. package/dist/card/index.d.ts +2 -0
  45. package/dist/card/index.js +3 -0
  46. package/dist/checkbox/checkbox.css +76 -0
  47. package/dist/checkbox/checkbox.d.ts +29 -0
  48. package/dist/checkbox/checkbox.d.ts.map +1 -0
  49. package/dist/checkbox/checkbox.js +40 -0
  50. package/dist/checkbox/checkbox.js.map +1 -0
  51. package/dist/checkbox/checkbox.module.css.d.ts +2 -0
  52. package/dist/checkbox/checkbox.module.js +11 -0
  53. package/dist/checkbox/checkbox.module.js.map +1 -0
  54. package/dist/checkbox/index.d.ts +3 -0
  55. package/dist/checkbox/index.js +4 -0
  56. package/dist/checkbox/parts.d.ts +20 -0
  57. package/dist/checkbox/parts.d.ts.map +1 -0
  58. package/dist/checkbox/parts.js +51 -0
  59. package/dist/checkbox/parts.js.map +1 -0
  60. package/dist/collapsible/collapsible.css +92 -0
  61. package/dist/collapsible/collapsible.d.ts +24 -0
  62. package/dist/collapsible/collapsible.d.ts.map +1 -0
  63. package/dist/collapsible/collapsible.js +44 -0
  64. package/dist/collapsible/collapsible.js.map +1 -0
  65. package/dist/collapsible/collapsible.module.css.d.ts +2 -0
  66. package/dist/collapsible/collapsible.module.js +12 -0
  67. package/dist/collapsible/collapsible.module.js.map +1 -0
  68. package/dist/collapsible/index.d.ts +3 -0
  69. package/dist/collapsible/index.js +4 -0
  70. package/dist/collapsible/parts.d.ts +23 -0
  71. package/dist/collapsible/parts.d.ts.map +1 -0
  72. package/dist/collapsible/parts.js +44 -0
  73. package/dist/collapsible/parts.js.map +1 -0
  74. package/dist/dialog/dialog.css +120 -0
  75. package/dist/dialog/dialog.d.ts +32 -0
  76. package/dist/dialog/dialog.d.ts.map +1 -0
  77. package/dist/dialog/dialog.js +54 -0
  78. package/dist/dialog/dialog.js.map +1 -0
  79. package/dist/dialog/dialog.module.css.d.ts +2 -0
  80. package/dist/dialog/dialog.module.js +15 -0
  81. package/dist/dialog/dialog.module.js.map +1 -0
  82. package/dist/dialog/index.d.ts +3 -0
  83. package/dist/dialog/index.js +4 -0
  84. package/dist/dialog/parts.d.ts +38 -0
  85. package/dist/dialog/parts.d.ts.map +1 -0
  86. package/dist/dialog/parts.js +75 -0
  87. package/dist/dialog/parts.js.map +1 -0
  88. package/dist/drawer/drawer.css +257 -0
  89. package/dist/drawer/drawer.d.ts +38 -0
  90. package/dist/drawer/drawer.d.ts.map +1 -0
  91. package/dist/drawer/drawer.js +87 -0
  92. package/dist/drawer/drawer.js.map +1 -0
  93. package/dist/drawer/drawer.module.css.d.ts +2 -0
  94. package/dist/drawer/drawer.module.js +20 -0
  95. package/dist/drawer/drawer.module.js.map +1 -0
  96. package/dist/drawer/index.d.ts +3 -0
  97. package/dist/drawer/index.js +4 -0
  98. package/dist/drawer/parts.d.ts +58 -0
  99. package/dist/drawer/parts.d.ts.map +1 -0
  100. package/dist/drawer/parts.js +107 -0
  101. package/dist/drawer/parts.js.map +1 -0
  102. package/dist/index.css +2424 -0
  103. package/dist/index.d.ts +33 -0
  104. package/dist/index.js +53 -0
  105. package/dist/input/index.d.ts +2 -0
  106. package/dist/input/index.js +3 -0
  107. package/dist/input/input.css +107 -0
  108. package/dist/input/input.d.ts +17 -0
  109. package/dist/input/input.d.ts.map +1 -0
  110. package/dist/input/input.js +37 -0
  111. package/dist/input/input.js.map +1 -0
  112. package/dist/input/input.module.css.d.ts +2 -0
  113. package/dist/input/input.module.js +18 -0
  114. package/dist/input/input.module.js.map +1 -0
  115. package/dist/menu/index.d.ts +4 -0
  116. package/dist/menu/index.js +5 -0
  117. package/dist/menu/menu.css +158 -0
  118. package/dist/menu/menu.d.ts +50 -0
  119. package/dist/menu/menu.d.ts.map +1 -0
  120. package/dist/menu/menu.js +69 -0
  121. package/dist/menu/menu.js.map +1 -0
  122. package/dist/menu/menu.module.css.d.ts +2 -0
  123. package/dist/menu/menu.module.js +19 -0
  124. package/dist/menu/menu.module.js.map +1 -0
  125. package/dist/menu/menuitemshortcut.d.ts +9 -0
  126. package/dist/menu/menuitemshortcut.d.ts.map +1 -0
  127. package/dist/menu/menuitemshortcut.js +15 -0
  128. package/dist/menu/menuitemshortcut.js.map +1 -0
  129. package/dist/menu/parts.d.ts +39 -0
  130. package/dist/menu/parts.d.ts.map +1 -0
  131. package/dist/menu/parts.js +76 -0
  132. package/dist/menu/parts.js.map +1 -0
  133. package/dist/number-field/index.d.ts +3 -0
  134. package/dist/number-field/index.js +4 -0
  135. package/dist/number-field/number-field.css +115 -0
  136. package/dist/number-field/number-field.d.ts +31 -0
  137. package/dist/number-field/number-field.d.ts.map +1 -0
  138. package/dist/number-field/number-field.js +78 -0
  139. package/dist/number-field/number-field.js.map +1 -0
  140. package/dist/number-field/number-field.module.css.d.ts +2 -0
  141. package/dist/number-field/number-field.module.js +16 -0
  142. package/dist/number-field/number-field.module.js.map +1 -0
  143. package/dist/number-field/parts.d.ts +38 -0
  144. package/dist/number-field/parts.d.ts.map +1 -0
  145. package/dist/number-field/parts.js +74 -0
  146. package/dist/number-field/parts.js.map +1 -0
  147. package/dist/progress/index.d.ts +3 -0
  148. package/dist/progress/index.js +4 -0
  149. package/dist/progress/parts.d.ts +20 -0
  150. package/dist/progress/parts.d.ts.map +1 -0
  151. package/dist/progress/parts.js +42 -0
  152. package/dist/progress/parts.js.map +1 -0
  153. package/dist/progress/progress.css +75 -0
  154. package/dist/progress/progress.d.ts +27 -0
  155. package/dist/progress/progress.d.ts.map +1 -0
  156. package/dist/progress/progress.js +27 -0
  157. package/dist/progress/progress.js.map +1 -0
  158. package/dist/progress/progress.module.css.d.ts +2 -0
  159. package/dist/progress/progress.module.js +19 -0
  160. package/dist/progress/progress.module.js.map +1 -0
  161. package/dist/reset.css +91 -0
  162. package/dist/select/index.d.ts +3 -0
  163. package/dist/select/index.js +4 -0
  164. package/dist/select/parts.d.ts +65 -0
  165. package/dist/select/parts.d.ts.map +1 -0
  166. package/dist/select/parts.js +134 -0
  167. package/dist/select/parts.js.map +1 -0
  168. package/dist/select/select.css +159 -0
  169. package/dist/select/select.d.ts +38 -0
  170. package/dist/select/select.d.ts.map +1 -0
  171. package/dist/select/select.js +80 -0
  172. package/dist/select/select.js.map +1 -0
  173. package/dist/select/select.module.css.d.ts +2 -0
  174. package/dist/select/select.module.js +17 -0
  175. package/dist/select/select.module.js.map +1 -0
  176. package/dist/separator/index.d.ts +2 -0
  177. package/dist/separator/index.js +3 -0
  178. package/dist/separator/separator.css +20 -0
  179. package/dist/separator/separator.d.ts +16 -0
  180. package/dist/separator/separator.d.ts.map +1 -0
  181. package/dist/separator/separator.js +17 -0
  182. package/dist/separator/separator.js.map +1 -0
  183. package/dist/separator/separator.module.css.d.ts +2 -0
  184. package/dist/separator/separator.module.js +6 -0
  185. package/dist/separator/separator.module.js.map +1 -0
  186. package/dist/styles/reset.css +69 -0
  187. package/dist/styles/tokens.css +274 -0
  188. package/dist/switch/index.d.ts +3 -0
  189. package/dist/switch/index.js +4 -0
  190. package/dist/switch/parts.d.ts +18 -0
  191. package/dist/switch/parts.d.ts.map +1 -0
  192. package/dist/switch/parts.js +39 -0
  193. package/dist/switch/parts.js.map +1 -0
  194. package/dist/switch/switch.css +68 -0
  195. package/dist/switch/switch.d.ts +28 -0
  196. package/dist/switch/switch.d.ts.map +1 -0
  197. package/dist/switch/switch.js +26 -0
  198. package/dist/switch/switch.js.map +1 -0
  199. package/dist/switch/switch.module.css.d.ts +2 -0
  200. package/dist/switch/switch.module.js +11 -0
  201. package/dist/switch/switch.module.js.map +1 -0
  202. package/dist/tabs/index.d.ts +3 -0
  203. package/dist/tabs/index.js +4 -0
  204. package/dist/tabs/parts.d.ts +23 -0
  205. package/dist/tabs/parts.d.ts.map +1 -0
  206. package/dist/tabs/parts.js +48 -0
  207. package/dist/tabs/parts.js.map +1 -0
  208. package/dist/tabs/tabs.css +90 -0
  209. package/dist/tabs/tabs.d.ts +28 -0
  210. package/dist/tabs/tabs.d.ts.map +1 -0
  211. package/dist/tabs/tabs.js +30 -0
  212. package/dist/tabs/tabs.js.map +1 -0
  213. package/dist/tabs/tabs.module.css.d.ts +2 -0
  214. package/dist/tabs/tabs.module.js +11 -0
  215. package/dist/tabs/tabs.module.js.map +1 -0
  216. package/dist/tailwind-theme.css +142 -0
  217. package/dist/toast/index.d.ts +3 -0
  218. package/dist/toast/index.js +4 -0
  219. package/dist/toast/parts.d.ts +33 -0
  220. package/dist/toast/parts.d.ts.map +1 -0
  221. package/dist/toast/parts.js +62 -0
  222. package/dist/toast/parts.js.map +1 -0
  223. package/dist/toast/toast.css +211 -0
  224. package/dist/toast/toast.d.ts +43 -0
  225. package/dist/toast/toast.d.ts.map +1 -0
  226. package/dist/toast/toast.js +156 -0
  227. package/dist/toast/toast.js.map +1 -0
  228. package/dist/toast/toast.module.css.d.ts +2 -0
  229. package/dist/toast/toast.module.js +25 -0
  230. package/dist/toast/toast.module.js.map +1 -0
  231. package/dist/tokens.css +400 -0
  232. package/dist/tooltip/index.d.ts +3 -0
  233. package/dist/tooltip/index.js +4 -0
  234. package/dist/tooltip/parts.d.ts +23 -0
  235. package/dist/tooltip/parts.d.ts.map +1 -0
  236. package/dist/tooltip/parts.js +53 -0
  237. package/dist/tooltip/parts.js.map +1 -0
  238. package/dist/tooltip/tooltip.css +64 -0
  239. package/dist/tooltip/tooltip.d.ts +22 -0
  240. package/dist/tooltip/tooltip.d.ts.map +1 -0
  241. package/dist/tooltip/tooltip.js +23 -0
  242. package/dist/tooltip/tooltip.js.map +1 -0
  243. package/dist/tooltip/tooltip.module.css.d.ts +2 -0
  244. package/dist/tooltip/tooltip.module.js +10 -0
  245. package/dist/tooltip/tooltip.module.js.map +1 -0
  246. package/package.json +137 -4
  247. package/src/accordion/accordion.module.css +89 -0
  248. package/src/accordion/accordion.tsx +50 -0
  249. package/src/accordion/index.ts +6 -0
  250. package/src/accordion/parts.tsx +68 -0
  251. package/src/badge/badge.module.css +70 -0
  252. package/src/badge/badge.tsx +19 -0
  253. package/src/badge/index.ts +3 -0
  254. package/src/button/button.module.css +265 -0
  255. package/src/button/button.tsx +67 -0
  256. package/src/button/index.ts +3 -0
  257. package/src/card/card.module.css +67 -0
  258. package/src/card/card.tsx +54 -0
  259. package/src/card/index.ts +3 -0
  260. package/src/checkbox/checkbox.module.css +80 -0
  261. package/src/checkbox/checkbox.tsx +38 -0
  262. package/src/checkbox/index.ts +6 -0
  263. package/src/checkbox/parts.tsx +54 -0
  264. package/src/collapsible/collapsible.module.css +94 -0
  265. package/src/collapsible/collapsible.tsx +38 -0
  266. package/src/collapsible/index.ts +6 -0
  267. package/src/collapsible/parts.tsx +52 -0
  268. package/src/css.d.ts +8 -0
  269. package/src/dialog/dialog.module.css +123 -0
  270. package/src/dialog/dialog.tsx +60 -0
  271. package/src/dialog/index.ts +13 -0
  272. package/src/dialog/parts.tsx +96 -0
  273. package/src/drawer/drawer.module.css +289 -0
  274. package/src/drawer/drawer.tsx +96 -0
  275. package/src/drawer/index.ts +24 -0
  276. package/src/drawer/parts.tsx +122 -0
  277. package/src/index.ts +189 -0
  278. package/src/input/index.ts +3 -0
  279. package/src/input/input.module.css +109 -0
  280. package/src/input/input.tsx +39 -0
  281. package/src/menu/index.ts +7 -0
  282. package/src/menu/menu.module.css +172 -0
  283. package/src/menu/menu.tsx +108 -0
  284. package/src/menu/menuitemshortcut.tsx +9 -0
  285. package/src/menu/parts.tsx +90 -0
  286. package/src/number-field/index.ts +20 -0
  287. package/src/number-field/number-field.module.css +114 -0
  288. package/src/number-field/number-field.tsx +75 -0
  289. package/src/number-field/parts.tsx +91 -0
  290. package/src/progress/index.ts +6 -0
  291. package/src/progress/parts.tsx +51 -0
  292. package/src/progress/progress.module.css +70 -0
  293. package/src/progress/progress.tsx +42 -0
  294. package/src/select/index.ts +30 -0
  295. package/src/select/parts.tsx +171 -0
  296. package/src/select/select.module.css +167 -0
  297. package/src/select/select.tsx +89 -0
  298. package/src/separator/index.ts +3 -0
  299. package/src/separator/separator.module.css +18 -0
  300. package/src/separator/separator.tsx +20 -0
  301. package/src/styles/reset.css +91 -0
  302. package/src/styles/tailwind-theme.css +142 -0
  303. package/src/styles/tokens.css +400 -0
  304. package/src/switch/index.ts +6 -0
  305. package/src/switch/parts.tsx +44 -0
  306. package/src/switch/switch.module.css +67 -0
  307. package/src/switch/switch.tsx +33 -0
  308. package/src/tabs/index.ts +6 -0
  309. package/src/tabs/parts.tsx +48 -0
  310. package/src/tabs/tabs.module.css +92 -0
  311. package/src/tabs/tabs.tsx +48 -0
  312. package/src/toast/index.ts +6 -0
  313. package/src/toast/parts.tsx +76 -0
  314. package/src/toast/toast.module.css +252 -0
  315. package/src/toast/toast.tsx +129 -0
  316. package/src/tooltip/index.ts +6 -0
  317. package/src/tooltip/parts.tsx +62 -0
  318. package/src/tooltip/tooltip.module.css +67 -0
  319. package/src/tooltip/tooltip.tsx +30 -0
@@ -0,0 +1,33 @@
1
+ import { useId } from "react";
2
+ import type { ReactNode } from "react";
3
+ import { Switch as BaseSwitch } from "@base-ui/react/switch";
4
+ import styles from "./switch.module.css";
5
+
6
+ export interface SwitchProps {
7
+ checked?: boolean;
8
+ defaultChecked?: boolean;
9
+ disabled?: boolean;
10
+ required?: boolean;
11
+ name?: string;
12
+ value?: string;
13
+ /** Called when checked state changes. `eventDetails` is the base-ui event details object. */
14
+ onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;
15
+ children?: ReactNode;
16
+ id?: string;
17
+ className?: string;
18
+ }
19
+
20
+ export function Switch({ children, id, className, onCheckedChange, ...props }: SwitchProps) {
21
+ // eslint-disable-next-line react-hooks/rules-of-hooks
22
+ const switchId = id ?? useId();
23
+
24
+ return (
25
+ <label className={`${styles.root} ${className ?? ""}`} htmlFor={switchId}>
26
+ <BaseSwitch.Root id={switchId} className={styles["thumb-track"]} onCheckedChange={onCheckedChange as never} {...props}>
27
+ <BaseSwitch.Thumb className={styles.thumb} />
28
+ </BaseSwitch.Root>
29
+ {children && <span className={styles.label}>{children}</span>}
30
+ </label>
31
+ );
32
+ }
33
+ export { styles as SwitchStyles };
@@ -0,0 +1,6 @@
1
+ export { Tabs } from "./tabs";
2
+ export type { TabsProps, TabItem } from "./tabs";
3
+
4
+ export { TabsList, TabsTab, TabsPanel } from "./parts";
5
+ export type { TabsListProps, TabsTabProps, TabsPanelProps } from "./parts";
6
+ export { TabsStyles } from "./tabs";
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Styled primitives for Tabs.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Tabs } from '@base-ui/react/tabs';
7
+ * import { TabsList, TabsTab, TabsPanel } from '@brijbyte/agentic-ui/tabs';
8
+ *
9
+ * <Tabs.Root defaultValue="a">
10
+ * <TabsList>
11
+ * <TabsTab value="a">Tab A</TabsTab>
12
+ * <TabsTab value="b">Tab B</TabsTab>
13
+ * </TabsList>
14
+ * <TabsPanel value="a">Content A</TabsPanel>
15
+ * <TabsPanel value="b">Content B</TabsPanel>
16
+ * </Tabs.Root>
17
+ * ```
18
+ */
19
+ import { forwardRef } from "react";
20
+ import type { ComponentRef, ComponentPropsWithoutRef } from "react";
21
+ import { Tabs as BaseTabs } from "@base-ui/react/tabs";
22
+ import styles from "./tabs.module.css";
23
+
24
+ type BaseListProps = ComponentPropsWithoutRef<typeof BaseTabs.List>;
25
+ type BaseTabProps = ComponentPropsWithoutRef<typeof BaseTabs.Tab>;
26
+ type BasePanelProps = ComponentPropsWithoutRef<typeof BaseTabs.Panel>;
27
+
28
+ export interface TabsListProps extends Omit<BaseListProps, "className"> {
29
+ className?: string;
30
+ }
31
+ export interface TabsTabProps extends Omit<BaseTabProps, "className"> {
32
+ className?: string;
33
+ }
34
+ export interface TabsPanelProps extends Omit<BasePanelProps, "className"> {
35
+ className?: string;
36
+ }
37
+
38
+ export const TabsList = forwardRef<ComponentRef<typeof BaseTabs.List>, TabsListProps>(function TabsList({ className, ...props }, ref) {
39
+ return <BaseTabs.List ref={ref} className={`${styles.list} ${className ?? ""}`} {...props} />;
40
+ });
41
+
42
+ export const TabsTab = forwardRef<ComponentRef<typeof BaseTabs.Tab>, TabsTabProps>(function TabsTab({ className, ...props }, ref) {
43
+ return <BaseTabs.Tab ref={ref} className={`${styles.tab} ${className ?? ""}`} {...props} />;
44
+ });
45
+
46
+ export const TabsPanel = forwardRef<ComponentRef<typeof BaseTabs.Panel>, TabsPanelProps>(function TabsPanel({ className, ...props }, ref) {
47
+ return <BaseTabs.Panel ref={ref} className={`${styles.panel} ${className ?? ""}`} {...props} />;
48
+ });
@@ -0,0 +1,92 @@
1
+ @layer theme, base, components, utilities;
2
+
3
+ @layer components {
4
+ .root {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 0;
8
+ }
9
+
10
+ /* ─── Tab List ──────────────────────────────────────── */
11
+ .list {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--space-px);
15
+ border-bottom: var(--border-width-base) solid var(--color-border-base);
16
+ overflow-x: auto;
17
+ scrollbar-width: none;
18
+ }
19
+
20
+ .list::-webkit-scrollbar {
21
+ display: none;
22
+ }
23
+
24
+ /* ─── Tab trigger ────────────────────────────────────── */
25
+ .tab {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ gap: var(--space-1-5);
29
+ padding: var(--space-1-5) var(--space-3);
30
+ font-family: var(--font-mono);
31
+ font-size: var(--font-size-sm);
32
+ font-weight: var(--font-weight-regular);
33
+ color: var(--color-text-tertiary);
34
+ border: none;
35
+ background: none;
36
+ cursor: pointer;
37
+ outline: none;
38
+ white-space: nowrap;
39
+ position: relative;
40
+ margin-bottom: -1px;
41
+ border-bottom: 3px solid transparent;
42
+ transition:
43
+ color var(--duration-fast) var(--easing-standard),
44
+ border-color var(--duration-fast) var(--easing-standard);
45
+ user-select: none;
46
+ }
47
+
48
+ .tab:hover:not([data-disabled]) {
49
+ color: var(--color-text-primary);
50
+ border-bottom-color: var(--color-border-strong);
51
+ }
52
+
53
+ .tab:focus-visible {
54
+ outline: none;
55
+ }
56
+
57
+ .tab:focus-visible::after {
58
+ content: "";
59
+ position: absolute;
60
+ inset: 2px 2px 8px;
61
+ border-radius: var(--radius-sm);
62
+ box-shadow: var(--shadow-focus);
63
+ pointer-events: none;
64
+ }
65
+
66
+ .tab[data-active] {
67
+ color: var(--color-text-primary);
68
+ font-weight: var(--font-weight-medium);
69
+ border-bottom-color: var(--color-accent);
70
+ }
71
+
72
+ .tab[data-disabled] {
73
+ opacity: 0.44;
74
+ cursor: not-allowed;
75
+ }
76
+
77
+ /* ─── Tab panel ─────────────────────────────────────── */
78
+ .panel {
79
+ padding-top: var(--space-4);
80
+ outline: none;
81
+ transition: opacity 150ms var(--easing-ease-out);
82
+ }
83
+
84
+ .panel[data-starting-style] {
85
+ opacity: 0;
86
+ }
87
+
88
+ .panel:focus-visible {
89
+ box-shadow: var(--shadow-focus);
90
+ border-radius: var(--radius-sm);
91
+ }
92
+ }
@@ -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,252 @@
1
+ @layer theme, base, components, utilities;
2
+
3
+ @layer components {
4
+ /* ─── Viewport ───────────────────────────────────────────────────── */
5
+
6
+ .viewport {
7
+ position: fixed;
8
+ bottom: var(--space-4);
9
+ right: var(--space-4);
10
+ z-index: var(--z-toast);
11
+ display: flex;
12
+ flex-direction: column;
13
+ width: 360px;
14
+ max-width: calc(100vw - var(--space-8));
15
+ list-style: none;
16
+ pointer-events: none;
17
+ outline: none;
18
+ }
19
+
20
+ /* List variant — toasts sit in a normal column */
21
+ .viewport-list {
22
+ gap: var(--space-2);
23
+ }
24
+
25
+ /* Stacked variant — toasts overlap; viewport height = frontmost toast */
26
+ .viewport-stacked {
27
+ gap: 0;
28
+ }
29
+
30
+ /* ─── Toast base ─────────────────────────────────────────────────── */
31
+
32
+ .toast {
33
+ display: flex;
34
+ align-items: flex-start;
35
+ gap: var(--space-3);
36
+ padding: var(--space-3) var(--space-4);
37
+ background-color: var(--color-bg-overlay);
38
+ border: var(--border-width-base) solid var(--color-border-base);
39
+ border-radius: var(--radius-xl);
40
+ box-shadow: var(--shadow-popover);
41
+ pointer-events: auto;
42
+ cursor: default;
43
+ width: 100%;
44
+ }
45
+
46
+ @supports (backdrop-filter: blur(12px)) {
47
+ .toast {
48
+ backdrop-filter: blur(12px) saturate(1.5);
49
+ -webkit-backdrop-filter: blur(12px) saturate(1.5);
50
+ }
51
+ }
52
+
53
+ /* ─── List mode animations ───────────────────────────────────────── */
54
+
55
+ .viewport-list .toast {
56
+ transform-origin: bottom right;
57
+ opacity: 1;
58
+ transform: translateX(0);
59
+ transition:
60
+ opacity 300ms var(--easing-ease-out),
61
+ transform 300ms var(--easing-spring);
62
+
63
+ @starting-style {
64
+ opacity: 0;
65
+ transform: translateX(calc(100% + var(--space-4)));
66
+ }
67
+ }
68
+
69
+ .viewport-list .toast[data-ending-style] {
70
+ opacity: 0;
71
+ transform: translateX(calc(100% + var(--space-4)));
72
+ transition:
73
+ opacity 200ms var(--easing-ease-in),
74
+ transform 200ms var(--easing-ease-in);
75
+ }
76
+
77
+ /* ─── Stacked mode ───────────────────────────────────────────────── */
78
+
79
+ /*
80
+ * Base UI provides on each toast root (as inline styles):
81
+ * --toast-index : plain integer, 0 = frontmost/newest
82
+ * --toast-offset-y: "Npx" — cumulative height of all toasts above
83
+ * --toast-height : "Npx" — this toast's measured height
84
+ *
85
+ * Base UI provides on the viewport:
86
+ * --toast-frontmost-height: "Npx" — height of index-0 toast
87
+ *
88
+ * Collapsed: toasts sit at bottom:0, stacked via scale+translate.
89
+ * Expanded (data-expanded): each toast moves to its offset position.
90
+ */
91
+
92
+ .viewport-stacked {
93
+ height: calc(var(--toast-frontmost-height, 64px) + 20px);
94
+ padding-top: 20px;
95
+ box-sizing: content-box;
96
+ clip-path: inset(0 0 0 0 round var(--radius-xl));
97
+ transition:
98
+ clip-path 200ms var(--easing-ease-out),
99
+ height 200ms var(--easing-ease-out);
100
+ }
101
+
102
+ .viewport-stacked[data-expanded] {
103
+ clip-path: inset(-9999px 0 0 0 round var(--radius-xl));
104
+ height: calc(var(--toast-frontmost-height, 64px) + 20px);
105
+ }
106
+
107
+ /* Fill the gaps between expanded toasts so the mouse doesn't leave
108
+ the viewport as it moves between them, which would collapse the stack */
109
+ .viewport-stacked[data-expanded]::after {
110
+ content: "";
111
+ position: absolute;
112
+ inset: -9999px 0 0 0;
113
+ pointer-events: auto;
114
+ z-index: 0;
115
+ }
116
+
117
+ .toast-stacked {
118
+ position: absolute;
119
+ bottom: 0;
120
+ left: 0;
121
+ right: 0;
122
+
123
+ z-index: calc(50 - var(--toast-index));
124
+
125
+ transform: translateY(calc(var(--toast-index) * -8px)) scale(calc(1 - var(--toast-index) * 0.04));
126
+ transform-origin: bottom center;
127
+ opacity: calc(1 - var(--toast-index) * 0.15);
128
+
129
+ transition:
130
+ transform 200ms var(--easing-ease-out),
131
+ opacity 200ms var(--easing-ease-out);
132
+ }
133
+
134
+ /* Expanded: each toast animates to its stacked position with a gap */
135
+ .viewport-stacked[data-expanded] .toast-stacked {
136
+ transform: translateY(calc((var(--toast-offset-y) + var(--toast-index) * 8px) * -1));
137
+ opacity: 1;
138
+ pointer-events: auto;
139
+ }
140
+
141
+ /* Enter: new toast slides up from below */
142
+ .viewport-stacked .toast-stacked {
143
+ @starting-style {
144
+ opacity: 0;
145
+ transform: translateY(16px) scale(calc(1 - var(--toast-index) * 0.04));
146
+ }
147
+ }
148
+
149
+ /* Exit: dismissed toast slides right */
150
+ .viewport-stacked .toast-stacked[data-ending-style] {
151
+ opacity: 0;
152
+ transform: translateX(calc(100% + var(--space-4)));
153
+ transition:
154
+ opacity 150ms var(--easing-ease-in),
155
+ transform 150ms var(--easing-ease-in);
156
+ }
157
+
158
+ /* ─── Variant tints ──────────────────────────────────────────────── */
159
+
160
+ .toast-success {
161
+ background-color: color-mix(in srgb, var(--color-success-solid) 6%, var(--color-bg-overlay));
162
+ }
163
+
164
+ .toast-error {
165
+ background-color: color-mix(in srgb, var(--color-error-solid) 6%, var(--color-bg-overlay));
166
+ }
167
+
168
+ .toast-warning {
169
+ background-color: color-mix(in srgb, var(--color-warning-solid) 6%, var(--color-bg-overlay));
170
+ }
171
+
172
+ .toast-info {
173
+ background-color: color-mix(in srgb, var(--color-info-solid) 6%, var(--color-bg-overlay));
174
+ }
175
+
176
+ /* ─── Icon ───────────────────────────────────────────────────────── */
177
+
178
+ .icon {
179
+ flex-shrink: 0;
180
+ width: 16px;
181
+ height: 16px;
182
+ margin-top: 1px;
183
+ }
184
+
185
+ .icon-success {
186
+ color: var(--color-success-solid);
187
+ }
188
+ .icon-warning {
189
+ color: var(--color-warning-solid);
190
+ }
191
+ .icon-error {
192
+ color: var(--color-error-solid);
193
+ }
194
+ .icon-info {
195
+ color: var(--color-info-solid);
196
+ }
197
+
198
+ /* ─── Content ────────────────────────────────────────────────────── */
199
+
200
+ .content {
201
+ flex: 1;
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: var(--space-0-5);
205
+ min-width: 0;
206
+ }
207
+
208
+ .title {
209
+ font-family: var(--font-mono);
210
+ font-size: var(--font-size-sm);
211
+ font-weight: var(--font-weight-medium);
212
+ color: var(--color-text-primary);
213
+ line-height: var(--line-height-normal);
214
+ }
215
+
216
+ .description {
217
+ font-family: var(--font-mono);
218
+ font-size: var(--font-size-xs);
219
+ color: var(--color-text-secondary);
220
+ line-height: var(--line-height-relaxed);
221
+ }
222
+
223
+ /* ─── Close button ───────────────────────────────────────────────── */
224
+
225
+ .close {
226
+ flex-shrink: 0;
227
+ width: 20px;
228
+ height: 20px;
229
+ border-radius: var(--radius-sm);
230
+ border: none;
231
+ background: transparent;
232
+ color: var(--color-text-tertiary);
233
+ cursor: pointer;
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ outline: none;
238
+ transition:
239
+ background-color var(--duration-fast) var(--easing-standard),
240
+ color var(--duration-fast) var(--easing-standard);
241
+ margin-top: 1px;
242
+ }
243
+
244
+ .close:hover {
245
+ background-color: var(--color-surface-hover);
246
+ color: var(--color-text-primary);
247
+ }
248
+
249
+ .close:focus-visible {
250
+ box-shadow: var(--shadow-focus);
251
+ }
252
+ }
@@ -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 };