@basic-ui/material 1.0.0-alpha.7 → 1.0.0-alpha.8

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 (52) hide show
  1. package/build/cjs/index.js +152 -8
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/Alert/Alert.d.ts +1 -1
  4. package/build/esm/BottomSheet/BottomSheet.d.ts +1 -1
  5. package/build/esm/Button/Button.d.ts +1 -1
  6. package/build/esm/Button/ButtonGroup.d.ts +1 -1
  7. package/build/esm/Button/FilledButton.d.ts +1 -1
  8. package/build/esm/Button/FilledButton.js +6 -8
  9. package/build/esm/Button/FilledButton.js.map +1 -1
  10. package/build/esm/Button/OutlinedButton.d.ts +1 -1
  11. package/build/esm/Button/TransparentButton.d.ts +1 -1
  12. package/build/esm/Chip/ButtonChip.d.ts +1 -1
  13. package/build/esm/Chip/ChipBase.d.ts +1 -1
  14. package/build/esm/Chip/ChoiceChip.d.ts +1 -1
  15. package/build/esm/Combobox/Combobox.d.ts +7 -7
  16. package/build/esm/Dialog/Dialog.d.ts +1 -1
  17. package/build/esm/Dialog/Scrim.d.ts +1 -1
  18. package/build/esm/Divider/Divider.d.ts +1 -1
  19. package/build/esm/Link/Link.d.ts +1 -1
  20. package/build/esm/ListItem/ListItem.d.ts +1 -1
  21. package/build/esm/NavRail/NavRailItem.d.ts +5 -4
  22. package/build/esm/NavRail/NavRailItem.js +14 -8
  23. package/build/esm/NavRail/NavRailItem.js.map +1 -1
  24. package/build/esm/Paper/Paper.d.ts +1 -1
  25. package/build/esm/Select/Select.d.ts +1 -1
  26. package/build/esm/Select/SelectIcon.d.ts +1 -1
  27. package/build/esm/SelectionControl/SelectionControlText.d.ts +1 -1
  28. package/build/esm/Skeleton/Skeleton.d.ts +1 -1
  29. package/build/esm/Tab/Tab.d.ts +1 -1
  30. package/build/esm/Table/TableHead.d.ts +1 -1
  31. package/build/esm/Table/TableRow.d.ts +1 -1
  32. package/build/esm/TextField/FilledContainer.d.ts +1 -1
  33. package/build/esm/TextField/HelperText.d.ts +1 -1
  34. package/build/esm/TextField/Input.d.ts +1 -1
  35. package/build/esm/TextField/TextField.d.ts +1 -1
  36. package/build/esm/Tooltip/Tooltip.d.ts +1 -1
  37. package/build/esm/color.d.ts +2 -0
  38. package/build/esm/color.js +8 -3
  39. package/build/esm/color.js.map +1 -1
  40. package/build/esm/index.d.ts +1 -0
  41. package/build/esm/index.js +1 -0
  42. package/build/esm/index.js.map +1 -1
  43. package/build/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +3 -3
  45. package/src/Button/Button.story.tsx +6 -1
  46. package/src/Button/FilledButton.tsx +4 -9
  47. package/src/NavRail/NavRail.story.tsx +93 -13
  48. package/src/NavRail/NavRailItem.tsx +45 -35
  49. package/src/ThemeExplorer/ThemeBuilder.story.tsx +27 -23
  50. package/src/color.ts +25 -4
  51. package/src/index.ts +1 -0
  52. package/src/ThemeExplorer/ThemeExplorer.story.tsx +0 -43
@@ -1,8 +1,9 @@
1
1
  import { rem } from 'polished';
2
- import React, { useState } from 'react';
2
+ import React, { forwardRef, useState } from 'react';
3
3
 
4
4
  import { Box } from '../Box';
5
5
  import { NavRailItem, NavRailIndicator, NavRailLabel } from './';
6
+ import type { NavRailLabelProps } from './';
6
7
  // import './styles.css';
7
8
 
8
9
  export default {
@@ -54,8 +55,8 @@ const MenuIcon = (props) => (
54
55
  </svg>
55
56
  );
56
57
 
57
- const Example = ({ selectable = true }) => {
58
- const [selectedItem, setSelectedItem] = useState(selectable ? '0' : '-1');
58
+ export const Default = () => {
59
+ const [selectedItem, setSelectedItem] = useState('0');
59
60
 
60
61
  return (
61
62
  <Box
@@ -71,9 +72,7 @@ const Example = ({ selectable = true }) => {
71
72
  >
72
73
  <NavRailItem
73
74
  selected={selectedItem === '0'}
74
- onClick={() => {
75
- selectable && setSelectedItem('0');
76
- }}
75
+ onClick={() => setSelectedItem('0')}
77
76
  >
78
77
  <NavRailIndicator>
79
78
  <MenuIcon />
@@ -82,9 +81,7 @@ const Example = ({ selectable = true }) => {
82
81
  </NavRailItem>
83
82
  <NavRailItem
84
83
  selected={selectedItem === '1'}
85
- onClick={() => {
86
- selectable && setSelectedItem('1');
87
- }}
84
+ onClick={() => setSelectedItem('1')}
88
85
  >
89
86
  <NavRailIndicator>
90
87
  <KitchenIcon />
@@ -93,9 +90,7 @@ const Example = ({ selectable = true }) => {
93
90
  </NavRailItem>
94
91
  <NavRailItem
95
92
  selected={selectedItem === '2'}
96
- onClick={() => {
97
- selectable && setSelectedItem('2');
98
- }}
93
+ onClick={() => setSelectedItem('2')}
99
94
  >
100
95
  <NavRailIndicator>
101
96
  <ListIcon />
@@ -106,4 +101,89 @@ const Example = ({ selectable = true }) => {
106
101
  );
107
102
  };
108
103
 
109
- export const Normal = () => <Example />;
104
+ const DisappearingNavRailLabel = forwardRef<
105
+ HTMLDivElement,
106
+ NavRailLabelProps & { selected: boolean }
107
+ >(function AnimatedNavRailLabel({ selected, height = '28px', ...props }, ref) {
108
+ const transitionDuration = '0.2s';
109
+ const transitionTimingFunction = 'cubic-bezier(0.4, 0, 0.2, 1)';
110
+ return (
111
+ <Box
112
+ ref={ref}
113
+ style={{
114
+ height: selected ? height : '0px',
115
+ }}
116
+ sx={{
117
+ transition: `height ${transitionDuration} ${transitionTimingFunction}`,
118
+ }}
119
+ >
120
+ <NavRailLabel
121
+ style={{
122
+ transform: selected
123
+ ? 'scale(1) translateY(0)'
124
+ : `scale(0.8, 0.64) translateY(calc(${height} * -0.5 * 0.64))`,
125
+ opacity: selected ? '1' : '0',
126
+ }}
127
+ sx={{
128
+ transformOrigin: 'center top',
129
+ transition:
130
+ `transform ${transitionDuration} ${transitionTimingFunction}, ` +
131
+ `opacity ${transitionDuration} ${transitionTimingFunction}`,
132
+ }}
133
+ {...props}
134
+ />
135
+ </Box>
136
+ );
137
+ });
138
+
139
+ export const WithHiddenLabels = () => {
140
+ const [selectedItem, setSelectedItem] = useState('0');
141
+
142
+ return (
143
+ <Box
144
+ bg="surface"
145
+ width="80px"
146
+ position="fixed"
147
+ top="0"
148
+ bottom="0"
149
+ left="0"
150
+ py={rem(80)}
151
+ display="flex"
152
+ flexDirection="column"
153
+ >
154
+ <NavRailItem
155
+ selected={selectedItem === '0'}
156
+ onClick={() => setSelectedItem('0')}
157
+ >
158
+ <NavRailIndicator>
159
+ <MenuIcon />
160
+ </NavRailIndicator>
161
+ <DisappearingNavRailLabel selected={selectedItem === '0'}>
162
+ Menu
163
+ </DisappearingNavRailLabel>
164
+ </NavRailItem>
165
+ <NavRailItem
166
+ selected={selectedItem === '1'}
167
+ onClick={() => setSelectedItem('1')}
168
+ >
169
+ <NavRailIndicator>
170
+ <KitchenIcon />
171
+ </NavRailIndicator>
172
+ <DisappearingNavRailLabel selected={selectedItem === '1'}>
173
+ Kitchen
174
+ </DisappearingNavRailLabel>
175
+ </NavRailItem>
176
+ <NavRailItem
177
+ selected={selectedItem === '2'}
178
+ onClick={() => setSelectedItem('2')}
179
+ >
180
+ <NavRailIndicator>
181
+ <ListIcon />
182
+ </NavRailIndicator>
183
+ <DisappearingNavRailLabel selected={selectedItem === '2'}>
184
+ Orders
185
+ </DisappearingNavRailLabel>
186
+ </NavRailItem>
187
+ </Box>
188
+ );
189
+ };
@@ -7,7 +7,6 @@ import { Box } from '../Box';
7
7
  import { useTheme } from '../theme';
8
8
  import { Text } from '../Text';
9
9
  import type { TextProps } from '../Text';
10
- import type { RippleBoxProps } from '../Ripple';
11
10
  import { useRippleSurface } from '../Ripple';
12
11
 
13
12
  export interface NavRailItemProps extends Omit<BoxProps, 'color'> {
@@ -18,38 +17,45 @@ export interface NavRailItemProps extends Omit<BoxProps, 'color'> {
18
17
  color?: string;
19
18
  }
20
19
 
21
- export const NavRailIndicator = forwardRef<HTMLDivElement, RippleBoxProps>(
22
- function NavRailIndicator(props, forwardedRef) {
23
- const { as = 'div', children, __css, ...otherProps } = props;
20
+ export type NavRailIndicatorProps = BoxProps;
24
21
 
25
- return (
26
- <Box
27
- color="currentColor"
28
- ref={forwardedRef}
29
- as={as}
30
- data-nav-rail-item-indicator=""
31
- {...otherProps}
32
- __css={{
33
- width: '100%',
34
- height: '100%',
35
- maxWidth: rem(56),
36
- maxHeight: rem(56),
37
- borderRadius: 'full',
38
- bg: 'var(--indicator-background-color)',
39
- display: 'flex',
40
- alignItems: 'center',
41
- justifyContent: 'center',
42
- minHeight: rem(32),
43
- ...__css,
44
- }}
45
- >
46
- {children}
47
- </Box>
48
- );
49
- }
50
- );
22
+ export const NavRailIndicator = forwardRef<
23
+ HTMLDivElement,
24
+ NavRailIndicatorProps
25
+ >(function NavRailIndicator(props, forwardedRef) {
26
+ const { as = 'div', children, __css, ...otherProps } = props;
27
+
28
+ return (
29
+ <Box
30
+ color="currentColor"
31
+ ref={forwardedRef}
32
+ as={as}
33
+ data-nav-rail-item-indicator=""
34
+ {...otherProps}
35
+ __css={{
36
+ width: '100%',
37
+ height: '100%',
38
+ maxWidth: rem(56),
39
+ maxHeight: rem(56),
40
+ borderRadius: 'full',
41
+ bg: 'var(--indicator-background-color)',
42
+ display: 'flex',
43
+ alignItems: 'center',
44
+ justifyContent: 'center',
45
+ minHeight: rem(32),
46
+ transition: 'background-color .2s cubic-bezier(.4,0,.2,1)',
47
+ pointerEvents: 'none',
48
+ ...__css,
49
+ }}
50
+ >
51
+ {children}
52
+ </Box>
53
+ );
54
+ });
55
+
56
+ export type NavRailLabelProps = TextProps;
51
57
 
52
- export const NavRailLabel = forwardRef<HTMLDivElement, TextProps>(
58
+ export const NavRailLabel = forwardRef<HTMLDivElement, NavRailLabelProps>(
53
59
  function NavRailLabel(props, forwardedRef) {
54
60
  const { as = 'div', children, __css, ...otherProps } = props;
55
61
 
@@ -58,12 +64,13 @@ export const NavRailLabel = forwardRef<HTMLDivElement, TextProps>(
58
64
  ref={forwardedRef}
59
65
  as={as}
60
66
  variant="caption"
61
- {...otherProps}
62
67
  lineHeight={1}
68
+ {...otherProps}
63
69
  __css={{
64
70
  pt: rem(4),
65
71
  pb: rem(12),
66
72
  color: 'inherit',
73
+ pointerEvents: 'none',
67
74
  ...__css,
68
75
  }}
69
76
  >
@@ -93,7 +100,7 @@ export const NavRailItem = forwardRef<HTMLDivElement, NavRailItemProps>(
93
100
  focusOpacity = 0.12,
94
101
  pressedOpacity = 0.12;
95
102
  const ripple = useRippleSurface({
96
- rippleColor: `on.${color}`,
103
+ rippleColor: 'currentColor',
97
104
  onKeyDown,
98
105
  onPointerDown,
99
106
  baseOpacity,
@@ -122,7 +129,6 @@ export const NavRailItem = forwardRef<HTMLDivElement, NavRailItemProps>(
122
129
  }
123
130
  return ret;
124
131
  }, [ripple.__css]);
125
- console.log(Object.keys(rippleCss));
126
132
 
127
133
  return (
128
134
  <Box
@@ -139,7 +145,8 @@ export const NavRailItem = forwardRef<HTMLDivElement, NavRailItemProps>(
139
145
  display: 'flex',
140
146
  flexDirection: 'column',
141
147
  alignItems: 'center',
142
- color: `on.${color}`,
148
+ transition: 'color .2s cubic-bezier(.4,0,.2,1)',
149
+ color: selected ? `on.${color}` : 'on.surface-variant',
143
150
  '--indicator-background-color': selected
144
151
  ? get(theme, `colors.${color}`)
145
152
  : 'transparent',
@@ -151,8 +158,11 @@ export const NavRailItem = forwardRef<HTMLDivElement, NavRailItemProps>(
151
158
  margin: 0,
152
159
  padding: 0,
153
160
  px: rem(12),
161
+ minHeight: rem(60),
162
+ height: rem(60),
154
163
  cursor: 'pointer',
155
164
  textDecoration: 'none',
165
+ WebkitTapHighlightColor: 'transparent',
156
166
  ...rippleCss,
157
167
  ...__css,
158
168
  }}
@@ -68,6 +68,8 @@ const ThemeBuilder = () => {
68
68
  sx={{ gap: 3 }}
69
69
  flexDirection="column"
70
70
  width="300px"
71
+ position="fixed"
72
+ top="0"
71
73
  >
72
74
  <Box display="flex">
73
75
  <TextFieldColorPicker
@@ -131,31 +133,33 @@ const ThemeBuilder = () => {
131
133
  </Button>
132
134
  </Box>
133
135
  </Box>
134
- <Box width="600px" mx="auto">
135
- <Box display="flex" flexDirection="column" sx={{ gap: 4 }}>
136
- <Box flex="1">
137
- <Text variant="h5" as="h1" pb={'0.3em'}>
138
- Light theme
139
- </Text>
140
- <ThemeColors scheme={scheme} />
136
+ <Box width="100%" pl="300px">
137
+ <Box width="600px" mx="auto">
138
+ <Box display="flex" flexDirection="column" sx={{ gap: 4 }}>
139
+ <Box flex="1">
140
+ <Text variant="h5" as="h1" pb={'0.3em'}>
141
+ Light theme
142
+ </Text>
143
+ <ThemeColors scheme={scheme} />
144
+ </Box>
145
+ <Box flex="1">
146
+ <Text variant="h5" as="h1" pb={'0.3em'}>
147
+ Dark theme
148
+ </Text>
149
+ <ThemeColors scheme={scheme.modes.dark} />
150
+ </Box>
141
151
  </Box>
142
- <Box flex="1">
143
- <Text variant="h5" as="h1" pb={'0.3em'}>
144
- Dark theme
145
- </Text>
146
- <ThemeColors scheme={scheme.modes.dark} />
152
+ <Box my={4} display="flex" sx={{ gap: 3 }} flexDirection="column">
153
+ <TonalColors palette={a1} />
154
+ <TonalColors palette={secondaryColorTonal} />
155
+ <TonalColors palette={tertiaryColorTonal} />
156
+ <TonalColors palette={error} />
157
+ <TonalColors palette={neutralColorTonal} />
158
+ <TonalColors palette={n2} />
159
+ </Box>
160
+ <Box as="pre" fontFamily="monospace" fontSize="12px">
161
+ {JSON.stringify({ colors: scheme }, null, 2)}
147
162
  </Box>
148
- </Box>
149
- <Box my={4} display="flex" sx={{ gap: 3 }} flexDirection="column">
150
- <TonalColors palette={a1} />
151
- <TonalColors palette={secondaryColorTonal} />
152
- <TonalColors palette={tertiaryColorTonal} />
153
- <TonalColors palette={error} />
154
- <TonalColors palette={neutralColorTonal} />
155
- <TonalColors palette={n2} />
156
- </Box>
157
- <Box as="pre" fontFamily="monospace" fontSize="12px">
158
- {JSON.stringify({ colors: scheme }, null, 2)}
159
163
  </Box>
160
164
  </Box>
161
165
  </Box>
package/src/color.ts CHANGED
@@ -17,17 +17,38 @@ export const alpha =
17
17
  return `rgba(${rgb.red},${rgb.green},${rgb.blue},${alphaValue})`;
18
18
  };
19
19
 
20
+ export function mixColor(
21
+ baseColor: string,
22
+ overlayColor: string
23
+ ): (theme: any) => string;
24
+ export function mixColor(
25
+ baseColor: string,
26
+ overlayColor: string,
27
+ overlayOpacity: number
28
+ ): (theme: any) => string;
29
+ export function mixColor(
30
+ baseColor: string,
31
+ overlayColor: string,
32
+ overlayOpacity?: number
33
+ ): (theme: any) => string {
34
+ return (theme) => {
35
+ baseColor = get(theme, `colors.${baseColor}`, baseColor);
36
+ overlayColor = overlayOpacity
37
+ ? alpha(overlayColor, overlayOpacity)(theme)
38
+ : get(theme, `colors.${overlayColor}`, overlayColor);
39
+
40
+ return `linear-gradient(${overlayColor}, ${overlayColor}), ${baseColor}`;
41
+ };
42
+ }
43
+
20
44
  export function getColorOverlay(
21
45
  theme: Theme,
22
46
  baseColor: string,
23
47
  overlayColor: string,
24
48
  overlayOpacity: number
25
49
  ): SystemStyleObject {
26
- baseColor = get(theme, `colors.${baseColor}`) || baseColor;
27
- overlayColor = alpha(overlayColor, overlayOpacity)(theme);
28
-
29
50
  return {
30
- background: `linear-gradient(${overlayColor}, ${overlayColor}), ${baseColor}`,
51
+ background: mixColor(baseColor, overlayColor, overlayOpacity)(theme),
31
52
  };
32
53
  }
33
54
 
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ export * from './Link';
17
17
  export * from './List';
18
18
  export * from './ListItem';
19
19
  export * from './Menu';
20
+ export * from './NavRail';
20
21
  export * from './NotchedOutline';
21
22
  export * from './Paper';
22
23
  export * from './ProgressSpinner';
@@ -1,43 +0,0 @@
1
- import React from 'react';
2
- import { useTheme } from '@emotion/react';
3
-
4
- import { ThemeColors } from './ThemeColors';
5
- import { DARK_THEME_CLASS, DEFAULT_THEME_CLASS, Box } from '../';
6
-
7
- export default {
8
- title: 'components/ThemeExplorer',
9
- };
10
-
11
- const ThemeExplorer = () => {
12
- const theme = useTheme();
13
- return (
14
- <>
15
- <Box
16
- flex="1"
17
- p={3}
18
- borderRadius="extra-large"
19
- overflow="hidden"
20
- border="1px solid #fff"
21
- borderColor="outline"
22
- bg="surface"
23
- className={DEFAULT_THEME_CLASS}
24
- >
25
- <ThemeColors scheme={theme.colors as any} />
26
- </Box>
27
- <Box
28
- flex="1"
29
- p={3}
30
- borderRadius="extra-large"
31
- overflow="hidden"
32
- border="1px solid #fff"
33
- borderColor="outline"
34
- bg="surface"
35
- className={DARK_THEME_CLASS}
36
- >
37
- <ThemeColors scheme={theme.colors.modes.dark as any} />
38
- </Box>
39
- </>
40
- );
41
- };
42
-
43
- export const Explorer = () => <ThemeExplorer />;