@react-ui-org/react-ui 0.42.0 → 0.44.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. package/CONTRIBUTING.md +44 -25
  2. package/README.md +1 -1
  3. package/dist/lib.development.js +1598 -652
  4. package/dist/lib.js +1 -9
  5. package/package.json +49 -48
  6. package/src/lib/components/{ui/Alert → Alert}/Alert.jsx +17 -14
  7. package/src/lib/components/{ui/Alert → Alert}/Alert.scss +3 -3
  8. package/src/lib/components/{ui/Alert → Alert}/README.mdx +6 -6
  9. package/src/lib/components/{ui/Alert → Alert}/_settings.scss +1 -1
  10. package/src/lib/components/{ui/Alert → Alert}/_theme.scss +0 -0
  11. package/src/lib/components/{ui/Alert → Alert}/_tools.scss +0 -0
  12. package/src/lib/components/{ui/Alert → Alert}/index.js +0 -0
  13. package/src/lib/components/{ui/Badge → Badge}/Badge.jsx +2 -2
  14. package/src/lib/components/{ui/Badge → Badge}/Badge.scss +3 -3
  15. package/src/lib/components/{ui/Badge → Badge}/README.mdx +3 -3
  16. package/src/lib/components/{ui/Badge → Badge}/index.js +0 -0
  17. package/src/lib/components/Button/Button.jsx +198 -0
  18. package/src/lib/components/{ui/Button → Button}/Button.scss +0 -0
  19. package/src/lib/components/{ui/Button → Button}/README.mdx +160 -75
  20. package/src/lib/components/Button/_base.scss +148 -0
  21. package/src/lib/components/{ui/Button → Button}/_priorities.scss +0 -4
  22. package/src/lib/components/{ui/Button → Button}/_settings.scss +2 -3
  23. package/src/lib/components/{ui/Button → Button}/_theme.scss +3 -11
  24. package/src/lib/components/{ui/Button → Button}/_tools.scss +27 -44
  25. package/src/lib/components/Button/helpers/getRootLabelVisibilityClassName.js +33 -0
  26. package/src/lib/components/{ui/Button → Button}/helpers/getRootPriorityClassName.js +0 -4
  27. package/src/lib/components/{ui/Button → Button}/index.js +0 -0
  28. package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.jsx +9 -11
  29. package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.scss +0 -0
  30. package/src/lib/components/ButtonGroup/ButtonGroupContext.js +3 -0
  31. package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/README.mdx +26 -2
  32. package/src/lib/components/ButtonGroup/index.js +2 -0
  33. package/src/lib/components/{layout/CTA → CTA}/CTA.jsx +5 -2
  34. package/src/lib/components/{layout/CTA → CTA}/CTA.scss +2 -2
  35. package/src/lib/components/{layout/CTA → CTA}/CTACenter.jsx +1 -1
  36. package/src/lib/components/{layout/CTA → CTA}/CTAEnd.jsx +1 -1
  37. package/src/lib/components/{layout/CTA → CTA}/CTAStart.jsx +1 -1
  38. package/src/lib/components/{layout/CTA → CTA}/README.mdx +3 -3
  39. package/src/lib/components/{layout/CTA → CTA}/index.js +0 -0
  40. package/src/lib/components/{ui/Card → Card}/Card.jsx +6 -4
  41. package/src/lib/components/{ui/Card → Card}/Card.scss +1 -1
  42. package/src/lib/components/{ui/Card → Card}/CardBody.jsx +1 -1
  43. package/src/lib/components/{ui/Card → Card}/CardFooter.jsx +1 -1
  44. package/src/lib/components/{ui/Card → Card}/README.mdx +2 -2
  45. package/src/lib/components/{ui/Card → Card}/_theme.scss +0 -0
  46. package/src/lib/components/{ui/Card → Card}/_tools.scss +0 -0
  47. package/src/lib/components/{ui/Card → Card}/index.js +0 -0
  48. package/src/lib/components/{layout/Center → Center}/Center.jsx +1 -1
  49. package/src/lib/components/{layout/Center → Center}/Center.scss +0 -0
  50. package/src/lib/components/{layout/Center → Center}/README.mdx +2 -2
  51. package/src/lib/components/{layout/Center → Center}/index.js +0 -0
  52. package/src/lib/components/CheckboxField/CheckboxField.jsx +164 -0
  53. package/src/lib/components/{ui/CheckboxField → CheckboxField}/CheckboxField.scss +5 -5
  54. package/src/lib/components/{ui/CheckboxField → CheckboxField}/README.mdx +15 -12
  55. package/src/lib/components/{ui/CheckboxField → CheckboxField}/index.js +0 -0
  56. package/src/lib/components/FileInputField/FileInputField.jsx +162 -0
  57. package/src/lib/components/{ui/FileInputField → FileInputField}/FileInputField.scss +5 -5
  58. package/src/lib/components/{ui/FileInputField → FileInputField}/README.mdx +8 -6
  59. package/src/lib/components/{ui/FileInputField → FileInputField}/index.js +0 -0
  60. package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.jsx +16 -18
  61. package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.scss +3 -3
  62. package/src/lib/components/FormLayout/FormLayoutContext.js +3 -0
  63. package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.jsx +33 -30
  64. package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.scss +4 -4
  65. package/src/lib/components/{layout/FormLayout → FormLayout}/README.mdx +30 -40
  66. package/src/lib/components/{layout/FormLayout → FormLayout}/_theme.scss +0 -0
  67. package/src/lib/components/{layout/FormLayout → FormLayout}/index.js +1 -0
  68. package/src/lib/components/{layout/Grid → Grid}/Grid.jsx +23 -5
  69. package/src/lib/components/{layout/Grid → Grid}/Grid.scss +2 -4
  70. package/src/lib/components/{layout/Grid → Grid}/GridSpan.jsx +10 -3
  71. package/src/lib/components/{layout/Grid → Grid}/README.mdx +42 -38
  72. package/src/lib/components/{layout/Grid → Grid}/_theme.scss +1 -2
  73. package/src/lib/components/{layout/Grid → Grid}/_tools.scss +2 -2
  74. package/src/lib/components/{layout/Grid → Grid}/helpers/generateResponsiveCustomProperties.js +0 -0
  75. package/src/lib/components/{layout/Grid → Grid}/index.js +0 -0
  76. package/src/lib/components/Link/Link.jsx +45 -0
  77. package/src/lib/components/Link/Link.scss +11 -0
  78. package/src/lib/components/Link/README.mdx +85 -0
  79. package/src/lib/components/Link/_theme.scss +4 -0
  80. package/src/lib/components/Link/index.js +1 -0
  81. package/src/lib/components/{layout/List → List}/List.jsx +1 -1
  82. package/src/lib/components/{layout/List → List}/List.scss +2 -2
  83. package/src/lib/components/{layout/List → List}/ListItem.jsx +1 -1
  84. package/src/lib/components/{layout/List → List}/README.mdx +2 -2
  85. package/src/lib/components/{layout/List → List}/_theme.scss +0 -0
  86. package/src/lib/components/{layout/List → List}/index.js +0 -0
  87. package/src/lib/components/{layout/Media → Media}/Media.jsx +4 -2
  88. package/src/lib/components/{layout/Media → Media}/Media.scss +1 -1
  89. package/src/lib/components/{layout/Media → Media}/MediaBody.jsx +1 -1
  90. package/src/lib/components/{layout/Media → Media}/MediaObject.jsx +1 -1
  91. package/src/lib/components/{layout/Media → Media}/README.mdx +2 -2
  92. package/src/lib/components/{layout/Media → Media}/index.js +0 -0
  93. package/src/lib/components/{ui/Modal → Modal}/Modal.jsx +28 -27
  94. package/src/lib/components/{ui/Modal → Modal}/Modal.scss +5 -5
  95. package/src/lib/components/{ui/Modal → Modal}/README.mdx +40 -40
  96. package/src/lib/components/{ui/Modal → Modal}/_settings.scss +4 -4
  97. package/src/lib/components/{ui/Modal → Modal}/_theme.scss +0 -0
  98. package/src/lib/components/{ui/Modal → Modal}/index.js +0 -0
  99. package/src/lib/components/{ui/Paper → Paper}/Paper.jsx +8 -1
  100. package/src/lib/components/{ui/Paper → Paper}/Paper.scss +5 -0
  101. package/src/lib/components/{ui/Paper → Paper}/README.mdx +14 -2
  102. package/src/lib/components/{ui/Paper → Paper}/_theme.scss +2 -0
  103. package/src/lib/components/{ui/Paper → Paper}/index.js +0 -0
  104. package/src/lib/components/{ui/Radio → Radio}/README.mdx +17 -14
  105. package/src/lib/components/Radio/Radio.jsx +188 -0
  106. package/src/lib/components/{ui/Radio → Radio}/Radio.scss +9 -9
  107. package/src/lib/components/{ui/Radio → Radio}/index.js +0 -0
  108. package/src/lib/components/{ui/ScrollView → ScrollView}/README.mdx +10 -10
  109. package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.jsx +9 -10
  110. package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.scss +6 -6
  111. package/src/lib/components/{ui/ScrollView → ScrollView}/_theme.scss +0 -0
  112. package/src/lib/components/{ui/ScrollView → ScrollView}/index.js +0 -0
  113. package/src/lib/components/{ui/SelectField → SelectField}/README.mdx +44 -41
  114. package/src/lib/components/SelectField/SelectField.jsx +219 -0
  115. package/src/lib/components/{ui/SelectField → SelectField}/SelectField.scss +6 -6
  116. package/src/lib/components/{ui/SelectField → SelectField}/index.js +0 -0
  117. package/src/lib/components/{ui/Table → Table}/README.mdx +7 -7
  118. package/src/lib/components/{ui/Table → Table}/Table.jsx +9 -13
  119. package/src/lib/components/{ui/Table → Table}/Table.scss +1 -1
  120. package/src/lib/components/{ui/Table → Table}/_settings.scss +4 -4
  121. package/src/lib/components/{ui/Table → Table}/index.js +0 -0
  122. package/src/lib/components/{ui/Tabs → Tabs}/README.mdx +3 -3
  123. package/src/lib/components/{ui/Tabs → Tabs}/Tabs.jsx +4 -4
  124. package/src/lib/components/{ui/Tabs → Tabs}/Tabs.scss +1 -1
  125. package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.jsx +4 -3
  126. package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.scss +3 -3
  127. package/src/lib/components/{ui/Tabs → Tabs}/_theme.scss +0 -0
  128. package/src/lib/components/{ui/Tabs → Tabs}/index.js +0 -0
  129. package/src/lib/components/{ui/Text → Text}/README.mdx +19 -19
  130. package/src/lib/components/{ui/Text → Text}/Text.jsx +1 -1
  131. package/src/lib/components/{ui/Text → Text}/Text.scss +0 -0
  132. package/src/lib/components/{ui/Text → Text}/helpers/getRootHyphensClassName.js +0 -0
  133. package/src/lib/components/{ui/Text → Text}/helpers/getRootWordWrappingClassName.js +0 -0
  134. package/src/lib/components/{ui/Text → Text}/index.js +0 -0
  135. package/src/lib/components/{ui/TextArea → TextArea}/README.mdx +8 -6
  136. package/src/lib/components/{ui/TextArea → TextArea}/TextArea.jsx +78 -78
  137. package/src/lib/components/{ui/TextArea → TextArea}/TextArea.scss +6 -6
  138. package/src/lib/components/{ui/TextArea → TextArea}/index.js +0 -0
  139. package/src/lib/components/{ui/TextField → TextField}/README.mdx +7 -6
  140. package/src/lib/components/{ui/TextField → TextField}/TextField.jsx +20 -23
  141. package/src/lib/components/{ui/TextField → TextField}/TextField.scss +6 -6
  142. package/src/lib/components/{ui/TextField → TextField}/index.js +0 -0
  143. package/src/lib/components/{ui/Toggle → Toggle}/README.mdx +15 -12
  144. package/src/lib/components/Toggle/Toggle.jsx +163 -0
  145. package/src/lib/components/{ui/Toggle → Toggle}/Toggle.scss +5 -5
  146. package/src/lib/components/{ui/Toggle → Toggle}/index.js +0 -0
  147. package/src/lib/components/{layout/Toolbar → Toolbar}/README.mdx +26 -26
  148. package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.jsx +1 -1
  149. package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.scss +1 -1
  150. package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarGroup.jsx +1 -1
  151. package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarItem.jsx +1 -1
  152. package/src/lib/components/{layout/Toolbar → Toolbar}/_theme.scss +0 -0
  153. package/src/lib/components/{layout/Toolbar → Toolbar}/index.js +0 -0
  154. package/src/lib/components/{ui/withForwardedRef.jsx → withForwardedRef.jsx} +0 -0
  155. package/src/lib/helpers/resolveContextOrProp.js +7 -0
  156. package/src/lib/index.js +34 -35
  157. package/src/lib/styles/tools/_accessibility.scss +9 -0
  158. package/src/lib/theme.scss +25 -7
  159. package/src/lib/components/ui/Button/Button.jsx +0 -191
  160. package/src/lib/components/ui/Button/_base.scss +0 -154
  161. package/src/lib/components/ui/Button/helpers/getRootLabelVisibilityClassName.js +0 -11
  162. package/src/lib/components/ui/ButtonGroup/index.js +0 -1
  163. package/src/lib/components/ui/CheckboxField/CheckboxField.jsx +0 -173
  164. package/src/lib/components/ui/FileInputField/FileInputField.jsx +0 -158
  165. package/src/lib/components/ui/Radio/Radio.jsx +0 -179
  166. package/src/lib/components/ui/SelectField/SelectField.jsx +0 -214
  167. package/src/lib/components/ui/Toggle/Toggle.jsx +0 -174
@@ -11,9 +11,5 @@ export default (priority, styles) => {
11
11
  return styles.rootPriorityFlat;
12
12
  }
13
13
 
14
- if (priority === 'link') {
15
- return styles.rootPriorityLink;
16
- }
17
-
18
14
  return null;
19
15
  };
@@ -1,7 +1,8 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './ButtonGroup.scss';
5
+ import { ButtonGroupContext } from './ButtonGroupContext';
5
6
 
6
7
  export const ButtonGroup = ({
7
8
  block,
@@ -19,19 +20,16 @@ export const ButtonGroup = ({
19
20
  role="group"
20
21
  {...restProps}
21
22
  >
22
- {React.Children.map(children, (child) => {
23
- if (!React.isValidElement(child)) {
24
- return null;
25
- }
26
-
27
- return React.cloneElement(child, {
23
+ <ButtonGroupContext.Provider
24
+ value={{
28
25
  block,
29
26
  disabled,
30
- grouped: true,
31
27
  priority,
32
28
  size,
33
- });
34
- })}
29
+ }}
30
+ >
31
+ {children}
32
+ </ButtonGroupContext.Provider>
35
33
  </div>
36
34
  );
37
35
 
@@ -50,7 +48,7 @@ ButtonGroup.propTypes = {
50
48
  /**
51
49
  * Buttons to be grouped.
52
50
  */
53
- children: PropTypes.arrayOf(PropTypes.element).isRequired,
51
+ children: PropTypes.node.isRequired,
54
52
  /**
55
53
  * If `true`, all buttons inside the group will be disabled.
56
54
  */
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+
3
+ export const ButtonGroupContext = React.createContext(null);
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ButtonGroup
3
- menu: 'UI'
4
- route: /components/ui/button-group
3
+ menu: 'Layouts'
4
+ route: /components/button-group
5
5
  ---
6
6
 
7
7
  # ButtonGroup
@@ -12,6 +12,7 @@ import {
12
12
  Playground,
13
13
  Props,
14
14
  } from 'docz'
15
+ import Icon from '../../../docs/_components/Icon'
15
16
  import Button from '../Button'
16
17
  import { ButtonGroup } from './ButtonGroup'
17
18
 
@@ -166,6 +167,29 @@ Disables all buttons inside the group.
166
167
  </ButtonGroup>
167
168
  </Playground>
168
169
 
170
+ ### Feedback State
171
+
172
+ When user's action triggers an asynchronous process on background, feedback
173
+ state of individual buttons can be indicated by showing an icon.
174
+
175
+ <Playground>
176
+ <ButtonGroup>
177
+ <Button label="Week" color="success" feedbackIcon={<Icon icon="success" />} />
178
+ <Button label="Month" />
179
+ <Button label="Year" />
180
+ </ButtonGroup>
181
+ <ButtonGroup priority="outline">
182
+ <Button label="Week" color="success" feedbackIcon={<Icon icon="success" />} />
183
+ <Button label="Month" />
184
+ <Button label="Year" />
185
+ </ButtonGroup>
186
+ <ButtonGroup priority="flat">
187
+ <Button label="Week" color="success" feedbackIcon={<Icon icon="success" />} />
188
+ <Button label="Month" />
189
+ <Button label="Year" />
190
+ </ButtonGroup>
191
+ </Playground>
192
+
169
193
  ### Active State
170
194
 
171
195
  To highlight the selected option, the active state can be achieved by setting
@@ -0,0 +1,2 @@
1
+ export { default as ButtonGroup } from './ButtonGroup';
2
+ export { ButtonGroupContext } from './ButtonGroupContext';
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './CTA.scss';
5
5
 
6
6
  export const CTA = (props) => {
@@ -47,7 +47,10 @@ CTA.propTypes = {
47
47
  */
48
48
  align: PropTypes.oneOf(['top', 'middle', 'bottom', 'baseline']),
49
49
  /**
50
- * Slot for individual CTA elements: CTAStart, CTACenter, and CTAEnd.
50
+ * Nested elements. Supported types are:
51
+ * * `CTAStart`
52
+ * * `CTACenter`
53
+ * * `CTAEnd`
51
54
  */
52
55
  children: PropTypes.node.isRequired,
53
56
  };
@@ -1,5 +1,5 @@
1
- @use '../../../styles/tools/breakpoint';
2
- @use '../../../styles/tools/spacing';
1
+ @use '../../styles/tools/breakpoint';
2
+ @use '../../styles/tools/spacing';
3
3
 
4
4
  $_breakpoint: lg;
5
5
  $_spacing: spacing.of(1);
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './CTA.scss';
5
5
 
6
6
  export const CTACenter = (props) => {
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './CTA.scss';
5
5
 
6
6
  export const CTAEnd = (props) => {
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './CTA.scss';
5
5
 
6
6
  export const CTAStart = (props) => {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: CTA
3
3
  menu: 'Layouts'
4
- route: /components/layout/cta
4
+ route: /components/cta
5
5
  ---
6
6
 
7
7
  # CTA
@@ -13,7 +13,7 @@ import {
13
13
  Playground,
14
14
  Props,
15
15
  } from 'docz'
16
- import { Placeholder } from '../../../../docs/_components/Placeholder/Placeholder'
16
+ import { Placeholder } from '../../../docs/_components/Placeholder/Placeholder'
17
17
  import { CTA } from './CTA'
18
18
  import { CTACenter } from './CTACenter'
19
19
  import { CTAEnd } from './CTAEnd'
@@ -63,7 +63,7 @@ See [API](#api) for all available options.
63
63
  screen even at the smallest size. For complex layouts and a lot of actions,
64
64
  consider using the [Toolbar](/components/layout/toolbar) layout.
65
65
 
66
- 👉 On screen sizes smaller than 66 em (the `lg`
66
+ 📐 On screen sizes smaller than 66 em (the `lg`
67
67
  [breakpoint](/foundation/breakpoints)), the start element expands over the full
68
68
  width of its parent. Please resize your browser rather than the playground to
69
69
  see this work.
File without changes
@@ -1,7 +1,7 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import getRootColorClassName from '../../../helpers/getRootColorClassName';
4
- import { withProviderContext } from '../../../provider';
3
+ import getRootColorClassName from '../../helpers/getRootColorClassName';
4
+ import { withProviderContext } from '../../provider';
5
5
  import styles from './Card.scss';
6
6
 
7
7
  export const Card = ({
@@ -36,8 +36,10 @@ Card.defaultProps = {
36
36
 
37
37
  Card.propTypes = {
38
38
  /**
39
- * Slot for individual card elements that build up the inner layout: CardBody, CardFooter, or
40
- * ScrollView.
39
+ * Slot for individual card elements that build up the inner layout:
40
+ * * `CardBody`
41
+ * * `CardFooter`
42
+ * * `ScrollView`
41
43
  */
42
44
  children: PropTypes.node.isRequired,
43
45
  /**
@@ -1,6 +1,6 @@
1
1
  // 1. Retain equal card widths in flex and grid layouts independently on their content.
2
2
 
3
- @use '../../../styles/theme/colors';
3
+ @use '../../styles/theme/colors';
4
4
  @use 'theme';
5
5
  @use 'tools';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './Card.scss';
5
5
 
6
6
  export const CardBody = (props) => {
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './Card.scss';
5
5
 
6
6
  export const CardFooter = (props) => {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Card
3
- menu: 'UI'
4
- route: /components/ui/card
3
+ menu: 'Miscellaneous'
4
+ route: /components/card
5
5
  ---
6
6
 
7
7
  # Card
File without changes
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
- import { withProviderContext } from '../../../provider';
3
+ import { withProviderContext } from '../../provider';
4
4
  import styles from './Center.scss';
5
5
 
6
6
  export const Center = ({ children }) => (
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Center
3
3
  menu: 'Layouts'
4
- route: /components/layout/center
4
+ route: /components/center
5
5
  ---
6
6
 
7
7
  # Center
@@ -12,7 +12,7 @@ import {
12
12
  Playground,
13
13
  Props,
14
14
  } from 'docz'
15
- import { Placeholder } from '../../../../docs/_components/Placeholder/Placeholder'
15
+ import { Placeholder } from '../../../docs/_components/Placeholder/Placeholder'
16
16
  import { Center } from './Center'
17
17
 
18
18
  ## Basic Usage
@@ -0,0 +1,164 @@
1
+ import PropTypes from 'prop-types';
2
+ import React, { useContext } from 'react';
3
+ import getRootValidationStateClassName from '../../helpers/getRootValidationStateClassName';
4
+ import { withProviderContext } from '../../provider';
5
+ import transferProps from '../../utils/transferProps';
6
+ import { FormLayoutContext } from '../FormLayout';
7
+ import withForwardedRef from '../withForwardedRef';
8
+ import styles from './CheckboxField.scss';
9
+
10
+ export const CheckboxField = ({
11
+ checked,
12
+ disabled,
13
+ forwardedRef,
14
+ helpText,
15
+ id,
16
+ isLabelVisible,
17
+ label,
18
+ labelPosition,
19
+ required,
20
+ validationState,
21
+ validationText,
22
+ value,
23
+ ...restProps
24
+ }) => {
25
+ const context = useContext(FormLayoutContext);
26
+
27
+ return (
28
+ <label
29
+ className={[
30
+ styles.root,
31
+ context ? styles.isRootInFormLayout : '',
32
+ context && context.layout === 'horizontal' ? styles.rootLayoutHorizontal : styles.rootLayoutVertical,
33
+ labelPosition === 'before' ? styles.hasRootLabelBefore : '',
34
+ disabled ? styles.isRootDisabled : '',
35
+ required ? styles.isRootRequired : '',
36
+ getRootValidationStateClassName(validationState, styles),
37
+ ].join(' ')}
38
+ htmlFor={id}
39
+ id={id && `${id}__label`}
40
+ >
41
+ <div className={styles.field}>
42
+ <input
43
+ {...transferProps(restProps)}
44
+ checked={checked}
45
+ className={styles.input}
46
+ disabled={disabled}
47
+ id={id}
48
+ ref={forwardedRef}
49
+ required={required}
50
+ type="checkbox"
51
+ value={value}
52
+ />
53
+ <div
54
+ className={[
55
+ styles.label,
56
+ isLabelVisible ? '' : styles.isLabelHidden,
57
+ ].join(' ')}
58
+ id={id && `${id}__labelText`}
59
+ >
60
+ {label}
61
+ </div>
62
+ </div>
63
+ {helpText && (
64
+ <div
65
+ className={styles.helpText}
66
+ id={id && `${id}__helpText`}
67
+ >
68
+ {helpText}
69
+ </div>
70
+ )}
71
+ {validationText && (
72
+ <div
73
+ className={styles.validationText}
74
+ id={id && `${id}__validationText`}
75
+ >
76
+ {validationText}
77
+ </div>
78
+ )}
79
+ </label>
80
+ );
81
+ };
82
+
83
+ CheckboxField.defaultProps = {
84
+ checked: undefined,
85
+ disabled: false,
86
+ forwardedRef: undefined,
87
+ helpText: null,
88
+ id: undefined,
89
+ isLabelVisible: true,
90
+ labelPosition: 'after',
91
+ required: false,
92
+ validationState: null,
93
+ validationText: null,
94
+ value: undefined,
95
+ };
96
+
97
+ CheckboxField.propTypes = {
98
+ /**
99
+ * If `true`, the input will be checked.
100
+ */
101
+ checked: PropTypes.bool,
102
+ /**
103
+ * If `true`, the input will be disabled.
104
+ */
105
+ disabled: PropTypes.bool,
106
+ /**
107
+ * Reference forwarded to the `input` element.
108
+ */
109
+ forwardedRef: PropTypes.oneOfType([
110
+ PropTypes.func,
111
+ // eslint-disable-next-line react/forbid-prop-types
112
+ PropTypes.shape({ current: PropTypes.any }),
113
+ ]),
114
+ /**
115
+ * Optional help text.
116
+ */
117
+ helpText: PropTypes.node,
118
+ /**
119
+ * ID of the `<input>` HTML element.
120
+ *
121
+ * Also serves as base for ids of nested elements:
122
+ * * `<ID>__label`
123
+ * * `<ID>__labelText`
124
+ * * `<ID>__helpText`
125
+ * * `<ID>__validationText`
126
+ */
127
+ id: PropTypes.string,
128
+ /**
129
+ * If `false`, the label will be visually hidden (but remains accessible by assistive
130
+ * technologies).
131
+ */
132
+ isLabelVisible: PropTypes.bool,
133
+ /**
134
+ * Checkbox field label.
135
+ */
136
+ label: PropTypes.string.isRequired,
137
+ /**
138
+ * Placement of the label relative to the input.
139
+ */
140
+ labelPosition: PropTypes.oneOf(['before', 'after']),
141
+ /**
142
+ * If `true`, the input will be required.
143
+ */
144
+ required: PropTypes.bool,
145
+ /**
146
+ * Alter the field to provide feedback based on validation result.
147
+ */
148
+ validationState: PropTypes.oneOf(['invalid', 'valid', 'warning']),
149
+ /**
150
+ * Validation message to be displayed.
151
+ */
152
+ validationText: PropTypes.node,
153
+ /**
154
+ * Value of the input.
155
+ */
156
+ value: PropTypes.oneOfType([
157
+ PropTypes.string,
158
+ PropTypes.number,
159
+ ]),
160
+ };
161
+
162
+ export const CheckboxFieldWithContext = withForwardedRef(withProviderContext(CheckboxField, 'CheckboxField'));
163
+
164
+ export default CheckboxFieldWithContext;
@@ -1,8 +1,8 @@
1
- @use '../../../styles/tools/form-fields/foundation';
2
- @use '../../../styles/tools/form-fields/inline-field-elements';
3
- @use '../../../styles/tools/form-fields/inline-field-layout';
4
- @use '../../../styles/tools/form-fields/variants';
5
- @use '../../../styles/tools/accessibility';
1
+ @use '../../styles/tools/form-fields/foundation';
2
+ @use '../../styles/tools/form-fields/inline-field-elements';
3
+ @use '../../styles/tools/form-fields/inline-field-layout';
4
+ @use '../../styles/tools/form-fields/variants';
5
+ @use '../../styles/tools/accessibility';
6
6
 
7
7
  // Foundation
8
8
  .root {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: CheckboxField
3
- menu: 'UI'
4
- route: /components/ui/checkbox-field
3
+ menu: 'Inputs'
4
+ route: /components/checkbox-field
5
5
  ---
6
6
 
7
7
  # CheckboxField
@@ -29,9 +29,9 @@ And use it:
29
29
  const [agree, setAgree] = React.useState(true);
30
30
  return (
31
31
  <CheckboxField
32
- changeHandler={() => setAgree(!agree)}
33
32
  checked={agree}
34
33
  label="I agree"
34
+ onChange={() => setAgree(!agree)}
35
35
  />
36
36
  );
37
37
  }}
@@ -81,10 +81,10 @@ turning the checkbox on or off.
81
81
  const [getNewsletter, setGetNewsletter] = React.useState(true);
82
82
  return (
83
83
  <CheckboxField
84
- changeHandler={() => setGetNewsletter(!getNewsletter)}
85
84
  checked={getNewsletter}
86
85
  helpText="We will not bother you more than once a month, we promise!"
87
86
  label="Send me newsletter"
87
+ onChange={() => setGetNewsletter(!getNewsletter)}
88
88
  />
89
89
  );
90
90
  }}
@@ -100,10 +100,10 @@ label remains accessible to assistive technologies.
100
100
  const [checked, setChecked] = React.useState(true);
101
101
  return (
102
102
  <CheckboxField
103
- changeHandler={() => setChecked(!checked)}
104
103
  checked={checked}
105
104
  isLabelVisible={false}
106
105
  label="You cannot see this"
106
+ onChange={() => setChecked(!checked)}
107
107
  />
108
108
  );
109
109
  }}
@@ -116,10 +116,10 @@ It's also possible to display label before input:
116
116
  const [checked, setChecked] = React.useState(true);
117
117
  return (
118
118
  <CheckboxField
119
- changeHandler={() => setChecked(!checked)}
120
119
  checked={checked}
121
120
  label="Label precedes input"
122
121
  labelPosition="before"
122
+ onChange={() => setChecked(!checked)}
123
123
  />
124
124
  );
125
125
  }}
@@ -140,22 +140,22 @@ have.
140
140
  return (
141
141
  <>
142
142
  <CheckboxField
143
- changeHandler={() => setAgree(!agree)}
144
143
  checked={agree}
145
144
  label="I have read and agree with terms and conditions"
145
+ onChange={() => setAgree(!agree)}
146
146
  validationState="valid"
147
147
  />
148
148
  <CheckboxField
149
- changeHandler={() => setAgree(!agree)}
150
149
  checked={agree}
151
150
  label="I have read and agree with terms and conditions"
151
+ onChange={() => setAgree(!agree)}
152
152
  validationState="warning"
153
153
  validationText="Please wait 10 minutes until we verify your data."
154
154
  />
155
155
  <CheckboxField
156
- changeHandler={() => setAgree(!agree)}
157
156
  checked={agree}
158
157
  label="I have read and agree with terms and conditions"
158
+ onChange={() => setAgree(!agree)}
159
159
  required
160
160
  validationState="invalid"
161
161
  validationText="You must agree to be able to proceed."
@@ -183,9 +183,10 @@ Disabled state makes the input unavailable.
183
183
 
184
184
  ## API
185
185
 
186
- In addition to the options below, you can add any custom attributes that do not
187
- interfere with the API, and they will be passed to the `input` HTML element.
188
- This is useful mainly to improve component's accessibility.
186
+ In addition to the options below, you can specify [React synthetic events] or
187
+ any custom HTML attributes that do not interfere with the API, and they will be
188
+ passed to the `input` HTML element. This enables making the component
189
+ interactive and helps improve its accessibility.
189
190
 
190
191
  <Props table of={CheckboxField} />
191
192
 
@@ -198,3 +199,5 @@ options. On top of that, the following options are available for CheckboxField.
198
199
  |----------------------------------------------------------------------|----------------------------------------------|
199
200
  | `--rui-FormField--check__input--checkbox__border-radius` | Input corner radius |
200
201
  | `--rui-FormField--check__input--checkbox--checked__background-image` | Background image of checked input |
202
+
203
+ [React synthetic events]: https://reactjs.org/docs/events.html