@itwin/itwinui-react 5.0.0-alpha.1 → 5.0.0-alpha.11
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/CHANGELOG.md +102 -0
- package/LICENSE.md +1 -1
- package/README.md +6 -6
- package/dist/DEV/bricks/Anchor.js +5 -10
- package/dist/DEV/bricks/Avatar.js +24 -0
- package/dist/DEV/bricks/Badge.js +22 -0
- package/dist/DEV/bricks/Button.js +11 -4
- package/dist/DEV/bricks/Checkbox.js +17 -9
- package/dist/DEV/bricks/Chip.js +42 -0
- package/dist/DEV/bricks/Description.js +29 -0
- package/dist/DEV/bricks/Divider.js +3 -2
- package/dist/DEV/bricks/DropdownMenu.js +109 -30
- package/dist/DEV/bricks/Field.js +115 -14
- package/dist/DEV/bricks/Icon.js +177 -10
- package/dist/DEV/bricks/IconButton.js +14 -3
- package/dist/DEV/bricks/Kbd.internal.js +19 -0
- package/dist/DEV/bricks/Kbd.js +23 -6
- package/dist/DEV/bricks/Label.js +11 -8
- package/dist/DEV/bricks/ProgressBar.js +25 -0
- package/dist/DEV/bricks/Radio.js +17 -9
- package/dist/DEV/bricks/Root.internal.js +17 -0
- package/dist/DEV/bricks/Root.js +103 -26
- package/dist/DEV/bricks/Select.js +17 -11
- package/dist/DEV/bricks/Skeleton.js +24 -0
- package/dist/DEV/bricks/Spinner.js +55 -0
- package/dist/DEV/bricks/Switch.js +18 -10
- package/dist/DEV/bricks/Table.js +114 -0
- package/dist/DEV/bricks/Tabs.js +6 -6
- package/dist/DEV/bricks/Text.js +2 -2
- package/dist/DEV/bricks/TextBox.js +54 -16
- package/dist/DEV/bricks/Tooltip.js +17 -25
- package/dist/DEV/bricks/Tree.js +15 -107
- package/dist/DEV/bricks/TreeItem.js +227 -0
- package/dist/DEV/bricks/VisuallyHidden.js +2 -2
- package/dist/DEV/bricks/index.js +16 -0
- package/dist/DEV/bricks/styles.css.js +2 -2
- package/dist/DEV/bricks/~hooks.js +57 -3
- package/dist/DEV/bricks/~utils.GhostAligner.js +13 -0
- package/dist/DEV/bricks/{ListItem.js → ~utils.ListItem.js} +19 -3
- package/dist/DEV/bricks/~utils.js +17 -0
- package/dist/DEV/foundations/styles.css.js +2 -2
- package/dist/bricks/Anchor.js +5 -10
- package/dist/bricks/Avatar.d.ts +47 -0
- package/dist/bricks/Avatar.js +23 -0
- package/dist/bricks/Badge.d.ts +28 -0
- package/dist/bricks/Badge.js +21 -0
- package/dist/bricks/Button.js +11 -4
- package/dist/bricks/Checkbox.d.ts +2 -2
- package/dist/bricks/Checkbox.js +17 -9
- package/dist/bricks/Chip.d.ts +31 -0
- package/dist/bricks/Chip.js +41 -0
- package/dist/bricks/Description.d.ts +19 -0
- package/dist/bricks/Description.js +29 -0
- package/dist/bricks/Divider.d.ts +2 -2
- package/dist/bricks/Divider.js +3 -2
- package/dist/bricks/DropdownMenu.d.ts +41 -14
- package/dist/bricks/DropdownMenu.js +106 -30
- package/dist/bricks/Field.d.ts +23 -1
- package/dist/bricks/Field.js +115 -14
- package/dist/bricks/Icon.d.ts +43 -4
- package/dist/bricks/Icon.js +174 -10
- package/dist/bricks/IconButton.d.ts +20 -4
- package/dist/bricks/IconButton.js +14 -3
- package/dist/bricks/Kbd.d.ts +15 -0
- package/dist/bricks/Kbd.internal.d.ts +17 -0
- package/dist/bricks/Kbd.internal.js +19 -0
- package/dist/bricks/Kbd.js +16 -6
- package/dist/bricks/Label.js +11 -8
- package/dist/bricks/ProgressBar.d.ts +31 -0
- package/dist/bricks/ProgressBar.js +24 -0
- package/dist/bricks/Radio.d.ts +2 -2
- package/dist/bricks/Radio.js +17 -9
- package/dist/bricks/Root.d.ts +12 -0
- package/dist/bricks/Root.internal.d.ts +6 -0
- package/dist/bricks/Root.internal.js +17 -0
- package/dist/bricks/Root.js +103 -26
- package/dist/bricks/Select.d.ts +9 -3
- package/dist/bricks/Select.js +17 -11
- package/dist/bricks/Skeleton.d.ts +25 -0
- package/dist/bricks/Skeleton.js +23 -0
- package/dist/bricks/Spinner.d.ts +31 -0
- package/dist/bricks/Spinner.js +54 -0
- package/dist/bricks/Switch.d.ts +2 -2
- package/dist/bricks/Switch.js +18 -10
- package/dist/bricks/Table.d.ts +115 -0
- package/dist/bricks/Table.js +108 -0
- package/dist/bricks/Tabs.d.ts +4 -4
- package/dist/bricks/Tabs.js +6 -6
- package/dist/bricks/Text.d.ts +1 -1
- package/dist/bricks/Text.js +2 -2
- package/dist/bricks/TextBox.d.ts +23 -2
- package/dist/bricks/TextBox.js +53 -16
- package/dist/bricks/Tooltip.d.ts +2 -2
- package/dist/bricks/Tooltip.js +17 -25
- package/dist/bricks/Tree.d.ts +19 -20
- package/dist/bricks/Tree.js +14 -102
- package/dist/bricks/TreeItem.d.ts +129 -0
- package/dist/bricks/TreeItem.js +222 -0
- package/dist/bricks/VisuallyHidden.js +2 -2
- package/dist/bricks/index.d.ts +8 -0
- package/dist/bricks/index.js +16 -0
- package/dist/bricks/styles.css.js +2 -2
- package/dist/bricks/~hooks.d.ts +63 -0
- package/dist/bricks/~hooks.js +57 -3
- package/dist/bricks/~utils.GhostAligner.d.ts +22 -0
- package/dist/bricks/~utils.GhostAligner.js +13 -0
- package/dist/bricks/~utils.ListItem.d.ts +14 -0
- package/dist/bricks/{ListItem.js → ~utils.ListItem.js} +18 -3
- package/dist/bricks/~utils.d.ts +14 -3
- package/dist/bricks/~utils.js +17 -0
- package/dist/foundations/styles.css.js +2 -2
- package/package.json +14 -13
- package/dist/DEV/bricks/Textarea.js +0 -30
- package/dist/bricks/ListItem.d.ts +0 -10
- package/dist/bricks/Textarea.d.ts +0 -24
- package/dist/bricks/Textarea.js +0 -29
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type BaseProps } from "./~utils.js";
|
|
2
|
+
interface AvatarProps extends BaseProps<"span"> {
|
|
3
|
+
/**
|
|
4
|
+
* The size of the avatar.
|
|
5
|
+
* @default "medium"
|
|
6
|
+
*/
|
|
7
|
+
size?: "small" | "medium" | "large" | "xlarge";
|
|
8
|
+
/**
|
|
9
|
+
* Initials that gets displayed in the absence of an image.
|
|
10
|
+
*/
|
|
11
|
+
initials?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Alternative text describing the avatar, typically the user's or organization's full name.
|
|
14
|
+
*
|
|
15
|
+
* When this prop is passed, the avatar gets rendered as `role="img"` and labelled
|
|
16
|
+
* using the provided text.
|
|
17
|
+
*
|
|
18
|
+
* This prop is not required if the avatar is purely decorative. By default, the avatar
|
|
19
|
+
* will be hidden from the accessibility tree.
|
|
20
|
+
*/
|
|
21
|
+
alt?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Image to be displayed. Can be `<img>` or `<svg>` or anything else.
|
|
24
|
+
*/
|
|
25
|
+
image?: React.JSX.Element;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* An avatar to represent a user or organization.
|
|
29
|
+
*
|
|
30
|
+
* By default, this component assumes that the avatar is decorative, so it adds `aria-hidden` by default.
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <Avatar initials="JD" />
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* If the avatar is semantically meaningful, the `alt` prop can be used to provide alternative text.
|
|
36
|
+
* ```tsx
|
|
37
|
+
* <Avatar initials="JD" alt="John Doe" />
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* Image & size examples:
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <Avatar initials="JD" alt="John Doe" size="xlarge" image={<img src="…" alt="">} />
|
|
43
|
+
* <Avatar initials="JD" alt="John Doe" size="small" image={<Icon href="…">} />
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const Avatar: import("react").ForwardRefExoticComponent<AvatarProps & import("react").RefAttributes<HTMLElement | HTMLSpanElement>>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import cx from "classnames";
|
|
3
|
+
import { Role } from "@ariakit/react/role";
|
|
4
|
+
import { forwardRef } from "./~utils.js";
|
|
5
|
+
const Avatar = forwardRef((props, forwardedRef) => {
|
|
6
|
+
const { size = "medium", initials, alt, image, children, ...rest } = props;
|
|
7
|
+
const isDecorative = !alt;
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
Role.span,
|
|
10
|
+
{
|
|
11
|
+
role: isDecorative ? void 0 : "img",
|
|
12
|
+
"aria-label": isDecorative ? void 0 : alt,
|
|
13
|
+
...rest,
|
|
14
|
+
"data-kiwi-size": size,
|
|
15
|
+
className: cx("\u{1F95D}-avatar", props.className),
|
|
16
|
+
ref: forwardedRef,
|
|
17
|
+
children: image ?? /* @__PURE__ */ jsx("abbr", { className: "\u{1F95D}-avatar-initials", "aria-hidden": "true", children: initials?.substring(0, 1) })
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
export {
|
|
22
|
+
Avatar
|
|
23
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type BaseProps } from "./~utils.js";
|
|
2
|
+
interface BadgeProps extends Omit<BaseProps<"span">, "children"> {
|
|
3
|
+
/**
|
|
4
|
+
* The label displayed inside the badge.
|
|
5
|
+
*/
|
|
6
|
+
label: string;
|
|
7
|
+
/**
|
|
8
|
+
* The tone of the badge.
|
|
9
|
+
* @default "neutral"
|
|
10
|
+
*/
|
|
11
|
+
tone?: "neutral" | "info" | "positive" | "attention" | "critical" | "accent";
|
|
12
|
+
/**
|
|
13
|
+
* The variant style of the badge.
|
|
14
|
+
* @default "solid"
|
|
15
|
+
*/
|
|
16
|
+
variant?: "solid" | "muted" | "outline";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A badge component, typically used to designate the status of an item.
|
|
20
|
+
*
|
|
21
|
+
* Example:
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <Badge label="Value" />
|
|
24
|
+
* <Badge label="Value" tone="info" variant="outline" />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLElement | HTMLSpanElement>>;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import cx from "classnames";
|
|
3
|
+
import { Role } from "@ariakit/react/role";
|
|
4
|
+
import { forwardRef } from "./~utils.js";
|
|
5
|
+
const Badge = forwardRef((props, forwardedRef) => {
|
|
6
|
+
const { tone = "neutral", variant = "solid", label, ...rest } = props;
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
Role.span,
|
|
9
|
+
{
|
|
10
|
+
...rest,
|
|
11
|
+
"data-kiwi-tone": tone,
|
|
12
|
+
"data-kiwi-variant": variant,
|
|
13
|
+
className: cx("\u{1F95D}-badge", props.className),
|
|
14
|
+
ref: forwardedRef,
|
|
15
|
+
children: label
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
export {
|
|
20
|
+
Badge
|
|
21
|
+
};
|
package/dist/bricks/Button.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import cx from "classnames";
|
|
3
|
-
import
|
|
3
|
+
import { Button as AkButton } from "@ariakit/react/button";
|
|
4
4
|
import { forwardRef } from "./~utils.js";
|
|
5
|
+
import { useGhostAlignment } from "./~utils.GhostAligner.js";
|
|
5
6
|
const Button = forwardRef(
|
|
6
7
|
(props, forwardedRef) => {
|
|
7
8
|
const { variant = "solid", tone = "neutral", ...rest } = props;
|
|
9
|
+
const ghostAlignment = useGhostAlignment();
|
|
8
10
|
return /* @__PURE__ */ jsx(
|
|
9
|
-
|
|
11
|
+
AkButton,
|
|
10
12
|
{
|
|
11
13
|
accessibleWhenDisabled: true,
|
|
14
|
+
...rest,
|
|
12
15
|
"data-kiwi-variant": variant,
|
|
13
16
|
"data-kiwi-tone": tone,
|
|
14
|
-
|
|
15
|
-
className: cx(
|
|
17
|
+
"data-kiwi-ghost-align": variant === "ghost" ? ghostAlignment : void 0,
|
|
18
|
+
className: cx(
|
|
19
|
+
"\u{1F95D}-button",
|
|
20
|
+
{ "\u{1F95D}-ghost-aligner": variant === "ghost" },
|
|
21
|
+
props.className
|
|
22
|
+
),
|
|
16
23
|
ref: forwardedRef
|
|
17
24
|
}
|
|
18
25
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type CheckboxProps as AkCheckboxProps } from "@ariakit/react/checkbox";
|
|
2
2
|
import { type FocusableProps } from "./~utils.js";
|
|
3
3
|
type InputBaseProps = Omit<FocusableProps<"input">, "defaultValue" | "checked" | "defaultChecked">;
|
|
4
|
-
type CheckboxOwnProps = Pick<
|
|
4
|
+
type CheckboxOwnProps = Pick<AkCheckboxProps, "value" | "defaultChecked" | "checked" | "onChange">;
|
|
5
5
|
interface CheckboxProps extends InputBaseProps, CheckboxOwnProps {
|
|
6
6
|
}
|
|
7
7
|
/**
|
package/dist/bricks/Checkbox.js
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import cx from "classnames";
|
|
3
|
-
import
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
Checkbox as AkCheckbox
|
|
5
|
+
} from "@ariakit/react/checkbox";
|
|
6
|
+
import { FieldControl } from "./Field.js";
|
|
5
7
|
import { forwardRef } from "./~utils.js";
|
|
6
8
|
const Checkbox = forwardRef(
|
|
7
9
|
(props, forwardedRef) => {
|
|
8
|
-
const
|
|
10
|
+
const { id, ...rest } = props;
|
|
9
11
|
return /* @__PURE__ */ jsx(
|
|
10
|
-
|
|
12
|
+
FieldControl,
|
|
11
13
|
{
|
|
12
|
-
|
|
13
|
-
id
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
type: "checkable",
|
|
15
|
+
id,
|
|
16
|
+
render: /* @__PURE__ */ jsx(
|
|
17
|
+
AkCheckbox,
|
|
18
|
+
{
|
|
19
|
+
accessibleWhenDisabled: true,
|
|
20
|
+
...rest,
|
|
21
|
+
className: cx("\u{1F95D}-checkbox", props.className),
|
|
22
|
+
ref: forwardedRef
|
|
23
|
+
}
|
|
24
|
+
)
|
|
17
25
|
}
|
|
18
26
|
);
|
|
19
27
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type BaseProps } from "./~utils.js";
|
|
3
|
+
interface ChipProps extends Omit<BaseProps<"div">, "children"> {
|
|
4
|
+
/**
|
|
5
|
+
* The label displayed inside the chip.
|
|
6
|
+
*/
|
|
7
|
+
label: string;
|
|
8
|
+
/**
|
|
9
|
+
* The variant style of the Chip.
|
|
10
|
+
* Use "solid" for primary states and "outline" for less prominent states.
|
|
11
|
+
*
|
|
12
|
+
* @default "solid"
|
|
13
|
+
*/
|
|
14
|
+
variant?: "solid" | "outline";
|
|
15
|
+
/**
|
|
16
|
+
* Callback invoked when the dismiss ("❌") button is clicked.
|
|
17
|
+
*/
|
|
18
|
+
onDismiss?: () => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Chip is a UI component used to represent an item, attribute, or action in a compact visual style.
|
|
22
|
+
* It supports two visual variants: `solid` for primary emphasis and `outline` for less prominent states.
|
|
23
|
+
*
|
|
24
|
+
* Example:
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <Chip label="Value" />
|
|
27
|
+
* <Chip label="Value" variant="outline" />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLElement | HTMLDivElement>>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import cx from "classnames";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Role } from "@ariakit/react/role";
|
|
5
|
+
import { forwardRef } from "./~utils.js";
|
|
6
|
+
import { IconButton } from "./IconButton.js";
|
|
7
|
+
import { Dismiss } from "./Icon.js";
|
|
8
|
+
const Chip = forwardRef((props, forwardedRef) => {
|
|
9
|
+
const { variant = "solid", onDismiss, label, ...rest } = props;
|
|
10
|
+
const baseId = React.useId();
|
|
11
|
+
const labelId = `${baseId}-label`;
|
|
12
|
+
const dismissIconId = `${baseId}-dismiss`;
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
Role.div,
|
|
15
|
+
{
|
|
16
|
+
"data-kiwi-variant": variant,
|
|
17
|
+
...rest,
|
|
18
|
+
className: cx("\u{1F95D}-chip", props.className),
|
|
19
|
+
ref: forwardedRef,
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsx("span", { id: labelId, children: label }),
|
|
22
|
+
onDismiss && /* @__PURE__ */ jsx(
|
|
23
|
+
IconButton,
|
|
24
|
+
{
|
|
25
|
+
id: dismissIconId,
|
|
26
|
+
className: "\u{1F95D}-chip-dismiss-button",
|
|
27
|
+
variant: "ghost",
|
|
28
|
+
"aria-labelledby": `${dismissIconId} ${labelId}`,
|
|
29
|
+
label: "Dismiss",
|
|
30
|
+
labelVariant: "visually-hidden",
|
|
31
|
+
icon: /* @__PURE__ */ jsx(Dismiss, {}),
|
|
32
|
+
onClick: onDismiss
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
export {
|
|
40
|
+
Chip
|
|
41
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type BaseProps } from "./~utils.js";
|
|
2
|
+
interface DescriptionProps extends BaseProps {
|
|
3
|
+
/**
|
|
4
|
+
* The tone of the description.
|
|
5
|
+
* @default "neutral"
|
|
6
|
+
*/
|
|
7
|
+
tone?: "neutral" | "critical";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* An additional description for a form control.
|
|
11
|
+
*
|
|
12
|
+
* Should not include content without an adequate text alternative.
|
|
13
|
+
*
|
|
14
|
+
* Either give this component an `id` and manually associate with a form control
|
|
15
|
+
* using `aria-describedby` on said control or use the `<Field>` component
|
|
16
|
+
* (WIP).
|
|
17
|
+
*/
|
|
18
|
+
export declare const Description: import("react").ForwardRefExoticComponent<DescriptionProps & import("react").RefAttributes<HTMLElement | HTMLDivElement>>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "./~utils.js";
|
|
3
|
+
import cx from "classnames";
|
|
4
|
+
import { Text } from "./Text.js";
|
|
5
|
+
import { FieldDescription } from "./Field.js";
|
|
6
|
+
const Description = forwardRef(
|
|
7
|
+
(props, forwardedRef) => {
|
|
8
|
+
const { id, tone, ...rest } = props;
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
FieldDescription,
|
|
11
|
+
{
|
|
12
|
+
id,
|
|
13
|
+
render: /* @__PURE__ */ jsx(
|
|
14
|
+
Text,
|
|
15
|
+
{
|
|
16
|
+
...rest,
|
|
17
|
+
variant: "caption-md",
|
|
18
|
+
"data-kiwi-tone": tone ?? "neutral",
|
|
19
|
+
className: cx("\u{1F95D}-description", props.className),
|
|
20
|
+
ref: forwardedRef
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
export {
|
|
28
|
+
Description
|
|
29
|
+
};
|
package/dist/bricks/Divider.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type SeparatorProps } from "@ariakit/react/separator";
|
|
2
2
|
import { type BaseProps } from "./~utils.js";
|
|
3
|
-
interface DividerProps extends BaseProps<"hr">, Pick<
|
|
3
|
+
interface DividerProps extends BaseProps<"hr">, Pick<SeparatorProps, "orientation"> {
|
|
4
4
|
/**
|
|
5
5
|
* If true, the divider will be purely presentational and will not have any associated semantics.
|
|
6
6
|
*
|
package/dist/bricks/Divider.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import cx from "classnames";
|
|
3
|
-
import
|
|
3
|
+
import { Role } from "@ariakit/react/role";
|
|
4
|
+
import { Separator } from "@ariakit/react/separator";
|
|
4
5
|
import { forwardRef } from "./~utils.js";
|
|
5
6
|
const Divider = forwardRef((props, forwardedRef) => {
|
|
6
7
|
const { presentational, ...rest } = props;
|
|
7
|
-
const Comp = presentational ?
|
|
8
|
+
const Comp = presentational ? Role : Separator;
|
|
8
9
|
return /* @__PURE__ */ jsx(
|
|
9
10
|
Comp,
|
|
10
11
|
{
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
3
|
-
import { type
|
|
4
|
-
|
|
2
|
+
import { type AnyString, type BaseProps, type FocusableProps } from "./~utils.js";
|
|
3
|
+
import { type MenuItemCheckboxProps, type MenuProviderProps } from "@ariakit/react/menu";
|
|
4
|
+
import { type PredefinedSymbol } from "./Kbd.internal.js";
|
|
5
|
+
interface DropdownMenuProps extends Pick<MenuProviderProps, "children" | "placement" | "open" | "setOpen" | "defaultOpen"> {
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
7
8
|
* A dropdown menu displays a list of actions or commands when the menu button is clicked.
|
|
@@ -14,9 +15,9 @@ interface DropdownMenuProps extends Pick<Ariakit.MenuProviderProps, "children" |
|
|
|
14
15
|
* <DropdownMenu.Button>Actions</DropdownMenu.Button>
|
|
15
16
|
*
|
|
16
17
|
* <DropdownMenu.Content>
|
|
17
|
-
* <DropdownMenu.Item
|
|
18
|
-
* <DropdownMenu.Item
|
|
19
|
-
* <DropdownMenu.Item
|
|
18
|
+
* <DropdownMenu.Item label="Add" />
|
|
19
|
+
* <DropdownMenu.Item label="Edit" />
|
|
20
|
+
* <DropdownMenu.Item label="Delete" />
|
|
20
21
|
* </DropdownMenu.Content>
|
|
21
22
|
* </DropdownMenu.Root>
|
|
22
23
|
* ```
|
|
@@ -55,7 +56,21 @@ interface DropdownMenuButtonProps extends FocusableProps<"button"> {
|
|
|
55
56
|
* ```
|
|
56
57
|
*/
|
|
57
58
|
declare const DropdownMenuButton: React.ForwardRefExoticComponent<DropdownMenuButtonProps & React.RefAttributes<HTMLElement | HTMLButtonElement>>;
|
|
58
|
-
interface DropdownMenuItemProps extends FocusableProps {
|
|
59
|
+
interface DropdownMenuItemProps extends Omit<FocusableProps, "children">, Partial<Pick<DropdownMenuItemShortcutsProps, "shortcuts"> & Pick<DropdownMenuIconProps, "icon">> {
|
|
60
|
+
/** The primary text label for the menu-item. */
|
|
61
|
+
label: React.ReactNode;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A single menu item within the dropdown menu. Should be used as a child of `DropdownMenu.Content`.
|
|
65
|
+
*
|
|
66
|
+
* Example:
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <DropdownMenu.Item label="Add" />
|
|
69
|
+
* <DropdownMenu.Item label="Edit" />
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare const DropdownMenuItem: React.ForwardRefExoticComponent<DropdownMenuItemProps & React.RefAttributes<HTMLElement | HTMLDivElement>>;
|
|
73
|
+
interface DropdownMenuItemShortcutsProps extends BaseProps {
|
|
59
74
|
/**
|
|
60
75
|
* A string defining the keyboard shortcut(s) associated with the menu item.
|
|
61
76
|
*
|
|
@@ -63,22 +78,34 @@ interface DropdownMenuItemProps extends FocusableProps {
|
|
|
63
78
|
* shortcuts="S" // A single key shortcut
|
|
64
79
|
* ```
|
|
65
80
|
*
|
|
66
|
-
* Multiple keys should be separated by the
|
|
81
|
+
* Multiple keys should be separated by the `+` character. If one of the keys is
|
|
82
|
+
* recognized as a symbol name or a modifier key, it will be displayed as a symbol.
|
|
67
83
|
*
|
|
68
84
|
* ```tsx
|
|
69
|
-
* shortcuts="
|
|
85
|
+
* shortcuts="Control+Enter" // A multi-key shortcut, displayed as "Ctrl ⏎"
|
|
70
86
|
* ```
|
|
71
87
|
*/
|
|
72
|
-
shortcuts
|
|
88
|
+
shortcuts: AnyString | `${PredefinedSymbol}+${AnyString}`;
|
|
89
|
+
}
|
|
90
|
+
interface DropdownMenuIconProps extends BaseProps {
|
|
91
|
+
/**
|
|
92
|
+
* An optional icon displayed before the menu-item label.
|
|
93
|
+
*
|
|
94
|
+
* Can be a URL of an SVG from the `@itwin/itwinui-icons` package,
|
|
95
|
+
* or a custom JSX icon.
|
|
96
|
+
*/
|
|
97
|
+
icon?: string | React.JSX.Element;
|
|
98
|
+
}
|
|
99
|
+
interface DropdownMenuCheckboxItemProps extends Omit<FocusableProps, "onChange" | "children">, Pick<MenuItemCheckboxProps, "checked" | "onChange" | "name" | "value">, Pick<DropdownMenuItemProps, "label" | "icon"> {
|
|
73
100
|
}
|
|
74
101
|
/**
|
|
75
102
|
* A single menu item within the dropdown menu. Should be used as a child of `DropdownMenu.Content`.
|
|
76
103
|
*
|
|
77
104
|
* Example:
|
|
78
105
|
* ```tsx
|
|
79
|
-
* <DropdownMenu.
|
|
80
|
-
* <DropdownMenu.
|
|
106
|
+
* <DropdownMenu.CheckboxItem name="add" label="Add" />
|
|
107
|
+
* <DropdownMenu.CheckboxItem name="edit" label="Edit" />
|
|
81
108
|
* ```
|
|
82
109
|
*/
|
|
83
|
-
declare const
|
|
84
|
-
export { DropdownMenu as Root, DropdownMenuButton as Button, DropdownMenuContent as Content, DropdownMenuItem as Item, };
|
|
110
|
+
declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLElement | HTMLDivElement>>;
|
|
111
|
+
export { DropdownMenu as Root, DropdownMenuButton as Button, DropdownMenuContent as Content, DropdownMenuItem as Item, DropdownMenuCheckboxItem as CheckboxItem, };
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import cx from "classnames";
|
|
4
|
-
import * as
|
|
5
|
-
import * as ListItem from "./ListItem.js";
|
|
4
|
+
import * as ListItem from "./~utils.ListItem.js";
|
|
6
5
|
import { Button } from "./Button.js";
|
|
7
6
|
import { Kbd } from "./Kbd.js";
|
|
8
|
-
import { DisclosureArrow } from "./Icon.js";
|
|
9
|
-
import {
|
|
7
|
+
import { Checkmark, DisclosureArrow, Icon } from "./Icon.js";
|
|
8
|
+
import {
|
|
9
|
+
forwardRef
|
|
10
|
+
} from "./~utils.js";
|
|
11
|
+
import { usePopoverApi } from "./~hooks.js";
|
|
12
|
+
import {
|
|
13
|
+
MenuProvider,
|
|
14
|
+
useMenuContext,
|
|
15
|
+
Menu,
|
|
16
|
+
MenuButton,
|
|
17
|
+
MenuItem,
|
|
18
|
+
MenuItemCheckbox
|
|
19
|
+
} from "@ariakit/react/menu";
|
|
20
|
+
import { useStoreState } from "@ariakit/react/store";
|
|
21
|
+
import { predefinedSymbols } from "./Kbd.internal.js";
|
|
10
22
|
function DropdownMenu(props) {
|
|
11
23
|
const {
|
|
12
24
|
children,
|
|
@@ -15,21 +27,9 @@ function DropdownMenu(props) {
|
|
|
15
27
|
setOpen: setOpenProp,
|
|
16
28
|
defaultOpen: defaultOpenProp
|
|
17
29
|
} = props;
|
|
18
|
-
const store = Ariakit.useMenuStore();
|
|
19
|
-
const open = Ariakit.useStoreState(store, (state) => state.open);
|
|
20
|
-
const popover = Ariakit.useStoreState(store, (state) => state.popoverElement);
|
|
21
|
-
React.useEffect(
|
|
22
|
-
function syncPopoverWithOpenState() {
|
|
23
|
-
if (popover?.isConnected) {
|
|
24
|
-
popover?.togglePopover?.(open);
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
[open, popover]
|
|
28
|
-
);
|
|
29
30
|
return /* @__PURE__ */ jsx(
|
|
30
|
-
|
|
31
|
+
MenuProvider,
|
|
31
32
|
{
|
|
32
|
-
store,
|
|
33
33
|
placement,
|
|
34
34
|
defaultOpen: defaultOpenProp,
|
|
35
35
|
open: openProp,
|
|
@@ -40,14 +40,16 @@ function DropdownMenu(props) {
|
|
|
40
40
|
}
|
|
41
41
|
const DropdownMenuContent = forwardRef(
|
|
42
42
|
(props, forwardedRef) => {
|
|
43
|
+
const popover = usePopoverApi(useMenuContext());
|
|
43
44
|
return /* @__PURE__ */ jsx(
|
|
44
|
-
|
|
45
|
+
Menu,
|
|
45
46
|
{
|
|
46
|
-
portal:
|
|
47
|
+
portal: true,
|
|
47
48
|
unmountOnHide: true,
|
|
48
49
|
...props,
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
gutter: 4,
|
|
51
|
+
style: { ...popover.style, ...props.style },
|
|
52
|
+
wrapperProps: popover.wrapperProps,
|
|
51
53
|
className: cx("\u{1F95D}-dropdown-menu", props.className),
|
|
52
54
|
ref: forwardedRef
|
|
53
55
|
}
|
|
@@ -57,8 +59,9 @@ const DropdownMenuContent = forwardRef(
|
|
|
57
59
|
const DropdownMenuButton = forwardRef(
|
|
58
60
|
(props, forwardedRef) => {
|
|
59
61
|
const { accessibleWhenDisabled = true, children, ...rest } = props;
|
|
62
|
+
const open = useStoreState(useMenuContext(), (state) => state?.open);
|
|
60
63
|
return /* @__PURE__ */ jsx(
|
|
61
|
-
|
|
64
|
+
MenuButton,
|
|
62
65
|
{
|
|
63
66
|
accessibleWhenDisabled: true,
|
|
64
67
|
render: /* @__PURE__ */ jsxs(Button, { accessibleWhenDisabled, children: [
|
|
@@ -67,6 +70,7 @@ const DropdownMenuButton = forwardRef(
|
|
|
67
70
|
] }),
|
|
68
71
|
...rest,
|
|
69
72
|
className: cx("\u{1F95D}-dropdown-menu-button", props.className),
|
|
73
|
+
"data-has-popover-open": open || void 0,
|
|
70
74
|
ref: forwardedRef
|
|
71
75
|
}
|
|
72
76
|
);
|
|
@@ -74,28 +78,100 @@ const DropdownMenuButton = forwardRef(
|
|
|
74
78
|
);
|
|
75
79
|
const DropdownMenuItem = forwardRef(
|
|
76
80
|
(props, forwardedRef) => {
|
|
77
|
-
const { shortcuts, ...rest } = props;
|
|
78
|
-
const shortcutKeys = React.useMemo(() => {
|
|
79
|
-
return typeof shortcuts === "string" ? shortcuts.split("+").map((key) => key.trim()) : [];
|
|
80
|
-
}, [shortcuts]);
|
|
81
|
-
const hasShortcuts = shortcutKeys.length > 0;
|
|
81
|
+
const { label, shortcuts, icon, ...rest } = props;
|
|
82
82
|
return /* @__PURE__ */ jsxs(
|
|
83
|
-
|
|
83
|
+
MenuItem,
|
|
84
84
|
{
|
|
85
85
|
accessibleWhenDisabled: true,
|
|
86
86
|
...rest,
|
|
87
87
|
render: /* @__PURE__ */ jsx(ListItem.Root, { render: props.render }),
|
|
88
|
+
className: cx("\u{1F95D}-dropdown-menu-item", props.className),
|
|
88
89
|
ref: forwardedRef,
|
|
89
90
|
children: [
|
|
90
|
-
/* @__PURE__ */ jsx(
|
|
91
|
-
|
|
91
|
+
icon ? /* @__PURE__ */ jsx(DropdownMenuIcon, { icon }) : null,
|
|
92
|
+
/* @__PURE__ */ jsx(ListItem.Content, { children: label }),
|
|
93
|
+
shortcuts ? /* @__PURE__ */ jsx(DropdownMenuItemShortcuts, { shortcuts }) : null
|
|
92
94
|
]
|
|
93
95
|
}
|
|
94
96
|
);
|
|
95
97
|
}
|
|
96
98
|
);
|
|
99
|
+
const DropdownMenuItemShortcuts = forwardRef((props, forwardedRef) => {
|
|
100
|
+
const { shortcuts, ...rest } = props;
|
|
101
|
+
const shortcutKeys = React.useMemo(() => {
|
|
102
|
+
return shortcuts.split("+").map((key) => ({
|
|
103
|
+
key: key.trim(),
|
|
104
|
+
isSymbol: key in predefinedSymbols
|
|
105
|
+
}));
|
|
106
|
+
}, [shortcuts]);
|
|
107
|
+
return /* @__PURE__ */ jsx(
|
|
108
|
+
ListItem.Decoration,
|
|
109
|
+
{
|
|
110
|
+
...rest,
|
|
111
|
+
className: cx("\u{1F95D}-dropdown-menu-item-shortcuts", props.className),
|
|
112
|
+
ref: forwardedRef,
|
|
113
|
+
children: shortcutKeys.map(({ key, isSymbol }, index) => {
|
|
114
|
+
if (isSymbol) {
|
|
115
|
+
return /* @__PURE__ */ jsx(
|
|
116
|
+
Kbd,
|
|
117
|
+
{
|
|
118
|
+
variant: "ghost",
|
|
119
|
+
symbol: key
|
|
120
|
+
},
|
|
121
|
+
`${key + index}`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
return /* @__PURE__ */ jsx(Kbd, { variant: "ghost", children: key }, `${key + index}`);
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
const DropdownMenuIcon = forwardRef(
|
|
130
|
+
(props, forwardedRef) => {
|
|
131
|
+
const { icon, ...rest } = props;
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
ListItem.Decoration,
|
|
134
|
+
{
|
|
135
|
+
render: /* @__PURE__ */ jsx(
|
|
136
|
+
Icon,
|
|
137
|
+
{
|
|
138
|
+
href: typeof icon === "string" ? icon : void 0,
|
|
139
|
+
render: React.isValidElement(icon) ? icon : void 0
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
...rest,
|
|
143
|
+
ref: forwardedRef
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
const DropdownMenuCheckboxItem = forwardRef((props, forwardedRef) => {
|
|
149
|
+
const { label, icon, ...rest } = props;
|
|
150
|
+
return /* @__PURE__ */ jsxs(
|
|
151
|
+
MenuItemCheckbox,
|
|
152
|
+
{
|
|
153
|
+
accessibleWhenDisabled: true,
|
|
154
|
+
value: props.defaultChecked ? "on" : void 0,
|
|
155
|
+
...rest,
|
|
156
|
+
render: /* @__PURE__ */ jsx(ListItem.Root, { render: props.render }),
|
|
157
|
+
className: cx("\u{1F95D}-dropdown-menu-item", props.className),
|
|
158
|
+
ref: forwardedRef,
|
|
159
|
+
children: [
|
|
160
|
+
icon ? /* @__PURE__ */ jsx(DropdownMenuIcon, { icon }) : null,
|
|
161
|
+
/* @__PURE__ */ jsx(ListItem.Content, { children: label }),
|
|
162
|
+
/* @__PURE__ */ jsx(
|
|
163
|
+
ListItem.Decoration,
|
|
164
|
+
{
|
|
165
|
+
render: /* @__PURE__ */ jsx(Checkmark, { className: "\u{1F95D}-dropdown-menu-checkmark" })
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
});
|
|
97
172
|
export {
|
|
98
173
|
DropdownMenuButton as Button,
|
|
174
|
+
DropdownMenuCheckboxItem as CheckboxItem,
|
|
99
175
|
DropdownMenuContent as Content,
|
|
100
176
|
DropdownMenuItem as Item,
|
|
101
177
|
DropdownMenu as Root
|