@basic-ui/material 1.0.0-alpha.14 → 1.0.0-alpha.17

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 (120) hide show
  1. package/build/cjs/index.js +298 -56
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/Alert/Alert.d.ts +1 -1
  4. package/build/esm/AppBar/AppBarButton.d.ts +1 -1
  5. package/build/esm/BottomSheet/BottomSheet.d.ts +1 -1
  6. package/build/esm/BottomSheet/BottomSheetSurface.d.ts +1 -1
  7. package/build/esm/Button/Button.d.ts +1 -1
  8. package/build/esm/Button/ButtonGroup.d.ts +1 -1
  9. package/build/esm/Button/FilledButton.d.ts +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/CheckBox/CheckBox.d.ts +1 -1
  13. package/build/esm/Chip/ButtonChip.d.ts +1 -1
  14. package/build/esm/Chip/ChipBase.d.ts +1 -1
  15. package/build/esm/Chip/ChoiceChip.d.ts +1 -1
  16. package/build/esm/Combobox/Combobox.d.ts +7 -7
  17. package/build/esm/Combobox/Combobox.js +4 -3
  18. package/build/esm/Combobox/Combobox.js.map +1 -1
  19. package/build/esm/Dialog/Dialog.d.ts +1 -1
  20. package/build/esm/Dialog/DialogBackdrop.d.ts +1 -1
  21. package/build/esm/Dialog/DialogSurface.d.ts +1 -1
  22. package/build/esm/Dialog/Scrim.d.ts +1 -1
  23. package/build/esm/Divider/Divider.d.ts +1 -1
  24. package/build/esm/Link/Link.d.ts +1 -1
  25. package/build/esm/Link/Link.js +12 -0
  26. package/build/esm/Link/Link.js.map +1 -1
  27. package/build/esm/ListItem/ListItem.d.ts +3 -1
  28. package/build/esm/ListItem/ListItem.js +46 -43
  29. package/build/esm/ListItem/ListItem.js.map +1 -1
  30. package/build/esm/Menu/Menu.d.ts +4 -4
  31. package/build/esm/NavRail/NavRailItem.d.ts +3 -3
  32. package/build/esm/Paper/Paper.d.ts +1 -1
  33. package/build/esm/RadioButton/RadioGroup.d.ts +1 -1
  34. package/build/esm/Ripple/useRippleSurface.d.ts +1 -0
  35. package/build/esm/Ripple/useRippleSurface.js +17 -16
  36. package/build/esm/Ripple/useRippleSurface.js.map +1 -1
  37. package/build/esm/Select/Select.d.ts +1 -1
  38. package/build/esm/Select/Select.js +4 -0
  39. package/build/esm/Select/Select.js.map +1 -1
  40. package/build/esm/Select/SelectIcon.d.ts +1 -1
  41. package/build/esm/SelectItem/SelectItem.d.ts +5 -2
  42. package/build/esm/SelectItem/SelectItem.js +17 -4
  43. package/build/esm/SelectItem/SelectItem.js.map +1 -1
  44. package/build/esm/SelectionControl/SelectionControlText.d.ts +1 -1
  45. package/build/esm/Skeleton/Skeleton.d.ts +1 -1
  46. package/build/esm/Slider/Slider.d.ts +17 -0
  47. package/build/esm/Slider/Slider.js +224 -0
  48. package/build/esm/Slider/Slider.js.map +1 -0
  49. package/build/esm/Slider/index.d.ts +1 -0
  50. package/build/esm/Slider/index.js +2 -0
  51. package/build/esm/Slider/index.js.map +1 -0
  52. package/build/esm/Snackbar/Snackbar.d.ts +1 -1
  53. package/build/esm/Snackbar/Snackbar.js +4 -4
  54. package/build/esm/Snackbar/Snackbar.js.map +1 -1
  55. package/build/esm/Switch/Switch.d.ts +1 -1
  56. package/build/esm/Tab/Tab.d.ts +1 -1
  57. package/build/esm/Tab/TabList.d.ts +1 -1
  58. package/build/esm/Tab/TabPanel.d.ts +1 -1
  59. package/build/esm/TabIndicator/TabIndicator.d.ts +1 -1
  60. package/build/esm/Table/TableHead.d.ts +1 -1
  61. package/build/esm/Table/TableRow.d.ts +1 -1
  62. package/build/esm/TextField/FilledContainer.d.ts +1 -1
  63. package/build/esm/TextField/HelperText.d.ts +1 -1
  64. package/build/esm/TextField/Input.d.ts +1 -1
  65. package/build/esm/TextField/OutlinedContainer.d.ts +1 -1
  66. package/build/esm/TextField/OutlinedContainer.js +13 -5
  67. package/build/esm/TextField/OutlinedContainer.js.map +1 -1
  68. package/build/esm/TextField/TextField.d.ts +1 -1
  69. package/build/esm/ThemeExplorer/BorderSlider.d.ts +7 -0
  70. package/build/esm/ThemeExplorer/BorderSlider.js +78 -0
  71. package/build/esm/ThemeExplorer/BorderSlider.js.map +1 -0
  72. package/build/esm/ThemeExplorer/ColorSchemePicker.d.ts +10 -0
  73. package/build/esm/ThemeExplorer/ColorSchemePicker.js +54 -0
  74. package/build/esm/ThemeExplorer/ColorSchemePicker.js.map +1 -0
  75. package/build/esm/ThemeExplorer/FontAutoComplete.d.ts +9 -0
  76. package/build/esm/ThemeExplorer/FontAutoComplete.js +128 -0
  77. package/build/esm/ThemeExplorer/FontAutoComplete.js.map +1 -0
  78. package/build/esm/ThemeExplorer/ThemeBuilder.d.ts +2 -0
  79. package/build/esm/ThemeExplorer/ThemeBuilder.js +232 -94
  80. package/build/esm/ThemeExplorer/ThemeBuilder.js.map +1 -1
  81. package/build/esm/ThemeExplorer/components.js +4 -4
  82. package/build/esm/ThemeExplorer/components.js.map +1 -1
  83. package/build/esm/ThemeExplorer/googleFonts.d.ts +1 -0
  84. package/build/esm/ThemeExplorer/googleFonts.js +7 -0
  85. package/build/esm/ThemeExplorer/googleFonts.js.map +1 -0
  86. package/build/esm/ThemeExplorer/updateGoogleFonts.js +70 -0
  87. package/build/esm/ThemeExplorer/updateGoogleFonts.js.map +1 -0
  88. package/build/esm/ThemeExplorer/useDeferredColor.js +3 -4
  89. package/build/esm/ThemeExplorer/useDeferredColor.js.map +1 -1
  90. package/build/esm/Tooltip/Tooltip.d.ts +1 -1
  91. package/build/esm/color.js +2 -2
  92. package/build/esm/color.js.map +1 -1
  93. package/build/esm/index.d.ts +1 -0
  94. package/build/esm/index.js +1 -0
  95. package/build/esm/index.js.map +1 -1
  96. package/build/tsconfig-build.tsbuildinfo +1 -1
  97. package/package.json +6 -6
  98. package/src/Combobox/Combobox.tsx +5 -2
  99. package/src/Link/Link.tsx +12 -0
  100. package/src/ListItem/ListItem.tsx +48 -42
  101. package/src/Ripple/useRippleSurface.ts +8 -2
  102. package/src/Select/PaymentMethodSelect.story.tsx +17 -24
  103. package/src/Select/Select.tsx +6 -0
  104. package/src/SelectItem/SelectItem.tsx +13 -3
  105. package/src/Slider/Slider.story.tsx +36 -0
  106. package/src/Slider/Slider.tsx +275 -0
  107. package/src/Slider/index.ts +1 -0
  108. package/src/Snackbar/Snackbar.tsx +5 -5
  109. package/src/TextField/OutlinedContainer.tsx +8 -3
  110. package/src/ThemeExplorer/BorderSlider.tsx +73 -0
  111. package/src/ThemeExplorer/ColorSchemePicker.tsx +55 -0
  112. package/src/ThemeExplorer/FontAutoComplete.tsx +139 -0
  113. package/src/ThemeExplorer/ThemeBuilder.story.tsx +2 -1
  114. package/src/ThemeExplorer/ThemeBuilder.tsx +223 -84
  115. package/src/ThemeExplorer/components.tsx +4 -4
  116. package/src/ThemeExplorer/googleFonts.ts +1436 -0
  117. package/src/ThemeExplorer/updateGoogleFonts.js +33 -0
  118. package/src/ThemeExplorer/useDeferredColor.tsx +3 -6
  119. package/src/color.ts +2 -2
  120. package/src/index.ts +1 -0
@@ -0,0 +1 @@
1
+ export * from './Slider';
@@ -3,9 +3,9 @@ import { rem } from 'polished';
3
3
  import type { ReactElement } from 'react';
4
4
  import { cloneElement, forwardRef, useRef } from 'react';
5
5
  import {
6
- DARK_THEME_CLASS,
7
- DEFAULT_THEME_CLASS,
8
- useColorMode,
6
+ DARK_SCHEME_CLASS,
7
+ LIGHT_SCHEME_CLASS,
8
+ useColorScheme,
9
9
  } from '@basic-ui/dynamic-theme';
10
10
 
11
11
  import { Box } from '../Box';
@@ -22,7 +22,7 @@ export interface SnackbarProps extends PaperProps {
22
22
 
23
23
  export const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(
24
24
  function Snackbar(props, forwardedRef) {
25
- const { colorMode } = useColorMode();
25
+ const { colorScheme } = useColorScheme();
26
26
  const ref = useRef<HTMLDivElement | null>(null);
27
27
  const {
28
28
  __css,
@@ -44,7 +44,7 @@ export const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(
44
44
  elevation={4}
45
45
  darkThemeBackgroundOverlay={4}
46
46
  className={
47
- colorMode === 'default' ? DARK_THEME_CLASS : DEFAULT_THEME_CLASS
47
+ colorScheme === 'light' ? DARK_SCHEME_CLASS : LIGHT_SCHEME_CLASS
48
48
  }
49
49
  ref={assignMultipleRefs(forwardedRef, ref)}
50
50
  __css={{
@@ -58,12 +58,17 @@ export const OutlinedContainer = forwardRef<
58
58
 
59
59
  if (element) {
60
60
  setLabelWidth(element.offsetWidth);
61
- (document as any)?.fonts?.ready?.then(() => {
61
+ function handleFontsLoaded() {
62
62
  // set the label width again once the fonts have been loaded
63
63
  requestAnimationFrame(() => {
64
- setLabelWidth(element.offsetWidth);
64
+ if (element) setLabelWidth(element.offsetWidth);
65
65
  });
66
- });
66
+ }
67
+ document.fonts?.addEventListener?.('loadingdone', handleFontsLoaded);
68
+ document.fonts?.ready?.then(handleFontsLoaded);
69
+
70
+ return () =>
71
+ document.fonts?.removeEventListener?.('loadingdone', handleFontsLoaded);
67
72
  }
68
73
  }, [label]);
69
74
 
@@ -0,0 +1,73 @@
1
+ import type { ButtonHTMLAttributes, FC } from 'react';
2
+ import { startTransition, useEffect, useRef, useState } from 'react';
3
+
4
+ import type { BoxProps } from '../Box';
5
+ import { Box } from '../Box';
6
+ import { Link as BaseLink } from '../Link';
7
+ import { Slider, SliderMarker } from '../Slider';
8
+ import { Text } from '../Text';
9
+
10
+ const Link: FC<
11
+ BoxProps<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>
12
+ > = BaseLink as any;
13
+
14
+ export function BorderSlider(props: {
15
+ label: string;
16
+ defaultValue: number;
17
+ onChange: (value: number) => void;
18
+ onReset: () => void;
19
+ resetDisabled: boolean;
20
+ }) {
21
+ const [value, setValue] = useState(props.defaultValue);
22
+
23
+ const resetting = useRef(false);
24
+ useEffect(() => {
25
+ if (resetting.current) {
26
+ setValue(props.defaultValue);
27
+ resetting.current = false;
28
+ }
29
+ }, [props.defaultValue]);
30
+
31
+ return (
32
+ <Box width="100%" display="flex" flexDirection="column">
33
+ <Text display="flex" justifyContent="space-between" width="100%" pb={2}>
34
+ <span>
35
+ {props.label}{' '}
36
+ <Link
37
+ as="button"
38
+ disabled={props.resetDisabled ? true : undefined}
39
+ onClick={() => {
40
+ resetting.current = true;
41
+ props.onReset();
42
+ }}
43
+ >
44
+ Reset
45
+ </Link>
46
+ </span>
47
+ <span>{value}px</span>
48
+ </Text>
49
+ <Slider
50
+ value={value}
51
+ onChange={(e, v) => {
52
+ setValue(v);
53
+ startTransition(() => {
54
+ props.onChange(v);
55
+ });
56
+ }}
57
+ min={0}
58
+ max={64}
59
+ step={2}
60
+ >
61
+ <SliderMarker value={2} />
62
+ <SliderMarker value={4} />
63
+ <SliderMarker value={8} />
64
+ <SliderMarker value={12} />
65
+ <SliderMarker value={16} />
66
+ <SliderMarker value={24} />
67
+ <SliderMarker value={32} />
68
+ <SliderMarker value={40} />
69
+ <SliderMarker value={48} />
70
+ </Slider>
71
+ </Box>
72
+ );
73
+ }
@@ -0,0 +1,55 @@
1
+ import type { Color } from '@basic-ui/color-picker';
2
+ import { startTransition, useEffect, useRef, useState } from 'react';
3
+
4
+ import { Box } from '../Box';
5
+ import { Button } from '../Button';
6
+ import { TextFieldColorPicker } from './TextFieldColorPicker';
7
+
8
+ interface ColorSchemePickerProps {
9
+ label: string;
10
+ initialValue: Color;
11
+ onChange: (c: Color) => void;
12
+ onReset: () => void;
13
+ resetDisabled: boolean;
14
+ }
15
+
16
+ export function ColorSchemePicker(props: ColorSchemePickerProps) {
17
+ const { label, initialValue, onChange, onReset, resetDisabled } = props;
18
+ const [value, setValue] = useState(initialValue);
19
+
20
+ const remountKey = useRef(0);
21
+ const resetting = useRef(false);
22
+ useEffect(() => {
23
+ if (resetting.current) {
24
+ remountKey.current++;
25
+ resetting.current = false;
26
+ setValue(props.initialValue);
27
+ }
28
+ }, [props.initialValue]);
29
+
30
+ return (
31
+ <Box display="flex" minWidth="300px" flex="1" alignItems="center">
32
+ <TextFieldColorPicker
33
+ key={remountKey.current}
34
+ label={label}
35
+ value={value}
36
+ onChange={(c) => {
37
+ setValue(c);
38
+ startTransition(() => {
39
+ onChange(c);
40
+ });
41
+ }}
42
+ />
43
+ <Button
44
+ variant="text"
45
+ disabled={resetDisabled}
46
+ onClick={() => {
47
+ resetting.current = true;
48
+ onReset();
49
+ }}
50
+ >
51
+ Reset
52
+ </Button>
53
+ </Box>
54
+ );
55
+ }
@@ -0,0 +1,139 @@
1
+ import {
2
+ useState,
3
+ useMemo,
4
+ useEffect,
5
+ useRef,
6
+ useDeferredValue,
7
+ memo,
8
+ } from 'react';
9
+
10
+ import { Box } from '../Box';
11
+ import { Button } from '../Button';
12
+ import {
13
+ Combobox,
14
+ ComboboxOption,
15
+ ComboboxList,
16
+ ComboboxPopover,
17
+ ComboboxInput,
18
+ ComboboxButton,
19
+ } from '../Combobox';
20
+ import { Text } from '../Text';
21
+ import { googleFonts } from './googleFonts';
22
+
23
+ export interface FontAutoCompleteProps {
24
+ label?: string;
25
+ initialValue?: string;
26
+ onSelect?: (font: string) => void;
27
+ onReset: () => void;
28
+ resetDisabled: boolean;
29
+ }
30
+
31
+ function useFontMatch(searchTerm: string) {
32
+ return useMemo(() => {
33
+ const term = searchTerm.trim().toLowerCase();
34
+ return term === ''
35
+ ? googleFonts
36
+ : googleFonts.filter((font) => font.toLowerCase().indexOf(term) !== -1);
37
+ }, [searchTerm]);
38
+ }
39
+
40
+ export function parseMainFont(fontStr: string): string | undefined {
41
+ const fonts = fontStr.split(/, */).map((f) => f.replace(/"([^"]+)"/, '$1'));
42
+ return fonts.length > 0 ? fonts[0] : undefined;
43
+ }
44
+
45
+ export function FontAutoComplete({
46
+ initialValue = '',
47
+ onSelect,
48
+ label,
49
+ onReset,
50
+ resetDisabled,
51
+ }: FontAutoCompleteProps) {
52
+ const [term, setTerm] = useState<undefined | string>(undefined);
53
+ const filterTerm = useDeferredValue(term);
54
+ const [selected, setSelected] = useState(initialValue);
55
+
56
+ const resetting = useRef(false);
57
+ useEffect(() => {
58
+ if (resetting.current) {
59
+ setSelected(initialValue);
60
+ setTerm(undefined);
61
+ resetting.current = false;
62
+ }
63
+ }, [initialValue]);
64
+
65
+ const results = useFontMatch(filterTerm || '');
66
+ return (
67
+ <Box display="flex" minWidth="300px" flex="1" alignItems="center">
68
+ <Combobox
69
+ onSelect={(text) => {
70
+ setSelected(text);
71
+ setTerm(text);
72
+ onSelect?.(text);
73
+ }}
74
+ selectOnBlur
75
+ width="100%"
76
+ >
77
+ <Box position="relative" width="100%">
78
+ <ComboboxInput
79
+ onChange={(e) => {
80
+ setTerm(e.target.value);
81
+ }}
82
+ value={term === undefined ? selected : term}
83
+ label={label}
84
+ />
85
+ <Box
86
+ height={56}
87
+ width={56}
88
+ position="absolute"
89
+ justifyContent="center"
90
+ alignItems="center"
91
+ display="flex"
92
+ top={0}
93
+ right={0}
94
+ bottom={0}
95
+ >
96
+ <ComboboxButton />
97
+ </Box>
98
+ </Box>
99
+ <SearchResults results={results} />
100
+ </Combobox>
101
+ <Button
102
+ variant="text"
103
+ onClick={() => {
104
+ resetting.current = true;
105
+ onReset();
106
+ }}
107
+ disabled={resetDisabled}
108
+ >
109
+ Reset
110
+ </Button>
111
+ </Box>
112
+ );
113
+ }
114
+
115
+ const SearchResults = memo(function SearchResults(props: {
116
+ results: string[];
117
+ }) {
118
+ if (!props.results) {
119
+ return null;
120
+ }
121
+
122
+ return (
123
+ <ComboboxPopover zIndex={100}>
124
+ <ComboboxList persistSelection={true}>
125
+ <Text variant="label-medium" opacity={0.6} px={3} py={2}>
126
+ Sorted by popularity
127
+ </Text>
128
+ {props.results.map((result) => (
129
+ <ComboboxOption
130
+ key={result}
131
+ id={result}
132
+ text={result}
133
+ value={result}
134
+ />
135
+ ))}
136
+ </ComboboxList>
137
+ </ComboboxPopover>
138
+ );
139
+ });
@@ -1,7 +1,8 @@
1
+ import { theme } from '../theme/theme';
1
2
  import { ThemeBuilder } from './ThemeBuilder';
2
3
 
3
4
  export default {
4
5
  title: 'components/ThemeExplorer',
5
6
  };
6
7
 
7
- export const Builder = () => <ThemeBuilder />;
8
+ export const Builder = () => <ThemeBuilder baseTheme={theme} />;