@react-ui-org/react-ui 0.42.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +44 -25
- package/README.md +1 -1
- package/dist/lib.development.js +1598 -652
- package/dist/lib.js +1 -9
- package/package.json +49 -48
- package/src/lib/components/{ui/Alert → Alert}/Alert.jsx +17 -14
- package/src/lib/components/{ui/Alert → Alert}/Alert.scss +3 -3
- package/src/lib/components/{ui/Alert → Alert}/README.mdx +6 -6
- package/src/lib/components/{ui/Alert → Alert}/_settings.scss +1 -1
- package/src/lib/components/{ui/Alert → Alert}/_theme.scss +0 -0
- package/src/lib/components/{ui/Alert → Alert}/_tools.scss +0 -0
- package/src/lib/components/{ui/Alert → Alert}/index.js +0 -0
- package/src/lib/components/{ui/Badge → Badge}/Badge.jsx +2 -2
- package/src/lib/components/{ui/Badge → Badge}/Badge.scss +3 -3
- package/src/lib/components/{ui/Badge → Badge}/README.mdx +3 -3
- package/src/lib/components/{ui/Badge → Badge}/index.js +0 -0
- package/src/lib/components/Button/Button.jsx +198 -0
- package/src/lib/components/{ui/Button → Button}/Button.scss +0 -0
- package/src/lib/components/{ui/Button → Button}/README.mdx +160 -75
- package/src/lib/components/Button/_base.scss +148 -0
- package/src/lib/components/{ui/Button → Button}/_priorities.scss +0 -4
- package/src/lib/components/{ui/Button → Button}/_settings.scss +2 -3
- package/src/lib/components/{ui/Button → Button}/_theme.scss +3 -11
- package/src/lib/components/{ui/Button → Button}/_tools.scss +27 -44
- package/src/lib/components/Button/helpers/getRootLabelVisibilityClassName.js +33 -0
- package/src/lib/components/{ui/Button → Button}/helpers/getRootPriorityClassName.js +0 -4
- package/src/lib/components/{ui/Button → Button}/index.js +0 -0
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.jsx +9 -11
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.scss +0 -0
- package/src/lib/components/ButtonGroup/ButtonGroupContext.js +3 -0
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/README.mdx +26 -2
- package/src/lib/components/ButtonGroup/index.js +2 -0
- package/src/lib/components/{layout/CTA → CTA}/CTA.jsx +5 -2
- package/src/lib/components/{layout/CTA → CTA}/CTA.scss +2 -2
- package/src/lib/components/{layout/CTA → CTA}/CTACenter.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/CTAEnd.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/CTAStart.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/README.mdx +3 -3
- package/src/lib/components/{layout/CTA → CTA}/index.js +0 -0
- package/src/lib/components/{ui/Card → Card}/Card.jsx +6 -4
- package/src/lib/components/{ui/Card → Card}/Card.scss +1 -1
- package/src/lib/components/{ui/Card → Card}/CardBody.jsx +1 -1
- package/src/lib/components/{ui/Card → Card}/CardFooter.jsx +1 -1
- package/src/lib/components/{ui/Card → Card}/README.mdx +2 -2
- package/src/lib/components/{ui/Card → Card}/_theme.scss +0 -0
- package/src/lib/components/{ui/Card → Card}/_tools.scss +0 -0
- package/src/lib/components/{ui/Card → Card}/index.js +0 -0
- package/src/lib/components/{layout/Center → Center}/Center.jsx +1 -1
- package/src/lib/components/{layout/Center → Center}/Center.scss +0 -0
- package/src/lib/components/{layout/Center → Center}/README.mdx +2 -2
- package/src/lib/components/{layout/Center → Center}/index.js +0 -0
- package/src/lib/components/CheckboxField/CheckboxField.jsx +164 -0
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/CheckboxField.scss +5 -5
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/README.mdx +15 -12
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/index.js +0 -0
- package/src/lib/components/FileInputField/FileInputField.jsx +162 -0
- package/src/lib/components/{ui/FileInputField → FileInputField}/FileInputField.scss +5 -5
- package/src/lib/components/{ui/FileInputField → FileInputField}/README.mdx +8 -6
- package/src/lib/components/{ui/FileInputField → FileInputField}/index.js +0 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.jsx +16 -18
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.scss +3 -3
- package/src/lib/components/FormLayout/FormLayoutContext.js +3 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.jsx +33 -30
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.scss +4 -4
- package/src/lib/components/{layout/FormLayout → FormLayout}/README.mdx +30 -40
- package/src/lib/components/{layout/FormLayout → FormLayout}/_theme.scss +0 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/index.js +1 -0
- package/src/lib/components/{layout/Grid → Grid}/Grid.jsx +23 -5
- package/src/lib/components/{layout/Grid → Grid}/Grid.scss +2 -4
- package/src/lib/components/{layout/Grid → Grid}/GridSpan.jsx +10 -3
- package/src/lib/components/{layout/Grid → Grid}/README.mdx +42 -38
- package/src/lib/components/{layout/Grid → Grid}/_theme.scss +1 -2
- package/src/lib/components/{layout/Grid → Grid}/_tools.scss +2 -2
- package/src/lib/components/{layout/Grid → Grid}/helpers/generateResponsiveCustomProperties.js +0 -0
- package/src/lib/components/{layout/Grid → Grid}/index.js +0 -0
- package/src/lib/components/Link/Link.jsx +45 -0
- package/src/lib/components/Link/Link.scss +11 -0
- package/src/lib/components/Link/README.mdx +85 -0
- package/src/lib/components/Link/_theme.scss +4 -0
- package/src/lib/components/Link/index.js +1 -0
- package/src/lib/components/{layout/List → List}/List.jsx +1 -1
- package/src/lib/components/{layout/List → List}/List.scss +2 -2
- package/src/lib/components/{layout/List → List}/ListItem.jsx +1 -1
- package/src/lib/components/{layout/List → List}/README.mdx +2 -2
- package/src/lib/components/{layout/List → List}/_theme.scss +0 -0
- package/src/lib/components/{layout/List → List}/index.js +0 -0
- package/src/lib/components/{layout/Media → Media}/Media.jsx +4 -2
- package/src/lib/components/{layout/Media → Media}/Media.scss +1 -1
- package/src/lib/components/{layout/Media → Media}/MediaBody.jsx +1 -1
- package/src/lib/components/{layout/Media → Media}/MediaObject.jsx +1 -1
- package/src/lib/components/{layout/Media → Media}/README.mdx +2 -2
- package/src/lib/components/{layout/Media → Media}/index.js +0 -0
- package/src/lib/components/{ui/Modal → Modal}/Modal.jsx +28 -27
- package/src/lib/components/{ui/Modal → Modal}/Modal.scss +5 -5
- package/src/lib/components/{ui/Modal → Modal}/README.mdx +40 -40
- package/src/lib/components/{ui/Modal → Modal}/_settings.scss +4 -4
- package/src/lib/components/{ui/Modal → Modal}/_theme.scss +0 -0
- package/src/lib/components/{ui/Modal → Modal}/index.js +0 -0
- package/src/lib/components/{ui/Paper → Paper}/Paper.jsx +8 -1
- package/src/lib/components/{ui/Paper → Paper}/Paper.scss +5 -0
- package/src/lib/components/{ui/Paper → Paper}/README.mdx +14 -2
- package/src/lib/components/{ui/Paper → Paper}/_theme.scss +2 -0
- package/src/lib/components/{ui/Paper → Paper}/index.js +0 -0
- package/src/lib/components/{ui/Radio → Radio}/README.mdx +17 -14
- package/src/lib/components/Radio/Radio.jsx +188 -0
- package/src/lib/components/{ui/Radio → Radio}/Radio.scss +9 -9
- package/src/lib/components/{ui/Radio → Radio}/index.js +0 -0
- package/src/lib/components/{ui/ScrollView → ScrollView}/README.mdx +10 -10
- package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.jsx +9 -10
- package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.scss +6 -6
- package/src/lib/components/{ui/ScrollView → ScrollView}/_theme.scss +0 -0
- package/src/lib/components/{ui/ScrollView → ScrollView}/index.js +0 -0
- package/src/lib/components/{ui/SelectField → SelectField}/README.mdx +44 -41
- package/src/lib/components/SelectField/SelectField.jsx +219 -0
- package/src/lib/components/{ui/SelectField → SelectField}/SelectField.scss +6 -6
- package/src/lib/components/{ui/SelectField → SelectField}/index.js +0 -0
- package/src/lib/components/{ui/Table → Table}/README.mdx +7 -7
- package/src/lib/components/{ui/Table → Table}/Table.jsx +9 -13
- package/src/lib/components/{ui/Table → Table}/Table.scss +1 -1
- package/src/lib/components/{ui/Table → Table}/_settings.scss +4 -4
- package/src/lib/components/{ui/Table → Table}/index.js +0 -0
- package/src/lib/components/{ui/Tabs → Tabs}/README.mdx +3 -3
- package/src/lib/components/{ui/Tabs → Tabs}/Tabs.jsx +4 -4
- package/src/lib/components/{ui/Tabs → Tabs}/Tabs.scss +1 -1
- package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.jsx +4 -3
- package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.scss +3 -3
- package/src/lib/components/{ui/Tabs → Tabs}/_theme.scss +0 -0
- package/src/lib/components/{ui/Tabs → Tabs}/index.js +0 -0
- package/src/lib/components/{ui/Text → Text}/README.mdx +19 -19
- package/src/lib/components/{ui/Text → Text}/Text.jsx +1 -1
- package/src/lib/components/{ui/Text → Text}/Text.scss +0 -0
- package/src/lib/components/{ui/Text → Text}/helpers/getRootHyphensClassName.js +0 -0
- package/src/lib/components/{ui/Text → Text}/helpers/getRootWordWrappingClassName.js +0 -0
- package/src/lib/components/{ui/Text → Text}/index.js +0 -0
- package/src/lib/components/{ui/TextArea → TextArea}/README.mdx +8 -6
- package/src/lib/components/{ui/TextArea → TextArea}/TextArea.jsx +78 -78
- package/src/lib/components/{ui/TextArea → TextArea}/TextArea.scss +6 -6
- package/src/lib/components/{ui/TextArea → TextArea}/index.js +0 -0
- package/src/lib/components/{ui/TextField → TextField}/README.mdx +7 -6
- package/src/lib/components/{ui/TextField → TextField}/TextField.jsx +20 -23
- package/src/lib/components/{ui/TextField → TextField}/TextField.scss +6 -6
- package/src/lib/components/{ui/TextField → TextField}/index.js +0 -0
- package/src/lib/components/{ui/Toggle → Toggle}/README.mdx +15 -12
- package/src/lib/components/Toggle/Toggle.jsx +163 -0
- package/src/lib/components/{ui/Toggle → Toggle}/Toggle.scss +5 -5
- package/src/lib/components/{ui/Toggle → Toggle}/index.js +0 -0
- package/src/lib/components/{layout/Toolbar → Toolbar}/README.mdx +26 -26
- package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.scss +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarGroup.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarItem.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/_theme.scss +0 -0
- package/src/lib/components/{layout/Toolbar → Toolbar}/index.js +0 -0
- package/src/lib/components/{ui/withForwardedRef.jsx → withForwardedRef.jsx} +0 -0
- package/src/lib/helpers/resolveContextOrProp.js +7 -0
- package/src/lib/index.js +34 -35
- package/src/lib/styles/tools/_accessibility.scss +9 -0
- package/src/lib/theme.scss +25 -7
- package/src/lib/components/ui/Button/Button.jsx +0 -191
- package/src/lib/components/ui/Button/_base.scss +0 -154
- package/src/lib/components/ui/Button/helpers/getRootLabelVisibilityClassName.js +0 -11
- package/src/lib/components/ui/ButtonGroup/index.js +0 -1
- package/src/lib/components/ui/CheckboxField/CheckboxField.jsx +0 -173
- package/src/lib/components/ui/FileInputField/FileInputField.jsx +0 -158
- package/src/lib/components/ui/Radio/Radio.jsx +0 -179
- package/src/lib/components/ui/SelectField/SelectField.jsx +0 -214
- package/src/lib/components/ui/Toggle/Toggle.jsx +0 -174
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import PropTypes from 'prop-types';
|
|
2
|
+
import React, { useContext } from 'react';
|
|
3
|
+
import getRootValidationStateClassName from '../../helpers/getRootValidationStateClassName';
|
|
4
|
+
import { resolveContextOrProp } from '../../helpers/resolveContextOrProp';
|
|
5
|
+
import { withProviderContext } from '../../provider';
|
|
6
|
+
import transferProps from '../../utils/transferProps';
|
|
7
|
+
import { FormLayoutContext } from '../FormLayout';
|
|
8
|
+
import withForwardedRef from '../withForwardedRef';
|
|
9
|
+
import styles from './FileInputField.scss';
|
|
10
|
+
|
|
11
|
+
export const FileInputField = ({
|
|
12
|
+
disabled,
|
|
13
|
+
forwardedRef,
|
|
14
|
+
fullWidth,
|
|
15
|
+
helpText,
|
|
16
|
+
id,
|
|
17
|
+
isLabelVisible,
|
|
18
|
+
label,
|
|
19
|
+
layout,
|
|
20
|
+
required,
|
|
21
|
+
validationState,
|
|
22
|
+
validationText,
|
|
23
|
+
...restProps
|
|
24
|
+
}) => {
|
|
25
|
+
const context = useContext(FormLayoutContext);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<label
|
|
29
|
+
className={[
|
|
30
|
+
styles.root,
|
|
31
|
+
fullWidth ? styles.isRootFullWidth : '',
|
|
32
|
+
context ? styles.isRootInFormLayout : '',
|
|
33
|
+
resolveContextOrProp(context && context.layout, layout) === 'horizontal'
|
|
34
|
+
? styles.rootLayoutHorizontal
|
|
35
|
+
: styles.rootLayoutVertical,
|
|
36
|
+
disabled ? styles.isRootDisabled : '',
|
|
37
|
+
required ? styles.isRootRequired : '',
|
|
38
|
+
getRootValidationStateClassName(validationState, styles),
|
|
39
|
+
].join(' ')}
|
|
40
|
+
htmlFor={id}
|
|
41
|
+
id={id && `${id}__label`}
|
|
42
|
+
>
|
|
43
|
+
<div
|
|
44
|
+
className={[
|
|
45
|
+
styles.label,
|
|
46
|
+
isLabelVisible ? '' : styles.isLabelHidden,
|
|
47
|
+
].join(' ')}
|
|
48
|
+
id={id && `${id}__labelText`}
|
|
49
|
+
>
|
|
50
|
+
{label}
|
|
51
|
+
</div>
|
|
52
|
+
<div className={styles.field}>
|
|
53
|
+
<div className={styles.inputContainer}>
|
|
54
|
+
<input
|
|
55
|
+
{...transferProps(restProps)}
|
|
56
|
+
className={styles.input}
|
|
57
|
+
disabled={disabled}
|
|
58
|
+
id={id}
|
|
59
|
+
ref={forwardedRef}
|
|
60
|
+
required={required}
|
|
61
|
+
type="file"
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
{helpText && (
|
|
65
|
+
<div
|
|
66
|
+
className={styles.helpText}
|
|
67
|
+
id={id && `${id}__helpText`}
|
|
68
|
+
>
|
|
69
|
+
{helpText}
|
|
70
|
+
</div>
|
|
71
|
+
)}
|
|
72
|
+
{validationText && (
|
|
73
|
+
<div
|
|
74
|
+
className={styles.validationText}
|
|
75
|
+
id={id && `${id}__validationText`}
|
|
76
|
+
>
|
|
77
|
+
{validationText}
|
|
78
|
+
</div>
|
|
79
|
+
)}
|
|
80
|
+
</div>
|
|
81
|
+
</label>
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
FileInputField.defaultProps = {
|
|
86
|
+
disabled: false,
|
|
87
|
+
forwardedRef: undefined,
|
|
88
|
+
fullWidth: false,
|
|
89
|
+
helpText: null,
|
|
90
|
+
id: undefined,
|
|
91
|
+
isLabelVisible: true,
|
|
92
|
+
layout: 'vertical',
|
|
93
|
+
required: false,
|
|
94
|
+
validationState: null,
|
|
95
|
+
validationText: null,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
FileInputField.propTypes = {
|
|
99
|
+
/**
|
|
100
|
+
* If `true`, the input will be disabled.
|
|
101
|
+
*/
|
|
102
|
+
disabled: PropTypes.bool,
|
|
103
|
+
/**
|
|
104
|
+
* Reference forwarded to the `input` element.
|
|
105
|
+
*/
|
|
106
|
+
forwardedRef: PropTypes.oneOfType([
|
|
107
|
+
PropTypes.func,
|
|
108
|
+
// eslint-disable-next-line react/forbid-prop-types
|
|
109
|
+
PropTypes.shape({ current: PropTypes.any }),
|
|
110
|
+
]),
|
|
111
|
+
/**
|
|
112
|
+
* If `true`, the field will span the full width of its parent.
|
|
113
|
+
*/
|
|
114
|
+
fullWidth: PropTypes.bool,
|
|
115
|
+
/**
|
|
116
|
+
* Optional help text.
|
|
117
|
+
*/
|
|
118
|
+
helpText: PropTypes.node,
|
|
119
|
+
/**
|
|
120
|
+
* ID of the `<input>` HTML element.
|
|
121
|
+
*
|
|
122
|
+
* Also serves as base for ids of nested elements:
|
|
123
|
+
* * `<ID>__label`
|
|
124
|
+
* * `<ID>__labelText`
|
|
125
|
+
* * `<ID>__helpText`
|
|
126
|
+
* * `<ID>__validationText`
|
|
127
|
+
*/
|
|
128
|
+
id: PropTypes.string,
|
|
129
|
+
/**
|
|
130
|
+
* If `false`, the label will be visually hidden (but remains accessible by assistive
|
|
131
|
+
* technologies).
|
|
132
|
+
*/
|
|
133
|
+
isLabelVisible: PropTypes.bool,
|
|
134
|
+
/**
|
|
135
|
+
* Text field label.
|
|
136
|
+
*/
|
|
137
|
+
label: PropTypes.string.isRequired,
|
|
138
|
+
/**
|
|
139
|
+
* Layout of the field.
|
|
140
|
+
*
|
|
141
|
+
* Ignored if the component is rendered within `FormLayout` component
|
|
142
|
+
* as the value is inherited in such case.
|
|
143
|
+
*
|
|
144
|
+
*/
|
|
145
|
+
layout: PropTypes.oneOf(['horizontal', 'vertical']),
|
|
146
|
+
/**
|
|
147
|
+
* If `true`, the input will be required.
|
|
148
|
+
*/
|
|
149
|
+
required: PropTypes.bool,
|
|
150
|
+
/**
|
|
151
|
+
* Alter the field to provide feedback based on validation result.
|
|
152
|
+
*/
|
|
153
|
+
validationState: PropTypes.oneOf(['invalid', 'valid', 'warning']),
|
|
154
|
+
/**
|
|
155
|
+
* Validation message to be displayed.
|
|
156
|
+
*/
|
|
157
|
+
validationText: PropTypes.node,
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const FileInputFieldWithContext = withForwardedRef(withProviderContext(FileInputField, 'FileInputField'));
|
|
161
|
+
|
|
162
|
+
export default FileInputFieldWithContext;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
@use '
|
|
2
|
-
@use '
|
|
3
|
-
@use '
|
|
4
|
-
@use '
|
|
5
|
-
@use '
|
|
1
|
+
@use '../../styles/tools/form-fields/box-field-elements';
|
|
2
|
+
@use '../../styles/tools/form-fields/box-field-layout';
|
|
3
|
+
@use '../../styles/tools/form-fields/foundation';
|
|
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: FileInputField
|
|
3
|
-
menu: '
|
|
4
|
-
route: /components/
|
|
3
|
+
menu: 'Inputs'
|
|
4
|
+
route: /components/file-input-field
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# FileInputField
|
|
@@ -189,10 +189,10 @@ It's possible to disable the whole input.
|
|
|
189
189
|
|
|
190
190
|
## API
|
|
191
191
|
|
|
192
|
-
In addition to the options below, you can
|
|
193
|
-
interfere with the API, and they will be
|
|
194
|
-
|
|
195
|
-
[accessibility](#forwarding-html-attributes).
|
|
192
|
+
In addition to the options below, you can specify [React synthetic events] or
|
|
193
|
+
any custom HTML attributes that do not interfere with the API, and they will be
|
|
194
|
+
passed to the `input` HTML element. This enables making the component
|
|
195
|
+
interactive and helps improve its [accessibility](#forwarding-html-attributes).
|
|
196
196
|
|
|
197
197
|
<Props table of={FileInputField} />
|
|
198
198
|
|
|
@@ -200,3 +200,5 @@ This is useful mainly to improve component's
|
|
|
200
200
|
|
|
201
201
|
Head to [Forms Theming](/customize/theming/forms) to see shared form theming
|
|
202
202
|
options.
|
|
203
|
+
|
|
204
|
+
[React synthetic events]: https://reactjs.org/docs/events.html
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import flattenChildren from 'react-keyed-flatten-children';
|
|
2
1
|
import PropTypes from 'prop-types';
|
|
3
2
|
import React from 'react';
|
|
4
|
-
import { withProviderContext } from '
|
|
3
|
+
import { withProviderContext } from '../../provider';
|
|
4
|
+
import { FormLayoutContext } from './FormLayoutContext';
|
|
5
5
|
import styles from './FormLayout.scss';
|
|
6
6
|
|
|
7
7
|
const PREDEFINED_LABEL_WIDTH_VALUES = ['auto', 'default', 'limited'];
|
|
@@ -56,20 +56,11 @@ export const FormLayout = (props) => {
|
|
|
56
56
|
].join(' ')}
|
|
57
57
|
{...hasCustomLabelWidth ? { style: { '--rui-custom-label-width': labelWidth } } : {}}
|
|
58
58
|
>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (!React.isValidElement(child)) {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return React.cloneElement(child, {
|
|
69
|
-
inFormLayout: true,
|
|
70
|
-
layout: fieldLayout,
|
|
71
|
-
});
|
|
72
|
-
})}
|
|
59
|
+
<FormLayoutContext.Provider
|
|
60
|
+
value={{ layout: fieldLayout }}
|
|
61
|
+
>
|
|
62
|
+
{children}
|
|
63
|
+
</FormLayoutContext.Provider>
|
|
73
64
|
</div>
|
|
74
65
|
);
|
|
75
66
|
};
|
|
@@ -88,8 +79,15 @@ FormLayout.propTypes = {
|
|
|
88
79
|
*/
|
|
89
80
|
autoWidth: PropTypes.bool,
|
|
90
81
|
/**
|
|
91
|
-
* Supported form field components:
|
|
92
|
-
*
|
|
82
|
+
* Supported form field components:
|
|
83
|
+
* * `CheckboxField`
|
|
84
|
+
* * `FileInputField`
|
|
85
|
+
* * `FormLayoutCustomField`
|
|
86
|
+
* * `Radio`
|
|
87
|
+
* * `SelectField`
|
|
88
|
+
* * `TextArea`
|
|
89
|
+
* * `TextField`
|
|
90
|
+
* * `Toggle`
|
|
93
91
|
*/
|
|
94
92
|
children: PropTypes.node,
|
|
95
93
|
/**
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
// (a global default which can be customised per use).
|
|
14
14
|
// https://github.com/react-ui-org/react-ui/issues/232
|
|
15
15
|
|
|
16
|
-
@use '
|
|
17
|
-
@use '
|
|
18
|
-
@use '
|
|
16
|
+
@use '../../styles/settings/forms';
|
|
17
|
+
@use '../../styles/tools/breakpoint';
|
|
18
|
+
@use '../../styles/tools/spacing';
|
|
19
19
|
@use 'theme';
|
|
20
20
|
|
|
21
21
|
.root {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import PropTypes from 'prop-types';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import getRootSizeClassName from '
|
|
4
|
-
import getRootValidationStateClassName from '
|
|
5
|
-
import { withProviderContext } from '
|
|
2
|
+
import React, { useContext } from 'react';
|
|
3
|
+
import getRootSizeClassName from '../../helpers/getRootSizeClassName';
|
|
4
|
+
import getRootValidationStateClassName from '../../helpers/getRootValidationStateClassName';
|
|
5
|
+
import { withProviderContext } from '../../provider';
|
|
6
6
|
import styles from './FormLayoutCustomField.scss';
|
|
7
|
+
import { FormLayoutContext } from './FormLayoutContext';
|
|
7
8
|
|
|
8
9
|
const renderLabel = (id, label, labelForId) => {
|
|
9
10
|
if (labelForId && label) {
|
|
@@ -40,31 +41,34 @@ export const FormLayoutCustomField = ({
|
|
|
40
41
|
innerFieldSize,
|
|
41
42
|
label,
|
|
42
43
|
labelForId,
|
|
43
|
-
layout,
|
|
44
44
|
required,
|
|
45
45
|
validationState,
|
|
46
|
-
}) =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
styles.root,
|
|
51
|
-
fullWidth ? styles.isRootFullWidth : '',
|
|
52
|
-
layout === 'vertical' ? styles.rootLayoutVertical : styles.rootLayoutHorizontal,
|
|
53
|
-
disabled ? styles.isRootDisabled : '',
|
|
54
|
-
required ? styles.isRootRequired : '',
|
|
55
|
-
getRootSizeClassName(innerFieldSize, styles),
|
|
56
|
-
getRootValidationStateClassName(validationState, styles),
|
|
57
|
-
].join(' ')}
|
|
58
|
-
>
|
|
59
|
-
{renderLabel(id, label, labelForId)}
|
|
46
|
+
}) => {
|
|
47
|
+
const context = useContext(FormLayoutContext);
|
|
48
|
+
|
|
49
|
+
return (
|
|
60
50
|
<div
|
|
61
|
-
id={id
|
|
62
|
-
className={
|
|
51
|
+
id={id}
|
|
52
|
+
className={[
|
|
53
|
+
styles.root,
|
|
54
|
+
fullWidth ? styles.isRootFullWidth : '',
|
|
55
|
+
context && context.layout === 'horizontal' ? styles.rootLayoutHorizontal : styles.rootLayoutVertical,
|
|
56
|
+
disabled ? styles.isRootDisabled : '',
|
|
57
|
+
required ? styles.isRootRequired : '',
|
|
58
|
+
getRootSizeClassName(innerFieldSize, styles),
|
|
59
|
+
getRootValidationStateClassName(validationState, styles),
|
|
60
|
+
].join(' ')}
|
|
63
61
|
>
|
|
64
|
-
{
|
|
62
|
+
{renderLabel(id, label, labelForId)}
|
|
63
|
+
<div
|
|
64
|
+
id={id && `${id}__field`}
|
|
65
|
+
className={styles.field}
|
|
66
|
+
>
|
|
67
|
+
{children}
|
|
68
|
+
</div>
|
|
65
69
|
</div>
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
);
|
|
71
|
+
};
|
|
68
72
|
|
|
69
73
|
FormLayoutCustomField.defaultProps = {
|
|
70
74
|
children: null,
|
|
@@ -74,7 +78,6 @@ FormLayoutCustomField.defaultProps = {
|
|
|
74
78
|
innerFieldSize: null,
|
|
75
79
|
label: null,
|
|
76
80
|
labelForId: undefined,
|
|
77
|
-
layout: 'vertical',
|
|
78
81
|
required: false,
|
|
79
82
|
validationState: null,
|
|
80
83
|
};
|
|
@@ -94,6 +97,10 @@ FormLayoutCustomField.propTypes = {
|
|
|
94
97
|
fullWidth: PropTypes.bool,
|
|
95
98
|
/**
|
|
96
99
|
* ID of the root HTML element.
|
|
100
|
+
*
|
|
101
|
+
* Also serves as base for ids of nested elements:
|
|
102
|
+
* * `<ID>__field`
|
|
103
|
+
* * `<ID>__label`
|
|
97
104
|
*/
|
|
98
105
|
id: PropTypes.string,
|
|
99
106
|
/**
|
|
@@ -105,13 +112,9 @@ FormLayoutCustomField.propTypes = {
|
|
|
105
112
|
*/
|
|
106
113
|
label: PropTypes.string,
|
|
107
114
|
/**
|
|
108
|
-
* Optional ID of
|
|
115
|
+
* Optional ID of labeled field to keep accessibility features. Only available if `label` is set.
|
|
109
116
|
*/
|
|
110
117
|
labelForId: PropTypes.string,
|
|
111
|
-
/**
|
|
112
|
-
* Layout of the field, controlled by parent FormLayout.
|
|
113
|
-
*/
|
|
114
|
-
layout: PropTypes.oneOf(['horizontal', 'vertical']),
|
|
115
118
|
/**
|
|
116
119
|
* If `true`, label will be styled as required.
|
|
117
120
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
@use '
|
|
2
|
-
@use '
|
|
3
|
-
@use '
|
|
4
|
-
@use '
|
|
1
|
+
@use '../../styles/tools/form-fields/foundation';
|
|
2
|
+
@use '../../styles/tools/form-fields/box-field-layout';
|
|
3
|
+
@use '../../styles/tools/form-fields/box-field-sizes';
|
|
4
|
+
@use '../../styles/tools/form-fields/variants';
|
|
5
5
|
|
|
6
6
|
// Foundation
|
|
7
7
|
.root {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: FormLayout
|
|
3
3
|
menu: 'Layouts'
|
|
4
|
-
route: /components/
|
|
4
|
+
route: /components/form-layout
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# FormLayout
|
|
@@ -12,16 +12,16 @@ import {
|
|
|
12
12
|
Playground,
|
|
13
13
|
Props,
|
|
14
14
|
} from 'docz'
|
|
15
|
-
import { Placeholder } from '
|
|
16
|
-
import { Button } from '
|
|
17
|
-
import { ButtonGroup } from '
|
|
18
|
-
import { CheckboxField } from '
|
|
19
|
-
import { FileInputField } from '
|
|
20
|
-
import { Radio } from '
|
|
21
|
-
import { SelectField } from '
|
|
22
|
-
import { TextArea } from '
|
|
23
|
-
import { TextField } from '
|
|
24
|
-
import { Toggle } from '
|
|
15
|
+
import { Placeholder } from '../../../docs/_components/Placeholder/Placeholder'
|
|
16
|
+
import { Button } from '../Button/Button'
|
|
17
|
+
import { ButtonGroup } from '../ButtonGroup/ButtonGroup'
|
|
18
|
+
import { CheckboxField } from '../CheckboxField/CheckboxField'
|
|
19
|
+
import { FileInputField } from '../FileInputField/FileInputField'
|
|
20
|
+
import { Radio } from '../Radio/Radio'
|
|
21
|
+
import { SelectField } from '../SelectField/SelectField'
|
|
22
|
+
import { TextArea } from '../TextArea/TextArea'
|
|
23
|
+
import { TextField } from '../TextField/TextField'
|
|
24
|
+
import { Toggle } from '../Toggle/Toggle'
|
|
25
25
|
import { Center } from '../Center/Center'
|
|
26
26
|
import { Toolbar } from '../Toolbar/Toolbar'
|
|
27
27
|
import { ToolbarItem } from '../Toolbar/ToolbarItem'
|
|
@@ -135,7 +135,7 @@ with CSS custom properties.
|
|
|
135
135
|
- The `custom` mode (local) allows you to enter any **custom label width for
|
|
136
136
|
individual FormLayouts.**
|
|
137
137
|
|
|
138
|
-
Try
|
|
138
|
+
📐 Try resizing the playground to see how individual options work.
|
|
139
139
|
|
|
140
140
|
<Playground>
|
|
141
141
|
{() => {
|
|
@@ -150,37 +150,35 @@ Try to resize the playground to see how individual options work.
|
|
|
150
150
|
<ToolbarItem>
|
|
151
151
|
<ButtonGroup aria-labelledby="#label-width-options-label">
|
|
152
152
|
<Button
|
|
153
|
-
label="default"
|
|
154
|
-
clickHandler={() => setLabelWidth('default')}
|
|
155
153
|
color={labelWidth === 'default' ? 'dark' : 'primary'}
|
|
154
|
+
label="default"
|
|
155
|
+
onClick={() => setLabelWidth('default')}
|
|
156
156
|
/>
|
|
157
157
|
<Button
|
|
158
|
-
label="auto"
|
|
159
|
-
clickHandler={() => setLabelWidth('auto')}
|
|
160
158
|
color={labelWidth === 'auto' ? 'dark' : 'primary'}
|
|
159
|
+
label="auto"
|
|
160
|
+
onClick={() => setLabelWidth('auto')}
|
|
161
161
|
/>
|
|
162
162
|
<Button
|
|
163
|
-
label="limited"
|
|
164
|
-
clickHandler={() => setLabelWidth('limited')}
|
|
165
163
|
color={labelWidth === 'limited' ? 'dark' : 'primary'}
|
|
164
|
+
label="limited"
|
|
165
|
+
onClick={() => setLabelWidth('limited')}
|
|
166
166
|
/>
|
|
167
167
|
<Button
|
|
168
|
-
label="custom"
|
|
169
|
-
clickHandler={() => setLabelWidth('custom')}
|
|
170
168
|
color={labelWidth === 'custom' ? 'dark' : 'primary'}
|
|
169
|
+
label="custom"
|
|
170
|
+
onClick={() => setLabelWidth('custom')}
|
|
171
171
|
/>
|
|
172
172
|
</ButtonGroup>
|
|
173
173
|
</ToolbarItem>
|
|
174
174
|
{labelWidth === 'custom' && (
|
|
175
175
|
<ToolbarItem>
|
|
176
176
|
<TextField
|
|
177
|
-
changeHandler={(e) => (
|
|
178
|
-
setCustomLabelWidth(e.target.value)
|
|
179
|
-
)}
|
|
180
177
|
inputSize={5}
|
|
181
178
|
isLabelVisible={false}
|
|
182
179
|
label="Custom label width"
|
|
183
180
|
layout="horizontal"
|
|
181
|
+
onChange={(e) => setCustomLabelWidth(e.target.value)}
|
|
184
182
|
value={customLabelWidth}
|
|
185
183
|
/>
|
|
186
184
|
</ToolbarItem>
|
|
@@ -340,9 +338,9 @@ properly vertically aligned.
|
|
|
340
338
|
</ToolbarItem>
|
|
341
339
|
<ToolbarItem>
|
|
342
340
|
<CheckboxField
|
|
343
|
-
changeHandler={() => setIsChecked(!isChecked)}
|
|
344
341
|
checked={isChecked}
|
|
345
342
|
label="Another form field"
|
|
343
|
+
onChange={() => setIsChecked(!isChecked)}
|
|
346
344
|
/>
|
|
347
345
|
</ToolbarItem>
|
|
348
346
|
</Toolbar>
|
|
@@ -383,14 +381,14 @@ This is a demo of all components supported by FormLayout.
|
|
|
383
381
|
<ToolbarItem>
|
|
384
382
|
<ButtonGroup>
|
|
385
383
|
<Button
|
|
386
|
-
label="Vertical layout"
|
|
387
|
-
clickHandler={() => setFieldLayout('vertical')}
|
|
388
384
|
color={fieldLayout === 'vertical' ? 'dark' : 'primary'}
|
|
385
|
+
label="Vertical layout"
|
|
386
|
+
onClick={() => setFieldLayout('vertical')}
|
|
389
387
|
/>
|
|
390
388
|
<Button
|
|
391
|
-
label="Horizontal layout"
|
|
392
|
-
clickHandler={() => setFieldLayout('horizontal')}
|
|
393
389
|
color={fieldLayout === 'horizontal' ? 'dark' : 'primary'}
|
|
390
|
+
label="Horizontal layout"
|
|
391
|
+
onClick={() => setFieldLayout('horizontal')}
|
|
394
392
|
/>
|
|
395
393
|
</ButtonGroup>
|
|
396
394
|
</ToolbarItem>
|
|
@@ -398,34 +396,28 @@ This is a demo of all components supported by FormLayout.
|
|
|
398
396
|
<FormLayout fieldLayout={fieldLayout} labelWidth="auto">
|
|
399
397
|
<>
|
|
400
398
|
<TextField
|
|
401
|
-
changeHandler={() => {}}
|
|
402
399
|
label="First Name"
|
|
403
400
|
/>
|
|
404
401
|
<TextField
|
|
405
|
-
changeHandler={() => {}}
|
|
406
402
|
label="Last Name"
|
|
407
403
|
/>
|
|
408
404
|
</>
|
|
409
405
|
<TextField
|
|
410
|
-
changeHandler={() => {}}
|
|
411
406
|
helpText="Optional"
|
|
412
407
|
label="Email address"
|
|
413
408
|
type="email"
|
|
414
409
|
/>
|
|
415
410
|
<>
|
|
416
411
|
<TextField
|
|
417
|
-
changeHandler={() => {}}
|
|
418
412
|
label="Address"
|
|
419
413
|
placeholder="Address line 1"
|
|
420
414
|
/>
|
|
421
415
|
<TextField
|
|
422
|
-
changeHandler={() => {}}
|
|
423
416
|
isLabelVisible={false}
|
|
424
417
|
label="Address 2"
|
|
425
418
|
placeholder="Address line 2"
|
|
426
419
|
/>
|
|
427
420
|
<TextField
|
|
428
|
-
changeHandler={() => {}}
|
|
429
421
|
inputSize={6}
|
|
430
422
|
label="ZIP"
|
|
431
423
|
validationState="invalid"
|
|
@@ -435,37 +427,35 @@ This is a demo of all components supported by FormLayout.
|
|
|
435
427
|
<span>Czech Republic</span>
|
|
436
428
|
</FormLayoutCustomField>
|
|
437
429
|
<CheckboxField
|
|
438
|
-
changeHandler={() => setIsDeliveryAddress(!isDeliveryAddress)}
|
|
439
430
|
checked={isDeliveryAddress}
|
|
440
431
|
label="This is my delivery address"
|
|
432
|
+
onChange={() => setIsDeliveryAddress(!isDeliveryAddress)}
|
|
441
433
|
/>
|
|
442
434
|
</>
|
|
443
435
|
<SelectField
|
|
444
|
-
changeHandler={(e) => setFruit(e.target.value)}
|
|
445
436
|
label="Your favourite fruit"
|
|
437
|
+
onChange={(e) => setFruit(e.target.value)}
|
|
446
438
|
options={options}
|
|
447
439
|
value={fruit}
|
|
448
440
|
/>
|
|
449
441
|
<TextArea
|
|
450
|
-
changeHandler={() => {}}
|
|
451
442
|
fullWidth
|
|
452
443
|
label="Message"
|
|
453
444
|
rows={3}
|
|
454
445
|
/>
|
|
455
446
|
<FileInputField
|
|
456
|
-
changeHandler={() => {}}
|
|
457
447
|
label="Attachment"
|
|
458
448
|
/>
|
|
459
449
|
<Toggle
|
|
460
|
-
changeHandler={() => setReceiveNewsletter(!receiveNewsletter)}
|
|
461
450
|
checked={receiveNewsletter}
|
|
462
451
|
helpText="Only once per week!"
|
|
463
452
|
label="Receive weekly newsletter"
|
|
453
|
+
onChange={() => setReceiveNewsletter(!receiveNewsletter)}
|
|
464
454
|
required
|
|
465
455
|
/>
|
|
466
456
|
<Radio
|
|
467
|
-
changeHandler={(e) => setFruit(e.target.value)}
|
|
468
457
|
label="And fruit again!"
|
|
458
|
+
onChange={(e) => setFruit(e.target.value)}
|
|
469
459
|
options={options}
|
|
470
460
|
value={fruit}
|
|
471
461
|
/>
|
|
File without changes
|