@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
@@ -1,8 +1,8 @@
1
1
  @use 'sass:map';
2
- @use '../../../styles/theme/borders';
3
- @use '../../../styles/theme/colors';
4
- @use '../../../styles/theme/typography';
5
- @use '../../../styles/tools/spacing';
2
+ @use '../../styles/theme/borders';
3
+ @use '../../styles/theme/colors';
4
+ @use '../../styles/theme/typography';
5
+ @use '../../styles/tools/spacing';
6
6
 
7
7
  $cell-padding-x: spacing.of(3);
8
8
  $cell-padding-y: spacing.of(1);
File without changes
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Tabs
3
- menu: 'UI'
4
- route: /components/ui/tabs
3
+ menu: 'Miscellaneous'
4
+ route: /components/tabs
5
5
  ---
6
6
 
7
7
  # Tabs
@@ -10,7 +10,7 @@ import {
10
10
  Playground,
11
11
  Props,
12
12
  } from 'docz'
13
- import { Icon } from '../../../../docs/_components/Icon/Icon'
13
+ import { Icon } from '../../../docs/_components/Icon/Icon'
14
14
  import ScrollView from '../ScrollView'
15
15
  import { Tabs } from './Tabs'
16
16
  import { TabsItem } from './TabsItem'
@@ -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 './Tabs.scss';
5
5
 
6
6
  export const Tabs = ({
@@ -24,12 +24,12 @@ Tabs.defaultProps = {
24
24
 
25
25
  Tabs.propTypes = {
26
26
  /**
27
- * Individual `TabsItem`s.
27
+ * Nested `TabsItem` elements.
28
28
  */
29
29
  children: PropTypes.node,
30
30
  /**
31
- * ID of the root HTML element. It also serves as a prefix for inner list element:
32
- * `<ID>__list`.
31
+ * ID of the root HTML element. It also serves as base for nested element:
32
+ * * `<ID>__list`
33
33
  */
34
34
  id: PropTypes.string,
35
35
  };
@@ -1,6 +1,6 @@
1
1
  // 1. Decorative bottom border.
2
2
 
3
- @use '../../../styles/tools/reset';
3
+ @use '../../styles/tools/reset';
4
4
  @use 'theme';
5
5
 
6
6
  .list {
@@ -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 './TabsItem.scss';
5
5
 
6
6
  export const TabsItem = ({
@@ -63,8 +63,9 @@ TabsItem.propTypes = {
63
63
  */
64
64
  href: PropTypes.string.isRequired,
65
65
  /**
66
- * ID of the root HTML element. It also serves as a prefix for important inner elements:
67
- * `<ID>__link`, `<ID>__label`.
66
+ * ID of the root HTML element. It also serves as base for nested elements:
67
+ * * `<ID>__link`
68
+ * * `<ID>__label`
68
69
  */
69
70
  id: PropTypes.string,
70
71
  /**
@@ -1,8 +1,8 @@
1
1
  // 1. Keep inactive items under Tabs' decorative bottom border and pop active ones above it.
2
2
 
3
- @use '../../../styles/tools/breakpoint';
4
- @use '../../../styles/tools/reset';
5
- @use '../../../styles/tools/transition';
3
+ @use '../../styles/tools/breakpoint';
4
+ @use '../../styles/tools/reset';
5
+ @use '../../styles/tools/transition';
6
6
  @use 'theme';
7
7
 
8
8
  .root {
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: Text
3
- menu: 'UI'
4
- route: /components/ui/text
3
+ menu: 'Miscellaneous'
4
+ route: /components/text
5
5
  ---
6
6
 
7
7
  # Text
@@ -10,10 +10,10 @@ import {
10
10
  Playground,
11
11
  Props,
12
12
  } from 'docz'
13
- import { Placeholder } from '../../../../docs/_components/Placeholder/Placeholder'
14
- import { Toolbar } from '../../layout/Toolbar/Toolbar'
15
- import { ToolbarGroup } from '../../layout/Toolbar/ToolbarGroup'
16
- import { ToolbarItem } from '../../layout/Toolbar/ToolbarItem'
13
+ import { Placeholder } from '../../../docs/_components/Placeholder/Placeholder'
14
+ import { Toolbar } from '../Toolbar/Toolbar'
15
+ import { ToolbarGroup } from '../Toolbar/ToolbarGroup'
16
+ import { ToolbarItem } from '../Toolbar/ToolbarItem'
17
17
  import { Button } from '../Button/Button'
18
18
  import { ButtonGroup } from '../ButtonGroup/ButtonGroup'
19
19
  import { TextField } from '../TextField/TextField'
@@ -78,10 +78,10 @@ appended by an ellipsis (`…`).
78
78
  <Toolbar align="baseline">
79
79
  <ToolbarItem>
80
80
  <TextField
81
- changeHandler={(e) => setLines(e.target.value)}
82
81
  label="Number of lines"
83
82
  min={1}
84
83
  max={100}
84
+ onChange={(e) => setLines(e.target.value)}
85
85
  type="number"
86
86
  value={lines}
87
87
  />
@@ -156,19 +156,19 @@ will override automatic break point selection in `auto` mode when present.
156
156
  <ToolbarItem>
157
157
  <ButtonGroup aria-labelledby="#word-wrapping-options-label">
158
158
  <Button
159
- label="normal"
160
- clickHandler={() => setWordWrapping('normal')}
161
159
  color={wordWrapping === 'normal' ? 'dark' : 'primary'}
160
+ label="normal"
161
+ onClick={() => setWordWrapping('normal')}
162
162
  />
163
163
  <Button
164
- label="long-words"
165
- clickHandler={() => setWordWrapping('long-words')}
166
164
  color={wordWrapping === 'long-words' ? 'dark' : 'primary'}
165
+ label="long-words"
166
+ onClick={() => setWordWrapping('long-words')}
167
167
  />
168
168
  <Button
169
- label="anywhere"
170
- clickHandler={() => setWordWrapping('anywhere')}
171
169
  color={wordWrapping === 'anywhere' ? 'dark' : 'primary'}
170
+ label="anywhere"
171
+ onClick={() => setWordWrapping('anywhere')}
172
172
  />
173
173
  </ButtonGroup>
174
174
  </ToolbarItem>
@@ -180,19 +180,19 @@ will override automatic break point selection in `auto` mode when present.
180
180
  <ToolbarItem>
181
181
  <ButtonGroup aria-labelledby="#hyphens-options-label">
182
182
  <Button
183
- label="none"
184
- clickHandler={() => setHyphens('none')}
185
183
  color={hyphens === 'none' ? 'dark' : 'primary'}
184
+ label="none"
185
+ onClick={() => setHyphens('none')}
186
186
  />
187
187
  <Button
188
- label="auto"
189
- clickHandler={() => setHyphens('auto')}
190
188
  color={hyphens === 'auto' ? 'dark' : 'primary'}
189
+ label="auto"
190
+ onClick={() => setHyphens('auto')}
191
191
  />
192
192
  <Button
193
- label="manual"
194
- clickHandler={() => setHyphens('manual')}
195
193
  color={hyphens === 'manual' ? 'dark' : 'primary'}
194
+ label="manual"
195
+ onClick={() => setHyphens('manual')}
196
196
  />
197
197
  </ButtonGroup>
198
198
  </ToolbarItem>
@@ -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 getRootHyphensClassName from './helpers/getRootHyphensClassName';
5
5
  import getRootWordWrappingClassName from './helpers/getRootWordWrappingClassName';
6
6
  import styles from './Text.scss';
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: TextArea
3
- menu: 'UI'
4
- route: /components/ui/text-area
3
+ menu: 'Inputs'
4
+ route: /components/text-area
5
5
  ---
6
6
 
7
7
  # TextArea
@@ -348,10 +348,10 @@ It's possible to disable the whole input.
348
348
 
349
349
  ## API
350
350
 
351
- In addition to the options below, you can add any custom attributes that do not
352
- interfere with the API, and they will be passed to the `textarea` HTML element.
353
- This is useful mainly to improve component's
354
- [accessibility](#forwarding-html-attributes).
351
+ In addition to the options below, you can specify [React synthetic events] or
352
+ any custom HTML attributes that do not interfere with the API, and they will be
353
+ passed to the `textarea` HTML element. This enables making the component
354
+ interactive and helps improve its [accessibility](#forwarding-html-attributes).
355
355
 
356
356
  <Props table of={TextArea} />
357
357
 
@@ -359,3 +359,5 @@ This is useful mainly to improve component's
359
359
 
360
360
  Head to [Forms Theming](/customize/theming/forms) to see shared form theming
361
361
  options.
362
+
363
+ [React synthetic events]: https://reactjs.org/docs/events.html
@@ -1,21 +1,21 @@
1
1
  import PropTypes from 'prop-types';
2
- import React from 'react';
3
- import getRootSizeClassName from '../../../helpers/getRootSizeClassName';
4
- import getRootValidationStateClassName from '../../../helpers/getRootValidationStateClassName';
5
- import { withProviderContext } from '../../../provider';
6
- import transferProps from '../../../utils/transferProps';
2
+ import React, { useContext } from 'react';
3
+ import getRootSizeClassName from '../../helpers/getRootSizeClassName';
4
+ import getRootValidationStateClassName from '../../helpers/getRootValidationStateClassName';
5
+ import { resolveContextOrProp } from '../../helpers/resolveContextOrProp';
6
+ import { withProviderContext } from '../../provider';
7
+ import transferProps from '../../utils/transferProps';
8
+ import { FormLayoutContext } from '../FormLayout';
7
9
  import withForwardedRef from '../withForwardedRef';
8
10
  import styles from './TextArea.scss';
9
11
 
10
12
  export const TextArea = ({
11
- changeHandler,
12
13
  cols,
13
14
  disabled,
14
15
  forwardedRef,
15
16
  fullWidth,
16
17
  helpText,
17
18
  id,
18
- inFormLayout,
19
19
  isLabelVisible,
20
20
  label,
21
21
  layout,
@@ -28,79 +28,82 @@ export const TextArea = ({
28
28
  value,
29
29
  variant,
30
30
  ...restProps
31
- }) => (
32
- <label
33
- className={[
34
- styles.root,
35
- fullWidth ? styles.isRootFullWidth : '',
36
- inFormLayout ? styles.isRootInFormLayout : '',
37
- layout === 'horizontal' ? styles.rootLayoutHorizontal : styles.rootLayoutVertical,
38
- disabled ? styles.isRootDisabled : '',
39
- required ? styles.isRootRequired : '',
40
- getRootSizeClassName(size, styles),
41
- getRootValidationStateClassName(validationState, styles),
42
- variant === 'filled' ? styles.rootVariantFilled : styles.rootVariantOutline,
43
- ].join(' ')}
44
- htmlFor={id}
45
- id={id && `${id}__label`}
46
- >
47
- <div
31
+ }) => {
32
+ const context = useContext(FormLayoutContext);
33
+
34
+ return (
35
+ <label
48
36
  className={[
49
- styles.label,
50
- isLabelVisible ? '' : styles.isLabelHidden,
37
+ styles.root,
38
+ fullWidth ? styles.isRootFullWidth : '',
39
+ context ? styles.isRootInFormLayout : '',
40
+ resolveContextOrProp(context && context.layout, layout) === 'horizontal'
41
+ ? styles.rootLayoutHorizontal
42
+ : styles.rootLayoutVertical,
43
+ disabled ? styles.isRootDisabled : '',
44
+ required ? styles.isRootRequired : '',
45
+ getRootSizeClassName(size, styles),
46
+ getRootValidationStateClassName(validationState, styles),
47
+ variant === 'filled' ? styles.rootVariantFilled : styles.rootVariantOutline,
51
48
  ].join(' ')}
52
- id={id && `${id}__labelText`}
49
+ htmlFor={id}
50
+ id={id && `${id}__label`}
53
51
  >
54
- {label}
55
- </div>
56
- <div className={styles.field}>
57
- <div className={styles.inputContainer}>
58
- <textarea
59
- {...transferProps(restProps)}
60
- className={styles.input}
61
- cols={cols}
62
- disabled={disabled}
63
- id={id}
64
- onChange={changeHandler}
65
- placeholder={placeholder}
66
- ref={forwardedRef}
67
- required={required}
68
- rows={rows}
69
- value={value}
70
- />
71
- {variant === 'filled' && (
72
- <div className={styles.bottomLine} />
73
- )}
52
+ <div
53
+ className={[
54
+ styles.label,
55
+ isLabelVisible ? '' : styles.isLabelHidden,
56
+ ].join(' ')}
57
+ id={id && `${id}__labelText`}
58
+ >
59
+ {label}
74
60
  </div>
75
- {helpText && (
76
- <div
77
- className={styles.helpText}
78
- id={id && `${id}__helpText`}
79
- >
80
- {helpText}
81
- </div>
82
- )}
83
- {validationText && (
84
- <div
85
- className={styles.validationText}
86
- id={id && `${id}__validationText`}
87
- >
88
- {validationText}
61
+ <div className={styles.field}>
62
+ <div className={styles.inputContainer}>
63
+ <textarea
64
+ {...transferProps(restProps)}
65
+ className={styles.input}
66
+ cols={cols}
67
+ disabled={disabled}
68
+ id={id}
69
+ placeholder={placeholder}
70
+ ref={forwardedRef}
71
+ required={required}
72
+ rows={rows}
73
+ value={value}
74
+ />
75
+ {variant === 'filled' && (
76
+ <div className={styles.bottomLine} />
77
+ )}
89
78
  </div>
90
- )}
91
- </div>
92
- </label>
93
- );
79
+ {helpText && (
80
+ <div
81
+ className={styles.helpText}
82
+ id={id && `${id}__helpText`}
83
+ >
84
+ {helpText}
85
+ </div>
86
+ )}
87
+ {validationText && (
88
+ <div
89
+ className={styles.validationText}
90
+ id={id && `${id}__validationText`}
91
+ >
92
+ {validationText}
93
+ </div>
94
+ )}
95
+ </div>
96
+ </label>
97
+ );
98
+ };
94
99
 
95
100
  TextArea.defaultProps = {
96
- changeHandler: null,
97
101
  cols: null,
98
102
  disabled: false,
99
103
  forwardedRef: undefined,
100
104
  fullWidth: false,
101
105
  helpText: null,
102
106
  id: undefined,
103
- inFormLayout: false,
104
107
  isLabelVisible: true,
105
108
  layout: 'vertical',
106
109
  placeholder: null,
@@ -114,10 +117,6 @@ TextArea.defaultProps = {
114
117
  };
115
118
 
116
119
  TextArea.propTypes = {
117
- /**
118
- * Function to call when the input has changed.
119
- */
120
- changeHandler: PropTypes.func,
121
120
  /**
122
121
  * The number of visible text columns for the control.
123
122
  */
@@ -142,15 +141,13 @@ TextArea.propTypes = {
142
141
  * Optional help text.
143
142
  */
144
143
  helpText: PropTypes.node,
145
- /**
146
- * ID of the input HTML element. It also serves as a prefix for important inner elements:
147
- * `<ID>__label`, `<ID>__labelText`, and `<ID>__helpText`, and `<ID>__validationText`.
144
+ /** ID of the input HTML element. It also serves as a prefix for nested elements:
145
+ * * `<ID>__label`
146
+ * * `<ID>__labelText`
147
+ * * `<ID>__helpText`
148
+ * * `<ID>__validationText`
148
149
  */
149
150
  id: PropTypes.string,
150
- /**
151
- * Treat the field differently when it's inside a FormLayout. Do not set manually!
152
- */
153
- inFormLayout: PropTypes.bool,
154
151
  /**
155
152
  * If `false`, the label will be visually hidden (but remains accessible by assistive
156
153
  * technologies).
@@ -162,6 +159,9 @@ TextArea.propTypes = {
162
159
  label: PropTypes.string.isRequired,
163
160
  /**
164
161
  * Layout of the field.
162
+ *
163
+ * Ignored if the component is rendered within `FormLayout` component
164
+ * as the value is inherited in such case.
165
165
  */
166
166
  layout: PropTypes.oneOf(['horizontal', 'vertical']),
167
167
  /**
@@ -1,9 +1,9 @@
1
- @use '../../../styles/tools/form-fields/box-field-elements';
2
- @use '../../../styles/tools/form-fields/box-field-layout';
3
- @use '../../../styles/tools/form-fields/box-field-sizes';
4
- @use '../../../styles/tools/form-fields/foundation';
5
- @use '../../../styles/tools/form-fields/variants';
6
- @use '../../../styles/tools/accessibility';
1
+ @use '../../styles/tools/form-fields/box-field-elements';
2
+ @use '../../styles/tools/form-fields/box-field-layout';
3
+ @use '../../styles/tools/form-fields/box-field-sizes';
4
+ @use '../../styles/tools/form-fields/foundation';
5
+ @use '../../styles/tools/form-fields/variants';
6
+ @use '../../styles/tools/accessibility';
7
7
 
8
8
  // Foundation
9
9
  .root {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: TextField
3
- menu: 'UI'
4
- route: /components/ui/text-field
3
+ menu: 'Inputs'
4
+ route: /components/text-field
5
5
  ---
6
6
 
7
7
  # TextField
@@ -491,10 +491,10 @@ It's possible to disable the whole input.
491
491
 
492
492
  ## API
493
493
 
494
- In addition to the options below, you can add any custom attributes that do not
495
- interfere with the API, and they will be passed to the `input` HTML element.
496
- This is useful mainly to improve component's
497
- [accessibility](#forwarding-html-attributes).
494
+ In addition to the options below, you can specify [React synthetic events] or
495
+ any custom HTML attributes that do not interfere with the API, and they will be
496
+ passed to the `input` HTML element. This enables making the component
497
+ interactive and helps improve its [accessibility](#forwarding-html-attributes).
498
498
 
499
499
  <Props table of={TextField} />
500
500
 
@@ -513,3 +513,4 @@ Head to [Forms Theming][theming-forms] to see shared form theming options.
513
513
  [input-tel]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/tel
514
514
  [input-password]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/password
515
515
  [theming-forms]: /customize/theming/forms
516
+ [React synthetic events]: https://reactjs.org/docs/events.html
@@ -1,22 +1,22 @@
1
1
  import PropTypes from 'prop-types';
2
- import React from 'react';
3
- import getRootSizeClassName from '../../../helpers/getRootSizeClassName';
4
- import getRootValidationStateClassName from '../../../helpers/getRootValidationStateClassName';
5
- import { withProviderContext } from '../../../provider';
6
- import transferProps from '../../../utils/transferProps';
2
+ import React, { useContext } from 'react';
3
+ import getRootSizeClassName from '../../helpers/getRootSizeClassName';
4
+ import getRootValidationStateClassName from '../../helpers/getRootValidationStateClassName';
5
+ import { resolveContextOrProp } from '../../helpers/resolveContextOrProp';
6
+ import { withProviderContext } from '../../provider';
7
+ import transferProps from '../../utils/transferProps';
8
+ import { FormLayoutContext } from '../FormLayout';
7
9
  import withForwardedRef from '../withForwardedRef';
8
10
  import styles from './TextField.scss';
9
11
 
10
12
  const SMALL_INPUT_SIZE = 10;
11
13
 
12
14
  export const TextField = ({
13
- changeHandler,
14
15
  disabled,
15
16
  forwardedRef,
16
17
  fullWidth,
17
18
  helpText,
18
19
  id,
19
- inFormLayout,
20
20
  inputSize,
21
21
  isLabelVisible,
22
22
  label,
@@ -31,6 +31,7 @@ export const TextField = ({
31
31
  variant,
32
32
  ...restProps
33
33
  }) => {
34
+ const context = useContext(FormLayoutContext);
34
35
  const hasSmallInput = (inputSize !== null) && (inputSize <= SMALL_INPUT_SIZE);
35
36
 
36
37
  return (
@@ -39,9 +40,10 @@ export const TextField = ({
39
40
  styles.root,
40
41
  fullWidth ? styles.isRootFullWidth : '',
41
42
  hasSmallInput ? styles.hasRootSmallInput : '',
42
- inFormLayout ? styles.isRootInFormLayout : '',
43
- inputSize ? styles.hasRootCustomInputSize : '',
44
- layout === 'horizontal' ? styles.rootLayoutHorizontal : styles.rootLayoutVertical,
43
+ context ? styles.isRootInFormLayout : '',
44
+ resolveContextOrProp(context && context.layout, layout) === 'horizontal'
45
+ ? styles.rootLayoutHorizontal
46
+ : styles.rootLayoutVertical,
45
47
  disabled ? styles.isRootDisabled : '',
46
48
  required ? styles.isRootRequired : '',
47
49
  getRootSizeClassName(size, styles),
@@ -68,7 +70,6 @@ export const TextField = ({
68
70
  className={styles.input}
69
71
  disabled={disabled}
70
72
  id={id}
71
- onChange={changeHandler}
72
73
  placeholder={placeholder}
73
74
  ref={forwardedRef}
74
75
  required={required}
@@ -102,13 +103,11 @@ export const TextField = ({
102
103
  };
103
104
 
104
105
  TextField.defaultProps = {
105
- changeHandler: null,
106
106
  disabled: false,
107
107
  forwardedRef: undefined,
108
108
  fullWidth: false,
109
109
  helpText: null,
110
110
  id: undefined,
111
- inFormLayout: false,
112
111
  inputSize: null,
113
112
  isLabelVisible: true,
114
113
  layout: 'vertical',
@@ -123,10 +122,6 @@ TextField.defaultProps = {
123
122
  };
124
123
 
125
124
  TextField.propTypes = {
126
- /**
127
- * Function to call when the input has changed.
128
- */
129
- changeHandler: PropTypes.func,
130
125
  /**
131
126
  * If `true`, the input will be disabled.
132
127
  */
@@ -148,17 +143,16 @@ TextField.propTypes = {
148
143
  */
149
144
  helpText: PropTypes.node,
150
145
  /**
151
- * ID of the input HTML element. It also serves as a prefix for important inner elements:
152
- * `<ID>__label`, `<ID>__labelText`, `<ID>__helpText`, and `<ID>__validationText`.
146
+ * ID of the input HTML element. It also serves as a prefix for nested elements:
147
+ * * `<ID>__label`
148
+ * * `<ID>__labelText`
149
+ * * `<ID>__helpText`
150
+ * * `<ID>__validationText`
153
151
  */
154
152
  id: PropTypes.string,
155
153
  /**
156
154
  * Treat the field differently when it's inside a FormLayout. Do not set manually!
157
155
  */
158
- inFormLayout: PropTypes.bool,
159
- /**
160
- * Width of the input field. Translated as `size` attribute for input types other than `number`.
161
- */
162
156
  inputSize: PropTypes.number,
163
157
  /**
164
158
  * If `false`, the label will be visually hidden (but remains accessible by assistive
@@ -171,6 +165,9 @@ TextField.propTypes = {
171
165
  label: PropTypes.string.isRequired,
172
166
  /**
173
167
  * Layout of the field.
168
+ *
169
+ * Ignored if the component is rendered within `FormLayout` component
170
+ * as the value is inherited in such case.
174
171
  */
175
172
  layout: PropTypes.oneOf(['horizontal', 'vertical']),
176
173
  /**
@@ -1,9 +1,9 @@
1
- @use '../../../styles/tools/form-fields/box-field-elements';
2
- @use '../../../styles/tools/form-fields/box-field-layout';
3
- @use '../../../styles/tools/form-fields/box-field-sizes';
4
- @use '../../../styles/tools/form-fields/foundation';
5
- @use '../../../styles/tools/form-fields/variants';
6
- @use '../../../styles/tools/accessibility';
1
+ @use '../../styles/tools/form-fields/box-field-elements';
2
+ @use '../../styles/tools/form-fields/box-field-layout';
3
+ @use '../../styles/tools/form-fields/box-field-sizes';
4
+ @use '../../styles/tools/form-fields/foundation';
5
+ @use '../../styles/tools/form-fields/variants';
6
+ @use '../../styles/tools/accessibility';
7
7
 
8
8
  // Foundation
9
9
  .root {