@basic-ui/material 1.0.0-alpha.33 → 1.0.0-alpha.34
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/build/cjs/index.js +83 -14
- package/build/cjs/index.js.map +1 -1
- package/build/esm/BottomSheet/BottomSheet.d.ts +1 -1
- package/build/esm/BottomSheet/BottomSheetSurface.d.ts +1 -1
- package/build/esm/Button/Button.d.ts +1 -1
- package/build/esm/CheckBox/CheckBox.d.ts +1 -1
- package/build/esm/Chip/ButtonChip.d.ts +1 -1
- package/build/esm/Chip/ChoiceChip.d.ts +1 -1
- package/build/esm/Combobox/Combobox.d.ts +7 -7
- package/build/esm/Dialog/Dialog.d.ts +1 -1
- package/build/esm/Dialog/DialogBackdrop.d.ts +1 -1
- package/build/esm/Dialog/DialogSurface.d.ts +1 -1
- package/build/esm/Menu/Menu.d.ts +5 -5
- package/build/esm/NavRail/NavRailItem.d.ts +3 -3
- package/build/esm/RadioButton/RadioGroup.d.ts +1 -1
- package/build/esm/Select/CustomContainerExample.d.ts +1 -1
- package/build/esm/Select/Select.d.ts +19 -7
- package/build/esm/Select/Select.js +49 -8
- package/build/esm/Select/Select.js.map +1 -1
- package/build/esm/Select/context.d.ts +5 -4
- package/build/esm/Select/context.js +2 -1
- package/build/esm/Select/context.js.map +1 -1
- package/build/esm/Select/defaultRender.d.ts +2 -1
- package/build/esm/Select/defaultRender.js +33 -4
- package/build/esm/Select/defaultRender.js.map +1 -1
- package/build/esm/SelectItem/SelectItem.d.ts +7 -3
- package/build/esm/SelectItem/SelectItem.js +14 -3
- package/build/esm/SelectItem/SelectItem.js.map +1 -1
- package/build/esm/Slider/Slider.d.ts +6 -6
- package/build/esm/Snackbar/Snackbar.d.ts +1 -1
- package/build/esm/Switch/Switch.d.ts +1 -1
- package/build/esm/Tab/Tab.d.ts +1 -1
- package/build/esm/Tab/TabList.d.ts +1 -1
- package/build/esm/Tab/TabPanel.d.ts +1 -1
- package/build/esm/TabIndicator/TabIndicator.d.ts +1 -1
- package/build/esm/TextField/TextField.d.ts +1 -1
- package/build/esm/Tooltip/Tooltip.d.ts +1 -1
- package/build/esm/theme/theme.js +2 -2
- package/build/esm/theme/theme.js.map +1 -1
- package/build/tsconfig-build.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/Select/Select.story.tsx +47 -69
- package/src/Select/Select.tsx +93 -25
- package/src/Select/SelectMultiple.story.tsx +215 -0
- package/src/Select/context.ts +5 -3
- package/src/Select/defaultRender.tsx +49 -0
- package/src/SelectItem/SelectItem.tsx +68 -46
- package/src/theme/theme.ts +2 -2
- package/src/Select/defaultRender.ts +0 -19
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Children, isValidElement } from 'react';
|
|
3
|
+
|
|
4
|
+
import { Box } from '../Box';
|
|
5
|
+
|
|
6
|
+
export const makeDefaultRender =
|
|
7
|
+
<T extends string>(children?: ReactNode) =>
|
|
8
|
+
(val: T | '' | undefined): ReactNode => {
|
|
9
|
+
if (children && val !== undefined) {
|
|
10
|
+
const allChildren = Children.toArray(children);
|
|
11
|
+
for (let i = 0; i < allChildren.length; i++) {
|
|
12
|
+
const child = allChildren[i];
|
|
13
|
+
if (isValidElement(child) && String(child.props.value) === val) {
|
|
14
|
+
return child.props.children;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return val || undefined;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const makeDefaultMultipleRender =
|
|
22
|
+
<T extends string>(children?: ReactNode) =>
|
|
23
|
+
(val: T[] | undefined): ReactNode => {
|
|
24
|
+
const ret = [];
|
|
25
|
+
if (children && val !== undefined && val.length > 0) {
|
|
26
|
+
const set = new Set<string>(val);
|
|
27
|
+
const allChildren = Children.toArray(children);
|
|
28
|
+
for (let i = 0; i < allChildren.length; i++) {
|
|
29
|
+
const child = allChildren[i];
|
|
30
|
+
if (isValidElement(child) && set.has(String(child.props.value))) {
|
|
31
|
+
ret.push(child.props.children);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<Box
|
|
38
|
+
as="span"
|
|
39
|
+
sx={{
|
|
40
|
+
maxWidth: '100%',
|
|
41
|
+
overflow: 'hidden',
|
|
42
|
+
textOverflow: 'ellipsis',
|
|
43
|
+
whiteSpace: 'nowrap',
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
{ret.join(', ')}
|
|
47
|
+
</Box>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ForwardedRef, ReactElement, Ref } from 'react';
|
|
1
2
|
import { forwardRef } from 'react';
|
|
2
3
|
import { wrapEvent, MenuItem as MenuItemCore } from '@basic-ui/core';
|
|
3
4
|
import type { MenuItemProps as MenuItemPropsCore } from '@basic-ui/core';
|
|
@@ -14,57 +15,78 @@ const MenuItem = forwardRef<HTMLLIElement, MenuItemProps>(
|
|
|
14
15
|
)
|
|
15
16
|
);
|
|
16
17
|
|
|
17
|
-
export
|
|
18
|
+
export interface SelectItemProps<ValueType extends string>
|
|
19
|
+
extends MenuItemProps {
|
|
20
|
+
value: ValueType;
|
|
21
|
+
}
|
|
18
22
|
|
|
19
23
|
const ZERO_WIDTH_SPACE = '\u200b';
|
|
20
|
-
export const SelectItem = forwardRef<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
export const SelectItem = forwardRef(function SelectItem<
|
|
25
|
+
ValueType extends string
|
|
26
|
+
>(
|
|
27
|
+
props: SelectItemProps<ValueType>,
|
|
28
|
+
forwardedRef: ForwardedRef<HTMLLIElement>
|
|
29
|
+
) {
|
|
30
|
+
const {
|
|
31
|
+
as: Comp = MenuItem,
|
|
32
|
+
onSelect: onSelectProp,
|
|
33
|
+
children,
|
|
34
|
+
value: valueProp,
|
|
35
|
+
disabled,
|
|
36
|
+
onKeyDown,
|
|
37
|
+
...otherProps
|
|
38
|
+
} = props;
|
|
39
|
+
const {
|
|
40
|
+
native,
|
|
41
|
+
onSelect,
|
|
42
|
+
value: selectedValue,
|
|
43
|
+
multiple,
|
|
44
|
+
} = useSelectContext();
|
|
45
|
+
const value =
|
|
46
|
+
valueProp !== undefined && valueProp !== null
|
|
47
|
+
? String(valueProp)
|
|
48
|
+
: (children as string);
|
|
35
49
|
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<option
|
|
39
|
-
ref={forwardedRef}
|
|
40
|
-
value={value}
|
|
41
|
-
disabled={disabled}
|
|
42
|
-
{...(otherProps as any)}
|
|
43
|
-
>
|
|
44
|
-
{children}
|
|
45
|
-
</option>
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (children === undefined && disabled) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const selected = value === String(selectedValue);
|
|
50
|
+
if (native) {
|
|
54
51
|
return (
|
|
55
|
-
<
|
|
56
|
-
as={MenuItem}
|
|
57
|
-
onSelect={wrapEvent(onSelectProp, onSelect as any)}
|
|
58
|
-
data-value={value}
|
|
59
|
-
disabled={disabled}
|
|
52
|
+
<option
|
|
60
53
|
ref={forwardedRef}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
{...otherProps}
|
|
54
|
+
value={value}
|
|
55
|
+
disabled={disabled}
|
|
56
|
+
{...(otherProps as any)}
|
|
65
57
|
>
|
|
66
|
-
{children
|
|
67
|
-
</
|
|
58
|
+
{children}
|
|
59
|
+
</option>
|
|
68
60
|
);
|
|
69
61
|
}
|
|
70
|
-
|
|
62
|
+
|
|
63
|
+
if (children === undefined && disabled) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let selected = false;
|
|
68
|
+
if (multiple && Array.isArray(selectedValue)) {
|
|
69
|
+
selected = Boolean(selectedValue.find((v) => v === value));
|
|
70
|
+
} else {
|
|
71
|
+
selected = value === String(selectedValue);
|
|
72
|
+
}
|
|
73
|
+
return (
|
|
74
|
+
<Comp
|
|
75
|
+
as={MenuItem}
|
|
76
|
+
onSelect={wrapEvent(onSelectProp, onSelect as any)}
|
|
77
|
+
data-value={value}
|
|
78
|
+
disabled={disabled}
|
|
79
|
+
ref={forwardedRef}
|
|
80
|
+
role="option"
|
|
81
|
+
aria-selected={selected ? 'true' : undefined}
|
|
82
|
+
selected={selected}
|
|
83
|
+
{...otherProps}
|
|
84
|
+
>
|
|
85
|
+
{children || ZERO_WIDTH_SPACE}
|
|
86
|
+
</Comp>
|
|
87
|
+
);
|
|
88
|
+
}) as <ValueType extends string>(
|
|
89
|
+
p: SelectItemProps<ValueType> & {
|
|
90
|
+
ref?: Ref<HTMLLIElement>;
|
|
91
|
+
}
|
|
92
|
+
) => ReactElement;
|
package/src/theme/theme.ts
CHANGED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import { Children, isValidElement } from 'react';
|
|
3
|
-
|
|
4
|
-
export const makeDefaultRender =
|
|
5
|
-
(children?: ReactNode) =>
|
|
6
|
-
(val?: string): string | undefined => {
|
|
7
|
-
if (children && val !== undefined) {
|
|
8
|
-
const allChildren = Children.toArray(children);
|
|
9
|
-
for (let i = 0; i < allChildren.length; i++) {
|
|
10
|
-
const child = allChildren[i];
|
|
11
|
-
if (isValidElement(child)) {
|
|
12
|
-
if (String(child.props.value) === val) {
|
|
13
|
-
return child.props.children;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return val || undefined;
|
|
19
|
-
};
|