@react-ui-org/react-ui 0.48.0 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. package/dist/lib.development.js +162 -66
  2. package/dist/lib.js +1 -1
  3. package/package.json +1 -1
  4. package/src/lib/components/Alert/Alert.jsx +3 -0
  5. package/src/lib/components/Alert/Alert.scss +10 -10
  6. package/src/lib/components/Alert/README.mdx +14 -0
  7. package/src/lib/components/Badge/Badge.jsx +4 -8
  8. package/src/lib/components/Badge/Badge.scss +21 -21
  9. package/src/lib/components/Badge/README.mdx +14 -0
  10. package/src/lib/components/Button/Button.jsx +2 -13
  11. package/src/lib/components/Button/README.mdx +17 -5
  12. package/src/lib/components/Button/_base.scss +20 -20
  13. package/src/lib/components/Button/_priorities.scss +35 -35
  14. package/src/lib/components/Button/helpers/getRootLabelVisibilityClassName.js +7 -7
  15. package/src/lib/components/Button/helpers/getRootPriorityClassName.js +3 -3
  16. package/src/lib/components/ButtonGroup/ButtonGroup.jsx +0 -7
  17. package/src/lib/components/ButtonGroup/README.mdx +14 -0
  18. package/src/lib/components/Card/Card.jsx +6 -10
  19. package/src/lib/components/Card/Card.scss +13 -13
  20. package/src/lib/components/Card/CardBody.jsx +6 -10
  21. package/src/lib/components/Card/CardFooter.jsx +6 -7
  22. package/src/lib/components/Card/README.mdx +14 -0
  23. package/src/lib/components/CheckboxField/CheckboxField.jsx +1 -27
  24. package/src/lib/components/CheckboxField/README.mdx +17 -5
  25. package/src/lib/components/FileInputField/FileInputField.jsx +2 -12
  26. package/src/lib/components/FileInputField/FileInputField.scss +3 -7
  27. package/src/lib/components/FileInputField/README.mdx +29 -27
  28. package/src/lib/components/FormLayout/FormLayout.jsx +5 -9
  29. package/src/lib/components/FormLayout/FormLayout.scss +3 -3
  30. package/src/lib/components/FormLayout/FormLayoutCustomField.jsx +4 -1
  31. package/src/lib/components/FormLayout/FormLayoutCustomField.scss +8 -8
  32. package/src/lib/components/FormLayout/README.mdx +13 -0
  33. package/src/lib/components/Grid/Grid.jsx +0 -7
  34. package/src/lib/components/Grid/GridSpan.jsx +0 -7
  35. package/src/lib/components/Grid/README.mdx +14 -0
  36. package/src/lib/components/Modal/Modal.jsx +7 -11
  37. package/src/lib/components/Modal/ModalBody.jsx +3 -7
  38. package/src/lib/components/Modal/ModalCloseButton.jsx +0 -16
  39. package/src/lib/components/Modal/ModalContent.jsx +3 -7
  40. package/src/lib/components/Modal/ModalFooter.jsx +3 -7
  41. package/src/lib/components/Modal/ModalFooter.scss +5 -5
  42. package/src/lib/components/Modal/ModalHeader.jsx +3 -7
  43. package/src/lib/components/Modal/ModalHeader.scss +5 -5
  44. package/src/lib/components/Modal/ModalTitle.jsx +6 -7
  45. package/src/lib/components/Modal/README.mdx +32 -6
  46. package/src/lib/components/Modal/_helpers/getJustifyClassName.js +5 -5
  47. package/src/lib/components/Paper/Paper.jsx +5 -9
  48. package/src/lib/components/Paper/Paper.scss +2 -2
  49. package/src/lib/components/Paper/README.mdx +14 -0
  50. package/src/lib/components/Popover/Popover.jsx +0 -16
  51. package/src/lib/components/Popover/PopoverWrapper.jsx +0 -7
  52. package/src/lib/components/Popover/README.mdx +19 -0
  53. package/src/lib/components/Radio/README.mdx +12 -5
  54. package/src/lib/components/Radio/Radio.jsx +2 -2
  55. package/src/lib/components/Radio/Radio.scss +3 -3
  56. package/src/lib/components/ScrollView/README.mdx +19 -0
  57. package/src/lib/components/ScrollView/ScrollView.jsx +11 -4
  58. package/src/lib/components/SelectField/README.mdx +17 -5
  59. package/src/lib/components/SelectField/SelectField.jsx +3 -22
  60. package/src/lib/components/SelectField/SelectField.scss +8 -8
  61. package/src/lib/components/Table/README.mdx +21 -7
  62. package/src/lib/components/Table/Table.jsx +43 -101
  63. package/src/lib/components/Table/Table.scss +0 -24
  64. package/src/lib/components/Table/_components/TableBodyCell/TableBodyCell.jsx +46 -0
  65. package/src/lib/components/Table/_components/TableBodyCell/index.js +1 -0
  66. package/src/lib/components/Table/_components/TableCell.scss +25 -0
  67. package/src/lib/components/Table/_components/TableHeaderCell/TableHeaderCell.jsx +71 -0
  68. package/src/lib/components/Table/_components/TableHeaderCell/index.js +1 -0
  69. package/src/lib/components/Tabs/README.mdx +16 -0
  70. package/src/lib/components/Tabs/Tabs.jsx +6 -1
  71. package/src/lib/components/Tabs/TabsItem.jsx +3 -0
  72. package/src/lib/components/Text/README.mdx +16 -0
  73. package/src/lib/components/Text/Text.jsx +3 -7
  74. package/src/lib/components/Text/Text.scss +6 -6
  75. package/src/lib/components/Text/_helpers/getRootClampClassName.js +2 -2
  76. package/src/lib/components/Text/_helpers/getRootHyphensClassName.js +2 -2
  77. package/src/lib/components/Text/_helpers/getRootWordWrappingClassName.js +2 -2
  78. package/src/lib/components/TextArea/README.mdx +33 -30
  79. package/src/lib/components/TextArea/TextArea.jsx +3 -43
  80. package/src/lib/components/TextArea/TextArea.scss +8 -8
  81. package/src/lib/components/TextField/README.mdx +53 -51
  82. package/src/lib/components/TextField/TextField.jsx +3 -29
  83. package/src/lib/components/TextField/TextField.scss +9 -9
  84. package/src/lib/components/TextLink/README.mdx +12 -5
  85. package/src/lib/components/TextLink/TextLink.jsx +0 -10
  86. package/src/lib/components/Toggle/README.mdx +17 -5
  87. package/src/lib/components/Toggle/Toggle.jsx +1 -27
  88. package/src/lib/components/Toolbar/README.mdx +13 -0
  89. package/src/lib/components/Toolbar/Toolbar.jsx +9 -43
  90. package/src/lib/components/Toolbar/Toolbar.scss +24 -12
  91. package/src/lib/components/Toolbar/ToolbarGroup.jsx +7 -26
  92. package/src/lib/components/Toolbar/ToolbarItem.jsx +3 -7
  93. package/src/lib/components/Toolbar/_helpers/getAlignClassName.js +19 -0
  94. package/src/lib/components/Toolbar/_helpers/getJustifyClassName.js +16 -0
  95. package/src/lib/components/_helpers/getRootColorClassName.js +10 -10
  96. package/src/lib/components/_helpers/getRootSizeClassName.js +3 -3
  97. package/src/lib/styles/generic/_forms.scss +10 -6
  98. package/src/lib/styles/theme/_accessibility.scss +2 -0
  99. package/src/lib/styles/theme/_form-fields.scss +1 -0
  100. package/src/lib/styles/tools/_accessibility.scss +2 -0
  101. package/src/lib/styles/tools/form-fields/_box-field-layout.scss +15 -15
  102. package/src/lib/styles/tools/form-fields/_foundation.scss +2 -0
  103. package/src/lib/styles/tools/form-fields/_inline-field-elements.scss +1 -1
  104. package/src/lib/styles/tools/form-fields/_inline-field-layout.scss +9 -9
  105. package/src/lib/theme.scss +4 -1
@@ -1,110 +1,52 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
- import { Button } from '../..';
4
+ import { transferProps } from '../_helpers/transferProps';
5
+ import { TableHeaderCell } from './_components/TableHeaderCell';
6
+ import { TableBodyCell } from './_components/TableBodyCell';
5
7
  import styles from './Table.scss';
6
8
 
7
- export class Table extends React.Component {
8
- constructor(props) {
9
- super(props);
10
-
11
- this.renderHeaderCell = this.renderHeaderCell.bind(this);
12
-
13
- this.sortCellStyle = {
14
- backgroundColor: 'lightgray',
15
- };
16
- }
17
-
18
- renderHeaderCell(column) {
19
- const {
20
- id,
21
- sort,
22
- } = this.props;
23
- const sortDirection = sort && column.name === sort.column ? sort.direction : 'asc';
24
- const isSortingActive = sort && column.name === sort.column;
25
-
26
- return (
27
- <th
28
- className={isSortingActive ? styles.isTableHeadCellSortingActive : styles.tableHeadCell}
29
- key={column.name}
30
- {...(id && { id: `${id}__headerCell__${column.name}` })}
31
- >
32
- {sort && column.isSortable && (
33
- <div className={styles.sortButton}>
34
- <Button
35
- beforeLabel={
36
- sortDirection === 'asc'
37
- ? sort.ascendingIcon
38
- : sort.descendingIcon
39
- }
40
- label={sortDirection}
41
- labelVisibility="none"
42
- onClick={() => sort.onClick(column.name, sortDirection)}
43
- priority="flat"
44
- {...(id && { id: `${id}__headerCell__${column.name}__sortButton` })}
9
+ export const Table = ({
10
+ columns,
11
+ id,
12
+ rows,
13
+ sort,
14
+ ...restProps
15
+ }) => (
16
+ <table
17
+ {...transferProps(restProps)}
18
+ className={styles.table}
19
+ id={id}
20
+ >
21
+ <thead>
22
+ <tr className={styles.tableHeadRow}>
23
+ {columns.map((column) => (
24
+ <TableHeaderCell
25
+ column={column}
26
+ key={column.name}
27
+ sort={sort}
28
+ {...(id && { id: `${id}__headerCell__${column.name}` })}
29
+ />
30
+ ))}
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ {rows.map((row) => (
35
+ <tr key={row.id} className={styles.tableRow}>
36
+ {columns.map((column) => (
37
+ <TableBodyCell
38
+ format={column.format}
39
+ isSortingActive={sort && column.name === sort.column}
40
+ key={`${row.id}-${column.name}`}
41
+ value={row[column.name]}
42
+ {...(id && { id: `${id}__bodyCell__${column.name}__${row.id}` })}
45
43
  />
46
- </div>
47
- )}
48
- {column.label}
49
- </th>
50
- );
51
- }
52
-
53
- renderBodyCell(column, row) {
54
- const {
55
- id,
56
- sort,
57
- } = this.props;
58
- const isSortingActive = sort && column.name === sort.column;
59
-
60
- if (column.format) {
61
- return (
62
- <td
63
- className={isSortingActive ? styles.isTableCellSortingActive : styles.tableCell}
64
- key={`${row.id}-${column.name}`}
65
- {...(id && { id: `${id}__bodyCell__${column.name}__${row.id}` })}
66
- >
67
- {column.format(row)}
68
- </td>
69
- );
70
- }
71
-
72
- return (
73
- <td
74
- className={isSortingActive ? styles.isTableCellSortingActive : styles.tableCell}
75
- key={`${row.id}-${column.name}`}
76
- {...(id && { id: `${id}__bodyCell__${column.name}__${row.id}` })}
77
- >
78
- {row[column.name]}
79
- </td>
80
- );
81
- }
82
-
83
- render() {
84
- const {
85
- columns,
86
- id,
87
- rows,
88
- } = this.props;
89
-
90
- return (
91
- <table id={id} className={styles.table}>
92
- <thead>
93
- <tr className={styles.tableHeadRow}>
94
- {columns.map(this.renderHeaderCell)}
95
- </tr>
96
- </thead>
97
- <tbody>
98
- {rows.map((row) => (
99
- <tr key={row.id} className={styles.tableRow}>
100
- {columns.map((column) => this.renderBodyCell(column, row))}
101
- </tr>
102
44
  ))}
103
- </tbody>
104
- </table>
105
- );
106
- }
107
- }
45
+ </tr>
46
+ ))}
47
+ </tbody>
48
+ </table>
49
+ );
108
50
 
109
51
  Table.defaultProps = {
110
52
  id: undefined,
@@ -123,7 +65,7 @@ Table.propTypes = {
123
65
  name: PropTypes.string.isRequired,
124
66
  })).isRequired,
125
67
  /**
126
- * ID of the root HTML element. It also serves as base fo nested elements:
68
+ * ID of the root HTML element. It also serves as base for nested elements:
127
69
  * * `<ID>__headerCell__<COLUMN_NAME>`
128
70
  * * `<ID>__headerCell__<COLUMN_NAME>__sortButton`
129
71
  * * `<ID>__bodyCell__<COLUMN_NAME>__<ROW_ID>`
@@ -26,27 +26,3 @@
26
26
  background-color: settings.$head-background-color;
27
27
  }
28
28
  }
29
-
30
- .tableCell,
31
- .tableHeadCell,
32
- .isTableCellSortingActive,
33
- .isTableHeadCellSortingActive {
34
- padding: settings.$cell-padding-y settings.$cell-padding-x;
35
- text-align: left;
36
- border-bottom: settings.$border-width solid settings.$border-color;
37
- }
38
-
39
- .tableHeadCell {
40
- font-weight: settings.$head-font-weight;
41
- border-bottom-width: 2px;
42
- }
43
-
44
- .isTableCellSortingActive,
45
- .isTableHeadCellSortingActive {
46
- background-color: settings.$sorted-background-color;
47
- }
48
-
49
- .sortButton {
50
- display: inline-block;
51
- margin-right: settings.$cell-padding-x;
52
- }
@@ -0,0 +1,46 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import styles from '../TableCell.scss';
4
+
5
+ export const TableBodyCell = ({
6
+ format,
7
+ id,
8
+ isSortingActive,
9
+ value,
10
+ }) => (
11
+ <td
12
+ className={isSortingActive ? styles.isTableCellSortingActive : styles.tableCell}
13
+ id={id}
14
+ >
15
+ {format ? format(value) : value}
16
+ </td>
17
+ );
18
+
19
+ TableBodyCell.defaultProps = {
20
+ format: undefined,
21
+ id: undefined,
22
+ isSortingActive: false,
23
+ value: null,
24
+ };
25
+
26
+ TableBodyCell.propTypes = {
27
+ /**
28
+ * Function that can be used to process the column data before displaying them.
29
+ */
30
+ format: PropTypes.func,
31
+ /**
32
+ * ID of the HTML <td> element:
33
+ */
34
+ id: PropTypes.string,
35
+ /**
36
+ * If `true`, cell is gray marked as sorted.
37
+ */
38
+ isSortingActive: PropTypes.bool,
39
+ /**
40
+ * Cell value.
41
+ */
42
+ // eslint-disable-next-line react/forbid-prop-types
43
+ value: PropTypes.any,
44
+ };
45
+
46
+ export default TableBodyCell;
@@ -0,0 +1 @@
1
+ export { default as TableBodyCell } from './TableBodyCell';
@@ -0,0 +1,25 @@
1
+ @use "../settings";
2
+
3
+ .tableCell,
4
+ .tableHeadCell,
5
+ .isTableCellSortingActive,
6
+ .isTableHeadCellSortingActive {
7
+ padding: settings.$cell-padding-y settings.$cell-padding-x;
8
+ text-align: left;
9
+ border-bottom: settings.$border-width solid settings.$border-color;
10
+ }
11
+
12
+ .tableHeadCell {
13
+ font-weight: settings.$head-font-weight;
14
+ border-bottom-width: 2px;
15
+ }
16
+
17
+ .isTableCellSortingActive,
18
+ .isTableHeadCellSortingActive {
19
+ background-color: settings.$sorted-background-color;
20
+ }
21
+
22
+ .sortButton {
23
+ display: inline-block;
24
+ margin-right: settings.$cell-padding-x;
25
+ }
@@ -0,0 +1,71 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import { Button } from '../../../..';
4
+ import styles from '../TableCell.scss';
5
+
6
+ export const TableHeaderCell = ({
7
+ column,
8
+ id,
9
+ sort,
10
+ }) => {
11
+ const sortDirection = sort && column.name === sort.column ? sort.direction : 'asc';
12
+ const isSortingActive = sort && column.name === sort.column;
13
+
14
+ return (
15
+ <th
16
+ className={isSortingActive ? styles.isTableHeadCellSortingActive : styles.tableHeadCell}
17
+ id={id}
18
+ >
19
+ {sort && column.isSortable && (
20
+ <div className={styles.sortButton}>
21
+ <Button
22
+ beforeLabel={
23
+ sortDirection === 'asc'
24
+ ? sort.ascendingIcon
25
+ : sort.descendingIcon
26
+ }
27
+ id={id && `${id}__sortButton`}
28
+ label={sortDirection}
29
+ labelVisibility="none"
30
+ onClick={() => sort.onClick(column.name, sortDirection)}
31
+ priority="flat"
32
+ />
33
+ </div>
34
+ )}
35
+ {column.label}
36
+ </th>
37
+ );
38
+ };
39
+
40
+ TableHeaderCell.defaultProps = {
41
+ id: undefined,
42
+ sort: null,
43
+ };
44
+
45
+ TableHeaderCell.propTypes = {
46
+ /**
47
+ * Table data column, optionally sortable. The `format` function can be used to process the
48
+ * column data before displaying them.
49
+ */
50
+ column: PropTypes.shape({
51
+ isSortable: PropTypes.bool,
52
+ label: PropTypes.string,
53
+ name: PropTypes.string.isRequired,
54
+ }).isRequired,
55
+ /**
56
+ * ID of the HTML <th> element and nested button for sorting.
57
+ */
58
+ id: PropTypes.string,
59
+ /**
60
+ * Sorting configuration required to make columns sortable.
61
+ */
62
+ sort: PropTypes.shape({
63
+ ascendingIcon: PropTypes.node.isRequired,
64
+ column: PropTypes.string.isRequired,
65
+ descendingIcon: PropTypes.node.isRequired,
66
+ direction: PropTypes.oneOf(['asc', 'desc']).isRequired,
67
+ onClick: PropTypes.func.isRequired,
68
+ }),
69
+ };
70
+
71
+ export default TableHeaderCell;
@@ -0,0 +1 @@
1
+ export { default as TableHeaderCell } from './TableHeaderCell';
@@ -171,6 +171,18 @@ accessible no matter the space they have around. Wrap Tabs into
171
171
  }}
172
172
  </Playground>
173
173
 
174
+ ## Forwarding HTML Attributes
175
+
176
+ In addition to the options below in the [component's API](#api) section, you
177
+ can specify [React synthetic events] or **any HTML attribute you like.** All
178
+ attributes that don't interfere with the API are forwarded to the `<nav>` HTML
179
+ element in case of `Tabs` component and to the `<li>` HTML element in
180
+ case of `TabsItem`. This enables making the component interactive and helps
181
+ to improve its accessibility.
182
+
183
+ 👉 Refer to the MDN reference for the full list of supported attributes of the
184
+ [nav] and [li] element.
185
+
174
186
  ## API
175
187
 
176
188
  <Props table of={Tabs} />
@@ -220,3 +232,7 @@ Where:
220
232
  - `<PROPERTY>` is one of `font-weight`, `color`, `border-width`, `border-color`,
221
233
  `background-color`, `box-shadow`, `shift-y` (shifts vertically the whole
222
234
  item), or `label__shift-y` (tweaks vertical position of tab label).
235
+
236
+ [React synthetic events]: https://reactjs.org/docs/events.html
237
+ [nav]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav#attributes
238
+ [li]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li#attributes
@@ -1,13 +1,18 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
+ import { transferProps } from '../_helpers/transferProps';
4
5
  import styles from './Tabs.scss';
5
6
 
6
7
  export const Tabs = ({
7
8
  children,
8
9
  id,
10
+ ...restProps
9
11
  }) => (
10
- <nav id={id}>
12
+ <nav
13
+ {...transferProps(restProps)}
14
+ id={id}
15
+ >
11
16
  <ul
12
17
  className={styles.list}
13
18
  id={id && `${id}__list`}
@@ -1,6 +1,7 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
+ import { transferProps } from '../_helpers/transferProps';
4
5
  import { classNames } from '../../utils/classNames';
5
6
  import styles from './TabsItem.scss';
6
7
 
@@ -12,8 +13,10 @@ export const TabsItem = ({
12
13
  isActive,
13
14
  label,
14
15
  onClick,
16
+ ...restProps
15
17
  }) => (
16
18
  <li
19
+ {...transferProps(restProps)}
17
20
  className={classNames(
18
21
  styles.root,
19
22
  isActive && styles.isRootActive,
@@ -214,6 +214,22 @@ will override automatic break point selection in `auto` mode when present.
214
214
  }}
215
215
  </Playground>
216
216
 
217
+ ## Forwarding HTML Attributes
218
+
219
+ In addition to the options below in the [component's API](#api) section, you
220
+ can specify [React synthetic events] or **any HTML attribute you like.** All
221
+ attributes that don't interfere with the API are forwarded either to the
222
+ `<span>` or to the `<div>` HTML element in case that `blockLevel` is set to
223
+ `true`. This enables making the component interactive and helps to improve its
224
+ accessibility.
225
+
226
+ 👉 Refer to the MDN reference for the full list of supported attributes of the
227
+ [span] and [div] element.
228
+
217
229
  ## API
218
230
 
219
231
  <Props table of={Text} />
232
+
233
+ [React synthetic events]: https://reactjs.org/docs/events.html
234
+ [span]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span#attributes
235
+ [div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
@@ -1,6 +1,7 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
+ import { transferProps } from '../_helpers/transferProps';
4
5
  import { classNames } from '../../utils/classNames';
5
6
  import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
6
7
  import { getRootClampClassName } from './_helpers/getRootClampClassName';
@@ -12,9 +13,9 @@ export const Text = ({
12
13
  blockLevel,
13
14
  children,
14
15
  hyphens,
15
- id,
16
16
  lines,
17
17
  wordWrapping,
18
+ ...restProps
18
19
  }) => {
19
20
  if (isChildrenEmpty(children)) {
20
21
  return null;
@@ -24,6 +25,7 @@ export const Text = ({
24
25
 
25
26
  return (
26
27
  <HtmlElement
28
+ {...transferProps(restProps)}
27
29
  className={(hyphens !== 'none' || lines > 0 || wordWrapping !== 'normal')
28
30
  ? classNames(
29
31
  getRootClampClassName(lines, styles),
@@ -31,7 +33,6 @@ export const Text = ({
31
33
  getRootWordWrappingClassName(wordWrapping, styles),
32
34
  )
33
35
  : undefined}
34
- id={id}
35
36
  style={(lines > 1) ? { '--rui-custom-lines': lines } : undefined}
36
37
  >
37
38
  {children}
@@ -43,7 +44,6 @@ Text.defaultProps = {
43
44
  blockLevel: false,
44
45
  children: null,
45
46
  hyphens: 'none',
46
- id: undefined,
47
47
  lines: undefined,
48
48
  wordWrapping: 'normal',
49
49
  };
@@ -61,10 +61,6 @@ Text.propTypes = {
61
61
  * Turn on hyphenation. Head to [Hyphens](#hyphens) to learn more.
62
62
  */
63
63
  hyphens: PropTypes.oneOf(['none', 'auto', 'manual']),
64
- /**
65
- * Optional ID of the root HTML element.
66
- */
67
- id: PropTypes.string,
68
64
  /**
69
65
  * Optional number of lines. If exceeded, the content is truncated and appended by an ellipsis (`…`).
70
66
  */
@@ -5,7 +5,7 @@
5
5
  // 2. Different approaches are used for single and multiline texts because the latter approach
6
6
  // doesn't always work for single-line texts.
7
7
 
8
- .rootClampSingleLine {
8
+ .isRootClampSingleLine {
9
9
  display: block; // 2.
10
10
  overflow: hidden;
11
11
  text-overflow: ellipsis;
@@ -13,7 +13,7 @@
13
13
  }
14
14
 
15
15
  // stylelint-disable property-no-vendor-prefix, value-no-vendor-prefix
16
- .rootClampMultiLine {
16
+ .isRootClampMultiLine {
17
17
  display: -webkit-box; // 2.
18
18
  -webkit-line-clamp: var(--rui-custom-lines);
19
19
  -webkit-box-orient: vertical;
@@ -22,19 +22,19 @@
22
22
  }
23
23
  // stylelint-enable property-no-vendor-prefix, value-no-vendor-prefix
24
24
 
25
- .rootHyphensAuto {
25
+ .isRootHyphensAuto {
26
26
  hyphens: auto;
27
27
  }
28
28
 
29
- .rootHyphensManual {
29
+ .isRootHyphensManual {
30
30
  hyphens: manual;
31
31
  }
32
32
 
33
- .rootWordWrappingAnywhere {
33
+ .isRootWordWrappingAnywhere {
34
34
  word-break: break-all;
35
35
  }
36
36
 
37
- .rootWordWrappingLongWords {
37
+ .isRootWordWrappingLongWords {
38
38
  word-break: break-word; // 1.
39
39
  overflow-wrap: anywhere;
40
40
  }
@@ -1,10 +1,10 @@
1
1
  export const getRootClampClassName = (lines, styles) => {
2
2
  if (lines === 1) {
3
- return styles.rootClampSingleLine;
3
+ return styles.isRootClampSingleLine;
4
4
  }
5
5
 
6
6
  if (lines > 1) {
7
- return styles.rootClampMultiLine;
7
+ return styles.isRootClampMultiLine;
8
8
  }
9
9
 
10
10
  return null;
@@ -1,10 +1,10 @@
1
1
  export const getRootHyphensClassName = (hyphens, styles) => {
2
2
  if (hyphens === 'auto') {
3
- return styles.rootHyphensAuto;
3
+ return styles.isRootHyphensAuto;
4
4
  }
5
5
 
6
6
  if (hyphens === 'manual') {
7
- return styles.rootHyphensManual;
7
+ return styles.isRootHyphensManual;
8
8
  }
9
9
 
10
10
  return null;
@@ -1,10 +1,10 @@
1
1
  export const getRootWordWrappingClassName = (wordWrapping, styles) => {
2
2
  if (wordWrapping === 'anywhere') {
3
- return styles.rootWordWrappingAnywhere;
3
+ return styles.isRootWordWrappingAnywhere;
4
4
  }
5
5
 
6
6
  if (wordWrapping === 'long-words') {
7
- return styles.rootWordWrappingLongWords;
7
+ return styles.isRootWordWrappingLongWords;
8
8
  }
9
9
 
10
10
  return null;
@@ -142,31 +142,6 @@ to achieve that effect.
142
142
  />
143
143
  </Playground>
144
144
 
145
- ## Forwarding HTML Attributes
146
-
147
- When you want to improve the accessibility of your text fields even further, you
148
- can **add whatever HTML attribute you like.** All attributes that don't
149
- interfere with [component's API](#api) are forwarded to the native HTML input.
150
-
151
- <Playground>
152
- <TextArea
153
- label="Address"
154
- autoComplete="street-address"
155
- minLength={3}
156
- maxLength={80}
157
- />
158
- <TextArea
159
- label="Address"
160
- variant="filled"
161
- autoComplete="street-address"
162
- minLength={3}
163
- maxLength={80}
164
- />
165
- </Playground>
166
-
167
- 👉 Refer to the MDN reference for the full list of
168
- [supported attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#Attributes).
169
-
170
145
  ## Invisible Label
171
146
 
172
147
  In some cases, it may be convenient to visually hide the field label. The label
@@ -346,12 +321,38 @@ It's possible to disable the whole input.
346
321
  />
347
322
  </Playground>
348
323
 
349
- ## API
324
+ ## Forwarding HTML Attributes
350
325
 
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).
326
+ In addition to the options below in the [component's API](#api) section, you
327
+ can specify [React synthetic events] or you can **add whatever HTML attribute
328
+ you like.** All attributes that don't interfere with the API are forwarded to
329
+ the native HTML `<textarea>`. This enables making the component interactive and
330
+ to helps to improve its accessibility.
331
+
332
+ <Playground>
333
+ <TextArea
334
+ label="Address"
335
+ autoComplete="street-address"
336
+ minLength={3}
337
+ maxLength={80}
338
+ />
339
+ <TextArea
340
+ label="Address"
341
+ variant="filled"
342
+ autoComplete="street-address"
343
+ minLength={3}
344
+ maxLength={80}
345
+ />
346
+ </Playground>
347
+
348
+ 👉 Refer to the MDN reference for the full list of supported attributes of the
349
+ [textarea] element.
350
+
351
+ ## Forwarding ref
352
+
353
+ If you provide [ref], it is forwarded to the native HTML `<textarea>` element.
354
+
355
+ ## API
355
356
 
356
357
  <Props table of={TextArea} />
357
358
 
@@ -361,3 +362,5 @@ Head to [Forms Theming](/customize/theming/forms) to see shared form theming
361
362
  options.
362
363
 
363
364
  [React synthetic events]: https://reactjs.org/docs/events.html
365
+ [textarea]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#attributes
366
+ [ref]: https://reactjs.org/docs/refs-and-the-dom.html