@koobiq/react-components 0.0.1-beta.2 → 0.0.1-beta.21
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/dist/components/Alert/Alert.js +2 -2
- package/dist/components/Alert/components/AlertIcon/utils.js +1 -1
- package/dist/components/Alert/intl.json.js +2 -6
- package/dist/components/Alert/types.d.ts +2 -1
- package/dist/components/AnimatedIcon/AnimatedIcon.d.ts +4 -0
- package/dist/components/AnimatedIcon/AnimatedIcon.js +50 -0
- package/dist/components/AnimatedIcon/AnimatedIcon.module.css.js +11 -0
- package/dist/components/AnimatedIcon/index.d.ts +2 -0
- package/dist/components/AnimatedIcon/types.d.ts +19 -0
- package/dist/components/Button/Button.js +1 -1
- package/dist/components/Button/Button.module.css.js +2 -2
- package/dist/components/Button/types.d.ts +4 -5
- package/dist/components/ButtonToggleGroup/ButtonToggleGroup.d.ts +2 -0
- package/dist/components/ButtonToggleGroup/ButtonToggleGroup.js +130 -0
- package/dist/components/ButtonToggleGroup/ButtonToggleGroup.module.css.js +17 -0
- package/dist/components/ButtonToggleGroup/ButtonToggleGroupContext.d.ts +7 -0
- package/dist/components/ButtonToggleGroup/ButtonToggleGroupContext.js +12 -0
- package/dist/components/ButtonToggleGroup/components/ButtonToggle/ButtonToggle.d.ts +2 -0
- package/dist/components/ButtonToggleGroup/components/ButtonToggle/ButtonToggle.js +90 -0
- package/dist/components/ButtonToggleGroup/components/ButtonToggle/ButtonToggle.module.css.js +32 -0
- package/dist/components/ButtonToggleGroup/components/ButtonToggle/index.d.ts +2 -0
- package/dist/components/ButtonToggleGroup/components/ButtonToggle/types.d.ts +27 -0
- package/dist/components/ButtonToggleGroup/components/index.d.ts +1 -0
- package/dist/components/ButtonToggleGroup/index.d.ts +3 -0
- package/dist/components/ButtonToggleGroup/reducer.d.ts +23 -0
- package/dist/components/ButtonToggleGroup/reducer.js +25 -0
- package/dist/components/ButtonToggleGroup/types.d.ts +38 -0
- package/dist/components/ButtonToggleGroup/utils.d.ts +3 -0
- package/dist/components/ButtonToggleGroup/utils.js +19 -0
- package/dist/components/Checkbox/Checkbox.js +18 -8
- package/dist/components/Collections/Divider.d.ts +19 -0
- package/dist/components/Collections/Divider.js +14 -0
- package/dist/components/Collections/Header.d.ts +20 -0
- package/dist/components/Collections/Header.js +16 -0
- package/dist/components/Collections/Item.d.ts +14 -0
- package/dist/components/Collections/Item.js +10 -0
- package/dist/components/{List/ListSection.d.ts → Collections/Section.d.ts} +6 -6
- package/dist/components/Collections/Section.js +10 -0
- package/dist/components/Collections/index.d.ts +4 -0
- package/dist/components/Container/Container.js +2 -1
- package/dist/components/Container/utils.d.ts +1 -1
- package/dist/components/Dialog/Dialog.d.ts +9 -1
- package/dist/components/Dialog/Dialog.js +31 -17
- package/dist/components/Dialog/components/DialogBody.d.ts +13 -0
- package/dist/components/Dialog/components/{DialogContent.js → DialogBody.js} +9 -8
- package/dist/components/Dialog/components/DialogCloseButton.d.ts +14 -1
- package/dist/components/Dialog/components/DialogCloseButton.js +3 -6
- package/dist/components/Dialog/components/index.d.ts +1 -1
- package/dist/components/Dialog/index.d.ts +0 -1
- package/dist/components/Dialog/intl.json.js +2 -6
- package/dist/components/Divider/Divider.d.ts +4 -0
- package/dist/components/Divider/Divider.js +44 -0
- package/dist/components/Divider/Divider.module.css.js +29 -0
- package/dist/components/Divider/index.d.ts +2 -0
- package/dist/components/Divider/types.d.ts +26 -0
- package/dist/components/Divider/types.js +6 -0
- package/dist/components/FieldComponents/FieldControl/FieldControl.d.ts +1 -1
- package/dist/components/FieldComponents/FieldInputGroup/FieldInputGroup.d.ts +8 -2
- package/dist/components/FieldComponents/FieldInputGroup/FieldInputGroup.js +32 -30
- package/dist/components/FieldComponents/FieldNumberControl/FieldNumberControl.d.ts +1 -1
- package/dist/components/FieldComponents/FieldSelect/FieldSelect.d.ts +12 -0
- package/dist/components/FieldComponents/FieldSelect/FieldSelect.js +37 -0
- package/dist/components/FieldComponents/FieldSelect/FieldSelect.module.css.js +20 -0
- package/dist/components/FieldComponents/FieldSelect/index.d.ts +1 -0
- package/dist/components/FieldComponents/index.d.ts +1 -0
- package/dist/components/FlexBox/FlexBox.d.ts +4 -0
- package/dist/components/FlexBox/FlexBox.js +47 -0
- package/dist/components/FlexBox/index.d.ts +2 -0
- package/dist/components/FlexBox/types.d.ts +27 -0
- package/dist/components/Grid/Grid.d.ts +8 -2
- package/dist/components/Grid/Grid.js +5 -2
- package/dist/components/IconButton/types.d.ts +5 -4
- package/dist/components/Input/Input.d.ts +1 -0
- package/dist/components/Input/Input.js +11 -11
- package/dist/components/Input/types.d.ts +2 -1
- package/dist/components/Link/Link.js +13 -15
- package/dist/components/Link/types.d.ts +4 -4
- package/dist/components/List/List.d.ts +17 -3
- package/dist/components/List/List.js +32 -18
- package/dist/components/List/List.module.css.js +0 -3
- package/dist/components/List/components/ListItemText/ListItemText.js +26 -0
- package/dist/components/List/components/ListItemText/ListItemText.module.css.js +11 -0
- package/dist/components/List/components/ListOption/ListOption.d.ts +3 -2
- package/dist/components/List/components/ListOption/ListOption.js +11 -16
- package/dist/components/List/components/ListSection/ListSection.d.ts +3 -2
- package/dist/components/List/components/ListSection/ListSection.js +1 -4
- package/dist/components/List/index.d.ts +2 -2
- package/dist/components/List/types.d.ts +13 -2
- package/dist/components/Menu/Menu.d.ts +15 -0
- package/dist/components/Menu/Menu.js +68 -0
- package/dist/components/Menu/Menu.module.css.js +8 -0
- package/dist/components/Menu/components/MenuHeader/MenuHeader.d.ts +5 -0
- package/dist/components/Menu/components/MenuHeader/MenuHeader.js +9 -0
- package/dist/components/Menu/components/MenuHeader/index.d.ts +1 -0
- package/dist/components/Menu/components/MenuInner/MenuInner.d.ts +3 -0
- package/dist/components/Menu/components/MenuInner/MenuInner.js +45 -0
- package/dist/components/Menu/components/MenuInner/MenuInner.module.css.js +11 -0
- package/dist/components/Menu/components/MenuInner/index.d.ts +1 -0
- package/dist/components/Menu/components/MenuItem/MenuItem.d.ts +6 -0
- package/dist/components/Menu/components/MenuItem/MenuItem.js +36 -0
- package/dist/components/Menu/components/MenuItem/index.d.ts +1 -0
- package/dist/components/Menu/components/MenuSection/MenuSection.d.ts +6 -0
- package/dist/components/Menu/components/MenuSection/MenuSection.js +30 -0
- package/dist/components/Menu/components/MenuSection/MenuSection.module.css.js +11 -0
- package/dist/components/Menu/components/MenuSection/index.d.ts +1 -0
- package/dist/components/Menu/components/index.d.ts +1 -0
- package/dist/components/Menu/index.d.ts +2 -0
- package/dist/components/Menu/types.d.ts +62 -0
- package/dist/components/Menu/types.js +4 -0
- package/dist/components/Modal/Modal.d.ts +9 -1
- package/dist/components/Modal/Modal.js +21 -16
- package/dist/components/Modal/index.d.ts +15 -2
- package/dist/components/Modal/index.js +9 -0
- package/dist/components/Modal/types.d.ts +7 -0
- package/dist/components/Popover/Popover.d.ts +12 -2
- package/dist/components/Popover/Popover.js +143 -128
- package/dist/components/Popover/Popover.module.css.js +3 -0
- package/dist/components/Popover/index.d.ts +15 -2
- package/dist/components/Popover/index.js +9 -0
- package/dist/components/Popover/types.d.ts +28 -4
- package/dist/components/Popover/types.js +9 -1
- package/dist/components/ProgressBar/ProgressBar.module.css.js +1 -2
- package/dist/components/ProgressSpinner/ProgressSpinner.module.css.js +1 -2
- package/dist/components/Provider/BreakpointsProvider.d.ts +2 -1
- package/dist/components/Provider/BreakpointsProvider.js +8 -1
- package/dist/components/Provider/Provider.d.ts +1 -1
- package/dist/components/Provider/Provider.js +9 -1
- package/dist/components/Provider/types.d.ts +5 -0
- package/dist/components/Provider/utils/useBreakpoints.d.ts +2 -1
- package/dist/components/Provider/utils/useBreakpoints.js +2 -2
- package/dist/components/RadioGroup/RadioContext.js +1 -0
- package/dist/components/RadioGroup/RadioGroup.js +2 -1
- package/dist/components/RadioGroup/components/Radio/Radio.js +3 -2
- package/dist/components/RadioGroup/components/Radio/Radio.module.css.js +3 -0
- package/dist/components/Select/Select.d.ts +11 -0
- package/dist/components/Select/Select.js +179 -0
- package/dist/components/Select/Select.module.css.js +20 -0
- package/dist/components/Select/index.d.ts +2 -0
- package/dist/components/Select/types.d.ts +87 -0
- package/dist/components/SidePanel/SidePanel.d.ts +9 -1
- package/dist/components/SidePanel/SidePanel.js +24 -19
- package/dist/components/SidePanel/index.d.ts +15 -2
- package/dist/components/SidePanel/index.js +9 -0
- package/dist/components/SidePanel/types.d.ts +7 -0
- package/dist/components/SkeletonBlock/SkeletonBlock.module.css.js +0 -1
- package/dist/components/SkeletonTypography/utils.js +3 -0
- package/dist/components/TagGroup/Tag.d.ts +24 -0
- package/dist/components/TagGroup/Tag.js +10 -0
- package/dist/components/TagGroup/TagGroup.d.ts +2 -0
- package/dist/components/TagGroup/TagGroup.js +22 -0
- package/dist/components/TagGroup/TagGroup.module.css.js +8 -0
- package/dist/components/TagGroup/components/TagInner/TagInner.d.ts +11 -0
- package/dist/components/TagGroup/components/TagInner/TagInner.js +86 -0
- package/dist/components/TagGroup/components/TagInner/TagInner.module.css.js +30 -0
- package/dist/components/TagGroup/components/TagInner/index.d.ts +1 -0
- package/dist/components/TagGroup/components/TagInner/utils.d.ts +3 -0
- package/dist/components/TagGroup/components/TagInner/utils.js +9 -0
- package/dist/components/TagGroup/components/index.d.ts +1 -0
- package/dist/components/TagGroup/index.d.ts +3 -0
- package/dist/components/TagGroup/intl.json.js +7 -0
- package/dist/components/TagGroup/types.d.ts +37 -0
- package/dist/components/TagGroup/types.js +9 -0
- package/dist/components/Toggle/Toggle.js +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +2 -1
- package/dist/components/Tooltip/Tooltip.js +9 -8
- package/dist/components/Tooltip/types.d.ts +9 -4
- package/dist/components/Typography/Typography.js +2 -2
- package/dist/components/Typography/Typography.module.css.js +2 -1
- package/dist/components/Typography/types.d.ts +7 -2
- package/dist/components/Typography/types.js +2 -1
- package/dist/components/index.d.ts +8 -0
- package/dist/components/layout/flex/flex.d.ts +15 -4
- package/dist/components/layout/flex/flex.js +6 -1
- package/dist/components/layout/flex/flex.module.css.js +78 -39
- package/dist/index.js +51 -23
- package/dist/style.css +862 -350
- package/dist/styles/utility.d.ts +2 -0
- package/dist/styles/utility.js +3 -2
- package/dist/styles/utility.module.css.js +5 -2
- package/dist/types.d.ts +1 -0
- package/package.json +11 -6
- package/dist/components/Dialog/DialogContext.d.ts +0 -9
- package/dist/components/Dialog/DialogContext.js +0 -12
- package/dist/components/Dialog/components/DialogContent.d.ts +0 -12
- package/dist/components/Input/components/FieldAddon/FieldAddon.d.ts +0 -10
- package/dist/components/Input/components/FieldAddon/index.d.ts +0 -1
- package/dist/components/Input/components/FieldCaption/FieldCaption.d.ts +0 -6
- package/dist/components/Input/components/FieldCaption/index.d.ts +0 -1
- package/dist/components/Input/components/FieldControl/FieldControl.d.ts +0 -9
- package/dist/components/Input/components/FieldControl/index.d.ts +0 -1
- package/dist/components/Input/components/FieldError/FieldError.d.ts +0 -7
- package/dist/components/Input/components/FieldError/index.d.ts +0 -1
- package/dist/components/Input/components/FieldInput/FieldInput.d.ts +0 -9
- package/dist/components/Input/components/FieldInput/index.d.ts +0 -1
- package/dist/components/Input/components/FieldInputGroup/FieldInputGroup.d.ts +0 -7
- package/dist/components/Input/components/FieldInputGroup/index.d.ts +0 -1
- package/dist/components/Input/components/FieldLabel/FieldLabel.d.ts +0 -9
- package/dist/components/Input/components/FieldLabel/index.d.ts +0 -1
- package/dist/components/Input/components/index.d.ts +0 -7
- package/dist/components/List/ListItem.d.ts +0 -11
- package/dist/components/List/ListItem.js +0 -11
- package/dist/components/List/ListSection.js +0 -11
- package/dist/components/List/components/ListOption/ListOption.module.css.js +0 -23
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useRef } from "react";
|
|
4
|
-
import { useHover, usePress,
|
|
4
|
+
import { useHover, usePress, clsx, mergeProps } from "@koobiq/react-core";
|
|
5
5
|
import { useOption } from "@koobiq/react-primitives";
|
|
6
6
|
import { utilClasses } from "../../../../styles/utility.js";
|
|
7
|
-
import s from "./ListOption.module.css.js";
|
|
8
7
|
const textVariant = utilClasses.typography;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}) {
|
|
8
|
+
const { listItem } = utilClasses;
|
|
9
|
+
function ListOption({ item, state }) {
|
|
10
|
+
const { href, className, style } = item.props;
|
|
13
11
|
const ref = useRef(null);
|
|
14
12
|
const {
|
|
15
13
|
optionProps,
|
|
@@ -19,21 +17,18 @@ function ListOption({
|
|
|
19
17
|
} = useOption({ key: item.key }, state, ref);
|
|
20
18
|
const { hoverProps, isHovered: hovered } = useHover({ isDisabled: disabled });
|
|
21
19
|
const { isPressed: pressed, pressProps } = usePress({ isDisabled: disabled });
|
|
22
|
-
const Tag =
|
|
20
|
+
const Tag = href ? "a" : "li";
|
|
23
21
|
return /* @__PURE__ */ jsx(
|
|
24
22
|
Tag,
|
|
25
23
|
{
|
|
26
24
|
...mergeProps(optionProps, hoverProps, pressProps),
|
|
27
|
-
className: clsx(
|
|
28
|
-
|
|
29
|
-
hovered && s.hovered,
|
|
30
|
-
pressed && s.pressed,
|
|
31
|
-
selected && s.selected,
|
|
32
|
-
textVariant["text-normal"],
|
|
33
|
-
disabled && s.disabled,
|
|
34
|
-
focusVisible && s.focusVisible
|
|
35
|
-
),
|
|
25
|
+
className: clsx(listItem, textVariant["text-normal"], className),
|
|
26
|
+
style,
|
|
36
27
|
ref,
|
|
28
|
+
"data-hovered": hovered,
|
|
29
|
+
"data-pressed": pressed,
|
|
30
|
+
"data-disabled": disabled,
|
|
31
|
+
"data-selected": selected,
|
|
37
32
|
"data-focus-visible": focusVisible,
|
|
38
33
|
children: item.rendered
|
|
39
34
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ListState, Node } from '@koobiq/react-primitives';
|
|
2
|
-
export
|
|
2
|
+
export type ListSectionProps<T> = {
|
|
3
3
|
section: Node<T>;
|
|
4
4
|
state: ListState<T>;
|
|
5
|
-
}
|
|
5
|
+
};
|
|
6
|
+
export declare function ListSection<T>({ section, state }: ListSectionProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -4,10 +4,7 @@ import { useListBoxSection } from "@koobiq/react-primitives";
|
|
|
4
4
|
import s from "./ListSection.module.css.js";
|
|
5
5
|
import { ListOption } from "../ListOption/ListOption.js";
|
|
6
6
|
import { Typography } from "../../../Typography/Typography.js";
|
|
7
|
-
function ListSection({
|
|
8
|
-
section,
|
|
9
|
-
state
|
|
10
|
-
}) {
|
|
7
|
+
function ListSection({ section, state }) {
|
|
11
8
|
const { itemProps, headingProps, groupProps } = useListBoxSection({
|
|
12
9
|
heading: section.rendered,
|
|
13
10
|
"aria-label": section["aria-label"]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { ComponentRef, ReactElement, ReactNode, Ref } from 'react';
|
|
1
|
+
import type { ComponentPropsWithRef, ComponentRef, CSSProperties, ReactElement, ReactNode, Ref } from 'react';
|
|
2
2
|
import type { AriaListBoxProps } from '@koobiq/react-primitives';
|
|
3
|
+
import type { TypographyProps } from '../Typography';
|
|
3
4
|
export declare const listPropSelectionMode: readonly ["none", "single", "multiple"];
|
|
4
5
|
export type ListPropSelectionMode = (typeof listPropSelectionMode)[number];
|
|
5
6
|
export type ListPropItems<T extends object> = AriaListBoxProps<T>['items'];
|
|
@@ -14,8 +15,11 @@ export type ListBaseProps<T extends object> = {
|
|
|
14
15
|
label?: ReactNode;
|
|
15
16
|
/** Additional CSS-classes. */
|
|
16
17
|
className?: string;
|
|
18
|
+
/** Inline styles. */
|
|
19
|
+
style?: CSSProperties;
|
|
17
20
|
/** The type of selection that is allowed in the collection. */
|
|
18
21
|
selectionMode?: ListPropSelectionMode;
|
|
22
|
+
/** Ref to the HTML ul-element. */
|
|
19
23
|
ref?: Ref<HTMLElement>;
|
|
20
24
|
/** The contents of the collection. */
|
|
21
25
|
children?: ListPropChildren<T>;
|
|
@@ -36,7 +40,14 @@ export type ListBaseProps<T extends object> = {
|
|
|
36
40
|
onAction?: ListPropOnAction<T>;
|
|
37
41
|
/** How multiple selection should behave in the collection. */
|
|
38
42
|
selectionBehavior?: ListPropSelectionBehavior<T>;
|
|
43
|
+
/** Whether to autofocus the list or an option. */
|
|
44
|
+
autoFocus?: boolean | 'first' | 'last';
|
|
45
|
+
/** The props used for each slot inside. */
|
|
46
|
+
slotProps?: {
|
|
47
|
+
label?: TypographyProps;
|
|
48
|
+
list?: ComponentPropsWithRef<'div'>;
|
|
49
|
+
};
|
|
39
50
|
};
|
|
40
51
|
export type ListProps<T extends object> = ListBaseProps<T>;
|
|
41
52
|
export type ListRef = ComponentRef<'ul'>;
|
|
42
|
-
export type
|
|
53
|
+
export type ListComponentProps = <T extends object>(props: ListProps<T>) => ReactElement | null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Pressable } from '@koobiq/react-core';
|
|
2
|
+
import { Divider, Item, Section, Header } from '../Collections';
|
|
3
|
+
import { ListItemText } from '../List';
|
|
4
|
+
import type { MenuComponentProps } from './index';
|
|
5
|
+
declare const MenuComponent: MenuComponentProps;
|
|
6
|
+
type CompoundedComponent = typeof MenuComponent & {
|
|
7
|
+
Item: typeof Item;
|
|
8
|
+
Header: typeof Header;
|
|
9
|
+
Section: typeof Section;
|
|
10
|
+
Divider: typeof Divider;
|
|
11
|
+
ItemText: typeof ListItemText;
|
|
12
|
+
Control: typeof Pressable;
|
|
13
|
+
};
|
|
14
|
+
export declare const Menu: CompoundedComponent;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useRef } from "react";
|
|
4
|
+
import { useDOMRef, mergeProps, clsx, Pressable } from "@koobiq/react-core";
|
|
5
|
+
import { useMenuTriggerState, useMenuTrigger } from "@koobiq/react-primitives";
|
|
6
|
+
import s from "./Menu.module.css.js";
|
|
7
|
+
import { MenuInner } from "./components/MenuInner/MenuInner.js";
|
|
8
|
+
import { Header } from "../Collections/Header.js";
|
|
9
|
+
import { Divider } from "../Collections/Divider.js";
|
|
10
|
+
import { PopoverInner } from "../Popover/Popover.js";
|
|
11
|
+
import { Item } from "../Collections/Item.js";
|
|
12
|
+
import { Section } from "../Collections/Section.js";
|
|
13
|
+
import { ListItemText } from "../List/components/ListItemText/ListItemText.js";
|
|
14
|
+
function MenuRender(props, ref) {
|
|
15
|
+
const {
|
|
16
|
+
placement = "bottom start",
|
|
17
|
+
"data-testid": testId,
|
|
18
|
+
control,
|
|
19
|
+
style,
|
|
20
|
+
open,
|
|
21
|
+
anchorRef,
|
|
22
|
+
className,
|
|
23
|
+
slotProps,
|
|
24
|
+
...otherProps
|
|
25
|
+
} = props;
|
|
26
|
+
const state = useMenuTriggerState({ ...props, isOpen: open });
|
|
27
|
+
const domRef = useDOMRef(ref);
|
|
28
|
+
const controlRef = useRef(null);
|
|
29
|
+
const { menuTriggerProps, menuProps } = useMenuTrigger(
|
|
30
|
+
{},
|
|
31
|
+
state,
|
|
32
|
+
controlRef
|
|
33
|
+
);
|
|
34
|
+
const { isDisabled, ...otherMenuTriggerProps } = menuTriggerProps;
|
|
35
|
+
const popoverProps = mergeProps(
|
|
36
|
+
{
|
|
37
|
+
style,
|
|
38
|
+
state,
|
|
39
|
+
offset: 4,
|
|
40
|
+
size: "auto",
|
|
41
|
+
hideArrow: true,
|
|
42
|
+
popoverRef: domRef,
|
|
43
|
+
"data-testid": testId,
|
|
44
|
+
anchorRef: anchorRef || controlRef,
|
|
45
|
+
className: clsx(s.popover, className)
|
|
46
|
+
},
|
|
47
|
+
slotProps?.popover
|
|
48
|
+
);
|
|
49
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
50
|
+
control?.({
|
|
51
|
+
ref: controlRef,
|
|
52
|
+
disabled: isDisabled,
|
|
53
|
+
...otherMenuTriggerProps
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ jsx(PopoverInner, { type: "menu", placement, ...popoverProps, children: /* @__PURE__ */ jsx(MenuInner, { ...otherProps, ...menuProps }) })
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
const MenuComponent = forwardRef(MenuRender);
|
|
59
|
+
const Menu = MenuComponent;
|
|
60
|
+
Menu.Item = Item;
|
|
61
|
+
Menu.Section = Section;
|
|
62
|
+
Menu.Header = Header;
|
|
63
|
+
Menu.Divider = Divider;
|
|
64
|
+
Menu.ItemText = ListItemText;
|
|
65
|
+
Menu.Control = Pressable;
|
|
66
|
+
export {
|
|
67
|
+
Menu
|
|
68
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
function MenuHeader({ item }) {
|
|
4
|
+
const { key, rendered, props } = item;
|
|
5
|
+
return /* @__PURE__ */ jsx("header", { role: "presentation", ...props, children: rendered }, key);
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
MenuHeader
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuHeader';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { clsx } from "@koobiq/react-core";
|
|
5
|
+
import { useTreeState, useMenu } from "@koobiq/react-primitives";
|
|
6
|
+
import { utilClasses } from "../../../../styles/utility.js";
|
|
7
|
+
import s from "./MenuInner.module.css.js";
|
|
8
|
+
import { MenuSection } from "../MenuSection/MenuSection.js";
|
|
9
|
+
import { Divider } from "../../../Divider/Divider.js";
|
|
10
|
+
import { MenuHeader } from "../MenuHeader/MenuHeader.js";
|
|
11
|
+
import { MenuItem } from "../MenuItem/MenuItem.js";
|
|
12
|
+
const { list } = utilClasses;
|
|
13
|
+
function MenuInner(props) {
|
|
14
|
+
const state = useTreeState(props);
|
|
15
|
+
const ref = useRef(null);
|
|
16
|
+
const { menuProps } = useMenu(props, state, ref);
|
|
17
|
+
const multiple = props.selectionMode === "multiple";
|
|
18
|
+
const renderItems = (treeState) => [...treeState.collection].map((item) => {
|
|
19
|
+
switch (item.type) {
|
|
20
|
+
case "header":
|
|
21
|
+
return /* @__PURE__ */ jsx(MenuHeader, { item }, item.key);
|
|
22
|
+
case "divider":
|
|
23
|
+
return /* @__PURE__ */ jsx(Divider, { className: s.divider }, item.key);
|
|
24
|
+
case "item":
|
|
25
|
+
return /* @__PURE__ */ jsx(MenuItem, { item, state }, item.key);
|
|
26
|
+
case "section":
|
|
27
|
+
return /* @__PURE__ */ jsx(MenuSection, { section: item, state }, item.key);
|
|
28
|
+
default:
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"ul",
|
|
34
|
+
{
|
|
35
|
+
...menuProps,
|
|
36
|
+
className: clsx(s.base, list),
|
|
37
|
+
...multiple && { "aria-multiselectable": true },
|
|
38
|
+
ref,
|
|
39
|
+
children: renderItems(state)
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
MenuInner
|
|
45
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuInner';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { useHover, usePress, clsx, mergeProps } from "@koobiq/react-core";
|
|
5
|
+
import { useMenuItem } from "@koobiq/react-primitives";
|
|
6
|
+
import { utilClasses } from "../../../../styles/utility.js";
|
|
7
|
+
const { listItem } = utilClasses;
|
|
8
|
+
const textVariant = utilClasses.typography;
|
|
9
|
+
function MenuItem({ item, state }) {
|
|
10
|
+
const ref = useRef(null);
|
|
11
|
+
const {
|
|
12
|
+
menuItemProps,
|
|
13
|
+
isSelected: selected,
|
|
14
|
+
isDisabled: disabled,
|
|
15
|
+
isFocusVisible: focusVisible
|
|
16
|
+
} = useMenuItem({ key: item.key }, state, ref);
|
|
17
|
+
const { hoverProps, isHovered: hovered } = useHover({ isDisabled: disabled });
|
|
18
|
+
const { isPressed: pressed, pressProps } = usePress({ isDisabled: disabled });
|
|
19
|
+
const Tag = item.props.href ? "a" : "li";
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
Tag,
|
|
22
|
+
{
|
|
23
|
+
...mergeProps(menuItemProps, hoverProps, pressProps),
|
|
24
|
+
"data-hovered": hovered,
|
|
25
|
+
"data-pressed": pressed,
|
|
26
|
+
"data-selected": selected,
|
|
27
|
+
"data-focus-visible": focusVisible,
|
|
28
|
+
className: clsx(listItem, textVariant["text-normal"]),
|
|
29
|
+
ref,
|
|
30
|
+
children: item.rendered
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
MenuItem
|
|
36
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuItem';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Node, TreeState } from '@koobiq/react-primitives';
|
|
2
|
+
export type MenuSectionProps<T> = {
|
|
3
|
+
section: Node<T>;
|
|
4
|
+
state: TreeState<T>;
|
|
5
|
+
};
|
|
6
|
+
export declare function MenuSection<T>({ section, state }: MenuSectionProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMenuSection } from "@koobiq/react-primitives";
|
|
4
|
+
import s from "./MenuSection.module.css.js";
|
|
5
|
+
import { MenuItem } from "../MenuItem/MenuItem.js";
|
|
6
|
+
import { Typography } from "../../../Typography/Typography.js";
|
|
7
|
+
function MenuSection({ section, state }) {
|
|
8
|
+
const { itemProps, headingProps, groupProps } = useMenuSection({
|
|
9
|
+
heading: section.rendered,
|
|
10
|
+
"aria-label": section["aria-label"]
|
|
11
|
+
});
|
|
12
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("li", { ...itemProps, children: [
|
|
13
|
+
section.rendered && /* @__PURE__ */ jsx(
|
|
14
|
+
Typography,
|
|
15
|
+
{
|
|
16
|
+
as: "span",
|
|
17
|
+
display: "block",
|
|
18
|
+
variant: "caps-compact-strong",
|
|
19
|
+
color: "contrast-secondary",
|
|
20
|
+
className: s.heading,
|
|
21
|
+
...headingProps,
|
|
22
|
+
children: section.rendered
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
/* @__PURE__ */ jsx("ul", { ...groupProps, className: s.base, children: [...section.childNodes].map((node) => /* @__PURE__ */ jsx(MenuItem, { item: node, state }, node.key)) })
|
|
26
|
+
] }) });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
MenuSection
|
|
30
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuSection';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MenuInner';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ComponentRef, CSSProperties, ReactElement, Ref, RefObject } from 'react';
|
|
2
|
+
import type { ButtonOptions, AriaMenuProps } from '@koobiq/react-primitives';
|
|
3
|
+
import type { PopoverInnerProps, PopoverPropPlacement } from '../Popover';
|
|
4
|
+
export type MenuPropControl = (props: ButtonOptions & {
|
|
5
|
+
ref?: Ref<HTMLButtonElement>;
|
|
6
|
+
}) => ReactElement;
|
|
7
|
+
export type MenuPropChildren<T extends object> = AriaMenuProps<T>['children'];
|
|
8
|
+
export type MenuPropItems<T extends object> = AriaMenuProps<T>['items'];
|
|
9
|
+
export declare const menuPropSelectionMode: readonly ["none", "single", "multiple"];
|
|
10
|
+
export type MenuPropSelectionMode = (typeof menuPropSelectionMode)[number];
|
|
11
|
+
export type MenuPropOnAction<T extends object> = AriaMenuProps<T>['onAction'];
|
|
12
|
+
export type MenuPropSelected<T extends object> = AriaMenuProps<T>['selectedKeys'];
|
|
13
|
+
export type MenuPropSelectionChange<T extends object> = AriaMenuProps<T>['onSelectionChange'];
|
|
14
|
+
export type MenuPropDisabledKeys<T extends object> = AriaMenuProps<T>['disabledKeys'];
|
|
15
|
+
export type MenuPropPlacement = PopoverPropPlacement;
|
|
16
|
+
export type MenuProps<T extends object> = {
|
|
17
|
+
/** Additional CSS-classes. */
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Unique identifier for testing purposes. */
|
|
20
|
+
'data-testid'?: string | number;
|
|
21
|
+
/** Inline styles. */
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
/** The contents of the collection. */
|
|
24
|
+
children?: MenuPropChildren<T>;
|
|
25
|
+
/** The render function of the control for displaying the modal window. */
|
|
26
|
+
control?: MenuPropControl;
|
|
27
|
+
/** Whether the overlay is open by default (controlled). */
|
|
28
|
+
open?: boolean;
|
|
29
|
+
/** Whether the overlay is open by default (uncontrolled). */
|
|
30
|
+
defaultOpen?: boolean;
|
|
31
|
+
/** Handler that is called when the overlay's open state changes. */
|
|
32
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
33
|
+
/** Item objects in the collection. */
|
|
34
|
+
items?: MenuPropItems<T>;
|
|
35
|
+
/** The type of selection that is allowed in the collection. */
|
|
36
|
+
selectionMode?: MenuPropSelectionMode;
|
|
37
|
+
/**
|
|
38
|
+
* Handler that is called when a user performs an action on an item. The exact user event depends on
|
|
39
|
+
* the collection's `selectionBehavior` prop and the interaction modality.
|
|
40
|
+
*/
|
|
41
|
+
onAction?: MenuPropOnAction<T>;
|
|
42
|
+
/** The currently selected keys in the collection (controlled). */
|
|
43
|
+
selectedKeys?: MenuPropSelected<T>;
|
|
44
|
+
/** Handler that is called when the selection changes. */
|
|
45
|
+
onSelectionChange?: MenuPropSelectionChange<T>;
|
|
46
|
+
disabledKeys?: MenuPropDisabledKeys<T>;
|
|
47
|
+
/** The ref for the element which the popover positions itself with respect to. */
|
|
48
|
+
anchorRef?: RefObject<HTMLElement | null>;
|
|
49
|
+
/**
|
|
50
|
+
* The placement of the element with respect to its anchor element.
|
|
51
|
+
* @default bottom start
|
|
52
|
+
* */
|
|
53
|
+
placement?: MenuPropPlacement;
|
|
54
|
+
/** Ref to the popover */
|
|
55
|
+
ref?: Ref<HTMLDivElement>;
|
|
56
|
+
/** The props used for each slot inside. */
|
|
57
|
+
slotProps?: {
|
|
58
|
+
popover?: PopoverInnerProps;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export type MenuComponentProps = <T extends object>(props: MenuProps<T>) => ReactElement | null;
|
|
62
|
+
export type MenuRef = ComponentRef<'div'>;
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
import { Dialog } from '../Dialog';
|
|
1
2
|
import type { ModalProps } from './types';
|
|
2
|
-
|
|
3
|
+
declare const ModalComponent: import("react").ForwardRefExoticComponent<ModalProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
4
|
+
type CompoundedComponent = typeof ModalComponent & {
|
|
5
|
+
Header: typeof Dialog.Header;
|
|
6
|
+
Body: typeof Dialog.Body;
|
|
7
|
+
Footer: typeof Dialog.Footer;
|
|
8
|
+
};
|
|
9
|
+
export declare const Modal: CompoundedComponent;
|
|
10
|
+
export {};
|
|
@@ -7,21 +7,22 @@ import { Transition } from "react-transition-group";
|
|
|
7
7
|
import s from "./Modal.module.css.js";
|
|
8
8
|
import { Backdrop } from "../Backdrop/Backdrop.js";
|
|
9
9
|
import { Dialog } from "../Dialog/Dialog.js";
|
|
10
|
-
const
|
|
10
|
+
const ModalComponent = forwardRef((props, ref) => {
|
|
11
11
|
const {
|
|
12
|
-
hideCloseButton = false,
|
|
13
12
|
size = "medium",
|
|
14
|
-
|
|
15
|
-
disableExitOnClickOutside,
|
|
16
|
-
disableFocusManagement,
|
|
17
|
-
portalContainer,
|
|
18
|
-
open: openProp,
|
|
19
|
-
hideBackdrop,
|
|
20
|
-
onOpenChange,
|
|
21
|
-
defaultOpen,
|
|
22
|
-
children,
|
|
13
|
+
hideCloseButton = false,
|
|
23
14
|
control,
|
|
15
|
+
children,
|
|
24
16
|
slotProps,
|
|
17
|
+
defaultOpen,
|
|
18
|
+
hideBackdrop,
|
|
19
|
+
onOpenChange,
|
|
20
|
+
open: openProp,
|
|
21
|
+
portalContainer,
|
|
22
|
+
disableFocusManagement,
|
|
23
|
+
disableExitOnClickOutside,
|
|
24
|
+
disableExitOnEscapeKeyDown,
|
|
25
|
+
shouldCloseOnInteractOutside,
|
|
25
26
|
...other
|
|
26
27
|
} = props;
|
|
27
28
|
const state = useOverlayTriggerState({
|
|
@@ -41,6 +42,7 @@ const Modal = forwardRef((props, ref) => {
|
|
|
41
42
|
const { modalProps: modalCommonProps, underlayProps } = useModalOverlay(
|
|
42
43
|
{
|
|
43
44
|
...props,
|
|
45
|
+
shouldCloseOnInteractOutside,
|
|
44
46
|
isDismissable: !disableExitOnClickOutside,
|
|
45
47
|
isKeyboardDismissDisabled: disableExitOnEscapeKeyDown
|
|
46
48
|
},
|
|
@@ -55,9 +57,9 @@ const Modal = forwardRef((props, ref) => {
|
|
|
55
57
|
};
|
|
56
58
|
const containerProps = mergeProps(
|
|
57
59
|
{
|
|
58
|
-
className: clsx(s.base, s[size]),
|
|
59
60
|
ref: containerRef,
|
|
60
|
-
"data-size": size
|
|
61
|
+
"data-size": size,
|
|
62
|
+
className: clsx(s.base, s[size])
|
|
61
63
|
},
|
|
62
64
|
other
|
|
63
65
|
);
|
|
@@ -83,10 +85,9 @@ const Modal = forwardRef((props, ref) => {
|
|
|
83
85
|
},
|
|
84
86
|
slotProps?.modal
|
|
85
87
|
);
|
|
86
|
-
const { isDisabled,
|
|
88
|
+
const { isDisabled, ...otherTriggerProps } = triggerProps;
|
|
87
89
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
88
90
|
control?.({
|
|
89
|
-
onClick: onPress,
|
|
90
91
|
disabled: isDisabled,
|
|
91
92
|
...otherTriggerProps
|
|
92
93
|
}),
|
|
@@ -115,7 +116,11 @@ const Modal = forwardRef((props, ref) => {
|
|
|
115
116
|
)
|
|
116
117
|
] });
|
|
117
118
|
});
|
|
118
|
-
|
|
119
|
+
ModalComponent.displayName = "Modal";
|
|
120
|
+
const Modal = ModalComponent;
|
|
121
|
+
Modal.Header = Dialog.Header;
|
|
122
|
+
Modal.Body = Dialog.Body;
|
|
123
|
+
Modal.Footer = Dialog.Footer;
|
|
119
124
|
export {
|
|
120
125
|
Modal
|
|
121
126
|
};
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
export * from './Modal';
|
|
2
2
|
export * from './types';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated
|
|
5
|
+
* This component has been deprecated, please use `Modal.Header` instead.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ModalHeader: import("react").ForwardRefExoticComponent<Omit<import("../Dialog").DialogHeaderProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated
|
|
10
|
+
* This component has been deprecated, please use `Modal.Body` instead.
|
|
11
|
+
*/
|
|
12
|
+
export declare const ModalContent: import("react").ForwardRefExoticComponent<Omit<import("../Dialog").DialogBodyProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
13
|
+
/**
|
|
14
|
+
* @deprecated
|
|
15
|
+
* This component has been deprecated, please use `Modal.Footer` instead.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ModalFooter: import("react").ForwardRefExoticComponent<Omit<import("../Dialog").DialogFooterProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -58,6 +58,13 @@ export type ModalProps = {
|
|
|
58
58
|
* @default false
|
|
59
59
|
*/
|
|
60
60
|
disableFocusManagement?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* When user interacts with the argument element outside of the overlay ref,
|
|
63
|
+
* return true if onClose should be called. This gives you a chance to filter
|
|
64
|
+
* out interaction with elements that should not dismiss the overlay.
|
|
65
|
+
* By default, onClose will always be called on interaction outside the overlay ref.
|
|
66
|
+
*/
|
|
67
|
+
shouldCloseOnInteractOutside?: (element: Element) => boolean;
|
|
61
68
|
/** The props used for each slot inside. */
|
|
62
69
|
slotProps?: {
|
|
63
70
|
dialog?: DialogProps;
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import { Dialog } from '../Dialog';
|
|
3
|
+
import type { PopoverInnerProps } from './types';
|
|
4
|
+
export declare const PopoverInner: FC<PopoverInnerProps>;
|
|
5
|
+
declare const PopoverComponent: import("react").ForwardRefExoticComponent<import("./types").PopoverBaseProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
6
|
+
type CompoundedComponent = typeof PopoverComponent & {
|
|
7
|
+
Header: typeof Dialog.Header;
|
|
8
|
+
Body: typeof Dialog.Body;
|
|
9
|
+
Footer: typeof Dialog.Footer;
|
|
10
|
+
};
|
|
11
|
+
export declare const Popover: CompoundedComponent;
|
|
12
|
+
export {};
|