@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.
Files changed (49) hide show
  1. package/build/cjs/index.js +83 -14
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/BottomSheet/BottomSheet.d.ts +1 -1
  4. package/build/esm/BottomSheet/BottomSheetSurface.d.ts +1 -1
  5. package/build/esm/Button/Button.d.ts +1 -1
  6. package/build/esm/CheckBox/CheckBox.d.ts +1 -1
  7. package/build/esm/Chip/ButtonChip.d.ts +1 -1
  8. package/build/esm/Chip/ChoiceChip.d.ts +1 -1
  9. package/build/esm/Combobox/Combobox.d.ts +7 -7
  10. package/build/esm/Dialog/Dialog.d.ts +1 -1
  11. package/build/esm/Dialog/DialogBackdrop.d.ts +1 -1
  12. package/build/esm/Dialog/DialogSurface.d.ts +1 -1
  13. package/build/esm/Menu/Menu.d.ts +5 -5
  14. package/build/esm/NavRail/NavRailItem.d.ts +3 -3
  15. package/build/esm/RadioButton/RadioGroup.d.ts +1 -1
  16. package/build/esm/Select/CustomContainerExample.d.ts +1 -1
  17. package/build/esm/Select/Select.d.ts +19 -7
  18. package/build/esm/Select/Select.js +49 -8
  19. package/build/esm/Select/Select.js.map +1 -1
  20. package/build/esm/Select/context.d.ts +5 -4
  21. package/build/esm/Select/context.js +2 -1
  22. package/build/esm/Select/context.js.map +1 -1
  23. package/build/esm/Select/defaultRender.d.ts +2 -1
  24. package/build/esm/Select/defaultRender.js +33 -4
  25. package/build/esm/Select/defaultRender.js.map +1 -1
  26. package/build/esm/SelectItem/SelectItem.d.ts +7 -3
  27. package/build/esm/SelectItem/SelectItem.js +14 -3
  28. package/build/esm/SelectItem/SelectItem.js.map +1 -1
  29. package/build/esm/Slider/Slider.d.ts +6 -6
  30. package/build/esm/Snackbar/Snackbar.d.ts +1 -1
  31. package/build/esm/Switch/Switch.d.ts +1 -1
  32. package/build/esm/Tab/Tab.d.ts +1 -1
  33. package/build/esm/Tab/TabList.d.ts +1 -1
  34. package/build/esm/Tab/TabPanel.d.ts +1 -1
  35. package/build/esm/TabIndicator/TabIndicator.d.ts +1 -1
  36. package/build/esm/TextField/TextField.d.ts +1 -1
  37. package/build/esm/Tooltip/Tooltip.d.ts +1 -1
  38. package/build/esm/theme/theme.js +2 -2
  39. package/build/esm/theme/theme.js.map +1 -1
  40. package/build/tsconfig-build.tsbuildinfo +1 -1
  41. package/package.json +3 -3
  42. package/src/Select/Select.story.tsx +47 -69
  43. package/src/Select/Select.tsx +93 -25
  44. package/src/Select/SelectMultiple.story.tsx +215 -0
  45. package/src/Select/context.ts +5 -3
  46. package/src/Select/defaultRender.tsx +49 -0
  47. package/src/SelectItem/SelectItem.tsx +68 -46
  48. package/src/theme/theme.ts +2 -2
  49. 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 type SelectItemProps = MenuItemProps;
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<HTMLLIElement, MenuItemProps>(
21
- function SelectItem(props, forwardedRef) {
22
- const {
23
- as: Comp = MenuItem,
24
- onSelect: onSelectProp,
25
- children,
26
- value: valueProp,
27
- disabled,
28
- ...otherProps
29
- } = props;
30
- const { native, onSelect, value: selectedValue } = useSelectContext();
31
- const value =
32
- valueProp !== undefined && valueProp !== null
33
- ? String(valueProp)
34
- : (children as string);
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
- if (native) {
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
- <Comp
56
- as={MenuItem}
57
- onSelect={wrapEvent(onSelectProp, onSelect as any)}
58
- data-value={value}
59
- disabled={disabled}
52
+ <option
60
53
  ref={forwardedRef}
61
- role="option"
62
- aria-selected={selected ? 'true' : undefined}
63
- selected={selected}
64
- {...otherProps}
54
+ value={value}
55
+ disabled={disabled}
56
+ {...(otherProps as any)}
65
57
  >
66
- {children || ZERO_WIDTH_SPACE}
67
- </Comp>
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;
@@ -486,8 +486,8 @@ export const theme = {
486
486
  styles: {
487
487
  root: {
488
488
  body: {
489
- fontFamily: 'body',
490
- fontWeight: 'body',
489
+ fontFamily: 'body1',
490
+ fontWeight: 'body1',
491
491
  lineHeight: 'body',
492
492
  backgroundColor: 'surface',
493
493
  color: 'on.surface',
@@ -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
- };