@brijbyte/agentic-ui 0.0.3 → 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.
- package/README.md +280 -53
- package/dist/accordion/accordion.d.ts +14 -0
- package/dist/accordion/accordion.d.ts.map +1 -1
- package/dist/accordion/accordion.js +5 -0
- package/dist/accordion/accordion.js.map +1 -1
- package/dist/accordion/index.d.ts +2 -2
- package/dist/accordion/index.js +2 -2
- package/dist/accordion/parts.d.ts +6 -14
- package/dist/accordion/parts.d.ts.map +1 -1
- package/dist/accordion/parts.js +7 -6
- package/dist/accordion/parts.js.map +1 -1
- package/dist/alert-dialog/alert-dialog.d.ts +11 -0
- package/dist/alert-dialog/alert-dialog.d.ts.map +1 -1
- package/dist/alert-dialog/alert-dialog.js +5 -0
- package/dist/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/alert-dialog/parts.d.ts +4 -12
- package/dist/alert-dialog/parts.d.ts.map +1 -1
- package/dist/alert-dialog/parts.js +17 -19
- package/dist/alert-dialog/parts.js.map +1 -1
- package/dist/badge/badge.d.ts +6 -0
- package/dist/badge/badge.d.ts.map +1 -1
- package/dist/badge/badge.js +4 -0
- package/dist/badge/badge.js.map +1 -1
- package/dist/button/button.d.ts +12 -1
- package/dist/button/button.d.ts.map +1 -1
- package/dist/button/button.js +5 -0
- package/dist/button/button.js.map +1 -1
- package/dist/card/card.d.ts +10 -0
- package/dist/card/card.d.ts.map +1 -1
- package/dist/card/card.js +7 -0
- package/dist/card/card.js.map +1 -1
- package/dist/checkbox/checkbox.d.ts +13 -0
- package/dist/checkbox/checkbox.d.ts.map +1 -1
- package/dist/checkbox/checkbox.js +4 -0
- package/dist/checkbox/checkbox.js.map +1 -1
- package/dist/checkbox/parts.d.ts +2 -5
- package/dist/checkbox/parts.d.ts.map +1 -1
- package/dist/checkbox/parts.js +3 -2
- package/dist/checkbox/parts.js.map +1 -1
- package/dist/collapsible/collapsible.d.ts +11 -0
- package/dist/collapsible/collapsible.d.ts.map +1 -1
- package/dist/collapsible/collapsible.js +5 -0
- package/dist/collapsible/collapsible.js.map +1 -1
- package/dist/collapsible/parts.d.ts +3 -9
- package/dist/collapsible/parts.d.ts.map +1 -1
- package/dist/collapsible/parts.js +7 -6
- package/dist/collapsible/parts.js.map +1 -1
- package/dist/context-menu/context-menu.d.ts +5 -0
- package/dist/context-menu/context-menu.d.ts.map +1 -1
- package/dist/context-menu/context-menu.js +4 -0
- package/dist/context-menu/context-menu.js.map +1 -1
- package/dist/context-menu/parts.d.ts +6 -18
- package/dist/context-menu/parts.d.ts.map +1 -1
- package/dist/context-menu/parts.js +16 -16
- package/dist/context-menu/parts.js.map +1 -1
- package/dist/dialog/dialog.d.ts +13 -1
- package/dist/dialog/dialog.d.ts.map +1 -1
- package/dist/dialog/dialog.js +6 -0
- package/dist/dialog/dialog.js.map +1 -1
- package/dist/dialog/parts.d.ts +6 -18
- package/dist/dialog/parts.d.ts.map +1 -1
- package/dist/dialog/parts.js +8 -9
- package/dist/dialog/parts.js.map +1 -1
- package/dist/drawer/drawer.d.ts +11 -0
- package/dist/drawer/drawer.d.ts.map +1 -1
- package/dist/drawer/drawer.js +5 -0
- package/dist/drawer/drawer.js.map +1 -1
- package/dist/drawer/parts.d.ts +7 -19
- package/dist/drawer/parts.d.ts.map +1 -1
- package/dist/drawer/parts.js +14 -13
- package/dist/drawer/parts.js.map +1 -1
- package/dist/index.css +1580 -1150
- package/dist/index.d.ts +20 -11
- package/dist/index.js +15 -2
- package/dist/input/input.d.ts +8 -0
- package/dist/input/input.d.ts.map +1 -1
- package/dist/input/input.js +5 -0
- package/dist/input/input.js.map +1 -1
- package/dist/menu/menu.css +3 -8
- package/dist/menu/menu.d.ts +11 -4
- package/dist/menu/menu.d.ts.map +1 -1
- package/dist/menu/menu.js +10 -24
- package/dist/menu/menu.js.map +1 -1
- package/dist/menu/menu.module.js +1 -1
- package/dist/menu/menu.module.js.map +1 -1
- package/dist/menu/parts.d.ts +6 -18
- package/dist/menu/parts.d.ts.map +1 -1
- package/dist/menu/parts.js +7 -6
- package/dist/menu/parts.js.map +1 -1
- package/dist/meter/circular-meter.d.ts +48 -0
- package/dist/meter/circular-meter.d.ts.map +1 -0
- package/dist/meter/circular-meter.js +86 -0
- package/dist/meter/circular-meter.js.map +1 -0
- package/dist/meter/index.d.ts +4 -0
- package/dist/meter/index.js +5 -0
- package/dist/meter/meter.css +152 -0
- package/dist/meter/meter.d.ts +58 -0
- package/dist/meter/meter.d.ts.map +1 -0
- package/dist/meter/meter.js +50 -0
- package/dist/meter/meter.js.map +1 -0
- package/dist/meter/meter.module.css.d.ts +2 -0
- package/dist/meter/meter.module.js +27 -0
- package/dist/meter/meter.module.js.map +1 -0
- package/dist/meter/meterState.js +18 -0
- package/dist/meter/meterState.js.map +1 -0
- package/dist/meter/parts.d.ts +25 -0
- package/dist/meter/parts.d.ts.map +1 -0
- package/dist/meter/parts.js +57 -0
- package/dist/meter/parts.js.map +1 -0
- package/dist/number-field/number-field.d.ts +16 -0
- package/dist/number-field/number-field.d.ts.map +1 -1
- package/dist/number-field/number-field.js +4 -0
- package/dist/number-field/number-field.js.map +1 -1
- package/dist/number-field/parts.d.ts +6 -18
- package/dist/number-field/parts.d.ts.map +1 -1
- package/dist/number-field/parts.js +7 -6
- package/dist/number-field/parts.js.map +1 -1
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +4 -0
- package/dist/popover/parts.d.ts +29 -0
- package/dist/popover/parts.d.ts.map +1 -0
- package/dist/popover/parts.js +93 -0
- package/dist/popover/parts.js.map +1 -0
- package/dist/popover/popover.css +173 -0
- package/dist/popover/popover.d.ts +49 -0
- package/dist/popover/popover.d.ts.map +1 -0
- package/dist/popover/popover.js +68 -0
- package/dist/popover/popover.js.map +1 -0
- package/dist/popover/popover.module.css.d.ts +2 -0
- package/dist/popover/popover.module.js +16 -0
- package/dist/popover/popover.module.js.map +1 -0
- package/dist/progress/parts.d.ts +2 -4
- package/dist/progress/parts.d.ts.map +1 -1
- package/dist/progress/parts.js +3 -6
- package/dist/progress/parts.js.map +1 -1
- package/dist/progress/progress.d.ts +11 -0
- package/dist/progress/progress.d.ts.map +1 -1
- package/dist/progress/progress.js +5 -0
- package/dist/progress/progress.js.map +1 -1
- package/dist/radio/index.d.ts +3 -0
- package/dist/radio/index.js +4 -0
- package/dist/radio/parts.d.ts +14 -0
- package/dist/radio/parts.d.ts.map +1 -0
- package/dist/radio/parts.js +43 -0
- package/dist/radio/parts.js.map +1 -0
- package/dist/radio/radio.css +84 -0
- package/dist/radio/radio.d.ts +31 -0
- package/dist/radio/radio.d.ts.map +1 -0
- package/dist/radio/radio.js +33 -0
- package/dist/radio/radio.js.map +1 -0
- package/dist/radio/radio.module.css.d.ts +2 -0
- package/dist/radio/radio.module.js +11 -0
- package/dist/radio/radio.module.js.map +1 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +4 -0
- package/dist/radio-group/parts.d.ts +11 -0
- package/dist/radio-group/parts.d.ts.map +1 -0
- package/dist/radio-group/parts.js +32 -0
- package/dist/radio-group/parts.js.map +1 -0
- package/dist/radio-group/radio-group.css +17 -0
- package/dist/radio-group/radio-group.d.ts +37 -0
- package/dist/radio-group/radio-group.d.ts.map +1 -0
- package/dist/radio-group/radio-group.js +28 -0
- package/dist/radio-group/radio-group.js.map +1 -0
- package/dist/radio-group/radio-group.module.css.d.ts +2 -0
- package/dist/radio-group/radio-group.module.js +9 -0
- package/dist/radio-group/radio-group.module.js.map +1 -0
- package/dist/reset-scoped.css +112 -0
- package/dist/select/parts.d.ts +11 -32
- package/dist/select/parts.d.ts.map +1 -1
- package/dist/select/parts.js +10 -9
- package/dist/select/parts.js.map +1 -1
- package/dist/select/select.d.ts +14 -1
- package/dist/select/select.d.ts.map +1 -1
- package/dist/select/select.js +4 -0
- package/dist/select/select.js.map +1 -1
- package/dist/separator/separator.d.ts +4 -0
- package/dist/separator/separator.d.ts.map +1 -1
- package/dist/separator/separator.js +4 -0
- package/dist/separator/separator.js.map +1 -1
- package/dist/shared/PopupArrow.js +22 -0
- package/dist/shared/PopupArrow.js.map +1 -0
- package/dist/slider/parts.d.ts +6 -18
- package/dist/slider/parts.d.ts.map +1 -1
- package/dist/slider/parts.js +7 -6
- package/dist/slider/parts.js.map +1 -1
- package/dist/slider/slider.d.ts +18 -0
- package/dist/slider/slider.d.ts.map +1 -1
- package/dist/slider/slider.js +6 -0
- package/dist/slider/slider.js.map +1 -1
- package/dist/switch/parts.d.ts +2 -6
- package/dist/switch/parts.d.ts.map +1 -1
- package/dist/switch/parts.js +3 -2
- package/dist/switch/parts.js.map +1 -1
- package/dist/switch/switch.css +11 -2
- package/dist/switch/switch.d.ts +12 -0
- package/dist/switch/switch.d.ts.map +1 -1
- package/dist/switch/switch.js +4 -0
- package/dist/switch/switch.js.map +1 -1
- package/dist/switch/switch.module.js.map +1 -1
- package/dist/tabs/parts.d.ts +3 -9
- package/dist/tabs/parts.d.ts.map +1 -1
- package/dist/tabs/parts.js +4 -3
- package/dist/tabs/parts.js.map +1 -1
- package/dist/tabs/tabs.d.ts +8 -1
- package/dist/tabs/tabs.d.ts.map +1 -1
- package/dist/tabs/tabs.js +4 -0
- package/dist/tabs/tabs.js.map +1 -1
- package/dist/toast/parts.d.ts +5 -15
- package/dist/toast/parts.d.ts.map +1 -1
- package/dist/toast/parts.js +6 -5
- package/dist/toast/parts.js.map +1 -1
- package/dist/toast/toast.d.ts +11 -0
- package/dist/toast/toast.d.ts.map +1 -1
- package/dist/toast/toast.js +8 -0
- package/dist/toast/toast.js.map +1 -1
- package/dist/tooltip/parts.d.ts +3 -9
- package/dist/tooltip/parts.d.ts.map +1 -1
- package/dist/tooltip/parts.js +4 -3
- package/dist/tooltip/parts.js.map +1 -1
- package/dist/tooltip/tooltip.d.ts +9 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -1
- package/dist/tooltip/tooltip.js +4 -0
- package/dist/tooltip/tooltip.js.map +1 -1
- package/dist/utils/resolveClassName.js +25 -0
- package/dist/utils/resolveClassName.js.map +1 -0
- package/package.json +25 -4
- package/src/accordion/accordion.tsx +14 -0
- package/src/accordion/index.ts +1 -1
- package/src/accordion/parts.tsx +10 -17
- package/src/alert-dialog/alert-dialog.tsx +11 -0
- package/src/alert-dialog/parts.tsx +23 -31
- package/src/badge/badge.tsx +6 -0
- package/src/button/button.tsx +12 -1
- package/src/card/card.tsx +10 -0
- package/src/checkbox/checkbox.tsx +13 -0
- package/src/checkbox/parts.tsx +5 -7
- package/src/collapsible/collapsible.tsx +11 -0
- package/src/collapsible/parts.tsx +10 -15
- package/src/context-menu/context-menu.tsx +5 -0
- package/src/context-menu/parts.tsx +34 -34
- package/src/dialog/dialog.tsx +13 -1
- package/src/dialog/parts.tsx +14 -27
- package/src/drawer/drawer.tsx +11 -0
- package/src/drawer/parts.tsx +30 -38
- package/src/index.ts +4 -0
- package/src/input/input.tsx +8 -0
- package/src/menu/menu.module.css +3 -10
- package/src/menu/menu.tsx +13 -26
- package/src/menu/parts.tsx +13 -24
- package/src/meter/circular-meter.tsx +114 -0
- package/src/meter/index.ts +9 -0
- package/src/meter/meter.module.css +162 -0
- package/src/meter/meter.tsx +86 -0
- package/src/meter/meterState.ts +29 -0
- package/src/meter/parts.tsx +73 -0
- package/src/number-field/number-field.tsx +16 -0
- package/src/number-field/parts.tsx +33 -24
- package/src/popover/index.ts +14 -0
- package/src/popover/parts.tsx +105 -0
- package/src/popover/popover.module.css +189 -0
- package/src/popover/popover.tsx +80 -0
- package/src/progress/parts.tsx +13 -6
- package/src/progress/progress.tsx +11 -0
- package/src/radio/index.ts +6 -0
- package/src/radio/parts.tsx +42 -0
- package/src/radio/radio.module.css +96 -0
- package/src/radio/radio.tsx +37 -0
- package/src/radio-group/index.ts +5 -0
- package/src/radio-group/parts.tsx +31 -0
- package/src/radio-group/radio-group.module.css +17 -0
- package/src/radio-group/radio-group.tsx +63 -0
- package/src/select/parts.tsx +34 -41
- package/src/select/select.tsx +14 -1
- package/src/separator/separator.tsx +4 -0
- package/src/shared/PopupArrow.tsx +41 -0
- package/src/slider/parts.tsx +13 -24
- package/src/slider/slider.tsx +18 -0
- package/src/styles/reset-scoped.css +112 -0
- package/src/switch/parts.tsx +5 -8
- package/src/switch/switch.module.css +11 -2
- package/src/switch/switch.tsx +12 -0
- package/src/tabs/parts.tsx +7 -12
- package/src/tabs/tabs.tsx +8 -1
- package/src/toast/parts.tsx +11 -20
- package/src/toast/toast.tsx +11 -0
- package/src/tooltip/parts.tsx +7 -12
- package/src/tooltip/tooltip.tsx +9 -0
- package/src/utils/resolveClassName.ts +24 -0
|
@@ -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
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
export interface
|
|
40
|
-
|
|
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={
|
|
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={
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { Popover } from "./popover";
|
|
2
|
+
export type { PopoverProps } from "./popover";
|
|
3
|
+
export { PopoverStyles } from "./popover";
|
|
4
|
+
|
|
5
|
+
export { PopoverPositioner, PopoverPopup, PopoverTitle, PopoverDescription, PopoverClose, PopoverArrow, PopoverViewport } from "./parts";
|
|
6
|
+
export type {
|
|
7
|
+
PopoverPositionerProps,
|
|
8
|
+
PopoverPopupProps,
|
|
9
|
+
PopoverTitleProps,
|
|
10
|
+
PopoverDescriptionProps,
|
|
11
|
+
PopoverCloseProps,
|
|
12
|
+
PopoverArrowProps,
|
|
13
|
+
PopoverViewportProps,
|
|
14
|
+
} from "./parts";
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styled primitives for Popover.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { Popover } from '@base-ui/react/popover';
|
|
7
|
+
* import {
|
|
8
|
+
* PopoverPopup,
|
|
9
|
+
* PopoverTitle,
|
|
10
|
+
* PopoverDescription,
|
|
11
|
+
* PopoverClose,
|
|
12
|
+
* PopoverArrow,
|
|
13
|
+
* } from '@brijbyte/agentic-ui/popover';
|
|
14
|
+
*
|
|
15
|
+
* <Popover.Root>
|
|
16
|
+
* <Popover.Trigger render={<button>Open</button>} />
|
|
17
|
+
* <Popover.Portal>
|
|
18
|
+
* <Popover.Positioner side="bottom" sideOffset={8}>
|
|
19
|
+
* <PopoverPopup>
|
|
20
|
+
* <PopoverArrow />
|
|
21
|
+
* <PopoverTitle>Details</PopoverTitle>
|
|
22
|
+
* <PopoverDescription>Supporting text here.</PopoverDescription>
|
|
23
|
+
* <PopoverClose aria-label="Close" />
|
|
24
|
+
* </PopoverPopup>
|
|
25
|
+
* </Popover.Positioner>
|
|
26
|
+
* </Popover.Portal>
|
|
27
|
+
* </Popover.Root>
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import { forwardRef } from "react";
|
|
31
|
+
import type { ComponentRef, ComponentPropsWithoutRef } from "react";
|
|
32
|
+
import { Popover as BasePopover } from "@base-ui/react/popover";
|
|
33
|
+
import styles from "./popover.module.css";
|
|
34
|
+
import { PopupArrow } from "../shared/PopupArrow";
|
|
35
|
+
import { resolveClassName, cx } from "../utils/resolveClassName";
|
|
36
|
+
|
|
37
|
+
type BasePositionerProps = ComponentPropsWithoutRef<typeof BasePopover.Positioner>;
|
|
38
|
+
type BasePopupProps = ComponentPropsWithoutRef<typeof BasePopover.Popup>;
|
|
39
|
+
type BaseTitleProps = ComponentPropsWithoutRef<typeof BasePopover.Title>;
|
|
40
|
+
type BaseDescriptionProps = ComponentPropsWithoutRef<typeof BasePopover.Description>;
|
|
41
|
+
type BaseCloseProps = ComponentPropsWithoutRef<typeof BasePopover.Close>;
|
|
42
|
+
type BaseArrowProps = ComponentPropsWithoutRef<typeof BasePopover.Arrow>;
|
|
43
|
+
type BaseViewportProps = ComponentPropsWithoutRef<typeof BasePopover.Viewport>;
|
|
44
|
+
|
|
45
|
+
export interface PopoverPositionerProps extends BasePositionerProps {}
|
|
46
|
+
export interface PopoverPopupProps extends BasePopupProps {}
|
|
47
|
+
export interface PopoverTitleProps extends BaseTitleProps {}
|
|
48
|
+
export interface PopoverDescriptionProps extends BaseDescriptionProps {}
|
|
49
|
+
export interface PopoverCloseProps extends BaseCloseProps {}
|
|
50
|
+
export interface PopoverArrowProps extends BaseArrowProps {}
|
|
51
|
+
export interface PopoverViewportProps extends BaseViewportProps {}
|
|
52
|
+
|
|
53
|
+
export const PopoverPositioner = forwardRef<ComponentRef<typeof BasePopover.Positioner>, PopoverPositionerProps>(function PopoverPositioner(
|
|
54
|
+
{ className, ...props },
|
|
55
|
+
ref,
|
|
56
|
+
) {
|
|
57
|
+
return <BasePopover.Positioner ref={ref} className={(state) => cx(styles.positioner, resolveClassName(className, state))} {...props} />;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export const PopoverPopup = forwardRef<ComponentRef<typeof BasePopover.Popup>, PopoverPopupProps>(function PopoverPopup(
|
|
61
|
+
{ className, ...props },
|
|
62
|
+
ref,
|
|
63
|
+
) {
|
|
64
|
+
return <BasePopover.Popup ref={ref} className={(state) => cx(styles.popup, resolveClassName(className, state))} {...props} />;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
export const PopoverTitle = forwardRef<ComponentRef<typeof BasePopover.Title>, PopoverTitleProps>(function PopoverTitle(
|
|
68
|
+
{ className, ...props },
|
|
69
|
+
ref,
|
|
70
|
+
) {
|
|
71
|
+
return <BasePopover.Title ref={ref} className={(state) => cx(styles.title, resolveClassName(className, state))} {...props} />;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const PopoverDescription = forwardRef<ComponentRef<typeof BasePopover.Description>, PopoverDescriptionProps>(
|
|
75
|
+
function PopoverDescription({ className, ...props }, ref) {
|
|
76
|
+
return (
|
|
77
|
+
<BasePopover.Description ref={ref} className={(state) => cx(styles.description, resolveClassName(className, state))} {...props} />
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
export const PopoverClose = forwardRef<ComponentRef<typeof BasePopover.Close>, PopoverCloseProps>(function PopoverClose(
|
|
83
|
+
{ className, ...props },
|
|
84
|
+
ref,
|
|
85
|
+
) {
|
|
86
|
+
return <BasePopover.Close ref={ref} className={(state) => cx(styles.close, resolveClassName(className, state))} {...props} />;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
export const PopoverViewport = forwardRef<ComponentRef<typeof BasePopover.Viewport>, PopoverViewportProps>(function PopoverViewport(
|
|
90
|
+
{ className, ...props },
|
|
91
|
+
ref,
|
|
92
|
+
) {
|
|
93
|
+
return <BasePopover.Viewport ref={ref} className={(state) => cx(styles.viewport, resolveClassName(className, state))} {...props} />;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
export const PopoverArrow = forwardRef<ComponentRef<typeof BasePopover.Arrow>, PopoverArrowProps>(function PopoverArrow(
|
|
97
|
+
{ className, children, ...props },
|
|
98
|
+
ref,
|
|
99
|
+
) {
|
|
100
|
+
return (
|
|
101
|
+
<BasePopover.Arrow ref={ref} className={(state) => cx(styles.arrow, resolveClassName(className, state))} {...props}>
|
|
102
|
+
{children ?? <PopupArrow fillClass={styles["arrow-fill"]!} seamClass={styles["arrow-seam"]!} />}
|
|
103
|
+
</BasePopover.Arrow>
|
|
104
|
+
);
|
|
105
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.positioner {
|
|
3
|
+
z-index: var(--z-popover);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.popup {
|
|
7
|
+
/* Arrow colour tokens consumed by .arrow-fill / .arrow-stroke below */
|
|
8
|
+
--arrow-fill: var(--color-elevated);
|
|
9
|
+
--arrow-stroke: var(--color-line);
|
|
10
|
+
background-color: var(--color-elevated);
|
|
11
|
+
border: var(--border-width-base) solid var(--color-line);
|
|
12
|
+
border-radius: var(--radius-xl);
|
|
13
|
+
box-shadow: var(--shadow-popover);
|
|
14
|
+
padding: var(--space-4);
|
|
15
|
+
min-width: 220px;
|
|
16
|
+
max-width: 320px;
|
|
17
|
+
outline: none;
|
|
18
|
+
transition: opacity 200ms var(--easing-ease-out);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.popup[data-starting-style] {
|
|
22
|
+
opacity: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.popup[data-ending-style] {
|
|
26
|
+
opacity: 0;
|
|
27
|
+
transition: opacity 100ms var(--easing-ease-in);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Instant dismiss/click — skip the exit animation */
|
|
31
|
+
.popup[data-instant] {
|
|
32
|
+
transition-duration: 0ms;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@media (prefers-reduced-motion: reduce) {
|
|
36
|
+
.popup[data-starting-style],
|
|
37
|
+
.popup[data-ending-style] {
|
|
38
|
+
transition: none;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* ── Internals ──────────────────────────────────────────────────── */
|
|
43
|
+
|
|
44
|
+
.title {
|
|
45
|
+
font-family: var(--font-mono);
|
|
46
|
+
font-size: var(--font-size-md);
|
|
47
|
+
font-weight: var(--font-weight-semibold);
|
|
48
|
+
color: var(--color-primary);
|
|
49
|
+
line-height: var(--line-height-tight);
|
|
50
|
+
margin: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.description {
|
|
54
|
+
font-family: var(--font-mono);
|
|
55
|
+
font-size: var(--font-size-sm);
|
|
56
|
+
color: var(--color-secondary);
|
|
57
|
+
line-height: var(--line-height-relaxed);
|
|
58
|
+
margin: 0;
|
|
59
|
+
margin-top: var(--space-1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.close {
|
|
63
|
+
position: absolute;
|
|
64
|
+
top: var(--space-3);
|
|
65
|
+
right: var(--space-3);
|
|
66
|
+
width: 22px;
|
|
67
|
+
height: 22px;
|
|
68
|
+
border-radius: var(--radius-sm);
|
|
69
|
+
border: none;
|
|
70
|
+
background: transparent;
|
|
71
|
+
color: var(--color-tertiary);
|
|
72
|
+
cursor: pointer;
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
outline: none;
|
|
77
|
+
flex-shrink: 0;
|
|
78
|
+
transition:
|
|
79
|
+
background-color var(--duration-fast) var(--easing-standard),
|
|
80
|
+
color var(--duration-fast) var(--easing-standard),
|
|
81
|
+
transform 100ms var(--easing-ease-out);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.close:hover {
|
|
85
|
+
background-color: var(--color-hover);
|
|
86
|
+
color: var(--color-primary);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.close:active {
|
|
90
|
+
transform: scale(0.94);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.close:focus-visible {
|
|
94
|
+
box-shadow: var(--shadow-focus);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ── Viewport ───────────────────────────────────────────────────── */
|
|
98
|
+
|
|
99
|
+
.viewport {
|
|
100
|
+
position: relative;
|
|
101
|
+
overflow: clip;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* [data-current] and [data-previous] are direct children injected by
|
|
105
|
+
base-ui's Viewport. Both get transition so the slide is smooth. */
|
|
106
|
+
.viewport [data-current],
|
|
107
|
+
.viewport [data-previous] {
|
|
108
|
+
transition:
|
|
109
|
+
transform 200ms var(--easing-ease-out),
|
|
110
|
+
opacity 150ms var(--easing-ease-out);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Entering content */
|
|
114
|
+
.viewport [data-current][data-starting-style] {
|
|
115
|
+
opacity: 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Exiting content */
|
|
119
|
+
.viewport [data-previous][data-ending-style] {
|
|
120
|
+
opacity: 0;
|
|
121
|
+
transition:
|
|
122
|
+
transform 200ms var(--easing-ease-in),
|
|
123
|
+
opacity 150ms var(--easing-ease-in);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Slide direction: previous exits opposite, current enters from direction */
|
|
127
|
+
.viewport[data-activation-direction~="down"] [data-current][data-starting-style] {
|
|
128
|
+
transform: translateY(-6px);
|
|
129
|
+
}
|
|
130
|
+
.viewport[data-activation-direction~="down"] [data-previous][data-ending-style] {
|
|
131
|
+
transform: translateY(6px);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.viewport[data-activation-direction~="up"] [data-current][data-starting-style] {
|
|
135
|
+
transform: translateY(6px);
|
|
136
|
+
}
|
|
137
|
+
.viewport[data-activation-direction~="up"] [data-previous][data-ending-style] {
|
|
138
|
+
transform: translateY(-6px);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.viewport[data-activation-direction~="right"] [data-current][data-starting-style] {
|
|
142
|
+
transform: translateX(-6px);
|
|
143
|
+
}
|
|
144
|
+
.viewport[data-activation-direction~="right"] [data-previous][data-ending-style] {
|
|
145
|
+
transform: translateX(6px);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.viewport[data-activation-direction~="left"] [data-current][data-starting-style] {
|
|
149
|
+
transform: translateX(6px);
|
|
150
|
+
}
|
|
151
|
+
.viewport[data-activation-direction~="left"] [data-previous][data-ending-style] {
|
|
152
|
+
transform: translateX(-6px);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@media (prefers-reduced-motion: reduce) {
|
|
156
|
+
.viewport [data-current],
|
|
157
|
+
.viewport [data-previous] {
|
|
158
|
+
transition: opacity 150ms var(--easing-ease-out);
|
|
159
|
+
transform: none !important;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* ── Arrow ──────────────────────────────────────────────────────── */
|
|
164
|
+
.arrow {
|
|
165
|
+
display: flex;
|
|
166
|
+
}
|
|
167
|
+
.arrow[data-side="top"] {
|
|
168
|
+
bottom: -8px;
|
|
169
|
+
rotate: 180deg;
|
|
170
|
+
}
|
|
171
|
+
.arrow[data-side="bottom"] {
|
|
172
|
+
top: -8px;
|
|
173
|
+
rotate: 0deg;
|
|
174
|
+
}
|
|
175
|
+
.arrow[data-side="left"] {
|
|
176
|
+
right: -13px;
|
|
177
|
+
rotate: 90deg;
|
|
178
|
+
}
|
|
179
|
+
.arrow[data-side="right"] {
|
|
180
|
+
left: -13px;
|
|
181
|
+
rotate: -90deg;
|
|
182
|
+
}
|
|
183
|
+
.arrow-fill {
|
|
184
|
+
fill: var(--color-elevated);
|
|
185
|
+
}
|
|
186
|
+
.arrow-seam {
|
|
187
|
+
fill: var(--color-line);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ReactNode, ReactElement } from "react";
|
|
2
|
+
import { Popover as BasePopover } from "@base-ui/react/popover";
|
|
3
|
+
import styles from "./popover.module.css";
|
|
4
|
+
import { PopupArrow } from "../shared/PopupArrow";
|
|
5
|
+
|
|
6
|
+
export interface PopoverProps {
|
|
7
|
+
/** The trigger element — rendered as-is, receives the popover open/close handler. */
|
|
8
|
+
trigger: ReactElement;
|
|
9
|
+
/** Optional heading rendered at the top of the popup. */
|
|
10
|
+
title?: ReactNode;
|
|
11
|
+
/** Optional supporting text rendered below the title. */
|
|
12
|
+
description?: ReactNode;
|
|
13
|
+
/** Body content of the popover. */
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
/** Which side of the trigger to open on. @default "bottom" */
|
|
16
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
17
|
+
/** Alignment relative to the trigger. @default "center" */
|
|
18
|
+
align?: "start" | "center" | "end";
|
|
19
|
+
/** Gap between trigger and popup in px. @default 8 */
|
|
20
|
+
sideOffset?: number;
|
|
21
|
+
/** Show a close (×) button in the top-right corner. @default false */
|
|
22
|
+
dismissible?: boolean;
|
|
23
|
+
/** Controlled open state. */
|
|
24
|
+
open?: boolean;
|
|
25
|
+
/** Uncontrolled default open state. */
|
|
26
|
+
defaultOpen?: boolean;
|
|
27
|
+
/** Called when the popover opens or closes. */
|
|
28
|
+
onOpenChange?: (open: boolean, eventDetails: unknown) => void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function XIcon() {
|
|
32
|
+
return (
|
|
33
|
+
<svg width="10" height="10" viewBox="0 0 12 12" fill="none" aria-hidden="true">
|
|
34
|
+
<path d="M2 2L10 10M10 2L2 10" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" />
|
|
35
|
+
</svg>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Floating content panel anchored to a trigger. Scales from the trigger's
|
|
41
|
+
* edge and repositions automatically to avoid viewport overflow. Supports
|
|
42
|
+
* title, description, close button, and arbitrary body content.
|
|
43
|
+
*/
|
|
44
|
+
export function Popover({
|
|
45
|
+
trigger,
|
|
46
|
+
title,
|
|
47
|
+
description,
|
|
48
|
+
children,
|
|
49
|
+
side = "bottom",
|
|
50
|
+
align = "center",
|
|
51
|
+
sideOffset = 8,
|
|
52
|
+
dismissible = false,
|
|
53
|
+
onOpenChange,
|
|
54
|
+
...props
|
|
55
|
+
}: PopoverProps) {
|
|
56
|
+
return (
|
|
57
|
+
<BasePopover.Root onOpenChange={onOpenChange as never} {...props}>
|
|
58
|
+
<BasePopover.Trigger render={trigger} />
|
|
59
|
+
<BasePopover.Portal>
|
|
60
|
+
<BasePopover.Positioner className={styles.positioner} side={side} align={align} sideOffset={sideOffset} arrowPadding={8}>
|
|
61
|
+
<BasePopover.Popup className={styles.popup}>
|
|
62
|
+
<BasePopover.Arrow className={styles.arrow}>
|
|
63
|
+
<PopupArrow fillClass={styles["arrow-fill"]!} seamClass={styles["arrow-seam"]!} />
|
|
64
|
+
</BasePopover.Arrow>
|
|
65
|
+
{dismissible && (
|
|
66
|
+
<BasePopover.Close className={styles.close} aria-label="Close">
|
|
67
|
+
<XIcon />
|
|
68
|
+
</BasePopover.Close>
|
|
69
|
+
)}
|
|
70
|
+
{title && <BasePopover.Title className={styles.title}>{title}</BasePopover.Title>}
|
|
71
|
+
{description && <BasePopover.Description className={styles.description}>{description}</BasePopover.Description>}
|
|
72
|
+
{children}
|
|
73
|
+
</BasePopover.Popup>
|
|
74
|
+
</BasePopover.Positioner>
|
|
75
|
+
</BasePopover.Portal>
|
|
76
|
+
</BasePopover.Root>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { styles as PopoverStyles };
|
package/src/progress/parts.tsx
CHANGED
|
@@ -17,16 +17,15 @@ import { forwardRef } from "react";
|
|
|
17
17
|
import type { ComponentRef, ComponentPropsWithoutRef } from "react";
|
|
18
18
|
import { Progress as BaseProgress } from "@base-ui/react/progress";
|
|
19
19
|
import styles from "./progress.module.css";
|
|
20
|
+
import { resolveClassName, cx } from "../utils/resolveClassName";
|
|
20
21
|
|
|
21
22
|
type BaseTrackProps = ComponentPropsWithoutRef<typeof BaseProgress.Track>;
|
|
22
23
|
type BaseIndicatorProps = ComponentPropsWithoutRef<typeof BaseProgress.Indicator>;
|
|
23
24
|
|
|
24
|
-
export interface ProgressTrackProps extends
|
|
25
|
-
className?: string;
|
|
25
|
+
export interface ProgressTrackProps extends BaseTrackProps {
|
|
26
26
|
size?: "sm" | "md" | "lg";
|
|
27
27
|
}
|
|
28
|
-
export interface ProgressIndicatorProps extends
|
|
29
|
-
className?: string;
|
|
28
|
+
export interface ProgressIndicatorProps extends BaseIndicatorProps {
|
|
30
29
|
status?: "default" | "success" | "warning" | "error";
|
|
31
30
|
}
|
|
32
31
|
|
|
@@ -34,7 +33,13 @@ export const ProgressTrack = forwardRef<ComponentRef<typeof BaseProgress.Track>,
|
|
|
34
33
|
{ className, size = "md", ...props },
|
|
35
34
|
ref,
|
|
36
35
|
) {
|
|
37
|
-
return
|
|
36
|
+
return (
|
|
37
|
+
<BaseProgress.Track
|
|
38
|
+
ref={ref}
|
|
39
|
+
className={(state) => cx(styles.track, styles[`track-${size}`], resolveClassName(className, state))}
|
|
40
|
+
{...props}
|
|
41
|
+
/>
|
|
42
|
+
);
|
|
38
43
|
});
|
|
39
44
|
|
|
40
45
|
export const ProgressIndicator = forwardRef<ComponentRef<typeof BaseProgress.Indicator>, ProgressIndicatorProps>(function ProgressIndicator(
|
|
@@ -44,7 +49,9 @@ export const ProgressIndicator = forwardRef<ComponentRef<typeof BaseProgress.Ind
|
|
|
44
49
|
return (
|
|
45
50
|
<BaseProgress.Indicator
|
|
46
51
|
ref={ref}
|
|
47
|
-
className={
|
|
52
|
+
className={(state) =>
|
|
53
|
+
cx(styles.indicator, status !== "default" ? styles[`indicator-${status}`] : undefined, resolveClassName(className, state))
|
|
54
|
+
}
|
|
48
55
|
{...props}
|
|
49
56
|
/>
|
|
50
57
|
);
|
|
@@ -5,15 +5,26 @@ export type ProgressStatus = "default" | "success" | "warning" | "error";
|
|
|
5
5
|
export type ProgressSize = "sm" | "md" | "lg";
|
|
6
6
|
|
|
7
7
|
export interface ProgressProps {
|
|
8
|
+
/** Current progress value. `null` for indeterminate state. */
|
|
8
9
|
value?: number | null;
|
|
10
|
+
/** Maximum value (the "complete" end). @default 100 */
|
|
9
11
|
max?: number;
|
|
12
|
+
/** Accessible label shown above the bar. */
|
|
10
13
|
label?: string;
|
|
14
|
+
/** Display the percentage next to the label. @default false */
|
|
11
15
|
showValue?: boolean;
|
|
16
|
+
/** Semantic colour for the progress fill. @default "default" */
|
|
12
17
|
status?: ProgressStatus;
|
|
18
|
+
/** Bar thickness. @default "md" */
|
|
13
19
|
size?: ProgressSize;
|
|
14
20
|
className?: string;
|
|
15
21
|
}
|
|
16
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Linear progress indicator with optional label and percentage display.
|
|
25
|
+
* Pass `value={null}` for an indeterminate animated state. Use `status`
|
|
26
|
+
* to apply semantic colour to the fill.
|
|
27
|
+
*/
|
|
17
28
|
export function Progress({ value = null, max = 100, label, showValue = false, status = "default", size = "md", className }: ProgressProps) {
|
|
18
29
|
const percentage = value != null ? Math.round((value / max) * 100) : null;
|
|
19
30
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styled primitives for Radio (single item).
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { RadioGroup } from '@base-ui/react/radio-group';
|
|
7
|
+
* import { RadioRoot, RadioIndicator } from '@brijbyte/agentic-ui/radio';
|
|
8
|
+
*
|
|
9
|
+
* <RadioGroup defaultValue="a">
|
|
10
|
+
* <label htmlFor="opt-a">
|
|
11
|
+
* <RadioRoot id="opt-a" value="a">
|
|
12
|
+
* <RadioIndicator />
|
|
13
|
+
* </RadioRoot>
|
|
14
|
+
* Option A
|
|
15
|
+
* </label>
|
|
16
|
+
* </RadioGroup>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { forwardRef } from "react";
|
|
20
|
+
import type { ComponentRef, ComponentPropsWithoutRef } from "react";
|
|
21
|
+
import { Radio as BaseRadio } from "@base-ui/react/radio";
|
|
22
|
+
import styles from "./radio.module.css";
|
|
23
|
+
import { resolveClassName, cx } from "../utils/resolveClassName";
|
|
24
|
+
|
|
25
|
+
type BaseRootProps = ComponentPropsWithoutRef<typeof BaseRadio.Root>;
|
|
26
|
+
type BaseIndicatorProps = ComponentPropsWithoutRef<typeof BaseRadio.Indicator>;
|
|
27
|
+
|
|
28
|
+
export interface RadioRootProps extends BaseRootProps {}
|
|
29
|
+
export interface RadioIndicatorProps extends BaseIndicatorProps {}
|
|
30
|
+
|
|
31
|
+
export const RadioRoot = forwardRef<ComponentRef<typeof BaseRadio.Root>, RadioRootProps>(function RadioRoot({ className, ...props }, ref) {
|
|
32
|
+
return <BaseRadio.Root ref={ref} className={(state) => cx(styles.radio, resolveClassName(className, state))} {...props} />;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export const RadioIndicator = forwardRef<ComponentRef<typeof BaseRadio.Indicator>, RadioIndicatorProps>(function RadioIndicator(
|
|
36
|
+
{ className, ...props },
|
|
37
|
+
ref,
|
|
38
|
+
) {
|
|
39
|
+
return (
|
|
40
|
+
<BaseRadio.Indicator ref={ref} keepMounted className={(state) => cx(styles.indicator, resolveClassName(className, state))} {...props} />
|
|
41
|
+
);
|
|
42
|
+
});
|