@marigold/components 0.0.2 → 0.3.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 (224) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/dist/ActionGroup/ActionGroup.d.ts +8 -0
  3. package/dist/ActionGroup/ActionGroup.stories.d.ts +5 -0
  4. package/dist/ActionGroup/index.d.ts +1 -0
  5. package/dist/Alert/Alert.d.ts +16 -3
  6. package/dist/Alert/Alert.stories.d.ts +5 -0
  7. package/dist/Badge/Badge.d.ts +11 -5
  8. package/dist/Badge/Badge.stories.d.ts +5 -0
  9. package/dist/Box.d.ts +2 -0
  10. package/dist/Button/Button.d.ts +9 -5
  11. package/dist/Button/Button.stories.d.ts +5 -0
  12. package/dist/Card/Card.d.ts +14 -0
  13. package/dist/Card/Card.stories.d.ts +5 -0
  14. package/dist/Card/index.d.ts +1 -0
  15. package/dist/Checkbox/Checkbox.d.ts +17 -5
  16. package/dist/Checkbox/Checkbox.stories.d.ts +5 -0
  17. package/dist/Checkbox/CheckboxIcons.d.ts +9 -0
  18. package/dist/Column/Column.d.ts +6 -4
  19. package/dist/Column/Column.stories.d.ts +5 -0
  20. package/dist/Columns/Columns.d.ts +10 -0
  21. package/dist/Columns/Columns.stories.d.ts +5 -0
  22. package/dist/Columns/index.d.ts +1 -0
  23. package/dist/Container/Container.d.ts +5 -4
  24. package/dist/Container/Container.stories.d.ts +5 -0
  25. package/dist/Dialog/Dialog.d.ts +17 -0
  26. package/dist/Dialog/Dialog.stories.d.ts +5 -0
  27. package/dist/Dialog/ModalDialog.d.ts +8 -0
  28. package/dist/Dialog/index.d.ts +1 -0
  29. package/dist/Divider/Divider.d.ts +10 -3
  30. package/dist/Divider/Divider.stories.d.ts +5 -0
  31. package/dist/Field/Field.d.ts +10 -5
  32. package/dist/Field/Field.stories.d.ts +5 -0
  33. package/dist/Image/Image.d.ts +11 -5
  34. package/dist/Image/Image.stories.d.ts +5 -0
  35. package/dist/Inline/Inline.d.ts +7 -0
  36. package/dist/Inline/Inline.stories.d.ts +5 -0
  37. package/dist/Inline/index.d.ts +1 -0
  38. package/dist/Input/Input.d.ts +10 -4
  39. package/dist/Input/Input.stories.d.ts +5 -0
  40. package/dist/Label/Label.d.ts +18 -5
  41. package/dist/Label/Label.stories.d.ts +5 -0
  42. package/dist/Link/Link.d.ts +10 -5
  43. package/dist/Link/Link.stories.d.ts +5 -0
  44. package/dist/Menu/Menu.d.ts +11 -4
  45. package/dist/Menu/Menu.stories.d.ts +5 -0
  46. package/dist/MenuItem/MenuItem.d.ts +11 -4
  47. package/dist/MenuItem/MenuItem.stories.d.ts +5 -0
  48. package/dist/Message/Message.d.ts +10 -4
  49. package/dist/Message/Message.stories.d.ts +5 -0
  50. package/dist/Provider/MarigoldProvider.d.ts +11 -0
  51. package/dist/Provider/index.d.ts +3 -0
  52. package/dist/Radio/Radio.d.ts +17 -4
  53. package/dist/Radio/RadioIcons.d.ts +10 -0
  54. package/dist/Select/ListBox.d.ts +9 -0
  55. package/dist/Select/ListBoxSection.d.ts +9 -0
  56. package/dist/Select/Option.d.ts +9 -0
  57. package/dist/Select/Popover.d.ts +9 -0
  58. package/dist/Select/Select.d.ts +27 -3
  59. package/dist/Select/Select.stories.d.ts +5 -0
  60. package/dist/Slider/Slider.d.ts +10 -4
  61. package/dist/Slider/Slider.stories.d.ts +5 -0
  62. package/dist/Stack/Stack.d.ts +7 -0
  63. package/dist/Stack/Stack.stories.d.ts +5 -0
  64. package/dist/Stack/index.d.ts +1 -0
  65. package/dist/Text/Text.d.ts +17 -7
  66. package/dist/Text/Text.stories.d.ts +5 -0
  67. package/dist/Textarea/Textarea.d.ts +15 -4
  68. package/dist/Textarea/Textarea.stories.d.ts +5 -0
  69. package/dist/ValidationMessage/ValidationMessage.d.ts +10 -4
  70. package/dist/ValidationMessage/ValidationMessage.stories.d.ts +5 -0
  71. package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -0
  72. package/dist/VisuallyHidden/VisuallyHidden.stories.d.ts +5 -0
  73. package/dist/VisuallyHidden/index.d.ts +1 -0
  74. package/dist/components.cjs.development.js +1276 -461
  75. package/dist/components.cjs.development.js.map +1 -1
  76. package/dist/components.cjs.production.min.js +1 -1
  77. package/dist/components.cjs.production.min.js.map +1 -1
  78. package/dist/components.esm.js +1229 -461
  79. package/dist/components.esm.js.map +1 -1
  80. package/dist/index.d.ts +10 -3
  81. package/dist/theme.d.ts +23 -28
  82. package/package.json +27 -4
  83. package/src/ActionGroup/ActionGroup.stories.tsx +47 -0
  84. package/src/ActionGroup/ActionGroup.test.tsx +83 -0
  85. package/src/ActionGroup/ActionGroup.tsx +32 -0
  86. package/src/ActionGroup/index.ts +1 -0
  87. package/src/Alert/Alert.stories.tsx +32 -0
  88. package/src/Alert/Alert.test.tsx +34 -23
  89. package/src/Alert/Alert.tsx +48 -24
  90. package/src/Badge/Badge.stories.tsx +38 -0
  91. package/src/Badge/Badge.test.tsx +14 -40
  92. package/src/Badge/Badge.tsx +31 -28
  93. package/src/Box.ts +2 -0
  94. package/src/Button/Button.stories.tsx +57 -0
  95. package/src/Button/Button.test.tsx +76 -13
  96. package/src/Button/Button.tsx +58 -23
  97. package/src/Card/Card.stories.tsx +41 -0
  98. package/src/Card/Card.test.tsx +71 -0
  99. package/src/Card/Card.tsx +48 -0
  100. package/src/Card/index.ts +1 -0
  101. package/src/Checkbox/Checkbox.stories.mdx +90 -112
  102. package/src/Checkbox/Checkbox.stories.tsx +78 -0
  103. package/src/Checkbox/Checkbox.test.tsx +139 -24
  104. package/src/Checkbox/Checkbox.tsx +95 -58
  105. package/src/Checkbox/CheckboxIcons.tsx +59 -0
  106. package/src/Column/Column.stories.tsx +33 -0
  107. package/src/Column/Column.test.tsx +15 -59
  108. package/src/Column/Column.tsx +21 -19
  109. package/src/Columns/Columns.stories.tsx +75 -0
  110. package/src/Columns/Columns.test.tsx +113 -0
  111. package/src/Columns/Columns.tsx +69 -0
  112. package/src/Columns/index.ts +1 -0
  113. package/src/Container/Container.stories.tsx +14 -0
  114. package/src/Container/Container.test.tsx +8 -49
  115. package/src/Container/Container.tsx +8 -19
  116. package/src/Dialog/Dialog.stories.tsx +88 -0
  117. package/src/Dialog/Dialog.test.tsx +158 -0
  118. package/src/Dialog/Dialog.tsx +130 -0
  119. package/src/Dialog/ModalDialog.tsx +76 -0
  120. package/src/Dialog/index.ts +1 -0
  121. package/src/Divider/Divider.stories.tsx +30 -0
  122. package/src/Divider/Divider.test.tsx +14 -6
  123. package/src/Divider/Divider.tsx +20 -13
  124. package/src/Field/Field.stories.tsx +110 -0
  125. package/src/Field/Field.test.tsx +75 -34
  126. package/src/Field/Field.tsx +50 -43
  127. package/src/Image/Image.stories.tsx +34 -0
  128. package/src/Image/Image.test.tsx +6 -3
  129. package/src/Image/Image.tsx +21 -15
  130. package/src/Inline/Inline.stories.tsx +39 -0
  131. package/src/Inline/Inline.test.tsx +99 -0
  132. package/src/Inline/Inline.tsx +38 -0
  133. package/src/Inline/index.ts +1 -0
  134. package/src/Input/Input.stories.tsx +54 -0
  135. package/src/Input/Input.test.tsx +9 -5
  136. package/src/Input/Input.tsx +21 -16
  137. package/src/Label/Label.stories.tsx +41 -0
  138. package/src/Label/Label.test.tsx +41 -6
  139. package/src/Label/Label.tsx +59 -18
  140. package/src/Link/Link.stories.tsx +35 -0
  141. package/src/Link/Link.test.tsx +52 -22
  142. package/src/Link/Link.tsx +40 -20
  143. package/src/Menu/Menu.stories.tsx +62 -0
  144. package/src/Menu/Menu.test.tsx +13 -7
  145. package/src/Menu/Menu.tsx +44 -38
  146. package/src/MenuItem/MenuItem.stories.tsx +30 -0
  147. package/src/MenuItem/MenuItem.test.tsx +23 -14
  148. package/src/MenuItem/MenuItem.tsx +29 -18
  149. package/src/Message/Message.stories.tsx +30 -0
  150. package/src/Message/Message.test.tsx +5 -2
  151. package/src/Message/Message.tsx +48 -40
  152. package/src/Provider/MarigoldProvider.test.tsx +136 -0
  153. package/src/Provider/MarigoldProvider.tsx +47 -0
  154. package/src/Provider/index.ts +4 -0
  155. package/src/Radio/Radio.stories.mdx +91 -94
  156. package/src/Radio/Radio.test.tsx +92 -16
  157. package/src/Radio/Radio.tsx +114 -50
  158. package/src/Radio/RadioIcons.tsx +39 -0
  159. package/src/Select/ListBox.tsx +40 -0
  160. package/src/Select/ListBoxSection.tsx +40 -0
  161. package/src/Select/Option.tsx +48 -0
  162. package/src/Select/Popover.tsx +50 -0
  163. package/src/Select/Select.stories.tsx +81 -0
  164. package/src/Select/Select.test.tsx +311 -43
  165. package/src/Select/Select.tsx +174 -28
  166. package/src/Slider/Slider.stories.tsx +24 -0
  167. package/src/Slider/Slider.test.tsx +11 -7
  168. package/src/Slider/Slider.tsx +30 -15
  169. package/src/Stack/Stack.stories.tsx +57 -0
  170. package/src/Stack/Stack.test.tsx +138 -0
  171. package/src/Stack/Stack.tsx +39 -0
  172. package/src/Stack/index.ts +1 -0
  173. package/src/Text/Text.stories.tsx +61 -0
  174. package/src/Text/Text.test.tsx +41 -36
  175. package/src/Text/Text.tsx +55 -29
  176. package/src/Textarea/Textarea.stories.tsx +64 -0
  177. package/src/Textarea/Textarea.test.tsx +41 -5
  178. package/src/Textarea/Textarea.tsx +57 -17
  179. package/src/ValidationMessage/ValidationMessage.stories.tsx +27 -0
  180. package/src/ValidationMessage/ValidationMessage.test.tsx +19 -14
  181. package/src/ValidationMessage/ValidationMessage.tsx +36 -21
  182. package/src/VisuallyHidden/VisuallyHidden.stories.tsx +19 -0
  183. package/src/VisuallyHidden/VisuallyHidden.test.tsx +10 -0
  184. package/src/VisuallyHidden/VisuallyHidden.tsx +1 -0
  185. package/src/VisuallyHidden/index.ts +1 -0
  186. package/src/index.ts +11 -3
  187. package/src/theme.ts +49 -28
  188. package/dist/Heading/Heading.d.ts +0 -5
  189. package/dist/Heading/index.d.ts +0 -1
  190. package/dist/Hidden/Hidden.d.ts +0 -6
  191. package/dist/Hidden/index.d.ts +0 -1
  192. package/dist/Svg/Svg.d.ts +0 -6
  193. package/dist/Svg/index.d.ts +0 -1
  194. package/src/Alert/Alert.stories.mdx +0 -49
  195. package/src/Badge/Badge.stories.mdx +0 -41
  196. package/src/Button/Button.stories.mdx +0 -155
  197. package/src/Column/Column.stories.mdx +0 -76
  198. package/src/Container/Container.stories.mdx +0 -42
  199. package/src/Divider/Divider.stories.mdx +0 -42
  200. package/src/Field/Field.stories.mdx +0 -57
  201. package/src/Heading/Heading.stories.mdx +0 -79
  202. package/src/Heading/Heading.test.tsx +0 -63
  203. package/src/Heading/Heading.tsx +0 -22
  204. package/src/Heading/index.ts +0 -1
  205. package/src/Hidden/Hidden.stories.mdx +0 -64
  206. package/src/Hidden/Hidden.test.tsx +0 -87
  207. package/src/Hidden/Hidden.tsx +0 -25
  208. package/src/Hidden/index.ts +0 -1
  209. package/src/Image/Image.stories.mdx +0 -40
  210. package/src/Input/Input.stories.mdx +0 -44
  211. package/src/Label/Label.stories.mdx +0 -34
  212. package/src/Link/Link.stories.mdx +0 -37
  213. package/src/Menu/Menu.stories.mdx +0 -47
  214. package/src/MenuItem/MenuItem.stories.mdx +0 -32
  215. package/src/Message/Message.stories.mdx +0 -43
  216. package/src/Select/Select.stories.mdx +0 -43
  217. package/src/Slider/Slider.stories.mdx +0 -57
  218. package/src/Svg/Svg.stories.mdx +0 -47
  219. package/src/Svg/Svg.test.tsx +0 -76
  220. package/src/Svg/Svg.tsx +0 -31
  221. package/src/Svg/index.ts +0 -1
  222. package/src/Text/Text.stories.mdx +0 -60
  223. package/src/Textarea/Textarea.stories.mdx +0 -34
  224. package/src/ValidationMessage/ValidationMessage.stories.mdx +0 -36
package/src/Menu/Menu.tsx CHANGED
@@ -1,45 +1,51 @@
1
1
  import React from 'react';
2
- import { useStyles, system } from '@marigold/system';
3
- import { Button } from '@marigold/components';
2
+ import { ComponentProps } from '@marigold/types';
4
3
 
5
- type MenuProps = {
4
+ import { Button } from '../Button';
5
+ import { Box } from '../Box';
6
+
7
+ // Theme Extension
8
+ // ---------------
9
+ export interface MenuThemeExtension<Value> {
10
+ menu?: Value;
11
+ }
12
+
13
+ // Props
14
+ // ---------------
15
+ export type MenuProps = {
6
16
  variant?: string;
7
17
  label?: string;
8
- onClick: () => void;
18
+ onClick: ComponentProps<typeof Button>['onClick'];
9
19
  show?: boolean;
20
+ className?: string;
21
+ title?: string; // For testing
10
22
  };
11
23
 
12
- export const Menu = system<MenuProps, 'div'>(
13
- ({
14
- variant = 'menu',
15
- label = 'Menu',
16
- onClick,
17
- show = false,
18
- className,
19
- children,
20
- ...props
21
- }) => {
22
- const classNames = useStyles(
23
- {
24
- variant: `content.${variant}`,
25
- },
26
- className
27
- );
28
- const itemStyles = useStyles({
29
- position: 'absolute',
30
- minWidth: '120px',
31
- display: 'block',
32
- textAlign: 'left',
33
- borderRadius: '2px',
34
- });
35
-
36
- return (
37
- <div className={classNames} {...props}>
38
- <Button onClick={onClick} variant="menu">
39
- {label}
40
- </Button>
41
- {show ? <div className={itemStyles}>{children}</div> : null}
42
- </div>
43
- );
44
- }
45
- );
24
+ // Component
25
+ // ---------------
26
+ export const Menu: React.FC<MenuProps> = ({
27
+ variant = 'default',
28
+ label = 'Menu',
29
+ onClick,
30
+ show = false,
31
+ children,
32
+ ...props
33
+ }) => {
34
+ return (
35
+ <Box variant={`menu.${variant}`} {...props}>
36
+ <Button onClick={onClick} variant="menu">
37
+ {label}
38
+ </Button>
39
+ {show ? (
40
+ <Box
41
+ display="block"
42
+ position="absolute"
43
+ minWidth="120px"
44
+ borderRadius="2px"
45
+ >
46
+ {children}
47
+ </Box>
48
+ ) : null}
49
+ </Box>
50
+ );
51
+ };
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import type { Meta, ComponentStory } from '@storybook/react';
3
+ import { MenuItem } from './MenuItem';
4
+
5
+ export default {
6
+ title: 'Components/MenuItem',
7
+ parameters: {
8
+ actions: {
9
+ handles: ['click'],
10
+ },
11
+ },
12
+ argTypes: {
13
+ variant: {
14
+ control: {
15
+ type: 'text',
16
+ },
17
+ table: {
18
+ defaultValue: {
19
+ summary: 'default',
20
+ },
21
+ },
22
+ },
23
+ },
24
+ } as Meta;
25
+
26
+ export const Basic: ComponentStory<typeof MenuItem> = args => (
27
+ <MenuItem href="#" {...args}>
28
+ Home
29
+ </MenuItem>
30
+ );
@@ -1,45 +1,52 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import { ThemeProvider } from '@marigold/system';
4
- import { MenuItem } from '@marigold/components';
4
+ import { MenuItem } from './MenuItem';
5
5
 
6
6
  const theme = {
7
- content: {
8
- menuItem: {
9
- padding: '4px',
7
+ space: {
8
+ none: 0,
9
+ small: 4,
10
+ medium: 8,
11
+ },
12
+ menuItem: {
13
+ default: {
14
+ padding: 'small',
10
15
  },
11
16
  item: {
12
- padding: '8px',
17
+ padding: 'medium',
13
18
  },
14
19
  },
15
20
  };
16
21
 
17
- test('supports default variant and themeSection', () => {
22
+ test('supports default variant', () => {
18
23
  render(
19
24
  <ThemeProvider theme={theme}>
20
- <MenuItem title="menuItem" />
25
+ <MenuItem title="menuItem">Item</MenuItem>
21
26
  </ThemeProvider>
22
27
  );
23
28
  const menuItem = screen.getByTitle(/menuItem/);
24
29
 
25
- expect(menuItem).toHaveStyle(`padding: 4px`);
30
+ expect(menuItem.parentElement).toHaveStyle(`padding: 4px`);
26
31
  });
27
32
 
28
33
  test('accepts other variant than default', () => {
29
34
  render(
30
35
  <ThemeProvider theme={theme}>
31
- <MenuItem title="menuItem" variant="item" />
36
+ <MenuItem title="menuItem" variant="item">
37
+ Item
38
+ </MenuItem>
32
39
  </ThemeProvider>
33
40
  );
34
41
  const menuItem = screen.getByTitle(/menuItem/);
35
42
 
36
- expect(menuItem).toHaveStyle(`padding: 8px`);
43
+ expect(menuItem.parentElement).toHaveStyle(`padding: 8px`);
37
44
  });
38
45
 
39
46
  test('renders correct HTML element', () => {
40
47
  render(
41
48
  <ThemeProvider theme={theme}>
42
- <MenuItem title="menuItem" />
49
+ <MenuItem title="menuItem">Item</MenuItem>
43
50
  </ThemeProvider>
44
51
  );
45
52
  const menuItem = screen.getByTitle(/menuItem/);
@@ -50,10 +57,12 @@ test('renders correct HTML element', () => {
50
57
  test('accepts custom styles prop className', () => {
51
58
  render(
52
59
  <ThemeProvider theme={theme}>
53
- <MenuItem className="custom-class-name" title="menuItem" />
60
+ <MenuItem title="menuItem" className="custom-class-name">
61
+ Item
62
+ </MenuItem>
54
63
  </ThemeProvider>
55
64
  );
56
- const menuItem = screen.getByTitle(/menuItem/);
65
+ const menuItem = screen.getByText(/Item/).parentElement;
57
66
 
58
- expect(menuItem.className).toMatch('custom-class-name');
67
+ expect(menuItem).toHaveClass('custom-class-name');
59
68
  });
@@ -1,24 +1,35 @@
1
1
  import React from 'react';
2
- import { useStyles, system } from '@marigold/system';
3
- import { Link } from '@marigold/components';
2
+ import { ComponentProps } from '@marigold/types';
3
+ import { Link } from '../Link';
4
+ import { Box } from '../Box';
4
5
 
5
- type MenuItemProps = {
6
- variant?: string;
7
- };
6
+ // Theme Extension
7
+ // ---------------
8
+ export interface MenuItemThemeExtension<Value> {
9
+ menuItem?: {
10
+ [key: string]: Value;
11
+ };
12
+ }
8
13
 
9
- export const MenuItem = system<MenuItemProps, 'a'>(
10
- ({ variant = 'menuItem', className, children, ...props }) => {
11
- const classNames = useStyles(
12
- {
13
- variant: `content.${variant}`,
14
- },
15
- className
16
- );
14
+ // Props
15
+ // ---------------
16
+ export type MenuItemProps = {
17
+ variant?: string;
18
+ } & ComponentProps<typeof Link>;
17
19
 
18
- return (
19
- <Link variant="menu" className={classNames} {...props}>
20
+ // Component
21
+ // ---------------
22
+ export const MenuItem: React.FC<MenuItemProps> = ({
23
+ variant = 'default',
24
+ className,
25
+ children,
26
+ ...props
27
+ }) => {
28
+ return (
29
+ <Box variant={`menuItem.${variant}`} className={className}>
30
+ <Link variant="menuItemLink" {...props}>
20
31
  {children}
21
32
  </Link>
22
- );
23
- }
24
- );
33
+ </Box>
34
+ );
35
+ };
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import type { Meta, ComponentStory } from '@storybook/react';
3
+ import { Message } from './Message';
4
+ import { Text } from '../Text';
5
+
6
+ export default {
7
+ title: 'Components/Message',
8
+ argTypes: {
9
+ variant: {
10
+ control: {
11
+ type: 'select',
12
+ },
13
+ options: ['warning', 'error', 'info'],
14
+ description: 'Messaging in different colors and icons',
15
+ },
16
+ messageTitle: {
17
+ control: {
18
+ type: 'text',
19
+ },
20
+ description: 'Content',
21
+ defaultValue: 'Danger Zone!',
22
+ },
23
+ },
24
+ } as Meta;
25
+
26
+ export const Basic: ComponentStory<typeof Message> = args => (
27
+ <Message {...args}>
28
+ <Text>Hello, I am a simple message.</Text>
29
+ </Message>
30
+ );
@@ -1,10 +1,13 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import { ThemeProvider } from '@marigold/system';
4
- import { Message } from '@marigold/components';
4
+ import { Message } from './Message';
5
5
 
6
6
  const theme = {
7
- messages: {
7
+ colors: {
8
+ primary: 'hotpink',
9
+ },
10
+ message: {
8
11
  info: {
9
12
  alignItems: 'center',
10
13
  },
@@ -1,47 +1,55 @@
1
1
  import React from 'react';
2
- import { useStyles, system } from '@marigold/system';
3
- import { Heading } from '@marigold/components';
4
2
  import { Exclamation, Info, Notification } from '@marigold/icons';
3
+ import { ComponentProps } from '@marigold/types';
4
+ import { Box } from '../Box';
5
+ import { Text } from '../Text';
5
6
 
6
- type MessageProps = {
7
+ // Theme Extension
8
+ // ---------------
9
+ export interface MessageThemeExtension<Value> {
10
+ message?: {
11
+ [key: string]: Value;
12
+ };
13
+ }
14
+
15
+ // Props
16
+ // ---------------
17
+ export type MessageProps = {
7
18
  messageTitle: string;
8
19
  variant?: string;
9
- };
10
-
11
- export const Message = system<MessageProps, 'div'>(
12
- ({ messageTitle, variant = 'info', className, children, ...props }) => {
13
- const classNames = useStyles(
14
- {
15
- element: ['p'],
16
- variant: `messages.${variant}`,
17
- display: 'inline-block',
18
- },
19
- className
20
- );
21
-
22
- var icon = <Info className={useStyles({ verticalAlign: '-5px' })} />;
20
+ } & ComponentProps<'div'>;
23
21
 
24
- if (variant === 'warning') {
25
- icon = <Notification className={useStyles({ verticalAlign: '-5px ' })} />;
26
- } else if (variant === 'error') {
27
- icon = <Exclamation className={useStyles({ verticalAlign: '-5px ' })} />;
28
- }
29
-
30
- return (
31
- <div className={classNames} {...props}>
32
- <div className={useStyles({ marginBottom: '8px', marginRight: '4px' })}>
33
- {icon}
34
- <Heading
35
- variant="h4"
36
- className={useStyles({
37
- display: 'inline',
38
- })}
39
- >
40
- {messageTitle}
41
- </Heading>
42
- </div>
43
- <div className={useStyles({ color: 'black' })}>{children}</div>
44
- </div>
45
- );
22
+ // Component
23
+ // ---------------
24
+ export const Message: React.FC<MessageProps> = ({
25
+ messageTitle,
26
+ variant = 'info',
27
+ className,
28
+ children,
29
+ ...props
30
+ }) => {
31
+ var icon = <Info />;
32
+ if (variant === 'warning') {
33
+ icon = <Notification />;
34
+ }
35
+ if (variant === 'error') {
36
+ icon = <Exclamation />;
46
37
  }
47
- );
38
+
39
+ return (
40
+ <Box
41
+ display="inline-block"
42
+ variant={`message.${variant}`}
43
+ className={className}
44
+ {...props}
45
+ >
46
+ <Box display="flex" alignItems="center" variant="message.title">
47
+ {icon}
48
+ <Text as="h4" variant="headline4">
49
+ {messageTitle}
50
+ </Text>
51
+ </Box>
52
+ <Box css={{ color: 'black' }}>{children}</Box>
53
+ </Box>
54
+ );
55
+ };
@@ -0,0 +1,136 @@
1
+ import React from 'react';
2
+ import { useTheme } from '@marigold/system';
3
+ import { render, screen } from '@testing-library/react';
4
+
5
+ import { MarigoldProvider } from './MarigoldProvider';
6
+
7
+ // Setup
8
+ // ---------------
9
+ const theme = {
10
+ colors: {
11
+ black: '#000',
12
+ },
13
+ fontSizes: {
14
+ body: 16,
15
+ heading: 32,
16
+ },
17
+ text: {
18
+ body: {
19
+ fontSize: 'body',
20
+ color: 'black',
21
+ },
22
+ },
23
+ };
24
+
25
+ test('themes can be cascaded', () => {
26
+ const outerTheme = {
27
+ colors: {
28
+ primary: 'coral',
29
+ },
30
+ };
31
+
32
+ const innerTheme = {
33
+ colors: {
34
+ primary: 'gainsboro',
35
+ },
36
+ };
37
+
38
+ const Theme = ({ testId }: { testId: string }) => {
39
+ const { theme } = useTheme();
40
+ return <div data-testid={testId}>{JSON.stringify(theme, null, 2)}</div>;
41
+ };
42
+
43
+ render(
44
+ <MarigoldProvider theme={outerTheme}>
45
+ <>
46
+ <Theme testId="outer" />
47
+ <MarigoldProvider theme={innerTheme}>
48
+ <Theme testId="inner" />
49
+ </MarigoldProvider>
50
+ </>
51
+ </MarigoldProvider>
52
+ );
53
+
54
+ const outer = screen.getByTestId('outer');
55
+ const inner = screen.getByTestId('inner');
56
+
57
+ expect(outer.innerHTML).toMatchInlineSnapshot(`
58
+ "{
59
+ \\"colors\\": {
60
+ \\"primary\\": \\"coral\\"
61
+ }
62
+ }"
63
+ `);
64
+ expect(inner.innerHTML).toMatchInlineSnapshot(`
65
+ "{
66
+ \\"colors\\": {
67
+ \\"primary\\": \\"gainsboro\\"
68
+ }
69
+ }"
70
+ `);
71
+ });
72
+
73
+ test('OverlayProvider is added', () => {
74
+ const { container } = render(
75
+ <MarigoldProvider theme={theme}>Test</MarigoldProvider>
76
+ );
77
+
78
+ expect(
79
+ container.querySelector(`div[data-overlay-container="true"]`)
80
+ ).toBeDefined();
81
+ });
82
+
83
+ test('OverlayProvider is added only once', () => {
84
+ const innerTheme = { colors: { primary: 'red' } };
85
+ const { container } = render(
86
+ <MarigoldProvider theme={theme}>
87
+ <MarigoldProvider theme={innerTheme}>Test</MarigoldProvider>
88
+ </MarigoldProvider>
89
+ );
90
+
91
+ expect(
92
+ container.querySelectorAll(`div[data-overlay-container="true"]`).length
93
+ ).toEqual(1);
94
+ });
95
+
96
+ test('applies global styles for body and html based on `theme.root`', () => {
97
+ const theme = {
98
+ fonts: {
99
+ body: 'Inter',
100
+ html: 'Roboto',
101
+ },
102
+ lineHeights: {
103
+ body: 2.5,
104
+ },
105
+ fontWeights: {
106
+ body: 500,
107
+ html: 700,
108
+ },
109
+ root: {
110
+ body: {
111
+ fontFamily: 'body',
112
+ lineHeight: 'body',
113
+ fontWeight: 'body',
114
+ },
115
+ html: {
116
+ fontFamily: 'html',
117
+ fontWeight: 'html',
118
+ },
119
+ },
120
+ };
121
+
122
+ const root = render(
123
+ <MarigoldProvider theme={theme}>
124
+ <h1>Hello</h1>
125
+ </MarigoldProvider>
126
+ );
127
+
128
+ const html = root.baseElement.parentElement;
129
+ expect(html).toHaveStyle(`font-family: ${theme.fonts.html}`);
130
+ expect(html).toHaveStyle(`font-weight: ${theme.fontWeights.html}`);
131
+
132
+ const body = root.baseElement;
133
+ expect(body).toHaveStyle(`font-family: ${theme.fonts.body}`);
134
+ expect(body).toHaveStyle(`font-weight: ${theme.fontWeights.body}`);
135
+ expect(body).toHaveStyle(`line-height: ${theme.lineHeights.body}`);
136
+ });
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { OverlayProvider } from '@react-aria/overlays';
3
+ import {
4
+ Theme,
5
+ Global,
6
+ ThemeProvider,
7
+ ThemeProviderProps,
8
+ useTheme,
9
+ __defaultTheme,
10
+ } from '@marigold/system';
11
+
12
+ // Theme Extension
13
+ // ---------------
14
+ export interface RootThemeExtension<Value> {
15
+ root?: {
16
+ body?: Value;
17
+ html?: Value;
18
+ };
19
+ }
20
+
21
+ // Props
22
+ // ---------------
23
+ export interface MarigoldProviderProps<T extends Theme>
24
+ extends ThemeProviderProps<T> {}
25
+
26
+ // Provider
27
+ // ---------------
28
+ export function MarigoldProvider<T extends Theme>({
29
+ theme,
30
+ children,
31
+ }: MarigoldProviderProps<T>) {
32
+ const outer = useTheme();
33
+ const isTopLevel = outer.theme === __defaultTheme;
34
+
35
+ return (
36
+ <ThemeProvider theme={theme}>
37
+ {isTopLevel ? (
38
+ <>
39
+ <Global />
40
+ <OverlayProvider>{children}</OverlayProvider>
41
+ </>
42
+ ) : (
43
+ children
44
+ )}
45
+ </ThemeProvider>
46
+ );
47
+ }
@@ -0,0 +1,4 @@
1
+ export { useTheme, ThemeProvider } from '@marigold/system';
2
+ export { SSRProvider } from '@react-aria/ssr';
3
+
4
+ export * from './MarigoldProvider';