@marigold/components 0.3.3 → 0.4.0

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 (232) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/index.d.ts +364 -32
  3. package/dist/index.js +1421 -5
  4. package/dist/index.mjs +1369 -0
  5. package/package.json +29 -10
  6. package/dist/ActionGroup/ActionGroup.d.ts +0 -8
  7. package/dist/ActionGroup/ActionGroup.stories.d.ts +0 -5
  8. package/dist/ActionGroup/index.d.ts +0 -1
  9. package/dist/Alert/Alert.d.ts +0 -27
  10. package/dist/Alert/Alert.stories.d.ts +0 -5
  11. package/dist/Alert/index.d.ts +0 -1
  12. package/dist/Badge/Badge.d.ts +0 -13
  13. package/dist/Badge/Badge.stories.d.ts +0 -5
  14. package/dist/Badge/index.d.ts +0 -1
  15. package/dist/Box.d.ts +0 -2
  16. package/dist/Button/Button.d.ts +0 -9
  17. package/dist/Button/Button.stories.d.ts +0 -5
  18. package/dist/Button/index.d.ts +0 -1
  19. package/dist/Card/Card.d.ts +0 -14
  20. package/dist/Card/Card.stories.d.ts +0 -5
  21. package/dist/Card/index.d.ts +0 -1
  22. package/dist/Checkbox/Checkbox.d.ts +0 -20
  23. package/dist/Checkbox/Checkbox.stories.d.ts +0 -5
  24. package/dist/Checkbox/CheckboxIcons.d.ts +0 -9
  25. package/dist/Checkbox/index.d.ts +0 -1
  26. package/dist/Column/Column.d.ts +0 -8
  27. package/dist/Column/Column.stories.d.ts +0 -5
  28. package/dist/Column/index.d.ts +0 -1
  29. package/dist/Columns/Columns.d.ts +0 -10
  30. package/dist/Columns/Columns.stories.d.ts +0 -5
  31. package/dist/Columns/index.d.ts +0 -1
  32. package/dist/Container/Container.d.ts +0 -6
  33. package/dist/Container/Container.stories.d.ts +0 -5
  34. package/dist/Container/index.d.ts +0 -1
  35. package/dist/Dialog/Dialog.d.ts +0 -17
  36. package/dist/Dialog/Dialog.stories.d.ts +0 -5
  37. package/dist/Dialog/ModalDialog.d.ts +0 -8
  38. package/dist/Dialog/index.d.ts +0 -1
  39. package/dist/Divider/Divider.d.ts +0 -11
  40. package/dist/Divider/Divider.stories.d.ts +0 -5
  41. package/dist/Divider/index.d.ts +0 -1
  42. package/dist/Field/Field.d.ts +0 -13
  43. package/dist/Field/Field.stories.d.ts +0 -5
  44. package/dist/Field/index.d.ts +0 -1
  45. package/dist/Image/Image.d.ts +0 -12
  46. package/dist/Image/Image.stories.d.ts +0 -5
  47. package/dist/Image/index.d.ts +0 -1
  48. package/dist/Inline/Inline.d.ts +0 -7
  49. package/dist/Inline/Inline.stories.d.ts +0 -5
  50. package/dist/Inline/index.d.ts +0 -1
  51. package/dist/Input/Input.d.ts +0 -11
  52. package/dist/Input/Input.stories.d.ts +0 -5
  53. package/dist/Input/index.d.ts +0 -1
  54. package/dist/Label/Label.d.ts +0 -19
  55. package/dist/Label/Label.stories.d.ts +0 -5
  56. package/dist/Label/index.d.ts +0 -1
  57. package/dist/Link/Link.d.ts +0 -10
  58. package/dist/Link/Link.stories.d.ts +0 -5
  59. package/dist/Link/index.d.ts +0 -1
  60. package/dist/Menu/Menu.d.ts +0 -15
  61. package/dist/Menu/Menu.stories.d.ts +0 -5
  62. package/dist/Menu/index.d.ts +0 -1
  63. package/dist/MenuItem/MenuItem.d.ts +0 -12
  64. package/dist/MenuItem/MenuItem.stories.d.ts +0 -5
  65. package/dist/MenuItem/index.d.ts +0 -1
  66. package/dist/Message/Message.d.ts +0 -12
  67. package/dist/Message/Message.stories.d.ts +0 -5
  68. package/dist/Message/index.d.ts +0 -1
  69. package/dist/Provider/MarigoldProvider.d.ts +0 -11
  70. package/dist/Provider/index.d.ts +0 -3
  71. package/dist/Radio/Radio.d.ts +0 -19
  72. package/dist/Radio/Radio.stories.d.ts +0 -5
  73. package/dist/Radio/RadioIcon.d.ts +0 -9
  74. package/dist/Radio/index.d.ts +0 -1
  75. package/dist/Select/ListBox.d.ts +0 -9
  76. package/dist/Select/ListBoxSection.d.ts +0 -9
  77. package/dist/Select/Option.d.ts +0 -9
  78. package/dist/Select/Popover.d.ts +0 -9
  79. package/dist/Select/Select.d.ts +0 -27
  80. package/dist/Select/Select.stories.d.ts +0 -5
  81. package/dist/Select/index.d.ts +0 -1
  82. package/dist/Slider/Slider.d.ts +0 -11
  83. package/dist/Slider/Slider.stories.d.ts +0 -5
  84. package/dist/Slider/index.d.ts +0 -1
  85. package/dist/Stack/Stack.d.ts +0 -7
  86. package/dist/Stack/Stack.stories.d.ts +0 -5
  87. package/dist/Stack/index.d.ts +0 -1
  88. package/dist/Text/Text.d.ts +0 -17
  89. package/dist/Text/Text.stories.d.ts +0 -5
  90. package/dist/Text/index.d.ts +0 -1
  91. package/dist/Textarea/Textarea.d.ts +0 -16
  92. package/dist/Textarea/Textarea.stories.d.ts +0 -5
  93. package/dist/Textarea/index.d.ts +0 -1
  94. package/dist/ValidationMessage/ValidationMessage.d.ts +0 -11
  95. package/dist/ValidationMessage/ValidationMessage.stories.d.ts +0 -5
  96. package/dist/ValidationMessage/index.d.ts +0 -1
  97. package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -1
  98. package/dist/VisuallyHidden/VisuallyHidden.stories.d.ts +0 -5
  99. package/dist/VisuallyHidden/index.d.ts +0 -1
  100. package/dist/components.cjs.development.js +0 -1394
  101. package/dist/components.cjs.development.js.map +0 -1
  102. package/dist/components.cjs.production.min.js +0 -2
  103. package/dist/components.cjs.production.min.js.map +0 -1
  104. package/dist/components.esm.js +0 -1320
  105. package/dist/components.esm.js.map +0 -1
  106. package/dist/theme.d.ts +0 -23
  107. package/src/ActionGroup/ActionGroup.stories.tsx +0 -47
  108. package/src/ActionGroup/ActionGroup.test.tsx +0 -83
  109. package/src/ActionGroup/ActionGroup.tsx +0 -32
  110. package/src/ActionGroup/index.ts +0 -1
  111. package/src/Alert/Alert.stories.tsx +0 -32
  112. package/src/Alert/Alert.test.tsx +0 -82
  113. package/src/Alert/Alert.tsx +0 -52
  114. package/src/Alert/index.ts +0 -1
  115. package/src/Badge/Badge.stories.tsx +0 -38
  116. package/src/Badge/Badge.test.tsx +0 -65
  117. package/src/Badge/Badge.tsx +0 -37
  118. package/src/Badge/index.ts +0 -1
  119. package/src/Box.ts +0 -2
  120. package/src/Button/Button.stories.tsx +0 -57
  121. package/src/Button/Button.test.tsx +0 -149
  122. package/src/Button/Button.tsx +0 -64
  123. package/src/Button/index.ts +0 -1
  124. package/src/Card/Card.stories.tsx +0 -41
  125. package/src/Card/Card.test.tsx +0 -71
  126. package/src/Card/Card.tsx +0 -48
  127. package/src/Card/index.ts +0 -1
  128. package/src/Checkbox/Checkbox.stories.tsx +0 -78
  129. package/src/Checkbox/Checkbox.test.tsx +0 -166
  130. package/src/Checkbox/Checkbox.tsx +0 -101
  131. package/src/Checkbox/CheckboxIcons.tsx +0 -59
  132. package/src/Checkbox/index.ts +0 -1
  133. package/src/Column/Column.stories.tsx +0 -33
  134. package/src/Column/Column.test.tsx +0 -32
  135. package/src/Column/Column.tsx +0 -27
  136. package/src/Column/index.ts +0 -1
  137. package/src/Columns/Columns.stories.tsx +0 -75
  138. package/src/Columns/Columns.test.tsx +0 -113
  139. package/src/Columns/Columns.tsx +0 -69
  140. package/src/Columns/index.ts +0 -1
  141. package/src/Container/Container.stories.tsx +0 -14
  142. package/src/Container/Container.test.tsx +0 -26
  143. package/src/Container/Container.tsx +0 -13
  144. package/src/Container/index.ts +0 -1
  145. package/src/Dialog/Dialog.stories.tsx +0 -88
  146. package/src/Dialog/Dialog.test.tsx +0 -158
  147. package/src/Dialog/Dialog.tsx +0 -130
  148. package/src/Dialog/ModalDialog.tsx +0 -76
  149. package/src/Dialog/index.ts +0 -1
  150. package/src/Divider/Divider.stories.tsx +0 -30
  151. package/src/Divider/Divider.test.tsx +0 -72
  152. package/src/Divider/Divider.tsx +0 -33
  153. package/src/Divider/index.ts +0 -1
  154. package/src/Field/Field.stories.tsx +0 -110
  155. package/src/Field/Field.test.tsx +0 -130
  156. package/src/Field/Field.tsx +0 -56
  157. package/src/Field/index.ts +0 -1
  158. package/src/Image/Image.stories.tsx +0 -34
  159. package/src/Image/Image.test.tsx +0 -73
  160. package/src/Image/Image.tsx +0 -25
  161. package/src/Image/index.ts +0 -1
  162. package/src/Inline/Inline.stories.tsx +0 -39
  163. package/src/Inline/Inline.test.tsx +0 -99
  164. package/src/Inline/Inline.tsx +0 -38
  165. package/src/Inline/index.ts +0 -1
  166. package/src/Input/Input.stories.tsx +0 -54
  167. package/src/Input/Input.test.tsx +0 -74
  168. package/src/Input/Input.tsx +0 -25
  169. package/src/Input/index.ts +0 -1
  170. package/src/Label/Label.stories.tsx +0 -41
  171. package/src/Label/Label.test.tsx +0 -109
  172. package/src/Label/Label.tsx +0 -64
  173. package/src/Label/index.ts +0 -1
  174. package/src/Link/Link.stories.tsx +0 -35
  175. package/src/Link/Link.test.tsx +0 -97
  176. package/src/Link/Link.tsx +0 -43
  177. package/src/Link/index.ts +0 -1
  178. package/src/Menu/Menu.stories.tsx +0 -62
  179. package/src/Menu/Menu.test.tsx +0 -84
  180. package/src/Menu/Menu.tsx +0 -51
  181. package/src/Menu/index.ts +0 -1
  182. package/src/MenuItem/MenuItem.stories.tsx +0 -30
  183. package/src/MenuItem/MenuItem.test.tsx +0 -68
  184. package/src/MenuItem/MenuItem.tsx +0 -35
  185. package/src/MenuItem/index.ts +0 -1
  186. package/src/Message/Message.stories.tsx +0 -30
  187. package/src/Message/Message.test.tsx +0 -90
  188. package/src/Message/Message.tsx +0 -55
  189. package/src/Message/index.ts +0 -1
  190. package/src/Provider/MarigoldProvider.test.tsx +0 -136
  191. package/src/Provider/MarigoldProvider.tsx +0 -47
  192. package/src/Provider/index.ts +0 -4
  193. package/src/Radio/Radio.stories.tsx +0 -78
  194. package/src/Radio/Radio.test.tsx +0 -154
  195. package/src/Radio/Radio.tsx +0 -88
  196. package/src/Radio/RadioIcon.tsx +0 -49
  197. package/src/Radio/index.ts +0 -1
  198. package/src/Select/ListBox.tsx +0 -40
  199. package/src/Select/ListBoxSection.tsx +0 -40
  200. package/src/Select/Option.tsx +0 -48
  201. package/src/Select/Popover.tsx +0 -50
  202. package/src/Select/Select.stories.tsx +0 -81
  203. package/src/Select/Select.test.tsx +0 -349
  204. package/src/Select/Select.tsx +0 -174
  205. package/src/Select/index.ts +0 -1
  206. package/src/Slider/Slider.stories.tsx +0 -24
  207. package/src/Slider/Slider.test.tsx +0 -63
  208. package/src/Slider/Slider.tsx +0 -35
  209. package/src/Slider/index.ts +0 -1
  210. package/src/Stack/Stack.stories.tsx +0 -57
  211. package/src/Stack/Stack.test.tsx +0 -138
  212. package/src/Stack/Stack.tsx +0 -39
  213. package/src/Stack/index.ts +0 -1
  214. package/src/Text/Text.stories.tsx +0 -61
  215. package/src/Text/Text.test.tsx +0 -99
  216. package/src/Text/Text.tsx +0 -60
  217. package/src/Text/index.ts +0 -1
  218. package/src/Textarea/Textarea.stories.tsx +0 -64
  219. package/src/Textarea/Textarea.test.tsx +0 -95
  220. package/src/Textarea/Textarea.tsx +0 -62
  221. package/src/Textarea/index.ts +0 -1
  222. package/src/ValidationMessage/ValidationMessage.stories.tsx +0 -27
  223. package/src/ValidationMessage/ValidationMessage.test.tsx +0 -68
  224. package/src/ValidationMessage/ValidationMessage.tsx +0 -40
  225. package/src/ValidationMessage/index.ts +0 -1
  226. package/src/VisuallyHidden/VisuallyHidden.stories.tsx +0 -19
  227. package/src/VisuallyHidden/VisuallyHidden.test.tsx +0 -10
  228. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -1
  229. package/src/VisuallyHidden/index.ts +0 -1
  230. package/src/index.ts +0 -34
  231. package/src/theme.ts +0 -50
  232. package/tsconfig.build.json +0 -3
@@ -1,154 +0,0 @@
1
- import React from 'react';
2
- import { fireEvent, render, screen } from '@testing-library/react';
3
- import { Radio } from './Radio';
4
- import { ThemeProvider } from '@marigold/system';
5
-
6
- const theme = {
7
- space: {
8
- none: 0,
9
- small: 2,
10
- },
11
- colors: {
12
- disabled: 'gray',
13
- },
14
- radio: {
15
- __default: {
16
- m: 'small',
17
- },
18
- },
19
- label: {
20
- above: {
21
- fontSize: '8px',
22
- },
23
- inline: {
24
- fontSize: '14px',
25
- },
26
- },
27
- };
28
-
29
- test('supports default labelVariant', () => {
30
- render(
31
- <ThemeProvider theme={theme}>
32
- <Radio id="test" title="checkbox" label="label" />
33
- </ThemeProvider>
34
- );
35
-
36
- const label = screen.getByText(/label/);
37
- expect(label).toHaveStyle(`font-size: 14px`);
38
- });
39
-
40
- test('supports other labelVariant than default', () => {
41
- render(
42
- <ThemeProvider theme={theme}>
43
- <Radio id="test" title="checkbox" label="label" labelVariant="above" />
44
- </ThemeProvider>
45
- );
46
-
47
- const label = screen.getByText(/label/);
48
- expect(label).toHaveStyle(`font-size: 8px`);
49
- });
50
-
51
- test('supports label prop', () => {
52
- render(<Radio label="Test" id="test" title="radio" />);
53
-
54
- const radioLabel = screen.getByText(/Test/);
55
- expect(radioLabel).toBeDefined();
56
- });
57
-
58
- test('supports required prop and renders required icon', () => {
59
- render(<Radio label="Test" id="test" required title="radio" />);
60
-
61
- const label = screen.getByText(/Test/);
62
- expect(label.nextSibling).toContainHTML('path d="M10.8');
63
- });
64
-
65
- test('supports default type', () => {
66
- render(<Radio id="radio" title="radio" label="test" />);
67
-
68
- const radio = screen.getByTitle(/radio/);
69
- expect(radio.getAttribute('type')).toEqual('radio');
70
- });
71
-
72
- test('renders <input> element', () => {
73
- render(<Radio id="radio" title="radio" label="test" />);
74
-
75
- const radio = screen.getByTitle(/radio/);
76
- expect(radio instanceof HTMLInputElement).toBeTruthy();
77
- });
78
-
79
- test('supports disabled prop', () => {
80
- render(
81
- <ThemeProvider theme={theme}>
82
- <Radio id="test" title="radio" label="label" disabled />
83
- </ThemeProvider>
84
- );
85
-
86
- const radio = screen.getByTitle(/radio/);
87
- expect(radio).toHaveAttribute('disabled');
88
- const label = screen.getByText(/label/);
89
- expect(label).toHaveStyle(`color: gray`);
90
- });
91
-
92
- test('supports error and errorMessage prop', () => {
93
- render(
94
- <ThemeProvider theme={theme}>
95
- <Radio id="test" title="radio" label="test" error errorMessage="error" />
96
- </ThemeProvider>
97
- );
98
-
99
- const errorMessage = screen.getByText(/error/);
100
- expect(errorMessage).toBeDefined();
101
- });
102
-
103
- test('supports checked radio', () => {
104
- render(
105
- <ThemeProvider theme={theme}>
106
- <Radio id="test" title="radio" label="test" onChange={() => {}} checked />
107
- </ThemeProvider>
108
- );
109
-
110
- const radio = screen.getByTitle(/radio/);
111
- expect(radio).toHaveAttribute('checked');
112
- });
113
-
114
- test('supports checked and disabled radio', () => {
115
- render(
116
- <ThemeProvider theme={theme}>
117
- <Radio
118
- id="test"
119
- title="radio"
120
- label="test"
121
- onChange={() => {}}
122
- checked
123
- disabled
124
- />
125
- </ThemeProvider>
126
- );
127
-
128
- const radio = screen.getByTitle(/radio/);
129
- expect(radio).toHaveAttribute('checked');
130
- expect(radio).toHaveAttribute('disabled');
131
- });
132
-
133
- test('correctly handles interaction', () => {
134
- const click = jest.fn();
135
- const change = jest.fn();
136
-
137
- render(
138
- <ThemeProvider theme={theme}>
139
- <Radio
140
- id="test"
141
- title="radio"
142
- label="Test"
143
- onClick={click}
144
- onChange={change}
145
- />
146
- </ThemeProvider>
147
- );
148
-
149
- const radio = screen.getByTitle(/radio/);
150
- fireEvent.click(radio);
151
-
152
- expect(click).toHaveBeenCalledTimes(1);
153
- expect(change).toHaveBeenCalledTimes(1);
154
- });
@@ -1,88 +0,0 @@
1
- import React from 'react';
2
- import { ComponentProps } from '@marigold/types';
3
- import { Exclamation } from '@marigold/icons';
4
- import { useFocusRing } from '@react-aria/focus';
5
- import { VisuallyHidden } from '@react-aria/visually-hidden';
6
-
7
- import { RadioIcon, RadioIconProps } from './RadioIcon';
8
- import { Box } from '../Box';
9
- import { Label } from '../Label';
10
- import { ValidationMessage } from '../ValidationMessage';
11
-
12
- // Theme Extension
13
- // ---------------
14
- export interface RadioThemeExtension<Value> {
15
- radio?: {
16
- [key: string]: Value;
17
- };
18
- }
19
-
20
- // Radio Input
21
- // ---------------
22
- type RadioInputProps = RadioIconProps & ComponentProps<'input'>;
23
-
24
- const RadioInput: React.FC<RadioInputProps> = ({ error, ...props }) => {
25
- const { focusProps } = useFocusRing();
26
-
27
- return (
28
- <Box pr="xsmall">
29
- <VisuallyHidden>
30
- <input
31
- type="radio"
32
- disabled={props.disabled}
33
- {...focusProps}
34
- {...props}
35
- />
36
- </VisuallyHidden>
37
- <RadioIcon
38
- variant={props.variant}
39
- disabled={props.disabled}
40
- checked={props.checked}
41
- error={error}
42
- />
43
- </Box>
44
- );
45
- };
46
-
47
- // Radio
48
- // ---------------
49
- export type RadioProps = {
50
- id: string;
51
- label: string;
52
- required?: boolean;
53
- labelVariant?: string;
54
- error?: boolean;
55
- errorMessage?: string;
56
- } & RadioInputProps;
57
-
58
- export const Radio: React.FC<RadioProps> = ({
59
- label,
60
- required,
61
- labelVariant = 'inline',
62
- error,
63
- errorMessage,
64
- ...props
65
- }) => (
66
- <>
67
- <Box
68
- as={Label}
69
- htmlFor={props.id}
70
- required={required}
71
- variant={`label.${labelVariant}`}
72
- css={
73
- props.disabled
74
- ? { color: 'disabled', ':hover': { cursor: 'not-allowed' } }
75
- : { color: 'text', ':hover': { cursor: 'pointer' } }
76
- }
77
- >
78
- <Box as={RadioInput} error={error} {...props} />
79
- {label}
80
- </Box>
81
- {error && errorMessage && (
82
- <ValidationMessage>
83
- <Exclamation size={16} />
84
- {errorMessage}
85
- </ValidationMessage>
86
- )}
87
- </>
88
- );
@@ -1,49 +0,0 @@
1
- import React from 'react';
2
- import { conditional, State, SVG } from '@marigold/system';
3
-
4
- import { Box } from '../Box';
5
-
6
- // Radio Icon
7
- // ---------------
8
- export type RadioIconProps = {
9
- variant?: string;
10
- checked?: boolean;
11
- disabled?: boolean;
12
- error?: boolean;
13
- children?: never;
14
- };
15
-
16
- export const RadioIcon: React.FC<RadioIconProps> = ({
17
- variant = '',
18
- checked = false,
19
- disabled = false,
20
- error = false,
21
- }) => {
22
- const conditionalStates: State = disabled
23
- ? {
24
- disabled: disabled,
25
- }
26
- : {
27
- checked: checked,
28
- error: error,
29
- };
30
-
31
- return (
32
- <SVG
33
- width="16"
34
- height="32"
35
- viewBox="0 0 16 32"
36
- fill="none"
37
- aria-hidden="true"
38
- >
39
- <Box
40
- variant={conditional(`radio.${variant}`, conditionalStates)}
41
- as="circle"
42
- cx="8"
43
- cy="16"
44
- r="7.5"
45
- />
46
- {checked && <circle fill="white" cx="8" cy="16" r="3" />}
47
- </SVG>
48
- );
49
- };
@@ -1 +0,0 @@
1
- export * from './Radio';
@@ -1,40 +0,0 @@
1
- import React, { useRef } from 'react';
2
- import { useListBox } from '@react-aria/listbox';
3
- import type { AriaListBoxOptions } from '@react-aria/listbox';
4
- import type { ListState } from '@react-stately/list';
5
-
6
- import { Box } from '../Box';
7
- import { Option } from './Option';
8
- import { ListBoxSection } from './ListBoxSection';
9
-
10
- interface ListBoxProps extends AriaListBoxOptions<unknown> {
11
- state: ListState<unknown>;
12
- error?: boolean;
13
- }
14
-
15
- export const ListBox = (props: ListBoxProps) => {
16
- const ref = useRef<HTMLUListElement>(null);
17
- const { state, error } = props;
18
- const { listBoxProps } = useListBox(props, state, ref);
19
-
20
- return (
21
- <Box
22
- as="ul"
23
- p="none"
24
- css={{
25
- listStyle: 'none',
26
- }}
27
- {...listBoxProps}
28
- variant={error ? 'select.listbox.error' : 'select.listbox'}
29
- ref={ref}
30
- >
31
- {[...state.collection].map(item =>
32
- item.type === 'section' ? (
33
- <ListBoxSection key={item.key} section={item} state={state} />
34
- ) : (
35
- <Option key={item.key} item={item} state={state} />
36
- )
37
- )}
38
- </Box>
39
- );
40
- };
@@ -1,40 +0,0 @@
1
- import React from 'react';
2
- import { useListBoxSection } from '@react-aria/listbox';
3
- import type { ListState } from '@react-stately/list';
4
- import type { Node } from '@react-types/shared';
5
-
6
- import { Box } from '../Box';
7
- import { Option } from './Option';
8
-
9
- interface SectionProps {
10
- section: Node<unknown>;
11
- state: ListState<unknown>;
12
- }
13
-
14
- export const ListBoxSection = ({ section, state }: SectionProps) => {
15
- const { itemProps, headingProps, groupProps } = useListBoxSection({
16
- heading: section.rendered,
17
- 'aria-label': section['aria-label'],
18
- });
19
-
20
- return (
21
- <Box
22
- as="li"
23
- {...itemProps}
24
- css={{
25
- cursor: 'not-allowed',
26
- }}
27
- >
28
- {section.rendered && (
29
- <Box as="span" {...headingProps} variant={'select.section'}>
30
- {section.rendered}
31
- </Box>
32
- )}
33
- <Box as="ul" {...groupProps}>
34
- {[...section.childNodes].map(node => (
35
- <Option key={node.key} item={node} state={state} />
36
- ))}
37
- </Box>
38
- </Box>
39
- );
40
- };
@@ -1,48 +0,0 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import type { ListState } from '@react-stately/list';
3
- import type { Node } from '@react-types/shared';
4
- import { useOption } from '@react-aria/listbox';
5
-
6
- import { Box } from '../Box';
7
-
8
- interface OptionProps {
9
- item: Node<unknown>;
10
- state: ListState<unknown>;
11
- }
12
-
13
- export const Option = ({ item, state }: OptionProps) => {
14
- const ref = useRef<HTMLLIElement>(null);
15
- const [disabled, setDisabled] = useState(false);
16
- const { optionProps, isSelected } = useOption(
17
- {
18
- key: item.key,
19
- },
20
- state,
21
- ref
22
- );
23
-
24
- useEffect(() => {
25
- for (const key of state.disabledKeys.values()) {
26
- if (key === item.key) {
27
- setDisabled(true);
28
- }
29
- }
30
- }, [state.disabledKeys, item.key]);
31
-
32
- return (
33
- <Box
34
- as="li"
35
- {...optionProps}
36
- ref={ref}
37
- variant={
38
- isSelected
39
- ? 'select.option.selected'
40
- : disabled
41
- ? 'select.option.disabled'
42
- : 'select.option'
43
- }
44
- >
45
- {item.rendered}
46
- </Box>
47
- );
48
- };
@@ -1,50 +0,0 @@
1
- import React, { forwardRef, RefObject } from 'react';
2
- import { FocusScope } from '@react-aria/focus';
3
- import {
4
- DismissButton,
5
- OverlayContainer,
6
- useModal,
7
- useOverlay,
8
- } from '@react-aria/overlays';
9
- import { mergeProps } from '@react-aria/utils';
10
-
11
- import { Box } from '../Box';
12
-
13
- interface PopoverProps {
14
- isOpen?: boolean;
15
- onClose?: () => void;
16
- ref?: React.Ref<HTMLDivElement>;
17
- className?: string;
18
- }
19
-
20
- export const Popover: React.FC<PopoverProps> = forwardRef(
21
- ({ children, className, isOpen, onClose, ...otherProps }, ref) => {
22
- // Handle events that should cause the popup to close,
23
- const { overlayProps } = useOverlay(
24
- {
25
- isOpen,
26
- onClose,
27
- shouldCloseOnBlur: true,
28
- isDismissable: true,
29
- },
30
- ref as RefObject<HTMLElement>
31
- );
32
- // Hide content outside the modal from screen readers.
33
- const { modalProps } = useModal();
34
-
35
- return (
36
- <OverlayContainer>
37
- <FocusScope restoreFocus>
38
- <Box
39
- {...mergeProps(overlayProps, otherProps, modalProps)}
40
- className={className}
41
- ref={ref}
42
- >
43
- {children}
44
- <DismissButton onDismiss={onClose} />
45
- </Box>
46
- </FocusScope>
47
- </OverlayContainer>
48
- );
49
- }
50
- );
@@ -1,81 +0,0 @@
1
- import React from 'react';
2
- import type { Meta, ComponentStory } from '@storybook/react';
3
- import { Select } from './Select';
4
- import { Item } from '@marigold/components';
5
-
6
- export default {
7
- title: 'Components/Select',
8
- argTypes: {
9
- label: {
10
- control: {
11
- type: 'text',
12
- },
13
- table: {
14
- defaultValue: {
15
- summary: 'Select label',
16
- },
17
- },
18
- defaultValue: 'Favorite Color',
19
- },
20
- placeholder: {
21
- control: {
22
- type: 'text',
23
- },
24
- table: {
25
- defaultValue: {
26
- summary: 'Select an option',
27
- },
28
- },
29
- },
30
- disabled: {
31
- control: {
32
- type: 'boolean',
33
- },
34
- options: [true, false],
35
- table: {
36
- defaultValue: {
37
- summary: false,
38
- },
39
- },
40
- },
41
- required: {
42
- control: {
43
- type: 'boolean',
44
- },
45
- options: [true, false],
46
- table: {
47
- defaultValue: {
48
- summary: false,
49
- },
50
- },
51
- },
52
- error: {
53
- control: {
54
- type: 'boolean',
55
- },
56
- description: 'Error',
57
- table: {
58
- defaultValue: {
59
- summary: false,
60
- },
61
- },
62
- },
63
- errorMessage: {
64
- control: {
65
- type: 'text',
66
- },
67
- description: 'Error Message',
68
- },
69
- width: {
70
- control: 'number',
71
- },
72
- },
73
- } as Meta;
74
-
75
- export const Basic: ComponentStory<typeof Select> = args => (
76
- <Select {...args}>
77
- <Item>Red</Item>
78
- <Item>Orange</Item>
79
- <Item>Yellow</Item>
80
- </Select>
81
- );