@onewelcome/react-lib-components 0.1.0-alpha

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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/BaseModal/BaseModal.d.ts +16 -0
  4. package/dist/BaseModal/BaseModalActions/BaseModalActions.d.ts +5 -0
  5. package/dist/BaseModal/BaseModalContent/BaseModalContent.d.ts +8 -0
  6. package/dist/BaseModal/BaseModalContext.d.ts +2 -0
  7. package/dist/BaseModal/BaseModalHeader/BaseModalHeader.d.ts +8 -0
  8. package/dist/Breadcrumbs/Breadcrumbs.d.ts +9 -0
  9. package/dist/Button/BaseButton.d.ts +8 -0
  10. package/dist/Button/Button.d.ts +10 -0
  11. package/dist/Button/IconButton.d.ts +10 -0
  12. package/dist/ContextMenu/ContextMenu.d.ts +18 -0
  13. package/dist/ContextMenu/ContextMenuItem.d.ts +6 -0
  14. package/dist/Dialog/Dialog.d.ts +18 -0
  15. package/dist/Dialog/DialogActions/DialogActions.d.ts +6 -0
  16. package/dist/Dialog/DialogTitle/DialogTitle.d.ts +6 -0
  17. package/dist/Form/Checkbox/Checkbox.d.ts +13 -0
  18. package/dist/Form/Fieldset/Fieldset.d.ts +13 -0
  19. package/dist/Form/Form.d.ts +5 -0
  20. package/dist/Form/FormControl/FormControl.d.ts +8 -0
  21. package/dist/Form/FormGroup/FormGroup.d.ts +18 -0
  22. package/dist/Form/FormHelperText/FormHelperText.d.ts +7 -0
  23. package/dist/Form/FormSelectorWrapper/FormSelectorWrapper.d.ts +18 -0
  24. package/dist/Form/Input/Input.d.ts +12 -0
  25. package/dist/Form/Label/Label.d.ts +6 -0
  26. package/dist/Form/Radio/Radio.d.ts +11 -0
  27. package/dist/Form/Select/Option.d.ts +12 -0
  28. package/dist/Form/Select/Select.d.ts +15 -0
  29. package/dist/Form/Textarea/Textarea.d.ts +7 -0
  30. package/dist/Form/Toggle/Toggle.d.ts +6 -0
  31. package/dist/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.d.ts +8 -0
  32. package/dist/Form/Wrapper/InputWrapper/InputWrapper.d.ts +17 -0
  33. package/dist/Form/Wrapper/RadioWrapper/RadioWrapper.d.ts +10 -0
  34. package/dist/Form/Wrapper/SelectWrapper/SelectWrapper.d.ts +12 -0
  35. package/dist/Form/Wrapper/TextareaWrapper/TextareaWrapper.d.ts +14 -0
  36. package/dist/Form/Wrapper/Wrapper/Wrapper.d.ts +28 -0
  37. package/dist/Form/form.interfaces.d.ts +12 -0
  38. package/dist/Icon/Icon.d.ts +75 -0
  39. package/dist/Link/Link.d.ts +15 -0
  40. package/dist/Modal/Modal.d.ts +1 -0
  41. package/dist/Modal/ModalActions/ModalActions.d.ts +1 -0
  42. package/dist/Modal/ModalContent/ModalContent.d.ts +1 -0
  43. package/dist/Modal/ModalHeader/ModalHeader.d.ts +1 -0
  44. package/dist/Popover/Popover.d.ts +11 -0
  45. package/dist/Snackbar/SnackbarContainer/SnackbarContainer.d.ts +12 -0
  46. package/dist/Snackbar/SnackbarItem/SnackbarItem.d.ts +13 -0
  47. package/dist/Snackbar/SnackbarProvider/SnackbarProvider.d.ts +18 -0
  48. package/dist/Snackbar/SnackbarProvider/SnackbarStateProvider.d.ts +14 -0
  49. package/dist/Snackbar/interfaces.d.ts +10 -0
  50. package/dist/Snackbar/useSnackbar.d.ts +1 -0
  51. package/dist/Tiles/Tile.d.ts +16 -0
  52. package/dist/Tiles/Tiles.d.ts +6 -0
  53. package/dist/Tooltip/Tooltip.d.ts +11 -0
  54. package/dist/Typography/Typography.d.ts +12 -0
  55. package/dist/Wizard/BaseWizardSteps/BaseWizardSteps.d.ts +13 -0
  56. package/dist/Wizard/Wizard.d.ts +12 -0
  57. package/dist/Wizard/WizardActions/WizardActions.d.ts +12 -0
  58. package/dist/Wizard/WizardStateProvider.d.ts +12 -0
  59. package/dist/Wizard/WizardSteps/WizardSteps.d.ts +5 -0
  60. package/dist/Wizard/wizardStateReducer.d.ts +26 -0
  61. package/dist/_BaseStyling_/BaseStyling.d.ts +47 -0
  62. package/dist/hooks/useAnimation.d.ts +6 -0
  63. package/dist/hooks/useBodyClick.d.ts +1 -0
  64. package/dist/hooks/useFormSelector.d.ts +13 -0
  65. package/dist/hooks/usePosition.d.ts +36 -0
  66. package/dist/hooks/useScroll.d.ts +2 -0
  67. package/dist/hooks/useSpacing.d.ts +18 -0
  68. package/dist/hooks/useWrapper.d.ts +11 -0
  69. package/dist/index.d.ts +43 -0
  70. package/dist/index.js +8 -0
  71. package/dist/interfaces.d.ts +13 -0
  72. package/dist/react-lib-components.cjs.development.js +3282 -0
  73. package/dist/react-lib-components.cjs.development.js.map +1 -0
  74. package/dist/react-lib-components.cjs.production.min.js +2 -0
  75. package/dist/react-lib-components.cjs.production.min.js.map +1 -0
  76. package/dist/react-lib-components.esm.js +3235 -0
  77. package/dist/react-lib-components.esm.js.map +1 -0
  78. package/dist/util/helper.d.ts +1 -0
  79. package/package.json +88 -0
  80. package/src/BaseModal/BaseModal.module.scss +58 -0
  81. package/src/BaseModal/BaseModal.test.tsx +59 -0
  82. package/src/BaseModal/BaseModal.tsx +113 -0
  83. package/src/BaseModal/BaseModalActions/BaseModalActions.module.scss +9 -0
  84. package/src/BaseModal/BaseModalActions/BaseModalActions.test.tsx +17 -0
  85. package/src/BaseModal/BaseModalActions/BaseModalActions.tsx +14 -0
  86. package/src/BaseModal/BaseModalContent/BaseModalContent.module.scss +6 -0
  87. package/src/BaseModal/BaseModalContent/BaseModalContent.test.tsx +29 -0
  88. package/src/BaseModal/BaseModalContent/BaseModalContent.tsx +35 -0
  89. package/src/BaseModal/BaseModalContext.ts +2 -0
  90. package/src/BaseModal/BaseModalHeader/BaseModalHeader.module.scss +17 -0
  91. package/src/BaseModal/BaseModalHeader/BaseModalHeader.test.tsx +30 -0
  92. package/src/BaseModal/BaseModalHeader/BaseModalHeader.tsx +28 -0
  93. package/src/Breadcrumbs/Breadcrumbs.module.scss +14 -0
  94. package/src/Breadcrumbs/Breadcrumbs.test.tsx +42 -0
  95. package/src/Breadcrumbs/Breadcrumbs.tsx +48 -0
  96. package/src/Button/BaseButton.module.scss +20 -0
  97. package/src/Button/BaseButton.test.tsx +59 -0
  98. package/src/Button/BaseButton.tsx +31 -0
  99. package/src/Button/Button.module.scss +336 -0
  100. package/src/Button/Button.test.tsx +76 -0
  101. package/src/Button/Button.tsx +44 -0
  102. package/src/Button/IconButton.module.scss +161 -0
  103. package/src/Button/IconButton.test.tsx +47 -0
  104. package/src/Button/IconButton.tsx +29 -0
  105. package/src/ContextMenu/ContextMenu.module.scss +20 -0
  106. package/src/ContextMenu/ContextMenu.test.tsx +93 -0
  107. package/src/ContextMenu/ContextMenu.tsx +91 -0
  108. package/src/ContextMenu/ContextMenuItem.module.scss +31 -0
  109. package/src/ContextMenu/ContextMenuItem.tsx +15 -0
  110. package/src/Dialog/Dialog.module.scss +16 -0
  111. package/src/Dialog/Dialog.test.tsx +79 -0
  112. package/src/Dialog/Dialog.tsx +96 -0
  113. package/src/Dialog/DialogActions/DialogActions.module.scss +11 -0
  114. package/src/Dialog/DialogActions/DialogActions.test.tsx +25 -0
  115. package/src/Dialog/DialogActions/DialogActions.tsx +21 -0
  116. package/src/Dialog/DialogTitle/DialogTitle.module.scss +7 -0
  117. package/src/Dialog/DialogTitle/DialogTitle.test.tsx +18 -0
  118. package/src/Dialog/DialogTitle/DialogTitle.tsx +18 -0
  119. package/src/Form/Checkbox/Checkbox.module.scss +65 -0
  120. package/src/Form/Checkbox/Checkbox.test.tsx +119 -0
  121. package/src/Form/Checkbox/Checkbox.tsx +145 -0
  122. package/src/Form/Fieldset/Fieldset.module.scss +19 -0
  123. package/src/Form/Fieldset/Fieldset.test.tsx +85 -0
  124. package/src/Form/Fieldset/Fieldset.tsx +55 -0
  125. package/src/Form/Form.module.scss +3 -0
  126. package/src/Form/Form.test.tsx +47 -0
  127. package/src/Form/Form.tsx +14 -0
  128. package/src/Form/FormControl/FormControl.module.scss +67 -0
  129. package/src/Form/FormControl/FormControl.test.tsx +56 -0
  130. package/src/Form/FormControl/FormControl.tsx +47 -0
  131. package/src/Form/FormGroup/FormGroup.module.scss +29 -0
  132. package/src/Form/FormGroup/FormGroup.test.tsx +61 -0
  133. package/src/Form/FormGroup/FormGroup.tsx +78 -0
  134. package/src/Form/FormHelperText/FormHelperText.module.scss +8 -0
  135. package/src/Form/FormHelperText/FormHelperText.test.tsx +42 -0
  136. package/src/Form/FormHelperText/FormHelperText.tsx +22 -0
  137. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.module.scss +33 -0
  138. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.tsx +65 -0
  139. package/src/Form/Input/Input.module.scss +65 -0
  140. package/src/Form/Input/Input.test.tsx +135 -0
  141. package/src/Form/Input/Input.tsx +72 -0
  142. package/src/Form/Label/Label.module.scss +5 -0
  143. package/src/Form/Label/Label.test.tsx +26 -0
  144. package/src/Form/Label/Label.tsx +19 -0
  145. package/src/Form/Radio/Radio.module.scss +100 -0
  146. package/src/Form/Radio/Radio.test.tsx +88 -0
  147. package/src/Form/Radio/Radio.tsx +98 -0
  148. package/src/Form/Select/Option.test.tsx +15 -0
  149. package/src/Form/Select/Option.tsx +57 -0
  150. package/src/Form/Select/Select.module.scss +189 -0
  151. package/src/Form/Select/Select.test.tsx +96 -0
  152. package/src/Form/Select/Select.tsx +217 -0
  153. package/src/Form/Textarea/Textarea.module.scss +53 -0
  154. package/src/Form/Textarea/Textarea.test.tsx +76 -0
  155. package/src/Form/Textarea/Textarea.tsx +33 -0
  156. package/src/Form/Toggle/Toggle.module.scss +58 -0
  157. package/src/Form/Toggle/Toggle.test.tsx +29 -0
  158. package/src/Form/Toggle/Toggle.tsx +20 -0
  159. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.module.scss +12 -0
  160. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.test.tsx +99 -0
  161. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +62 -0
  162. package/src/Form/Wrapper/InputWrapper/InputWrapper.module.scss +24 -0
  163. package/src/Form/Wrapper/InputWrapper/InputWrapper.test.tsx +93 -0
  164. package/src/Form/Wrapper/InputWrapper/InputWrapper.tsx +92 -0
  165. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.module.scss +12 -0
  166. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.test.tsx +101 -0
  167. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +74 -0
  168. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.module.scss +14 -0
  169. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.test.tsx +101 -0
  170. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +59 -0
  171. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss +65 -0
  172. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.test.tsx +125 -0
  173. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +105 -0
  174. package/src/Form/Wrapper/Wrapper/Wrapper.module.scss +35 -0
  175. package/src/Form/Wrapper/Wrapper/Wrapper.test.tsx +17 -0
  176. package/src/Form/Wrapper/Wrapper/Wrapper.tsx +101 -0
  177. package/src/Form/form.interfaces.ts +14 -0
  178. package/src/Icon/Icon.module.scss +278 -0
  179. package/src/Icon/Icon.test.tsx +39 -0
  180. package/src/Icon/Icon.tsx +94 -0
  181. package/src/Link/Link.module.scss +46 -0
  182. package/src/Link/Link.test.tsx +122 -0
  183. package/src/Link/Link.tsx +80 -0
  184. package/src/Link/types.d.ts +9 -0
  185. package/src/Modal/Modal.test.tsx +16 -0
  186. package/src/Modal/Modal.tsx +1 -0
  187. package/src/Modal/ModalActions/ModalActions.tsx +4 -0
  188. package/src/Modal/ModalContent/ModalContent.tsx +4 -0
  189. package/src/Modal/ModalHeader/ModalHeader.tsx +4 -0
  190. package/src/Popover/Popover.module.scss +18 -0
  191. package/src/Popover/Popover.test.tsx +84 -0
  192. package/src/Popover/Popover.tsx +46 -0
  193. package/src/Snackbar/SnackbarContainer/SnackbarContainer.module.scss +35 -0
  194. package/src/Snackbar/SnackbarContainer/SnackbarContainer.test.tsx +37 -0
  195. package/src/Snackbar/SnackbarContainer/SnackbarContainer.tsx +28 -0
  196. package/src/Snackbar/SnackbarItem/SnackbarItem.module.scss +135 -0
  197. package/src/Snackbar/SnackbarItem/SnackbarItem.test.tsx +47 -0
  198. package/src/Snackbar/SnackbarItem/SnackbarItem.tsx +105 -0
  199. package/src/Snackbar/SnackbarProvider/SnackbarProvider.test.tsx +179 -0
  200. package/src/Snackbar/SnackbarProvider/SnackbarProvider.tsx +127 -0
  201. package/src/Snackbar/SnackbarProvider/SnackbarStateProvider.tsx +25 -0
  202. package/src/Snackbar/interfaces.ts +11 -0
  203. package/src/Snackbar/useSnackbar.ts +4 -0
  204. package/src/Tiles/Tile.module.scss +72 -0
  205. package/src/Tiles/Tile.test.tsx +129 -0
  206. package/src/Tiles/Tile.tsx +48 -0
  207. package/src/Tiles/Tiles.module.scss +11 -0
  208. package/src/Tiles/Tiles.test.tsx +118 -0
  209. package/src/Tiles/Tiles.tsx +48 -0
  210. package/src/Tooltip/Tooltip.module.scss +42 -0
  211. package/src/Tooltip/Tooltip.test.tsx +72 -0
  212. package/src/Tooltip/Tooltip.tsx +130 -0
  213. package/src/Typography/Typography.module.scss +46 -0
  214. package/src/Typography/Typography.test.tsx +114 -0
  215. package/src/Typography/Typography.tsx +84 -0
  216. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.module.scss +192 -0
  217. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.test.tsx +75 -0
  218. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.tsx +86 -0
  219. package/src/Wizard/Wizard.test.tsx +198 -0
  220. package/src/Wizard/Wizard.tsx +49 -0
  221. package/src/Wizard/WizardActions/WizardActions.test.tsx +168 -0
  222. package/src/Wizard/WizardActions/WizardActions.tsx +100 -0
  223. package/src/Wizard/WizardStateProvider.tsx +26 -0
  224. package/src/Wizard/WizardSteps/WizardSteps.test.tsx +110 -0
  225. package/src/Wizard/WizardSteps/WizardSteps.tsx +30 -0
  226. package/src/Wizard/wizardStateReducer.ts +51 -0
  227. package/src/_BaseStyling_/BaseStyling.test.tsx +39 -0
  228. package/src/_BaseStyling_/BaseStyling.tsx +115 -0
  229. package/src/hooks/useAnimation.test.tsx +45 -0
  230. package/src/hooks/useAnimation.ts +20 -0
  231. package/src/hooks/useBodyClick.test.tsx +39 -0
  232. package/src/hooks/useBodyClick.ts +20 -0
  233. package/src/hooks/useFormSelector.test.ts +40 -0
  234. package/src/hooks/useFormSelector.ts +47 -0
  235. package/src/hooks/usePosition.test.tsx +494 -0
  236. package/src/hooks/usePosition.ts +347 -0
  237. package/src/hooks/useScroll.test.tsx +20 -0
  238. package/src/hooks/useScroll.ts +16 -0
  239. package/src/hooks/useSpacing.test.ts +70 -0
  240. package/src/hooks/useSpacing.ts +42 -0
  241. package/src/hooks/useWrapper.test.ts +49 -0
  242. package/src/hooks/useWrapper.ts +35 -0
  243. package/src/index.ts +52 -0
  244. package/src/interfaces.ts +15 -0
  245. package/src/readyclasses.module.scss +77 -0
  246. package/src/types.d.ts +4 -0
  247. package/src/util/helper.test.tsx +15 -0
  248. package/src/util/helper.tsx +80 -0
@@ -0,0 +1,125 @@
1
+ import React from 'react';
2
+ import { TextareaWrapper, Props } from './TextareaWrapper';
3
+ import { render } from '@testing-library/react';
4
+ import userEvent from '@testing-library/user-event';
5
+
6
+ const defaultParams: Props = {
7
+ name: 'textarea',
8
+ label: 'textarea_label',
9
+ value: 'value',
10
+ error: false,
11
+ helperText: 'helpertext',
12
+ helperProps: { 'data-testid': 'helpertext' },
13
+ errorMessage: 'errormessage',
14
+ textareaProps: { 'data-testid': 'textarea' },
15
+ onChange: jest.fn(),
16
+ };
17
+
18
+ const createTextareaWrapper = (params?: (defaultParams: Props) => Props) => {
19
+ let parameters: Props = defaultParams;
20
+ if (params) {
21
+ parameters = params(defaultParams);
22
+ }
23
+ const queries = render(<TextareaWrapper {...parameters} data-testid="textareawrapper" />);
24
+ const textareawrapper = queries.getByTestId('textareawrapper');
25
+ const textarea = queries.getByTestId('textarea');
26
+
27
+ return {
28
+ ...queries,
29
+ textareawrapper,
30
+ textarea,
31
+ };
32
+ };
33
+
34
+ describe('TextareaWrapper should render', () => {
35
+ it('renders without crashing', () => {
36
+ const { textareawrapper } = createTextareaWrapper();
37
+
38
+ expect(textareawrapper).toBeDefined();
39
+ });
40
+ });
41
+
42
+ describe('TextareaWrapper & Textarea have the right attributes', () => {
43
+ it('textarea has aria values', async () => {
44
+ const { textarea, getByTestId, findByText } = createTextareaWrapper();
45
+
46
+ const helpertext = getByTestId('helpertext');
47
+ const label = await findByText('textarea_label');
48
+
49
+ expect(textarea).toHaveAttribute('aria-describedby', helpertext.id);
50
+ expect(textarea).toHaveAttribute('aria-labelledby', label.id);
51
+ });
52
+
53
+ it('TextareaWrapper has the right helpertext', () => {
54
+ const { getByTestId } = createTextareaWrapper();
55
+
56
+ const helpertext = getByTestId('helpertext');
57
+
58
+ expect(helpertext).toBeTruthy();
59
+ expect(helpertext).toHaveTextContent('helpertext');
60
+ });
61
+
62
+ it('TextareaWrapper has the right errormessage', async () => {
63
+ const { findByText, textarea } = createTextareaWrapper((defaultParams) => ({
64
+ ...defaultParams,
65
+ error: true,
66
+ }));
67
+
68
+ const errorMessage = await findByText('errormessage');
69
+
70
+ expect(errorMessage).toBeTruthy();
71
+ expect(textarea).toHaveAttribute('aria-describedby', errorMessage.id);
72
+ });
73
+
74
+ it('has floating label active when it has a placeholder', async () => {
75
+ const { findByText } = createTextareaWrapper((defaultParams) => ({
76
+ ...defaultParams,
77
+ placeholder: 'placeholder',
78
+ }));
79
+
80
+ const label = await findByText('textarea_label');
81
+
82
+ expect(label).toHaveClass('floating-label-active');
83
+ });
84
+ });
85
+
86
+ describe('TextarenaWrapper should be interactive', () => {
87
+ it('Fires the onChange, onFocus & onBlur events', () => {
88
+ const onFocusHandler = jest.fn();
89
+ const onChangeHandler = jest.fn();
90
+ const onBlurHandler = jest.fn();
91
+
92
+ const { textarea } = createTextareaWrapper((defaultParams) => ({
93
+ ...defaultParams,
94
+ onChange: onChangeHandler,
95
+ onFocus: onFocusHandler,
96
+ onBlur: onBlurHandler,
97
+ }));
98
+
99
+ userEvent.tab();
100
+ expect(textarea).toHaveFocus();
101
+
102
+ userEvent.keyboard('input');
103
+ userEvent.tab();
104
+
105
+ expect(onChangeHandler).toHaveBeenCalledTimes(5);
106
+ expect(onFocusHandler).toHaveBeenCalled();
107
+ expect(onBlurHandler).toHaveBeenCalled();
108
+ });
109
+
110
+ it('Fires the onMouseEnter & onMouseLeave events', () => {
111
+ const onMouseEnterHandler = jest.fn();
112
+ const onMouseLeaveHandler = jest.fn();
113
+
114
+ const { textarea } = createTextareaWrapper((defaultParams) => ({
115
+ ...defaultParams,
116
+ onMouseEnter: onMouseEnterHandler,
117
+ onMouseLeave: onMouseLeaveHandler,
118
+ }));
119
+
120
+ userEvent.hover(textarea);
121
+ expect(onMouseEnterHandler).toHaveBeenCalled();
122
+ userEvent.unhover(textarea);
123
+ expect(onMouseLeaveHandler).toHaveBeenCalled();
124
+ });
125
+ });
@@ -0,0 +1,105 @@
1
+ import React, { useState } from 'react';
2
+ import classes from './TextareaWrapper.module.scss';
3
+ import { Wrapper, WrapperProps } from '../Wrapper/Wrapper';
4
+ import { Textarea, Props as TextareaProps } from '../../Textarea/Textarea';
5
+ import { useWrapper } from '../../../hooks/useWrapper';
6
+
7
+ export interface Props
8
+ extends Omit<WrapperProps, 'onFocus' | 'onChange' | 'onBlur' | 'onMouseEnter' | 'onMouseLeave'> {
9
+ placeholder?: string;
10
+ textareaProps?: TextareaProps;
11
+ value: string;
12
+ onFocus?: (event: React.FocusEvent<HTMLTextAreaElement>) => void;
13
+ onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
14
+ onBlur?: (event: React.FocusEvent<HTMLTextAreaElement>) => void;
15
+ onMouseEnter?: (event: React.MouseEvent<HTMLTextAreaElement>) => void;
16
+ onMouseLeave?: (event: React.MouseEvent<HTMLTextAreaElement>) => void;
17
+ }
18
+
19
+ export const TextareaWrapper = ({
20
+ name,
21
+ error,
22
+ value,
23
+ label,
24
+ placeholder,
25
+ textareaProps,
26
+ helperProps,
27
+ onChange,
28
+ onFocus,
29
+ onBlur,
30
+ onMouseEnter,
31
+ onMouseLeave,
32
+ disabled,
33
+ ...rest
34
+ }: Props) => {
35
+ const {
36
+ errorId,
37
+ floatingLabelActive,
38
+ setFloatingLabelActive,
39
+ hasFocus,
40
+ setHasFocus,
41
+ helperId,
42
+ labelId,
43
+ } = useWrapper(value, placeholder);
44
+
45
+ const [focus, setFocus] = useState(false);
46
+ const [hover, setHover] = useState(false);
47
+
48
+ return (
49
+ <Wrapper
50
+ {...rest}
51
+ disabled={disabled}
52
+ labelProps={{
53
+ id: labelId,
54
+ className: `${classes['textarea-label']} ${hasFocus ? classes['focus'] : ''}`,
55
+ }}
56
+ name={name}
57
+ label={label}
58
+ helperId={helperId}
59
+ helperProps={{
60
+ ...helperProps,
61
+ className: classes['textarea-helper-text'],
62
+ }}
63
+ error={error}
64
+ floatingLabelActive={floatingLabelActive}
65
+ errorId={errorId}
66
+ >
67
+ <Textarea
68
+ {...textareaProps}
69
+ error={error}
70
+ aria-labelledby={label && labelId}
71
+ aria-describedby={error ? errorId : helperId}
72
+ placeholder={placeholder}
73
+ value={value}
74
+ onChange={onChange}
75
+ onFocus={(e) => {
76
+ onFocus && onFocus(e);
77
+ setHasFocus(true);
78
+ setFloatingLabelActive(true);
79
+ setFocus(true);
80
+ }}
81
+ onBlur={(e) => {
82
+ onBlur && onBlur(e);
83
+ setHasFocus(false);
84
+ setFocus(false);
85
+ e.target.value || textareaProps?.placeholder?.length
86
+ ? setFloatingLabelActive(true)
87
+ : setFloatingLabelActive(false);
88
+ }}
89
+ onMouseEnter={(e) => {
90
+ onMouseEnter && onMouseEnter(e);
91
+ setHover(true);
92
+ }}
93
+ onMouseLeave={(e) => {
94
+ onMouseLeave && onMouseLeave(e);
95
+ setHover(false);
96
+ }}
97
+ className={classes['textarea']}
98
+ wrapperClassName={`${classes['textarea-wrapper']} ${focus ? classes['focus'] : ''} ${
99
+ hover ? classes['hover'] : ''
100
+ } ${disabled ? classes['disabled'] : ''} ${error ? classes['error'] : ''}`}
101
+ errorClassName={classes['error-icon']}
102
+ />
103
+ </Wrapper>
104
+ );
105
+ };
@@ -0,0 +1,35 @@
1
+ .floating-wrapper {
2
+ position: relative;
3
+ }
4
+
5
+ .floating-label {
6
+ font-size: 1rem;
7
+ position: absolute;
8
+ z-index: 1;
9
+ top: 1.3125rem;
10
+ left: 1.25rem;
11
+ transform-origin: left top;
12
+ transition: all 0.2s ease-in-out;
13
+ pointer-events: none;
14
+
15
+ &.floating-label-active {
16
+ font-size: 0.75rem;
17
+ transform: translateY(-0.75rem);
18
+ color: var(--default);
19
+ }
20
+
21
+ &.error {
22
+ color: var(--error);
23
+ }
24
+ }
25
+
26
+ .wrapper + fieldset,
27
+ .wrapper + .wrapper {
28
+ margin-top: 1rem;
29
+ }
30
+
31
+ .required {
32
+ &:after {
33
+ content: ' *';
34
+ }
35
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { Wrapper } from './Wrapper';
3
+ import { render } from '@testing-library/react';
4
+ import { Input } from '../../Input/Input';
5
+
6
+ describe('Wrapper should render', () => {
7
+ it('renders without crashing', () => {
8
+ const { container } = render(
9
+ <Wrapper floatingLabelActive={true} label="label" name="name" helperId="helperID">
10
+ <Input onChange={jest.fn()} name="test" type="text" value="test" />
11
+ </Wrapper>
12
+ );
13
+ const wrapper = container.querySelector('.wrapper');
14
+
15
+ expect(wrapper).toBeDefined();
16
+ });
17
+ });
@@ -0,0 +1,101 @@
1
+ import React, { ReactElement } from 'react';
2
+ import { FormGroup, Props as FormGroupProps } from '../../FormGroup/FormGroup';
3
+ import { Label, Props as LabelProps } from '../../Label/Label';
4
+ import classes from './Wrapper.module.scss';
5
+ import { Props as HelperProps } from '../../FormHelperText/FormHelperText';
6
+ import { HTMLProps } from '../../../interfaces';
7
+
8
+ export interface Props extends Omit<FormGroupProps, 'children'> {
9
+ children: ReactElement | ReactElement[];
10
+ floatingLabelActive?: boolean;
11
+ floatingLabel?: boolean;
12
+ helperIndent?: number;
13
+ label?: string;
14
+ labelProps?: LabelProps;
15
+ name: string;
16
+ /** This does NOT add validation! It simply adds an asterix on the Label! */
17
+ required?: boolean;
18
+ innerClassName?: string;
19
+ }
20
+
21
+ /** For components that extend this component we create an interface (InputWrapper, SelectWrapper, etc.) */
22
+ export interface WrapperProps extends HTMLProps<HTMLDivElement> {
23
+ errorMessage?: string;
24
+ error: boolean;
25
+ helperText?: string;
26
+ helperProps?: HelperProps;
27
+ label?: string;
28
+ name: string;
29
+ required?: boolean;
30
+ }
31
+
32
+ export const Wrapper = ({
33
+ children,
34
+ className,
35
+ error,
36
+ errorMessage,
37
+ errorId,
38
+ errorMessageIcon,
39
+ errorMessageIconPosition,
40
+ helperText,
41
+ helperId,
42
+ floatingLabel = true,
43
+ floatingLabelActive,
44
+ required,
45
+ helperProps,
46
+ helperIndent,
47
+ labelProps,
48
+ label,
49
+ disabled,
50
+ name,
51
+ innerClassName,
52
+ ...rest
53
+ }: Props) => {
54
+ const renderChildren = () =>
55
+ React.Children.map(children, (child) =>
56
+ React.cloneElement(child, {
57
+ disabled,
58
+ })
59
+ );
60
+
61
+ const labelClasses = [];
62
+
63
+ floatingLabel && labelClasses.push(classes['floating-label']);
64
+ floatingLabel && floatingLabelActive && labelClasses.push(classes['floating-label-active']);
65
+ labelProps?.className && labelClasses.push(labelProps.className);
66
+ required && labelClasses.push(classes['required']);
67
+ error && labelClasses.push(classes['error']);
68
+
69
+ return (
70
+ <div {...rest} className={`${classes.wrapper} ${className ? className : ''}`}>
71
+ <FormGroup
72
+ error={error}
73
+ errorMessage={errorMessage}
74
+ errorId={errorId}
75
+ errorMessageIcon={errorMessageIcon}
76
+ errorMessageIconPosition={errorMessageIconPosition}
77
+ helperText={helperText}
78
+ helperId={helperId}
79
+ helperProps={helperProps}
80
+ helperIndent={helperIndent}
81
+ >
82
+ <div
83
+ className={`${floatingLabel ? classes['floating-wrapper'] : ''} ${
84
+ innerClassName ? innerClassName : ''
85
+ }`}
86
+ >
87
+ {label && (
88
+ <Label
89
+ {...labelProps}
90
+ className={`${classes.label} ${labelClasses.join(' ')}`}
91
+ htmlFor={name}
92
+ >
93
+ {label}
94
+ </Label>
95
+ )}
96
+ {renderChildren()}
97
+ </div>
98
+ </FormGroup>
99
+ </div>
100
+ );
101
+ };
@@ -0,0 +1,14 @@
1
+ import { HTMLProps } from '../interfaces';
2
+
3
+ /** Radios */
4
+ export interface FormSelector<T> extends FormElement<T> {
5
+ helperText?: string;
6
+ errorMessage?: string;
7
+ parentHelperId?: string;
8
+ parentErrorId?: string;
9
+ }
10
+
11
+ /** Default form elements */
12
+ export interface FormElement<T> extends HTMLProps<T> {
13
+ error?: boolean;
14
+ }
@@ -0,0 +1,278 @@
1
+ @font-face {
2
+ font-family: 'icomoon';
3
+ src: url('../../font/icomoon.eot?9c63pa');
4
+ src: url('../../font/icomoon.eot?9c63pa#iefix') format('embedded-opentype'),
5
+ url('../../font/icomoon.ttf?9c63pa') format('truetype'),
6
+ url('../../font/icomoon.woff?9c63pa') format('woff'),
7
+ url('../../font/icomoon.svg?9c63pa#icomoon') format('svg');
8
+ font-weight: normal;
9
+ font-style: normal;
10
+ font-display: block;
11
+ }
12
+
13
+ @mixin fontProperties() {
14
+ font-family: 'icomoon', sans-serif !important;
15
+ speak: never;
16
+ font-style: normal;
17
+ font-weight: normal;
18
+ font-variant: normal;
19
+ text-transform: none;
20
+ line-height: 1;
21
+
22
+ /* Better Font Rendering =========== */
23
+ -webkit-font-smoothing: antialiased;
24
+ -moz-osx-font-smoothing: grayscale;
25
+ }
26
+
27
+ .icon {
28
+ line-height: 0;
29
+ }
30
+
31
+ .icon-image:before {
32
+ content: '\e900';
33
+ @include fontProperties();
34
+ }
35
+ .icon-bookmark:before {
36
+ content: '\e901';
37
+ @include fontProperties();
38
+ }
39
+ .icon-bookmark-alt:before {
40
+ content: '\e902';
41
+ @include fontProperties();
42
+ }
43
+ .icon-equal:before {
44
+ content: '\e903';
45
+ @include fontProperties();
46
+ }
47
+ .icon-build:before {
48
+ content: '\e904';
49
+ @include fontProperties();
50
+ }
51
+ .icon-refresh:before {
52
+ content: '\e905';
53
+ @include fontProperties();
54
+ }
55
+ .icon-calendar:before {
56
+ content: '\e906';
57
+ @include fontProperties();
58
+ }
59
+ .icon-checkmark-circle:before {
60
+ content: '\e907';
61
+ @include fontProperties();
62
+ }
63
+ .icon-checkmark-circle-alt:before {
64
+ content: '\e908';
65
+ @include fontProperties();
66
+ }
67
+ .icon-clock:before {
68
+ content: '\e909';
69
+ @include fontProperties();
70
+ }
71
+ .icon-trash:before {
72
+ content: '\e90a';
73
+ @include fontProperties();
74
+ }
75
+ .icon-heart:before {
76
+ content: '\e90b';
77
+ @include fontProperties();
78
+ }
79
+ .icon-search:before {
80
+ content: '\e90c';
81
+ @include fontProperties();
82
+ }
83
+ .icon-gearwheel:before {
84
+ content: '\e90d';
85
+ @include fontProperties();
86
+ }
87
+ .icon-star:before {
88
+ content: '\e90e';
89
+ @include fontProperties();
90
+ }
91
+ .icon-star-alt:before {
92
+ content: '\e90f';
93
+ @include fontProperties();
94
+ }
95
+ .icon-undo:before {
96
+ content: '\e910';
97
+ @include fontProperties();
98
+ }
99
+ .icon-eye:before {
100
+ content: '\e911';
101
+ @include fontProperties();
102
+ }
103
+ .icon-times-circle-alt:before {
104
+ content: '\e912';
105
+ @include fontProperties();
106
+ }
107
+ .icon-info-circle:before {
108
+ content: '\e913';
109
+ @include fontProperties();
110
+ }
111
+ .icon-info-bell:before {
112
+ content: '\e914';
113
+ @include fontProperties();
114
+ }
115
+ .icon-checkmark-circle-breakout:before {
116
+ content: '\e915';
117
+ @include fontProperties();
118
+ }
119
+ .icon-warning:before {
120
+ content: '\e916';
121
+ @include fontProperties();
122
+ }
123
+ .icon-plus:before {
124
+ content: '\e917';
125
+ @include fontProperties();
126
+ }
127
+ .icon-copy:before {
128
+ content: '\e918';
129
+ @include fontProperties();
130
+ }
131
+ .icon-edit:before {
132
+ content: '\e919';
133
+ @include fontProperties();
134
+ }
135
+ .icon-filter:before {
136
+ content: '\e91a';
137
+ @include fontProperties();
138
+ }
139
+ .icon-link:before {
140
+ content: '\e91b';
141
+ @include fontProperties();
142
+ }
143
+ .icon-change:before {
144
+ content: '\e91c';
145
+ @include fontProperties();
146
+ }
147
+ .icon-filter-alt-arrow:before {
148
+ content: '\e91d';
149
+ @include fontProperties();
150
+ }
151
+ .icon-filter-alt:before {
152
+ content: '\e91e';
153
+ @include fontProperties();
154
+ }
155
+ .icon-filter-alt-times:before {
156
+ content: '\e91f';
157
+ @include fontProperties();
158
+ }
159
+ .icon-grid:before {
160
+ content: '\e920';
161
+ @include fontProperties();
162
+ }
163
+ .icon-triangle-down:before {
164
+ content: '\e921';
165
+ @include fontProperties();
166
+ }
167
+ .icon-triangle-down-circle:before {
168
+ content: '\e922';
169
+ @include fontProperties();
170
+ }
171
+ .icon-triangle-up:before {
172
+ content: '\e923';
173
+ @include fontProperties();
174
+ }
175
+ .icon-triangle-right:before {
176
+ content: '\e924';
177
+ @include fontProperties();
178
+ }
179
+ .icon-chevron-left:before {
180
+ content: '\e925';
181
+ @include fontProperties();
182
+ }
183
+ .icon-chevron-right:before {
184
+ content: '\e926';
185
+ @include fontProperties();
186
+ }
187
+ .icon-times:before {
188
+ content: '\e927';
189
+ @include fontProperties();
190
+ }
191
+ .icon-times-circle:before {
192
+ content: '\e928';
193
+ @include fontProperties();
194
+ }
195
+ .icon-times-thin:before {
196
+ content: '\e929';
197
+ @include fontProperties();
198
+ }
199
+ .icon-chevron-up:before {
200
+ content: '\e92a';
201
+ @include fontProperties();
202
+ }
203
+ .icon-chevron-down:before {
204
+ content: '\e92b';
205
+ @include fontProperties();
206
+ }
207
+ .icon-navigation-first:before {
208
+ content: '\e92c';
209
+ @include fontProperties();
210
+ }
211
+ .icon-fullscreen:before {
212
+ content: '\e92d';
213
+ @include fontProperties();
214
+ }
215
+ .icon-fullscreen-exit:before {
216
+ content: '\e92e';
217
+ @include fontProperties();
218
+ }
219
+ .icon-navigation-last:before {
220
+ content: '\e92f';
221
+ @include fontProperties();
222
+ }
223
+ .icon-hamburger:before {
224
+ content: '\e930';
225
+ @include fontProperties();
226
+ }
227
+ .icon-ellipsis:before {
228
+ content: '\e931';
229
+ @include fontProperties();
230
+ }
231
+ .icon-triangle-left:before {
232
+ content: '\e932';
233
+ @include fontProperties();
234
+ }
235
+ .icon-ellipsis-alt:before {
236
+ content: '\e933';
237
+ @include fontProperties();
238
+ }
239
+ .icon-bell:before {
240
+ content: '\e934';
241
+ @include fontProperties();
242
+ }
243
+ .icon-bell-alt:before {
244
+ content: '\e935';
245
+ @include fontProperties();
246
+ }
247
+ .icon-share:before {
248
+ content: '\e936';
249
+ @include fontProperties();
250
+ }
251
+ .icon-forbidden:before {
252
+ content: '\e937';
253
+ @include fontProperties();
254
+ }
255
+ .icon-checkmark:before {
256
+ content: '\e938';
257
+ @include fontProperties();
258
+ }
259
+ .icon-checkmark-square:before {
260
+ content: '\e939';
261
+ @include fontProperties();
262
+ }
263
+ .icon-square:before {
264
+ content: '\e93a';
265
+ @include fontProperties();
266
+ }
267
+ .icon-minus-square:before {
268
+ content: '\e93b';
269
+ @include fontProperties();
270
+ }
271
+ .icon-radio:before {
272
+ content: '\e93c';
273
+ @include fontProperties();
274
+ }
275
+ .icon-circle:before {
276
+ content: '\e93e';
277
+ @include fontProperties();
278
+ }