@brijbyte/agentic-ui 0.0.4 → 0.0.5

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 (113) hide show
  1. package/README.md +151 -21
  2. package/dist/accordion/index.d.ts +2 -2
  3. package/dist/accordion/index.js +2 -2
  4. package/dist/accordion/parts.d.ts +6 -14
  5. package/dist/accordion/parts.d.ts.map +1 -1
  6. package/dist/accordion/parts.js +7 -6
  7. package/dist/accordion/parts.js.map +1 -1
  8. package/dist/alert-dialog/parts.d.ts +4 -12
  9. package/dist/alert-dialog/parts.d.ts.map +1 -1
  10. package/dist/alert-dialog/parts.js +17 -19
  11. package/dist/alert-dialog/parts.js.map +1 -1
  12. package/dist/checkbox/parts.d.ts +2 -5
  13. package/dist/checkbox/parts.d.ts.map +1 -1
  14. package/dist/checkbox/parts.js +3 -2
  15. package/dist/checkbox/parts.js.map +1 -1
  16. package/dist/collapsible/parts.d.ts +3 -9
  17. package/dist/collapsible/parts.d.ts.map +1 -1
  18. package/dist/collapsible/parts.js +7 -6
  19. package/dist/collapsible/parts.js.map +1 -1
  20. package/dist/context-menu/parts.d.ts +6 -18
  21. package/dist/context-menu/parts.d.ts.map +1 -1
  22. package/dist/context-menu/parts.js +16 -16
  23. package/dist/context-menu/parts.js.map +1 -1
  24. package/dist/dialog/parts.d.ts +6 -18
  25. package/dist/dialog/parts.d.ts.map +1 -1
  26. package/dist/dialog/parts.js +8 -9
  27. package/dist/dialog/parts.js.map +1 -1
  28. package/dist/drawer/parts.d.ts +7 -19
  29. package/dist/drawer/parts.d.ts.map +1 -1
  30. package/dist/drawer/parts.js +14 -13
  31. package/dist/drawer/parts.js.map +1 -1
  32. package/dist/index.css +1375 -1375
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.js +2 -2
  35. package/dist/menu/parts.d.ts +6 -18
  36. package/dist/menu/parts.d.ts.map +1 -1
  37. package/dist/menu/parts.js +7 -6
  38. package/dist/menu/parts.js.map +1 -1
  39. package/dist/meter/parts.d.ts +4 -10
  40. package/dist/meter/parts.d.ts.map +1 -1
  41. package/dist/meter/parts.js +5 -4
  42. package/dist/meter/parts.js.map +1 -1
  43. package/dist/number-field/parts.d.ts +6 -18
  44. package/dist/number-field/parts.d.ts.map +1 -1
  45. package/dist/number-field/parts.js +7 -6
  46. package/dist/number-field/parts.js.map +1 -1
  47. package/dist/popover/parts.d.ts +7 -21
  48. package/dist/popover/parts.d.ts.map +1 -1
  49. package/dist/popover/parts.js +8 -11
  50. package/dist/popover/parts.js.map +1 -1
  51. package/dist/progress/parts.d.ts +2 -4
  52. package/dist/progress/parts.d.ts.map +1 -1
  53. package/dist/progress/parts.js +3 -6
  54. package/dist/progress/parts.js.map +1 -1
  55. package/dist/radio/parts.d.ts +2 -6
  56. package/dist/radio/parts.d.ts.map +1 -1
  57. package/dist/radio/parts.js +3 -2
  58. package/dist/radio/parts.js.map +1 -1
  59. package/dist/radio-group/parts.d.ts +1 -3
  60. package/dist/radio-group/parts.d.ts.map +1 -1
  61. package/dist/radio-group/parts.js +2 -1
  62. package/dist/radio-group/parts.js.map +1 -1
  63. package/dist/reset-scoped.css +112 -0
  64. package/dist/select/parts.d.ts +11 -32
  65. package/dist/select/parts.d.ts.map +1 -1
  66. package/dist/select/parts.js +10 -9
  67. package/dist/select/parts.js.map +1 -1
  68. package/dist/slider/parts.d.ts +6 -18
  69. package/dist/slider/parts.d.ts.map +1 -1
  70. package/dist/slider/parts.js +7 -6
  71. package/dist/slider/parts.js.map +1 -1
  72. package/dist/switch/parts.d.ts +2 -6
  73. package/dist/switch/parts.d.ts.map +1 -1
  74. package/dist/switch/parts.js +3 -2
  75. package/dist/switch/parts.js.map +1 -1
  76. package/dist/tabs/parts.d.ts +3 -9
  77. package/dist/tabs/parts.d.ts.map +1 -1
  78. package/dist/tabs/parts.js +4 -3
  79. package/dist/tabs/parts.js.map +1 -1
  80. package/dist/toast/parts.d.ts +5 -15
  81. package/dist/toast/parts.d.ts.map +1 -1
  82. package/dist/toast/parts.js +6 -5
  83. package/dist/toast/parts.js.map +1 -1
  84. package/dist/tooltip/parts.d.ts +3 -9
  85. package/dist/tooltip/parts.d.ts.map +1 -1
  86. package/dist/tooltip/parts.js +4 -3
  87. package/dist/tooltip/parts.js.map +1 -1
  88. package/dist/utils/resolveClassName.js +25 -0
  89. package/dist/utils/resolveClassName.js.map +1 -0
  90. package/package.json +4 -3
  91. package/src/accordion/index.ts +1 -1
  92. package/src/accordion/parts.tsx +10 -17
  93. package/src/alert-dialog/parts.tsx +23 -31
  94. package/src/checkbox/parts.tsx +5 -7
  95. package/src/collapsible/parts.tsx +10 -15
  96. package/src/context-menu/parts.tsx +34 -34
  97. package/src/dialog/parts.tsx +14 -27
  98. package/src/drawer/parts.tsx +30 -38
  99. package/src/menu/parts.tsx +13 -24
  100. package/src/meter/parts.tsx +15 -14
  101. package/src/number-field/parts.tsx +33 -24
  102. package/src/popover/parts.tsx +17 -32
  103. package/src/progress/parts.tsx +13 -6
  104. package/src/radio/parts.tsx +7 -8
  105. package/src/radio-group/parts.tsx +3 -4
  106. package/src/select/parts.tsx +34 -41
  107. package/src/slider/parts.tsx +13 -24
  108. package/src/styles/reset-scoped.css +112 -0
  109. package/src/switch/parts.tsx +5 -8
  110. package/src/tabs/parts.tsx +7 -12
  111. package/src/toast/parts.tsx +11 -20
  112. package/src/tooltip/parts.tsx +7 -12
  113. package/src/utils/resolveClassName.ts +24 -0
@@ -4,43 +4,38 @@
4
4
  * @example
5
5
  * ```tsx
6
6
  * import { Collapsible } from '@base-ui/react/collapsible';
7
- * import { CollapsibleTrigger, CollapsiblePanel } from '@brijbyte/agentic-ui/collapsible';
7
+ * import { CollapsibleRoot, CollapsibleTrigger, CollapsiblePanel } from '@brijbyte/agentic-ui/collapsible';
8
8
  *
9
- * <Collapsible.Root>
9
+ * <CollapsibleRoot>
10
10
  * <CollapsibleTrigger>Toggle</CollapsibleTrigger>
11
11
  * <CollapsiblePanel>Content</CollapsiblePanel>
12
- * </Collapsible.Root>
12
+ * </CollapsibleRoot>
13
13
  * ```
14
14
  */
15
15
  import { forwardRef } from "react";
16
16
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
17
17
  import { Collapsible as BaseCollapsible } from "@base-ui/react/collapsible";
18
18
  import styles from "./collapsible.module.css";
19
+ import { resolveClassName, cx } from "../utils/resolveClassName";
19
20
 
20
21
  type BaseRootProps = ComponentPropsWithoutRef<typeof BaseCollapsible.Root>;
21
22
  type BaseTriggerProps = ComponentPropsWithoutRef<typeof BaseCollapsible.Trigger>;
22
23
  type BasePanelProps = ComponentPropsWithoutRef<typeof BaseCollapsible.Panel>;
23
24
 
24
- export interface CollapsibleRootProps extends Omit<BaseRootProps, "className"> {
25
- className?: string;
26
- }
27
- export interface CollapsibleTriggerProps extends Omit<BaseTriggerProps, "className"> {
28
- className?: string;
29
- }
30
- export interface CollapsiblePanelProps extends Omit<BasePanelProps, "className"> {
31
- className?: string;
32
- }
25
+ export interface CollapsibleRootProps extends BaseRootProps {}
26
+ export interface CollapsibleTriggerProps extends BaseTriggerProps {}
27
+ export interface CollapsiblePanelProps extends BasePanelProps {}
33
28
 
34
29
  export const CollapsibleRoot = forwardRef<ComponentRef<typeof BaseCollapsible.Root>, CollapsibleRootProps>(function CollapsibleRoot(
35
30
  { className, ...props },
36
31
  ref,
37
32
  ) {
38
- return <BaseCollapsible.Root ref={ref} className={`${styles.root} ${className ?? ""}`} {...props} />;
33
+ return <BaseCollapsible.Root ref={ref} className={(state) => cx(styles.root, resolveClassName(className, state))} {...props} />;
39
34
  });
40
35
 
41
36
  export const CollapsibleTrigger = forwardRef<ComponentRef<typeof BaseCollapsible.Trigger>, CollapsibleTriggerProps>(
42
37
  function CollapsibleTrigger({ className, ...props }, ref) {
43
- return <BaseCollapsible.Trigger ref={ref} className={`${styles.trigger} ${className ?? ""}`} {...props} />;
38
+ return <BaseCollapsible.Trigger ref={ref} className={(state) => cx(styles.trigger, resolveClassName(className, state))} {...props} />;
44
39
  },
45
40
  );
46
41
 
@@ -48,5 +43,5 @@ export const CollapsiblePanel = forwardRef<ComponentRef<typeof BaseCollapsible.P
48
43
  { className, ...props },
49
44
  ref,
50
45
  ) {
51
- return <BaseCollapsible.Panel ref={ref} className={`${styles.panel} ${className ?? ""}`} {...props} />;
46
+ return <BaseCollapsible.Panel ref={ref} className={(state) => cx(styles.panel, resolveClassName(className, state))} {...props} />;
52
47
  });
@@ -3,28 +3,28 @@
3
3
  *
4
4
  * @example
5
5
  * ```tsx
6
- * import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';
6
+ * import { ContextMenu } from '@base-ui/react/context-menu';
7
7
  * import { ContextMenuPopup, ContextMenuItem, ContextMenuSeparator } from '@brijbyte/agentic-ui/context-menu';
8
8
  *
9
- * <BaseContextMenu.Root>
10
- * <BaseContextMenu.Trigger render={<div>Right click me</div>} />
11
- * <BaseContextMenu.Portal>
12
- * <BaseContextMenu.Positioner>
9
+ * <ContextMenu.Root>
10
+ * <ContextMenu.Trigger render={<div>Right click me</div>} />
11
+ * <ContextMenu.Portal>
12
+ * <ContextMenu.Positioner>
13
13
  * <ContextMenuPopup>
14
- * <ContextMenuItem>Cut</ContextMenuItem>
15
- * <ContextMenuItem>Copy</ContextMenuItem>
14
+ * <ContextMenuItem>Action</ContextMenuItem>
16
15
  * <ContextMenuSeparator />
17
- * <ContextMenuItem>Paste</ContextMenuItem>
16
+ * <ContextMenuItem>Another</ContextMenuItem>
18
17
  * </ContextMenuPopup>
19
- * </BaseContextMenu.Positioner>
20
- * </BaseContextMenu.Portal>
21
- * </BaseContextMenu.Root>
18
+ * </ContextMenu.Positioner>
19
+ * </ContextMenu.Portal>
20
+ * </ContextMenu.Root>
22
21
  * ```
23
22
  */
24
23
  import { forwardRef } from "react";
25
24
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
26
25
  import { ContextMenu as BaseContextMenu } from "@base-ui/react/context-menu";
27
26
  import styles from "./context-menu.module.css";
27
+ import { resolveClassName, cx } from "../utils/resolveClassName";
28
28
 
29
29
  type BasePopupProps = ComponentPropsWithoutRef<typeof BaseContextMenu.Popup>;
30
30
  type BaseItemProps = ComponentPropsWithoutRef<typeof BaseContextMenu.Item>;
@@ -33,42 +33,32 @@ type BaseGroupProps = ComponentPropsWithoutRef<typeof BaseContextMenu.Group>;
33
33
  type BaseGroupLabelProps = ComponentPropsWithoutRef<typeof BaseContextMenu.GroupLabel>;
34
34
  type BaseSubmenuTriggerProps = ComponentPropsWithoutRef<typeof BaseContextMenu.SubmenuTrigger>;
35
35
 
36
- export interface ContextMenuPopupProps extends Omit<BasePopupProps, "className"> {
37
- className?: string;
38
- }
39
- export interface ContextMenuItemProps extends Omit<BaseItemProps, "className"> {
40
- className?: string;
41
- }
42
- export interface ContextMenuSeparatorProps extends Omit<BaseSeparatorProps, "className"> {
43
- className?: string;
44
- }
45
- export interface ContextMenuGroupProps extends Omit<BaseGroupProps, "className"> {
46
- className?: string;
47
- }
48
- export interface ContextMenuGroupLabelProps extends Omit<BaseGroupLabelProps, "className"> {
49
- className?: string;
50
- }
51
- export interface ContextMenuSubmenuTriggerProps extends Omit<BaseSubmenuTriggerProps, "className"> {
52
- className?: string;
53
- }
36
+ export interface ContextMenuPopupProps extends BasePopupProps {}
37
+ export interface ContextMenuItemProps extends BaseItemProps {}
38
+ export interface ContextMenuSeparatorProps extends BaseSeparatorProps {}
39
+ export interface ContextMenuGroupProps extends BaseGroupProps {}
40
+ export interface ContextMenuGroupLabelProps extends BaseGroupLabelProps {}
41
+ export interface ContextMenuSubmenuTriggerProps extends BaseSubmenuTriggerProps {}
54
42
 
55
43
  export const ContextMenuPopup = forwardRef<ComponentRef<typeof BaseContextMenu.Popup>, ContextMenuPopupProps>(function ContextMenuPopup(
56
44
  { className, ...props },
57
45
  ref,
58
46
  ) {
59
- return <BaseContextMenu.Popup ref={ref} className={`${styles.popup} ${className ?? ""}`} {...props} />;
47
+ return <BaseContextMenu.Popup ref={ref} className={(state) => cx(styles.popup, resolveClassName(className, state))} {...props} />;
60
48
  });
61
49
 
62
50
  export const ContextMenuItem = forwardRef<ComponentRef<typeof BaseContextMenu.Item>, ContextMenuItemProps>(function ContextMenuItem(
63
51
  { className, ...props },
64
52
  ref,
65
53
  ) {
66
- return <BaseContextMenu.Item ref={ref} className={`${styles.item} ${className ?? ""}`} {...props} />;
54
+ return <BaseContextMenu.Item ref={ref} className={(state) => cx(styles.item, resolveClassName(className, state))} {...props} />;
67
55
  });
68
56
 
69
57
  export const ContextMenuSeparator = forwardRef<ComponentRef<typeof BaseContextMenu.Separator>, ContextMenuSeparatorProps>(
70
58
  function ContextMenuSeparator({ className, ...props }, ref) {
71
- return <BaseContextMenu.Separator ref={ref} className={`${styles.separator} ${className ?? ""}`} {...props} />;
59
+ return (
60
+ <BaseContextMenu.Separator ref={ref} className={(state) => cx(styles.separator, resolveClassName(className, state))} {...props} />
61
+ );
72
62
  },
73
63
  );
74
64
 
@@ -81,14 +71,24 @@ export const ContextMenuGroup = forwardRef<ComponentRef<typeof BaseContextMenu.G
81
71
 
82
72
  export const ContextMenuGroupLabel = forwardRef<ComponentRef<typeof BaseContextMenu.GroupLabel>, ContextMenuGroupLabelProps>(
83
73
  function ContextMenuGroupLabel({ className, ...props }, ref) {
84
- return <BaseContextMenu.GroupLabel ref={ref} className={`${styles["group-label"]} ${className ?? ""}`} {...props} />;
74
+ return (
75
+ <BaseContextMenu.GroupLabel
76
+ ref={ref}
77
+ className={(state) => cx(styles["group-label"], resolveClassName(className, state))}
78
+ {...props}
79
+ />
80
+ );
85
81
  },
86
82
  );
87
83
 
88
84
  export const ContextMenuSubmenuTrigger = forwardRef<ComponentRef<typeof BaseContextMenu.SubmenuTrigger>, ContextMenuSubmenuTriggerProps>(
89
85
  function ContextMenuSubmenuTrigger({ className, children, ...props }, ref) {
90
86
  return (
91
- <BaseContextMenu.SubmenuTrigger ref={ref} className={`${styles["submenu-trigger"]} ${className ?? ""}`} {...props}>
87
+ <BaseContextMenu.SubmenuTrigger
88
+ ref={ref}
89
+ className={(state) => cx(styles["submenu-trigger"], resolveClassName(className, state))}
90
+ {...props}
91
+ >
92
92
  <span style={{ flex: 1 }}>{children}</span>
93
93
  <svg width="10" height="10" viewBox="0 0 10 10" fill="none" className={styles["submenu-icon"]}>
94
94
  <path d="M3.5 9L7.5 5L3.5 1" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Styled primitives for Dialog — each one wraps the corresponding @base-ui/react
3
- * Dialog part and pre-applies the agentic-ui CSS class. All base-ui props are
4
- * forwarded so you can compose these with a raw `Dialog.Root` / `Dialog.Trigger`.
2
+ * Styled primitives for Dialog.
5
3
  *
6
4
  * @example
7
5
  * ```tsx
@@ -26,6 +24,7 @@ import { forwardRef } from "react";
26
24
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
27
25
  import { Dialog as BaseDialog } from "@base-ui/react/dialog";
28
26
  import styles from "./dialog.module.css";
27
+ import { resolveClassName, cx } from "../utils/resolveClassName";
29
28
 
30
29
  type BaseBackdropProps = ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;
31
30
  type BaseViewportProps = ComponentPropsWithoutRef<typeof BaseDialog.Viewport>;
@@ -34,63 +33,51 @@ type BaseTitleProps = ComponentPropsWithoutRef<typeof BaseDialog.Title>;
34
33
  type BaseDescriptionProps = ComponentPropsWithoutRef<typeof BaseDialog.Description>;
35
34
  type BaseCloseProps = ComponentPropsWithoutRef<typeof BaseDialog.Close>;
36
35
 
37
- export interface DialogBackdropProps extends Omit<BaseBackdropProps, "className"> {
38
- className?: string;
39
- }
40
- export interface DialogViewportProps extends Omit<BaseViewportProps, "className"> {
41
- className?: string;
42
- }
43
- export interface DialogPopupProps extends Omit<BasePopupProps, "className"> {
44
- className?: string;
45
- }
46
- export interface DialogTitleProps extends Omit<BaseTitleProps, "className"> {
47
- className?: string;
48
- }
49
- export interface DialogDescriptionProps extends Omit<BaseDescriptionProps, "className"> {
50
- className?: string;
51
- }
52
- export interface DialogCloseProps extends Omit<BaseCloseProps, "className"> {
53
- className?: string;
54
- }
36
+ export interface DialogBackdropProps extends BaseBackdropProps {}
37
+ export interface DialogViewportProps extends BaseViewportProps {}
38
+ export interface DialogPopupProps extends BasePopupProps {}
39
+ export interface DialogTitleProps extends BaseTitleProps {}
40
+ export interface DialogDescriptionProps extends BaseDescriptionProps {}
41
+ export interface DialogCloseProps extends BaseCloseProps {}
55
42
 
56
43
  export const DialogBackdrop = forwardRef<ComponentRef<typeof BaseDialog.Backdrop>, DialogBackdropProps>(function DialogBackdrop(
57
44
  { className, ...props },
58
45
  ref,
59
46
  ) {
60
- return <BaseDialog.Backdrop ref={ref} className={`${styles.backdrop} ${className ?? ""}`} {...props} />;
47
+ return <BaseDialog.Backdrop ref={ref} className={(state) => cx(styles.backdrop, resolveClassName(className, state))} {...props} />;
61
48
  });
62
49
 
63
50
  export const DialogViewport = forwardRef<ComponentRef<typeof BaseDialog.Viewport>, DialogViewportProps>(function DialogViewport(
64
51
  { className, ...props },
65
52
  ref,
66
53
  ) {
67
- return <BaseDialog.Viewport ref={ref} className={`${styles.viewport ?? ""} ${className ?? ""}`} {...props} />;
54
+ return <BaseDialog.Viewport ref={ref} className={(state) => cx(styles.viewport ?? "", resolveClassName(className, state))} {...props} />;
68
55
  });
69
56
 
70
57
  export const DialogPopup = forwardRef<ComponentRef<typeof BaseDialog.Popup>, DialogPopupProps>(function DialogPopup(
71
58
  { className, ...props },
72
59
  ref,
73
60
  ) {
74
- return <BaseDialog.Popup ref={ref} className={`${styles.popup} ${className ?? ""}`} {...props} />;
61
+ return <BaseDialog.Popup ref={ref} className={(state) => cx(styles.popup, resolveClassName(className, state))} {...props} />;
75
62
  });
76
63
 
77
64
  export const DialogTitle = forwardRef<ComponentRef<typeof BaseDialog.Title>, DialogTitleProps>(function DialogTitle(
78
65
  { className, ...props },
79
66
  ref,
80
67
  ) {
81
- return <BaseDialog.Title ref={ref} className={`${styles.title} ${className ?? ""}`} {...props} />;
68
+ return <BaseDialog.Title ref={ref} className={(state) => cx(styles.title, resolveClassName(className, state))} {...props} />;
82
69
  });
83
70
 
84
71
  export const DialogDescription = forwardRef<ComponentRef<typeof BaseDialog.Description>, DialogDescriptionProps>(function DialogDescription(
85
72
  { className, ...props },
86
73
  ref,
87
74
  ) {
88
- return <BaseDialog.Description ref={ref} className={`${styles.description} ${className ?? ""}`} {...props} />;
75
+ return <BaseDialog.Description ref={ref} className={(state) => cx(styles.description, resolveClassName(className, state))} {...props} />;
89
76
  });
90
77
 
91
78
  export const DialogClose = forwardRef<ComponentRef<typeof BaseDialog.Close>, DialogCloseProps>(function DialogClose(
92
79
  { className, ...props },
93
80
  ref,
94
81
  ) {
95
- return <BaseDialog.Close ref={ref} className={`${styles.close} ${className ?? ""}`} {...props} />;
82
+ return <BaseDialog.Close ref={ref} className={(state) => cx(styles.close, resolveClassName(className, state))} {...props} />;
96
83
  });
@@ -31,8 +31,7 @@ import type { ComponentPropsWithoutRef } from "react";
31
31
  import { Drawer as BaseDrawer } from "@base-ui/react/drawer";
32
32
  import type { DrawerSide } from "./drawer";
33
33
  import styles from "./drawer.module.css";
34
-
35
- // ─── Base prop types ───────────────────────────────────────────────────────
34
+ import { resolveClassName, cx } from "../utils/resolveClassName";
36
35
 
37
36
  type BaseBackdropProps = ComponentPropsWithoutRef<typeof BaseDrawer.Backdrop>;
38
37
  type BaseViewportProps = ComponentPropsWithoutRef<typeof BaseDrawer.Viewport>;
@@ -42,73 +41,66 @@ type BaseTitleProps = ComponentPropsWithoutRef<typeof BaseDrawer.Title>;
42
41
  type BaseDescriptionProps = ComponentPropsWithoutRef<typeof BaseDrawer.Description>;
43
42
  type BaseCloseProps = ComponentPropsWithoutRef<typeof BaseDrawer.Close>;
44
43
 
45
- // ─── Exported prop types ───────────────────────────────────────────────────
46
-
47
- export interface DrawerBackdropProps extends Omit<BaseBackdropProps, "className"> {
48
- className?: string;
49
- }
50
- export interface DrawerViewportProps extends Omit<BaseViewportProps, "className"> {
51
- className?: string;
44
+ export interface DrawerBackdropProps extends BaseBackdropProps {}
45
+ export interface DrawerViewportProps extends BaseViewportProps {
52
46
  side?: DrawerSide;
53
47
  }
54
- export interface DrawerPopupProps extends Omit<BasePopupProps, "className"> {
55
- className?: string;
48
+ export interface DrawerPopupProps extends BasePopupProps {
56
49
  side?: DrawerSide;
57
50
  }
58
- export interface DrawerContentProps extends Omit<BaseContentProps, "className"> {
59
- className?: string;
60
- }
61
- export interface DrawerTitleProps extends Omit<BaseTitleProps, "className"> {
62
- className?: string;
63
- }
64
- export interface DrawerDescriptionProps extends Omit<BaseDescriptionProps, "className"> {
65
- className?: string;
66
- }
67
- export interface DrawerCloseProps extends Omit<BaseCloseProps, "className"> {
68
- className?: string;
69
- }
51
+ export interface DrawerContentProps extends BaseContentProps {}
52
+ export interface DrawerTitleProps extends BaseTitleProps {}
53
+ export interface DrawerDescriptionProps extends BaseDescriptionProps {}
54
+ export interface DrawerCloseProps extends BaseCloseProps {}
70
55
 
71
- // ─── Parts ────────────────────────────────────────────────────────────────
56
+ const POPUP_CLASS: Record<DrawerSide, string> = {
57
+ right: styles["popup-right"] as string,
58
+ left: styles["popup-left"] as string,
59
+ bottom: styles["popup-bottom"] as string,
60
+ top: styles["popup-top"] as string,
61
+ };
72
62
 
73
63
  export const DrawerBackdrop = forwardRef<HTMLDivElement, DrawerBackdropProps>(function DrawerBackdrop({ className, ...props }, ref) {
74
- return <BaseDrawer.Backdrop ref={ref} className={`${styles.backdrop} ${className ?? ""}`} {...props} />;
64
+ return <BaseDrawer.Backdrop ref={ref} className={(state) => cx(styles.backdrop, resolveClassName(className, state))} {...props} />;
75
65
  });
76
66
 
77
67
  export const DrawerViewport = forwardRef<HTMLDivElement, DrawerViewportProps>(function DrawerViewport(
78
68
  { className, side = "right", ...props },
79
69
  ref,
80
70
  ) {
81
- return <BaseDrawer.Viewport ref={ref} className={`${styles.viewport} ${className ?? ""}`} data-side={side} {...props} />;
71
+ return (
72
+ <BaseDrawer.Viewport
73
+ ref={ref}
74
+ className={(state) => cx(styles.viewport, resolveClassName(className, state))}
75
+ data-side={side}
76
+ {...props}
77
+ />
78
+ );
82
79
  });
83
80
 
84
- const POPUP_CLASS: Record<DrawerSide, string> = {
85
- right: styles["popup-right"] as string,
86
- left: styles["popup-left"] as string,
87
- bottom: styles["popup-bottom"] as string,
88
- top: styles["popup-top"] as string,
89
- };
90
-
91
81
  export const DrawerPopup = forwardRef<HTMLDivElement, DrawerPopupProps>(function DrawerPopup({ className, side = "right", ...props }, ref) {
92
- return <BaseDrawer.Popup ref={ref} className={`${styles.popup} ${POPUP_CLASS[side]} ${className ?? ""}`} {...props} />;
82
+ return (
83
+ <BaseDrawer.Popup ref={ref} className={(state) => cx(styles.popup, POPUP_CLASS[side], resolveClassName(className, state))} {...props} />
84
+ );
93
85
  });
94
86
 
95
87
  export const DrawerContent = forwardRef<HTMLDivElement, DrawerContentProps>(function DrawerContent({ className, ...props }, ref) {
96
- return <BaseDrawer.Content ref={ref} className={`${styles.content} ${className ?? ""}`} {...props} />;
88
+ return <BaseDrawer.Content ref={ref} className={(state) => cx(styles.content, resolveClassName(className, state))} {...props} />;
97
89
  });
98
90
 
99
91
  export const DrawerTitle = forwardRef<HTMLHeadingElement, DrawerTitleProps>(function DrawerTitle({ className, ...props }, ref) {
100
- return <BaseDrawer.Title ref={ref} className={`${styles.title} ${className ?? ""}`} {...props} />;
92
+ return <BaseDrawer.Title ref={ref} className={(state) => cx(styles.title, resolveClassName(className, state))} {...props} />;
101
93
  });
102
94
 
103
95
  export const DrawerDescription = forwardRef<HTMLParagraphElement, DrawerDescriptionProps>(function DrawerDescription(
104
96
  { className, ...props },
105
97
  ref,
106
98
  ) {
107
- return <BaseDrawer.Description ref={ref} className={`${styles.description} ${className ?? ""}`} {...props} />;
99
+ return <BaseDrawer.Description ref={ref} className={(state) => cx(styles.description, resolveClassName(className, state))} {...props} />;
108
100
  });
109
101
 
110
102
  export const DrawerClose = forwardRef<HTMLButtonElement, DrawerCloseProps>(function DrawerClose({ className, ...props }, ref) {
111
- return <BaseDrawer.Close ref={ref} className={`${styles.close} ${className ?? ""}`} {...props} />;
103
+ return <BaseDrawer.Close ref={ref} className={(state) => cx(styles.close, resolveClassName(className, state))} {...props} />;
112
104
  });
113
105
 
114
106
  /** A decorative drag handle bar. Place at the top of a bottom drawer or bottom of a top drawer. */
@@ -26,6 +26,7 @@ import { forwardRef } from "react";
26
26
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
27
27
  import { Menu as BaseMenu } from "@base-ui/react/menu";
28
28
  import styles from "./menu.module.css";
29
+ import { resolveClassName, cx } from "../utils/resolveClassName";
29
30
 
30
31
  type BasePositionerProps = ComponentPropsWithoutRef<typeof BaseMenu.Positioner>;
31
32
  type BasePopupProps = ComponentPropsWithoutRef<typeof BaseMenu.Popup>;
@@ -34,56 +35,44 @@ type BaseSeparatorProps = ComponentPropsWithoutRef<typeof BaseMenu.Separator>;
34
35
  type BaseGroupLabelProps = ComponentPropsWithoutRef<typeof BaseMenu.GroupLabel>;
35
36
  type BaseArrowProps = ComponentPropsWithoutRef<typeof BaseMenu.Arrow>;
36
37
 
37
- export interface MenuPositionerProps extends Omit<BasePositionerProps, "className"> {
38
- className?: string;
39
- }
40
- export interface MenuPopupProps extends Omit<BasePopupProps, "className"> {
41
- className?: string;
42
- }
43
- export interface MenuItemProps extends Omit<BaseItemProps, "className"> {
44
- className?: string;
45
- }
46
- export interface MenuSeparatorProps extends Omit<BaseSeparatorProps, "className"> {
47
- className?: string;
48
- }
49
- export interface MenuGroupLabelProps extends Omit<BaseGroupLabelProps, "className"> {
50
- className?: string;
51
- }
52
- export interface MenuArrowProps extends Omit<BaseArrowProps, "className"> {
53
- className?: string;
54
- }
38
+ export interface MenuPositionerProps extends BasePositionerProps {}
39
+ export interface MenuPopupProps extends BasePopupProps {}
40
+ export interface MenuItemProps extends BaseItemProps {}
41
+ export interface MenuSeparatorProps extends BaseSeparatorProps {}
42
+ export interface MenuGroupLabelProps extends BaseGroupLabelProps {}
43
+ export interface MenuArrowProps extends BaseArrowProps {}
55
44
 
56
45
  export const MenuPositioner = forwardRef<ComponentRef<typeof BaseMenu.Positioner>, MenuPositionerProps>(function MenuPositioner(
57
46
  { className, ...props },
58
47
  ref,
59
48
  ) {
60
- return <BaseMenu.Positioner ref={ref} className={`${styles.positioner} ${className ?? ""}`} {...props} />;
49
+ return <BaseMenu.Positioner ref={ref} className={(state) => cx(styles.positioner, resolveClassName(className, state))} {...props} />;
61
50
  });
62
51
 
63
52
  export const MenuPopup = forwardRef<ComponentRef<typeof BaseMenu.Popup>, MenuPopupProps>(function MenuPopup({ className, ...props }, ref) {
64
- return <BaseMenu.Popup ref={ref} className={`${styles.popup} ${className ?? ""}`} {...props} />;
53
+ return <BaseMenu.Popup ref={ref} className={(state) => cx(styles.popup, resolveClassName(className, state))} {...props} />;
65
54
  });
66
55
 
67
56
  export const MenuItem = forwardRef<ComponentRef<typeof BaseMenu.Item>, MenuItemProps>(function MenuItem({ className, ...props }, ref) {
68
- return <BaseMenu.Item ref={ref} className={`${styles.item} ${className ?? ""}`} {...props} />;
57
+ return <BaseMenu.Item ref={ref} className={(state) => cx(styles.item, resolveClassName(className, state))} {...props} />;
69
58
  });
70
59
 
71
60
  export const MenuSeparator = forwardRef<ComponentRef<typeof BaseMenu.Separator>, MenuSeparatorProps>(function MenuSeparator(
72
61
  { className, ...props },
73
62
  ref,
74
63
  ) {
75
- return <BaseMenu.Separator ref={ref} className={`${styles.separator} ${className ?? ""}`} {...props} />;
64
+ return <BaseMenu.Separator ref={ref} className={(state) => cx(styles.separator, resolveClassName(className, state))} {...props} />;
76
65
  });
77
66
 
78
67
  export const MenuGroupLabel = forwardRef<ComponentRef<typeof BaseMenu.GroupLabel>, MenuGroupLabelProps>(function MenuGroupLabel(
79
68
  { className, ...props },
80
69
  ref,
81
70
  ) {
82
- return <BaseMenu.GroupLabel ref={ref} className={`${styles["group-label"]} ${className ?? ""}`} {...props} />;
71
+ return <BaseMenu.GroupLabel ref={ref} className={(state) => cx(styles["group-label"], resolveClassName(className, state))} {...props} />;
83
72
  });
84
73
 
85
74
  export const MenuArrow = forwardRef<ComponentRef<typeof BaseMenu.Arrow>, MenuArrowProps>(function MenuArrow({ className, ...props }, ref) {
86
- return <BaseMenu.Arrow ref={ref} className={`${styles.arrow} ${className ?? ""}`} {...props} />;
75
+ return <BaseMenu.Arrow ref={ref} className={(state) => cx(styles.arrow, resolveClassName(className, state))} {...props} />;
87
76
  });
88
77
 
89
78
  /** Convenience class for keyboard shortcut hints inside a MenuItem. */
@@ -21,52 +21,53 @@ import { forwardRef } from "react";
21
21
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
22
22
  import { Meter as BaseMeter } from "@base-ui/react/meter";
23
23
  import styles from "./meter.module.css";
24
+ import { resolveClassName, cx } from "../utils/resolveClassName";
24
25
 
25
26
  type BaseTrackProps = ComponentPropsWithoutRef<typeof BaseMeter.Track>;
26
27
  type BaseIndicatorProps = ComponentPropsWithoutRef<typeof BaseMeter.Indicator>;
27
28
  type BaseLabelProps = ComponentPropsWithoutRef<typeof BaseMeter.Label>;
28
29
  type BaseValueProps = ComponentPropsWithoutRef<typeof BaseMeter.Value>;
29
30
 
30
- export interface MeterTrackProps extends Omit<BaseTrackProps, "className"> {
31
- className?: string;
31
+ export interface MeterTrackProps extends BaseTrackProps {
32
32
  size?: "sm" | "md" | "lg";
33
33
  }
34
- export interface MeterIndicatorProps extends Omit<BaseIndicatorProps, "className"> {
35
- className?: string;
34
+ export interface MeterIndicatorProps extends BaseIndicatorProps {
36
35
  /** Threshold state — controls fill colour. Set automatically by the high-level Meter wrapper. */
37
36
  "data-meter-state"?: "optimum" | "suboptimal" | "critical";
38
37
  }
39
- export interface MeterLabelProps extends Omit<BaseLabelProps, "className"> {
40
- className?: string;
41
- }
42
- export interface MeterValueProps extends Omit<BaseValueProps, "className"> {
43
- className?: string;
44
- }
38
+ export interface MeterLabelProps extends BaseLabelProps {}
39
+ export interface MeterValueProps extends BaseValueProps {}
45
40
 
46
41
  export const MeterTrack = forwardRef<ComponentRef<typeof BaseMeter.Track>, MeterTrackProps>(function MeterTrack(
47
42
  { className, size = "md", ...props },
48
43
  ref,
49
44
  ) {
50
- return <BaseMeter.Track ref={ref} className={`${styles.track} ${styles[`track-${size}`]} ${className ?? ""}`} {...props} />;
45
+ return (
46
+ <BaseMeter.Track
47
+ ref={ref}
48
+ className={(state) => cx(styles.track, styles[`track-${size}`], resolveClassName(className, state))}
49
+ {...props}
50
+ />
51
+ );
51
52
  });
52
53
 
53
54
  export const MeterIndicator = forwardRef<ComponentRef<typeof BaseMeter.Indicator>, MeterIndicatorProps>(function MeterIndicator(
54
55
  { className, ...props },
55
56
  ref,
56
57
  ) {
57
- return <BaseMeter.Indicator ref={ref} className={`${styles.indicator} ${className ?? ""}`} {...props} />;
58
+ return <BaseMeter.Indicator ref={ref} className={(state) => cx(styles.indicator, resolveClassName(className, state))} {...props} />;
58
59
  });
59
60
 
60
61
  export const MeterLabel = forwardRef<ComponentRef<typeof BaseMeter.Label>, MeterLabelProps>(function MeterLabel(
61
62
  { className, ...props },
62
63
  ref,
63
64
  ) {
64
- return <BaseMeter.Label ref={ref} className={`${styles.label} ${className ?? ""}`} {...props} />;
65
+ return <BaseMeter.Label ref={ref} className={(state) => cx(styles.label, resolveClassName(className, state))} {...props} />;
65
66
  });
66
67
 
67
68
  export const MeterValue = forwardRef<ComponentRef<typeof BaseMeter.Value>, MeterValueProps>(function MeterValue(
68
69
  { className, ...props },
69
70
  ref,
70
71
  ) {
71
- return <BaseMeter.Value ref={ref} className={`${styles.value} ${className ?? ""}`} {...props} />;
72
+ return <BaseMeter.Value ref={ref} className={(state) => cx(styles.value, resolveClassName(className, state))} {...props} />;
72
73
  });
@@ -25,6 +25,7 @@ import { forwardRef } from "react";
25
25
  import type { ComponentRef, ComponentPropsWithoutRef } from "react";
26
26
  import { NumberField as BaseNumberField } from "@base-ui/react/number-field";
27
27
  import styles from "./number-field.module.css";
28
+ import { resolveClassName, cx } from "../utils/resolveClassName";
28
29
 
29
30
  type BaseGroupProps = ComponentPropsWithoutRef<typeof BaseNumberField.Group>;
30
31
  type BaseInputProps = ComponentPropsWithoutRef<typeof BaseNumberField.Input>;
@@ -33,59 +34,67 @@ type BaseIncrementProps = ComponentPropsWithoutRef<typeof BaseNumberField.Increm
33
34
  type BaseScrubAreaProps = ComponentPropsWithoutRef<typeof BaseNumberField.ScrubArea>;
34
35
  type BaseScrubAreaCursorProps = ComponentPropsWithoutRef<typeof BaseNumberField.ScrubAreaCursor>;
35
36
 
36
- export interface NumberFieldGroupProps extends Omit<BaseGroupProps, "className"> {
37
- className?: string;
38
- }
39
- export interface NumberFieldInputProps extends Omit<BaseInputProps, "className"> {
40
- className?: string;
41
- }
42
- export interface NumberFieldDecrementProps extends Omit<BaseDecrementProps, "className"> {
43
- className?: string;
44
- }
45
- export interface NumberFieldIncrementProps extends Omit<BaseIncrementProps, "className"> {
46
- className?: string;
47
- }
48
- export interface NumberFieldScrubAreaProps extends Omit<BaseScrubAreaProps, "className"> {
49
- className?: string;
50
- }
51
- export interface NumberFieldScrubAreaCursorProps extends Omit<BaseScrubAreaCursorProps, "className"> {
52
- className?: string;
53
- }
37
+ export interface NumberFieldGroupProps extends BaseGroupProps {}
38
+ export interface NumberFieldInputProps extends BaseInputProps {}
39
+ export interface NumberFieldDecrementProps extends BaseDecrementProps {}
40
+ export interface NumberFieldIncrementProps extends BaseIncrementProps {}
41
+ export interface NumberFieldScrubAreaProps extends BaseScrubAreaProps {}
42
+ export interface NumberFieldScrubAreaCursorProps extends BaseScrubAreaCursorProps {}
54
43
 
55
44
  export const NumberFieldGroup = forwardRef<ComponentRef<typeof BaseNumberField.Group>, NumberFieldGroupProps>(function NumberFieldGroup(
56
45
  { className, ...props },
57
46
  ref,
58
47
  ) {
59
- return <BaseNumberField.Group ref={ref} className={`${styles.group} ${className ?? ""}`} {...props} />;
48
+ return <BaseNumberField.Group ref={ref} className={(state) => cx(styles.group, resolveClassName(className, state))} {...props} />;
60
49
  });
61
50
 
62
51
  export const NumberFieldInput = forwardRef<ComponentRef<typeof BaseNumberField.Input>, NumberFieldInputProps>(function NumberFieldInput(
63
52
  { className, ...props },
64
53
  ref,
65
54
  ) {
66
- return <BaseNumberField.Input ref={ref} className={`${styles.input} ${className ?? ""}`} {...props} />;
55
+ return <BaseNumberField.Input ref={ref} className={(state) => cx(styles.input, resolveClassName(className, state))} {...props} />;
67
56
  });
68
57
 
69
58
  export const NumberFieldDecrement = forwardRef<ComponentRef<typeof BaseNumberField.Decrement>, NumberFieldDecrementProps>(
70
59
  function NumberFieldDecrement({ className, ...props }, ref) {
71
- return <BaseNumberField.Decrement ref={ref} className={`${styles["step-button"]} ${styles.decrement} ${className ?? ""}`} {...props} />;
60
+ return (
61
+ <BaseNumberField.Decrement
62
+ ref={ref}
63
+ className={(state) => cx(styles["step-button"], styles.decrement, resolveClassName(className, state))}
64
+ {...props}
65
+ />
66
+ );
72
67
  },
73
68
  );
74
69
 
75
70
  export const NumberFieldIncrement = forwardRef<ComponentRef<typeof BaseNumberField.Increment>, NumberFieldIncrementProps>(
76
71
  function NumberFieldIncrement({ className, ...props }, ref) {
77
- return <BaseNumberField.Increment ref={ref} className={`${styles["step-button"]} ${styles.increment} ${className ?? ""}`} {...props} />;
72
+ return (
73
+ <BaseNumberField.Increment
74
+ ref={ref}
75
+ className={(state) => cx(styles["step-button"], styles.increment, resolveClassName(className, state))}
76
+ {...props}
77
+ />
78
+ );
78
79
  },
79
80
  );
80
81
 
81
82
  export const NumberFieldScrubArea = forwardRef<ComponentRef<typeof BaseNumberField.ScrubArea>, NumberFieldScrubAreaProps>(
82
83
  function NumberFieldScrubArea({ className, ...props }, ref) {
83
- return <BaseNumberField.ScrubArea ref={ref} className={`${styles["scrub-area"]} ${className ?? ""}`} {...props} />;
84
+ return (
85
+ <BaseNumberField.ScrubArea ref={ref} className={(state) => cx(styles["scrub-area"], resolveClassName(className, state))} {...props} />
86
+ );
84
87
  },
85
88
  );
86
89
 
87
90
  export const NumberFieldScrubAreaCursor = forwardRef<ComponentRef<typeof BaseNumberField.ScrubAreaCursor>, NumberFieldScrubAreaCursorProps>(
88
91
  function NumberFieldScrubAreaCursor({ className, ...props }, ref) {
89
- return <BaseNumberField.ScrubAreaCursor ref={ref} className={`${styles["scrub-area-cursor"]} ${className ?? ""}`} {...props} />;
92
+ return (
93
+ <BaseNumberField.ScrubAreaCursor
94
+ ref={ref}
95
+ className={(state) => cx(styles["scrub-area-cursor"], resolveClassName(className, state))}
96
+ {...props}
97
+ />
98
+ );
90
99
  },
91
100
  );