@brijbyte/agentic-ui 0.0.3 → 0.0.4
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 +132 -35
- 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/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/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/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/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/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/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/index.css +1681 -1251
- package/dist/index.d.ts +19 -10
- package/dist/index.js +14 -1
- 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/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 +31 -0
- package/dist/meter/parts.d.ts.map +1 -0
- package/dist/meter/parts.js +56 -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/popover/index.d.ts +3 -0
- package/dist/popover/index.js +4 -0
- package/dist/popover/parts.d.ts +43 -0
- package/dist/popover/parts.d.ts.map +1 -0
- package/dist/popover/parts.js +96 -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/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 +18 -0
- package/dist/radio/parts.d.ts.map +1 -0
- package/dist/radio/parts.js +42 -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 +13 -0
- package/dist/radio-group/parts.d.ts.map +1 -0
- package/dist/radio-group/parts.js +31 -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/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/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/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/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/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/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/package.json +22 -2
- package/src/accordion/accordion.tsx +14 -0
- package/src/alert-dialog/alert-dialog.tsx +11 -0
- 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/collapsible/collapsible.tsx +11 -0
- package/src/context-menu/context-menu.tsx +5 -0
- package/src/dialog/dialog.tsx +13 -1
- package/src/drawer/drawer.tsx +11 -0
- 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/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 +72 -0
- package/src/number-field/number-field.tsx +16 -0
- package/src/popover/index.ts +14 -0
- package/src/popover/parts.tsx +120 -0
- package/src/popover/popover.module.css +189 -0
- package/src/popover/popover.tsx +80 -0
- package/src/progress/progress.tsx +11 -0
- package/src/radio/index.ts +6 -0
- package/src/radio/parts.tsx +43 -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 +32 -0
- package/src/radio-group/radio-group.module.css +17 -0
- package/src/radio-group/radio-group.tsx +63 -0
- package/src/select/select.tsx +14 -1
- package/src/separator/separator.tsx +4 -0
- package/src/shared/PopupArrow.tsx +41 -0
- package/src/slider/slider.tsx +18 -0
- package/src/switch/switch.module.css +11 -2
- package/src/switch/switch.tsx +12 -0
- package/src/tabs/tabs.tsx +8 -1
- package/src/toast/toast.tsx +11 -0
- package/src/tooltip/tooltip.tsx +9 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useId } from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { Radio as BaseRadio } from "@base-ui/react/radio";
|
|
4
|
+
import styles from "./radio.module.css";
|
|
5
|
+
|
|
6
|
+
export interface RadioProps {
|
|
7
|
+
/** Value submitted with the form and matched against the group's value. */
|
|
8
|
+
value: string;
|
|
9
|
+
/** Label rendered next to the button. */
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
readOnly?: boolean;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
/** Override the auto-generated element id. */
|
|
15
|
+
id?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A single radio button with an optional label.
|
|
21
|
+
* Must be placed inside `<RadioGroup>` or a raw base-ui RadioGroup.
|
|
22
|
+
*/
|
|
23
|
+
export function Radio({ value, children, id, className, ...props }: RadioProps) {
|
|
24
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
25
|
+
const radioId = id ?? useId();
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<label className={`${styles.item} ${className ?? ""}`} htmlFor={radioId}>
|
|
29
|
+
<BaseRadio.Root id={radioId} value={value} className={styles.radio} {...props}>
|
|
30
|
+
<BaseRadio.Indicator keepMounted className={styles.indicator} />
|
|
31
|
+
</BaseRadio.Root>
|
|
32
|
+
{children && <span className={styles.label}>{children}</span>}
|
|
33
|
+
</label>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { styles as RadioStyles };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styled primitive for RadioGroup.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { Radio } from '@brijbyte/agentic-ui/radio';
|
|
7
|
+
* import { RadioGroupRoot } from '@brijbyte/agentic-ui/radio-group';
|
|
8
|
+
*
|
|
9
|
+
* <RadioGroupRoot defaultValue="b" name="plan">
|
|
10
|
+
* <Radio value="a">Hobby</Radio>
|
|
11
|
+
* <Radio value="b">Pro</Radio>
|
|
12
|
+
* <Radio value="c">Enterprise</Radio>
|
|
13
|
+
* </RadioGroupRoot>
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
import { forwardRef } from "react";
|
|
17
|
+
import type { ComponentRef, ComponentPropsWithoutRef } from "react";
|
|
18
|
+
import { RadioGroup as BaseRadioGroup } from "@base-ui/react/radio-group";
|
|
19
|
+
import styles from "./radio-group.module.css";
|
|
20
|
+
|
|
21
|
+
type BaseGroupProps = ComponentPropsWithoutRef<typeof BaseRadioGroup>;
|
|
22
|
+
|
|
23
|
+
export interface RadioGroupRootProps extends Omit<BaseGroupProps, "className"> {
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const RadioGroupRoot = forwardRef<ComponentRef<typeof BaseRadioGroup>, RadioGroupRootProps>(function RadioGroupRoot(
|
|
28
|
+
{ className, ...props },
|
|
29
|
+
ref,
|
|
30
|
+
) {
|
|
31
|
+
return <BaseRadioGroup ref={ref} className={`${styles.group} ${className ?? ""}`} {...props} />;
|
|
32
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.group {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--space-2);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.group-label {
|
|
9
|
+
font-family: var(--font-mono);
|
|
10
|
+
font-size: var(--font-size-xs);
|
|
11
|
+
font-weight: var(--font-weight-semibold);
|
|
12
|
+
color: var(--color-tertiary);
|
|
13
|
+
text-transform: uppercase;
|
|
14
|
+
letter-spacing: var(--letter-spacing-wide);
|
|
15
|
+
margin-bottom: var(--space-1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useId } from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { RadioGroup as BaseRadioGroup } from "@base-ui/react/radio-group";
|
|
4
|
+
import { Radio } from "../radio/radio";
|
|
5
|
+
import styles from "./radio-group.module.css";
|
|
6
|
+
|
|
7
|
+
export interface RadioOption {
|
|
8
|
+
value: string;
|
|
9
|
+
label: ReactNode;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface RadioGroupProps {
|
|
14
|
+
/** The options to render. Each becomes one `<Radio>` item. */
|
|
15
|
+
options: RadioOption[];
|
|
16
|
+
/** Accessible group label rendered above the options. */
|
|
17
|
+
label?: ReactNode;
|
|
18
|
+
/** Controlled selected value. */
|
|
19
|
+
value?: string;
|
|
20
|
+
/** Initial selected value (uncontrolled). */
|
|
21
|
+
defaultValue?: string;
|
|
22
|
+
onValueChange?: (value: string, eventDetails: unknown) => void;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
readOnly?: boolean;
|
|
25
|
+
required?: boolean;
|
|
26
|
+
/** HTML name for form submission. */
|
|
27
|
+
name?: string;
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A labelled group of radio buttons. Renders a base-ui RadioGroup with one
|
|
33
|
+
* `<Radio>` per option.
|
|
34
|
+
*
|
|
35
|
+
* For full control over layout or behaviour use `RadioGroupRoot` with
|
|
36
|
+
* individual `<Radio>` or `<RadioRoot>` elements.
|
|
37
|
+
*/
|
|
38
|
+
export { styles as RadioGroupStyles };
|
|
39
|
+
|
|
40
|
+
export function RadioGroup({ options, label, className, onValueChange, ...props }: RadioGroupProps) {
|
|
41
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
42
|
+
const labelId = useId();
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<BaseRadioGroup
|
|
46
|
+
aria-labelledby={label ? labelId : undefined}
|
|
47
|
+
className={`${styles.group} ${className ?? ""}`}
|
|
48
|
+
onValueChange={onValueChange as never}
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
{label && (
|
|
52
|
+
<div id={labelId} className={styles["group-label"]}>
|
|
53
|
+
{label}
|
|
54
|
+
</div>
|
|
55
|
+
)}
|
|
56
|
+
{options.map((opt) => (
|
|
57
|
+
<Radio key={opt.value} value={opt.value} {...(opt.disabled !== undefined && { disabled: opt.disabled })}>
|
|
58
|
+
{opt.label}
|
|
59
|
+
</Radio>
|
|
60
|
+
))}
|
|
61
|
+
</BaseRadioGroup>
|
|
62
|
+
);
|
|
63
|
+
}
|
package/src/select/select.tsx
CHANGED
|
@@ -14,17 +14,26 @@ export interface SelectGroup {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface SelectProps {
|
|
17
|
+
/** Currently selected value (controlled). */
|
|
17
18
|
value?: string;
|
|
19
|
+
/** Initially selected value (uncontrolled). */
|
|
18
20
|
defaultValue?: string;
|
|
19
|
-
/** `eventDetails` is the base-ui event details object. Value may be null when cleared. */
|
|
21
|
+
/** Called when the selection changes. `eventDetails` is the base-ui event details object. Value may be null when cleared. */
|
|
20
22
|
onValueChange?: (value: string | null, eventDetails: unknown) => void;
|
|
23
|
+
/** Prevent interaction. */
|
|
21
24
|
disabled?: boolean;
|
|
25
|
+
/** Mark the field as required for form validation. */
|
|
22
26
|
required?: boolean;
|
|
27
|
+
/** HTML name attribute for form submission. */
|
|
23
28
|
name?: string;
|
|
29
|
+
/** Text shown when no value is selected. */
|
|
24
30
|
placeholder?: string;
|
|
31
|
+
/** Flat list of options (use `groups` for grouped options). */
|
|
25
32
|
options?: SelectOption[];
|
|
33
|
+
/** Grouped options with optional section labels. */
|
|
26
34
|
groups?: SelectGroup[];
|
|
27
35
|
className?: string;
|
|
36
|
+
/** Override the auto-generated element id. */
|
|
28
37
|
id?: string;
|
|
29
38
|
}
|
|
30
39
|
|
|
@@ -55,6 +64,10 @@ function SelectItem({ option }: { option: SelectOption }) {
|
|
|
55
64
|
);
|
|
56
65
|
}
|
|
57
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Dropdown select with keyboard navigation, grouping, and search. Pass
|
|
69
|
+
* `options` for a flat list or `groups` for sections with optional labels.
|
|
70
|
+
*/
|
|
58
71
|
export function Select({ placeholder = "Select…", options, groups, className, onValueChange, value, defaultValue, ...props }: SelectProps) {
|
|
59
72
|
const allOptions = useMemo(() => [...(options ?? []), ...(groups?.flatMap((g) => g.options) ?? [])], [options, groups]);
|
|
60
73
|
|
|
@@ -11,6 +11,10 @@ export interface SeparatorProps extends Omit<BaseSeparatorProps, "className"> {
|
|
|
11
11
|
className?: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* A semantic divider accessible to screen readers. Renders a horizontal
|
|
16
|
+
* line by default; switch to vertical for inline layouts.
|
|
17
|
+
*/
|
|
14
18
|
export const Separator = forwardRef<ComponentRef<typeof BaseSeparator>, SeparatorProps>(function Separator(
|
|
15
19
|
{ className, orientation = "horizontal", ...props },
|
|
16
20
|
ref,
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared arrow SVG used by Menu and Popover.
|
|
3
|
+
*
|
|
4
|
+
* Two paths:
|
|
5
|
+
* 1. Fill — the arrow body, matches the popup surface colour.
|
|
6
|
+
* 2. Seam — a thin strip in the border colour at the base, covering
|
|
7
|
+
* the popup border at the junction so it doesn't bleed through.
|
|
8
|
+
*
|
|
9
|
+
* All CSS classes come from the importing component's own CSS module
|
|
10
|
+
* so the rules are bundled into the component's CSS file, not a
|
|
11
|
+
* separate shared chunk that consumers would need to import separately.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <BaseMenu.Arrow className={styles.arrow}>
|
|
16
|
+
* <PopupArrow fillClass={styles["arrow-fill"]!} seamClass={styles["arrow-seam"]!} />
|
|
17
|
+
* </BaseMenu.Arrow>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
interface PopupArrowProps {
|
|
22
|
+
fillClass: string;
|
|
23
|
+
seamClass: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function PopupArrow({ fillClass, seamClass }: PopupArrowProps) {
|
|
27
|
+
return (
|
|
28
|
+
<svg width="20" height="10" viewBox="0 0 20 10" fill="none" aria-hidden>
|
|
29
|
+
{/* Body — surface colour */}
|
|
30
|
+
<path
|
|
31
|
+
d="M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z"
|
|
32
|
+
className={fillClass}
|
|
33
|
+
/>
|
|
34
|
+
{/* Seam — border colour strip at the base, covers the popup border at the junction */}
|
|
35
|
+
<path
|
|
36
|
+
d="M10.3333 3.34539L5.47654 7.71648C4.55842 8.54279 3.36693 9 2.13172 9H0V8H2.13172C3.11989 8 4.07308 7.63423 4.80758 6.97318L9.66437 2.60207C10.0447 2.25979 10.622 2.2598 11.0023 2.60207L15.8591 6.97318C16.5936 7.63423 17.5468 8 18.5349 8H20V9H18.5349C17.2998 9 16.1083 8.54278 15.1901 7.71648L10.3333 3.34539Z"
|
|
37
|
+
className={seamClass}
|
|
38
|
+
/>
|
|
39
|
+
</svg>
|
|
40
|
+
);
|
|
41
|
+
}
|
package/src/slider/slider.tsx
CHANGED
|
@@ -3,17 +3,29 @@ import { Slider as BaseSlider } from "@base-ui/react/slider";
|
|
|
3
3
|
import styles from "./slider.module.css";
|
|
4
4
|
|
|
5
5
|
export interface SliderProps {
|
|
6
|
+
/** Current value (controlled). Pass an array for range sliders. */
|
|
6
7
|
value?: number | number[];
|
|
8
|
+
/** Initial value (uncontrolled). Pass an array for range sliders. */
|
|
7
9
|
defaultValue?: number | number[];
|
|
10
|
+
/** Called on every value change while dragging. */
|
|
8
11
|
onValueChange?: (value: number | number[], eventDetails: unknown) => void;
|
|
12
|
+
/** Called once when the user finishes dragging. */
|
|
9
13
|
onValueCommitted?: (value: number | number[], eventDetails: unknown) => void;
|
|
14
|
+
/** Minimum allowed value. @default 0 */
|
|
10
15
|
min?: number;
|
|
16
|
+
/** Maximum allowed value. @default 100 */
|
|
11
17
|
max?: number;
|
|
18
|
+
/** Step increment. @default 1 */
|
|
12
19
|
step?: number;
|
|
20
|
+
/** Step used for Page Up / Page Down keyboard shortcuts. @default 10 */
|
|
13
21
|
largeStep?: number;
|
|
22
|
+
/** Prevent interaction. */
|
|
14
23
|
disabled?: boolean;
|
|
24
|
+
/** HTML name attribute for form submission. */
|
|
15
25
|
name?: string;
|
|
26
|
+
/** Axis direction. @default "horizontal" */
|
|
16
27
|
orientation?: "horizontal" | "vertical";
|
|
28
|
+
/** `Intl.NumberFormatOptions` for value display formatting. */
|
|
17
29
|
format?: Intl.NumberFormatOptions;
|
|
18
30
|
/** Visible label rendered above the track. */
|
|
19
31
|
label?: ReactNode;
|
|
@@ -24,6 +36,12 @@ export interface SliderProps {
|
|
|
24
36
|
className?: string;
|
|
25
37
|
}
|
|
26
38
|
|
|
39
|
+
/**
|
|
40
|
+
* An accessible range input with full keyboard and touch support. Pass a
|
|
41
|
+
* single number for a standard slider or an array for a range slider with
|
|
42
|
+
* two thumbs. Supports steps, large steps (Page Up/Down), and
|
|
43
|
+
* `Intl.NumberFormat` display formatting.
|
|
44
|
+
*/
|
|
27
45
|
export function Slider({
|
|
28
46
|
label,
|
|
29
47
|
showValue = false,
|
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
cursor: pointer;
|
|
7
7
|
user-select: none;
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
/* data-disabled lives on the inner button, not the label wrapper.
|
|
10
|
+
Use :has() to dim the label text, and target the track directly. */
|
|
11
|
+
.root:has([data-disabled]) {
|
|
11
12
|
cursor: not-allowed;
|
|
12
13
|
}
|
|
14
|
+
.root:has([data-disabled]) .label {
|
|
15
|
+
opacity: 0.44;
|
|
16
|
+
}
|
|
13
17
|
.thumb-track {
|
|
14
18
|
position: relative;
|
|
15
19
|
width: 36px;
|
|
@@ -24,6 +28,11 @@
|
|
|
24
28
|
outline: none;
|
|
25
29
|
flex-shrink: 0;
|
|
26
30
|
}
|
|
31
|
+
.thumb-track[data-disabled] {
|
|
32
|
+
opacity: 0.44;
|
|
33
|
+
cursor: not-allowed;
|
|
34
|
+
pointer-events: none;
|
|
35
|
+
}
|
|
27
36
|
.thumb-track:focus-visible {
|
|
28
37
|
box-shadow: var(--shadow-focus);
|
|
29
38
|
}
|
package/src/switch/switch.tsx
CHANGED
|
@@ -4,19 +4,31 @@ import { Switch as BaseSwitch } from "@base-ui/react/switch";
|
|
|
4
4
|
import styles from "./switch.module.css";
|
|
5
5
|
|
|
6
6
|
export interface SwitchProps {
|
|
7
|
+
/** Controlled checked state. */
|
|
7
8
|
checked?: boolean;
|
|
9
|
+
/** Initial checked state (uncontrolled). */
|
|
8
10
|
defaultChecked?: boolean;
|
|
11
|
+
/** Prevent interaction. */
|
|
9
12
|
disabled?: boolean;
|
|
13
|
+
/** Mark the field as required for form validation. */
|
|
10
14
|
required?: boolean;
|
|
15
|
+
/** HTML name attribute for form submission. */
|
|
11
16
|
name?: string;
|
|
17
|
+
/** HTML value attribute for form submission. */
|
|
12
18
|
value?: string;
|
|
13
19
|
/** Called when checked state changes. `eventDetails` is the base-ui event details object. */
|
|
14
20
|
onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;
|
|
21
|
+
/** Label content rendered next to the switch. */
|
|
15
22
|
children?: ReactNode;
|
|
23
|
+
/** Override the auto-generated element id. */
|
|
16
24
|
id?: string;
|
|
17
25
|
className?: string;
|
|
18
26
|
}
|
|
19
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Toggle for boolean settings. Renders a track with a sliding thumb and
|
|
30
|
+
* an optional label. Wraps `@base-ui/react` Switch.
|
|
31
|
+
*/
|
|
20
32
|
export function Switch({ children, id, className, onCheckedChange, ...props }: SwitchProps) {
|
|
21
33
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
22
34
|
const switchId = id ?? useId();
|
package/src/tabs/tabs.tsx
CHANGED
|
@@ -11,14 +11,21 @@ export interface TabItem {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export interface TabsProps {
|
|
14
|
+
/** Array of tab definitions to render. */
|
|
14
15
|
items: TabItem[];
|
|
16
|
+
/** Currently active tab value (controlled). */
|
|
15
17
|
value?: string;
|
|
18
|
+
/** Initially active tab value (uncontrolled). Defaults to the first item. */
|
|
16
19
|
defaultValue?: string;
|
|
17
|
-
/** `eventDetails` is the base-ui event details object. */
|
|
20
|
+
/** Called when the active tab changes. `eventDetails` is the base-ui event details object. */
|
|
18
21
|
onValueChange?: (value: unknown, eventDetails: unknown) => void;
|
|
19
22
|
className?: string;
|
|
20
23
|
}
|
|
21
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Tab navigation for switching between content panels. Each tab can have
|
|
27
|
+
* an optional icon and can be individually disabled.
|
|
28
|
+
*/
|
|
22
29
|
export function Tabs({ items, className, ...props }: TabsProps) {
|
|
23
30
|
const defaultVal = props.defaultValue ?? items[0]?.value;
|
|
24
31
|
|
package/src/toast/toast.tsx
CHANGED
|
@@ -77,8 +77,11 @@ const DEFAULT_LIMIT: Record<NonNullable<ToastViewportProps["variant"]>, number>
|
|
|
77
77
|
|
|
78
78
|
export interface ToastProviderProps {
|
|
79
79
|
children: ReactNode;
|
|
80
|
+
/** Layout style for the viewport. @default "list" */
|
|
80
81
|
variant?: ToastViewportProps["variant"];
|
|
82
|
+
/** Maximum number of toasts shown at once. */
|
|
81
83
|
limit?: number;
|
|
84
|
+
/** Auto-dismiss delay in milliseconds. */
|
|
82
85
|
timeout?: number;
|
|
83
86
|
}
|
|
84
87
|
|
|
@@ -91,6 +94,10 @@ const MAX_LIMIT: Record<NonNullable<ToastViewportProps["variant"]>, number> = {
|
|
|
91
94
|
list: 5,
|
|
92
95
|
};
|
|
93
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Drop-in provider that wires limit defaults to the chosen viewport variant.
|
|
99
|
+
* Use this instead of base-ui's `Toast.Provider` when using `ToastViewport`.
|
|
100
|
+
*/
|
|
94
101
|
export function ToastProvider({ children, variant = "list", limit, timeout }: ToastProviderProps) {
|
|
95
102
|
const resolvedLimit = Math.min(limit ?? DEFAULT_LIMIT[variant], MAX_LIMIT[variant]);
|
|
96
103
|
return (
|
|
@@ -100,6 +107,10 @@ export function ToastProvider({ children, variant = "list", limit, timeout }: To
|
|
|
100
107
|
);
|
|
101
108
|
}
|
|
102
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Renders and manages toast notifications. Supports `"stacked"` (Sonner-style
|
|
112
|
+
* fanned cards) and `"list"` (vertically stacked, each fully visible) layouts.
|
|
113
|
+
*/
|
|
103
114
|
export function ToastViewport({ variant = "list", limit: _limit }: ToastViewportProps) {
|
|
104
115
|
const manager = useToastManager();
|
|
105
116
|
const isStacked = variant === "stacked";
|
package/src/tooltip/tooltip.tsx
CHANGED
|
@@ -3,13 +3,22 @@ import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
|
|
|
3
3
|
import styles from "./tooltip.module.css";
|
|
4
4
|
|
|
5
5
|
export interface TooltipProps {
|
|
6
|
+
/** Text or rich content shown inside the tooltip popup. */
|
|
6
7
|
content: ReactNode;
|
|
8
|
+
/** The element that triggers the tooltip on hover/focus. */
|
|
7
9
|
children: ReactElement;
|
|
10
|
+
/** Hover delay in milliseconds before the tooltip appears. @default 400 */
|
|
8
11
|
delay?: number;
|
|
12
|
+
/** Which side of the trigger the tooltip appears on. @default "top" */
|
|
9
13
|
side?: "top" | "bottom" | "left" | "right";
|
|
14
|
+
/** Alignment along the side axis. @default "center" */
|
|
10
15
|
align?: "start" | "center" | "end";
|
|
11
16
|
}
|
|
12
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Accessible popup shown on hover or focus. Automatically positions itself
|
|
20
|
+
* with an arrow and supports configurable delay, side, and alignment.
|
|
21
|
+
*/
|
|
13
22
|
export function Tooltip({ content, children, delay = 400, side = "top", align = "center" }: TooltipProps) {
|
|
14
23
|
return (
|
|
15
24
|
<BaseTooltip.Provider delay={delay}>
|