@react-ui-org/react-ui 0.54.0 → 0.55.1
Sign up to get free protection for your applications and to get access to all the features.
- package/.nvmrc +1 -0
- package/README.md +7 -5
- package/dist/react-ui.css +36 -38
- package/dist/react-ui.development.css +10021 -10523
- package/dist/react-ui.development.js +211 -231
- package/dist/react-ui.js +1 -1
- package/package.json +3 -2
- package/src/components/Alert/Alert.jsx +1 -1
- package/src/components/Alert/Alert.module.scss +100 -0
- package/src/components/Alert/README.md +9 -7
- package/src/components/Badge/Badge.jsx +1 -1
- package/src/components/Badge/Badge.module.scss +109 -0
- package/src/components/Badge/README.md +9 -7
- package/src/components/Button/Button.jsx +1 -1
- package/src/components/Button/README.md +9 -7
- package/src/components/Button/_base.scss +117 -115
- package/src/components/Button/_priorities.scss +135 -133
- package/src/components/ButtonGroup/ButtonGroup.jsx +1 -1
- package/src/components/ButtonGroup/ButtonGroup.module.scss +35 -0
- package/src/components/ButtonGroup/README.md +10 -8
- package/src/components/Card/Card.jsx +1 -1
- package/src/components/Card/Card.module.scss +72 -0
- package/src/components/Card/CardBody.jsx +1 -1
- package/src/components/Card/CardFooter.jsx +1 -1
- package/src/components/Card/README.md +9 -7
- package/src/components/CheckboxField/CheckboxField.jsx +1 -1
- package/src/components/CheckboxField/CheckboxField.module.scss +63 -0
- package/src/components/CheckboxField/README.md +10 -8
- package/src/components/FileInputField/FileInputField.jsx +1 -1
- package/src/components/FileInputField/FileInputField.module.scss +65 -0
- package/src/components/FileInputField/README.md +10 -8
- package/src/components/FormLayout/FormLayout.jsx +1 -1
- package/src/components/FormLayout/{FormLayout.scss → FormLayout.module.scss} +30 -28
- package/src/components/FormLayout/FormLayoutCustomField.jsx +1 -1
- package/src/components/FormLayout/FormLayoutCustomField.module.scss +65 -0
- package/src/components/FormLayout/README.md +11 -9
- package/src/components/Grid/Grid.jsx +1 -1
- package/src/components/Grid/Grid.module.scss +66 -0
- package/src/components/Grid/GridSpan.jsx +1 -1
- package/src/components/Grid/README.md +11 -8
- package/src/components/InputGroup/InputGroup.jsx +1 -1
- package/src/components/InputGroup/InputGroup.module.scss +93 -0
- package/src/components/InputGroup/README.md +10 -8
- package/src/components/Modal/Modal.jsx +1 -1
- package/src/components/Modal/Modal.module.scss +80 -0
- package/src/components/Modal/ModalBody.jsx +1 -1
- package/src/components/Modal/ModalBody.module.scss +20 -0
- package/src/components/Modal/ModalCloseButton.jsx +1 -1
- package/src/components/Modal/ModalCloseButton.module.scss +20 -0
- package/src/components/Modal/ModalContent.jsx +1 -1
- package/src/components/Modal/ModalContent.module.scss +7 -0
- package/src/components/Modal/ModalFooter.jsx +1 -1
- package/src/components/Modal/ModalFooter.module.scss +37 -0
- package/src/components/Modal/ModalHeader.jsx +1 -1
- package/src/components/Modal/ModalHeader.module.scss +32 -0
- package/src/components/Modal/ModalTitle.jsx +1 -1
- package/src/components/Modal/ModalTitle.module.scss +12 -0
- package/src/components/Modal/README.md +17 -14
- package/src/components/Paper/Paper.jsx +1 -1
- package/src/components/Paper/Paper.module.scss +19 -0
- package/src/components/Paper/README.md +9 -7
- package/src/components/Popover/Popover.jsx +1 -1
- package/src/components/Popover/Popover.module.scss +238 -0
- package/src/components/Popover/PopoverWrapper.jsx +1 -2
- package/src/components/Popover/PopoverWrapper.module.scss +5 -0
- package/src/components/Popover/README.md +9 -7
- package/src/components/Radio/README.md +12 -10
- package/src/components/Radio/Radio.jsx +1 -1
- package/src/components/Radio/Radio.module.scss +85 -0
- package/src/components/ScrollView/README.md +10 -8
- package/src/components/ScrollView/ScrollView.jsx +1 -1
- package/src/components/ScrollView/ScrollView.module.scss +233 -0
- package/src/components/SelectField/README.md +10 -8
- package/src/components/SelectField/SelectField.jsx +1 -1
- package/src/components/SelectField/SelectField.module.scss +111 -0
- package/src/components/Table/README.md +10 -8
- package/src/components/Table/Table.jsx +1 -1
- package/src/components/Table/Table.module.scss +30 -0
- package/src/components/Table/_components/TableBodyCell/TableBodyCell.jsx +1 -1
- package/src/components/Table/_components/TableCell.module.scss +28 -0
- package/src/components/Table/_components/TableHeaderCell/TableHeaderCell.jsx +1 -1
- package/src/components/Tabs/README.md +16 -10
- package/src/components/Tabs/Tabs.jsx +1 -1
- package/src/components/Tabs/Tabs.module.scss +31 -0
- package/src/components/Tabs/TabsItem.jsx +1 -1
- package/src/components/Tabs/TabsItem.module.scss +119 -0
- package/src/components/Text/README.md +15 -9
- package/src/components/Text/Text.jsx +1 -1
- package/src/components/Text/Text.module.scss +42 -0
- package/src/components/TextArea/README.md +10 -8
- package/src/components/TextArea/TextArea.jsx +1 -1
- package/src/components/TextArea/TextArea.module.scss +97 -0
- package/src/components/TextField/README.md +13 -8
- package/src/components/TextField/TextField.jsx +1 -1
- package/src/components/TextField/TextField.module.scss +109 -0
- package/src/components/TextLink/README.md +10 -8
- package/src/components/TextLink/TextLink.jsx +1 -1
- package/src/components/TextLink/TextLink.module.scss +18 -0
- package/src/components/Toggle/README.md +10 -8
- package/src/components/Toggle/Toggle.jsx +1 -1
- package/src/components/Toggle/Toggle.module.scss +63 -0
- package/src/components/Toolbar/README.md +9 -7
- package/src/components/Toolbar/Toolbar.jsx +1 -1
- package/src/components/Toolbar/Toolbar.module.scss +85 -0
- package/src/components/Toolbar/ToolbarGroup.jsx +1 -1
- package/src/components/Toolbar/ToolbarItem.jsx +1 -1
- package/src/components/_helpers/transferProps.js +46 -7
- package/src/foundation.scss +22 -17
- package/src/helpers.scss +12 -8
- package/src/index.js +3 -4
- package/src/index.scss +7 -0
- package/src/layers.scss +4 -0
- package/src/styles/elements/_page.scss +0 -4
- package/src/styles/helpers/_animation.scss +2 -2
- package/src/styles/tools/_utilities.scss +1 -1
- package/src/theme.scss +1040 -1038
- package/src/components/Alert/Alert.scss +0 -98
- package/src/components/Badge/Badge.scss +0 -107
- package/src/components/ButtonGroup/ButtonGroup.scss +0 -33
- package/src/components/Card/Card.scss +0 -70
- package/src/components/CheckboxField/CheckboxField.scss +0 -61
- package/src/components/FileInputField/FileInputField.scss +0 -63
- package/src/components/FormLayout/FormLayoutCustomField.scss +0 -63
- package/src/components/Grid/Grid.scss +0 -63
- package/src/components/InputGroup/InputGroup.scss +0 -91
- package/src/components/Modal/Modal.scss +0 -78
- package/src/components/Modal/ModalBody.scss +0 -18
- package/src/components/Modal/ModalCloseButton.scss +0 -18
- package/src/components/Modal/ModalContent.scss +0 -5
- package/src/components/Modal/ModalFooter.scss +0 -35
- package/src/components/Modal/ModalHeader.scss +0 -30
- package/src/components/Modal/ModalTitle.scss +0 -10
- package/src/components/Paper/Paper.scss +0 -17
- package/src/components/Popover/Popover.scss +0 -236
- package/src/components/Popover/PopoverWrapper.scss +0 -3
- package/src/components/Radio/Radio.scss +0 -83
- package/src/components/ScrollView/ScrollView.scss +0 -227
- package/src/components/SelectField/SelectField.scss +0 -109
- package/src/components/Table/Table.scss +0 -28
- package/src/components/Table/_components/TableCell.scss +0 -26
- package/src/components/Tabs/Tabs.scss +0 -28
- package/src/components/Tabs/TabsItem.scss +0 -117
- package/src/components/Text/Text.scss +0 -40
- package/src/components/TextArea/TextArea.scss +0 -95
- package/src/components/TextField/TextField.scss +0 -107
- package/src/components/TextLink/TextLink.scss +0 -16
- package/src/components/Toggle/Toggle.scss +0 -61
- package/src/components/Toolbar/Toolbar.scss +0 -83
- /package/src/components/Button/{Button.scss → Button.module.scss} +0 -0
@@ -156,10 +156,10 @@ It's possible to disable the whole input.
|
|
156
156
|
## Forwarding HTML Attributes
|
157
157
|
|
158
158
|
In addition to the options below in the [component's API](#api) section, you
|
159
|
-
can specify
|
160
|
-
|
161
|
-
|
162
|
-
|
159
|
+
can specify **any HTML attribute you like.** All attributes that don't interfere
|
160
|
+
with the API of the React component are forwarded to the root `<input>` HTML
|
161
|
+
element. This enables making the component interactive and helps to improve
|
162
|
+
its accessibility.
|
163
163
|
|
164
164
|
```docoff-react-preview
|
165
165
|
<FileInputField
|
@@ -173,8 +173,10 @@ helps to improve its accessibility.
|
|
173
173
|
/>
|
174
174
|
```
|
175
175
|
|
176
|
-
👉
|
177
|
-
|
176
|
+
👉 For the full list of supported attributes refer to:
|
177
|
+
|
178
|
+
- [`<input type="file" />` HTML element attributes][file-attributes]{:target="_blank"}
|
179
|
+
- [React common props]{:target="_blank"}
|
178
180
|
|
179
181
|
## Forwarding ref
|
180
182
|
|
@@ -189,6 +191,6 @@ If you provide [ref], it is forwarded to the native HTML `<input>` element.
|
|
189
191
|
Head to [Forms Theming](/docs/customize/theming/forms) to see shared form theming
|
190
192
|
options.
|
191
193
|
|
192
|
-
[React
|
193
|
-
[file]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#additional_attributes
|
194
|
+
[React common props]: https://react.dev/reference/react-dom/components/common#common-props
|
195
|
+
[file-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#additional_attributes
|
194
196
|
[ref]: https://reactjs.org/docs/refs-and-the-dom.html
|
@@ -5,7 +5,7 @@ import { transferProps } from '../_helpers/transferProps';
|
|
5
5
|
import { classNames } from '../../utils/classNames';
|
6
6
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
7
7
|
import { FormLayoutContext } from './FormLayoutContext';
|
8
|
-
import styles from './FormLayout.scss';
|
8
|
+
import styles from './FormLayout.module.scss';
|
9
9
|
|
10
10
|
const PREDEFINED_LABEL_WIDTH_VALUES = ['auto', 'default', 'limited'];
|
11
11
|
|
@@ -18,41 +18,43 @@
|
|
18
18
|
@use "../../styles/tools/spacing";
|
19
19
|
@use "theme";
|
20
20
|
|
21
|
-
.
|
22
|
-
|
21
|
+
@layer components.form-layout {
|
22
|
+
.root {
|
23
|
+
--rui-local-field-width: 1fr;
|
23
24
|
|
24
|
-
|
25
|
-
}
|
25
|
+
@include spacing.bottom(layouts);
|
26
|
+
}
|
26
27
|
|
27
|
-
.isRootFieldLayoutVertical,
|
28
|
-
.isRootFieldLayoutHorizontal {
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
}
|
28
|
+
.isRootFieldLayoutVertical,
|
29
|
+
.isRootFieldLayoutHorizontal {
|
30
|
+
display: grid;
|
31
|
+
grid-template-columns: var(--rui-local-field-width);
|
32
|
+
grid-row-gap: theme.$row-gap;
|
33
|
+
}
|
33
34
|
|
34
|
-
.isRootFieldLayoutHorizontal {
|
35
|
-
|
36
|
-
|
35
|
+
.isRootFieldLayoutHorizontal {
|
36
|
+
@include breakpoint.up(forms.$horizontal-breakpoint) {
|
37
|
+
grid-template-columns: var(--rui-local-label-width) var(--rui-local-field-width); // 1.
|
38
|
+
}
|
37
39
|
}
|
38
|
-
}
|
39
40
|
|
40
|
-
.hasRootLabelWidthDefault {
|
41
|
-
|
42
|
-
}
|
41
|
+
.hasRootLabelWidthDefault {
|
42
|
+
--rui-local-label-width: #{theme.$horizontal-label-width}; // 1., 2.
|
43
|
+
}
|
43
44
|
|
44
|
-
.hasRootLabelWidthAuto {
|
45
|
-
|
46
|
-
}
|
45
|
+
.hasRootLabelWidthAuto {
|
46
|
+
--rui-local-label-width: #{theme.$horizontal-label-width-auto}; // 4.
|
47
|
+
}
|
47
48
|
|
48
|
-
.hasRootLabelWidthLimited {
|
49
|
-
|
50
|
-
}
|
49
|
+
.hasRootLabelWidthLimited {
|
50
|
+
--rui-local-label-width: #{theme.$horizontal-label-width-limited}; // 4.
|
51
|
+
}
|
51
52
|
|
52
|
-
.hasRootLabelWidthCustom {
|
53
|
-
|
54
|
-
}
|
53
|
+
.hasRootLabelWidthCustom {
|
54
|
+
--rui-local-label-width: var(--rui-custom-label-width); // 3.
|
55
|
+
}
|
55
56
|
|
56
|
-
.isRootAutoWidth {
|
57
|
-
|
57
|
+
.isRootAutoWidth {
|
58
|
+
--rui-local-field-width: min-content;
|
59
|
+
}
|
58
60
|
}
|
@@ -7,7 +7,7 @@ import { getRootSizeClassName } from '../_helpers/getRootSizeClassName';
|
|
7
7
|
import { getRootValidationStateClassName } from '../_helpers/getRootValidationStateClassName';
|
8
8
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
9
9
|
import { FormLayoutContext } from './FormLayoutContext';
|
10
|
-
import styles from './FormLayoutCustomField.scss';
|
10
|
+
import styles from './FormLayoutCustomField.module.scss';
|
11
11
|
|
12
12
|
const renderLabel = (id, label, labelForId) => {
|
13
13
|
if (labelForId && label) {
|
@@ -0,0 +1,65 @@
|
|
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
|
+
|
6
|
+
@layer components.form-layout {
|
7
|
+
// Foundation
|
8
|
+
.root {
|
9
|
+
@include box-field-layout.in-form-layout();
|
10
|
+
@include variants.visual(custom);
|
11
|
+
}
|
12
|
+
|
13
|
+
.label {
|
14
|
+
@include foundation.label();
|
15
|
+
}
|
16
|
+
|
17
|
+
.isRootRequired .label {
|
18
|
+
@include foundation.label-required();
|
19
|
+
}
|
20
|
+
|
21
|
+
// States
|
22
|
+
.isRootStateInvalid {
|
23
|
+
@include variants.validation(invalid);
|
24
|
+
}
|
25
|
+
|
26
|
+
.isRootStateValid {
|
27
|
+
@include variants.validation(valid);
|
28
|
+
}
|
29
|
+
|
30
|
+
.isRootStateWarning {
|
31
|
+
@include variants.validation(warning);
|
32
|
+
}
|
33
|
+
|
34
|
+
// Layouts
|
35
|
+
.isRootLayoutVertical,
|
36
|
+
.isRootLayoutHorizontal {
|
37
|
+
@include box-field-layout.vertical();
|
38
|
+
}
|
39
|
+
|
40
|
+
.isRootLayoutHorizontal {
|
41
|
+
@include box-field-layout.horizontal();
|
42
|
+
}
|
43
|
+
|
44
|
+
.isRootLayoutVertical .field,
|
45
|
+
.isRootLayoutHorizontal .field {
|
46
|
+
width: auto;
|
47
|
+
}
|
48
|
+
|
49
|
+
.isRootFullWidth .field {
|
50
|
+
justify-self: stretch;
|
51
|
+
}
|
52
|
+
|
53
|
+
// Sizes
|
54
|
+
.isRootSizeSmall {
|
55
|
+
@include box-field-sizes.size(small);
|
56
|
+
}
|
57
|
+
|
58
|
+
.isRootSizeMedium {
|
59
|
+
@include box-field-sizes.size(medium);
|
60
|
+
}
|
61
|
+
|
62
|
+
.isRootSizeLarge {
|
63
|
+
@include box-field-sizes.size(large);
|
64
|
+
}
|
65
|
+
}
|
@@ -416,13 +416,15 @@ React.createElement(() => {
|
|
416
416
|
## Forwarding HTML Attributes
|
417
417
|
|
418
418
|
In addition to the options below in the [component's API](#api) section, you
|
419
|
-
can specify
|
420
|
-
|
421
|
-
|
419
|
+
can specify **any HTML attribute you like.** All attributes that don't interfere
|
420
|
+
with the API of the React component are forwarded to the root `<div>` HTML
|
421
|
+
element. This enables making the component interactive and helps to improve
|
422
422
|
its accessibility.
|
423
423
|
|
424
|
-
👉
|
425
|
-
|
424
|
+
👉 For the full list of supported attributes refer to:
|
425
|
+
|
426
|
+
- [`<div>` HTML element attributes][div-attributes]{:target="_blank"}
|
427
|
+
- [React common props]{:target="_blank"}
|
426
428
|
|
427
429
|
## API
|
428
430
|
|
@@ -453,10 +455,10 @@ FormLayoutCustomField can be styled using a small subset of
|
|
453
455
|
| `--rui-FormField--custom--default__surrounding-text-color` | Custom field label color in default state |
|
454
456
|
| `--rui-FormField--custom--disabled__surrounding-text-color` | Custom field label color in disabled-like state |
|
455
457
|
|
456
|
-
[
|
457
|
-
[subgrid]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Subgrid
|
458
|
+
[div-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
|
458
459
|
[fragments]: https://reactjs.org/docs/fragments.html
|
460
|
+
[grid]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout
|
461
|
+
[React common props]: https://react.dev/reference/react-dom/components/common#common-props
|
459
462
|
[rui-232]: https://github.com/react-ui-org/react-ui/issues/232
|
460
463
|
[rui-265]: https://github.com/react-ui-org/react-ui/issues/265
|
461
|
-
[
|
462
|
-
[div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
|
464
|
+
[subgrid]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Subgrid
|
@@ -4,7 +4,7 @@ import { withGlobalProps } from '../../provider';
|
|
4
4
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
5
5
|
import { transferProps } from '../_helpers/transferProps';
|
6
6
|
import { generateResponsiveCustomProperties } from './_helpers/generateResponsiveCustomProperties';
|
7
|
-
import styles from './Grid.scss';
|
7
|
+
import styles from './Grid.module.scss';
|
8
8
|
|
9
9
|
const SPACING_VALUES = [0, 1, 2, 3, 4, 5, 6, 7];
|
10
10
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// 1. Read value of `--rui-local-<PROPERTY>-<BREAKPOINT>` that might have been defined by
|
2
|
+
// JavaScript and assign it to `--rui-local-<PROPERTY>` used in 2.
|
3
|
+
//
|
4
|
+
// Fallback cascade containing fallbacks for all previous breakpoints recursively is included
|
5
|
+
// using CSS custom property fallback mechanism like this:
|
6
|
+
//
|
7
|
+
// Fallback for `xs` breakpoint: `<INITIAL FALLBACK>`
|
8
|
+
// Fallback for `sm` breakpoint: `var(--rui-local-<PROPERTY>-xs, <INITIAL FALLBACK>)`
|
9
|
+
// Fallback for `md` breakpoint: `var(--rui-local-<PROPERTY>-sm, var(--rui-local-<PROPERTY>-xs, <INIT. FALLBACK>))`
|
10
|
+
//
|
11
|
+
// … etc, up to the largest breakpoint.
|
12
|
+
//
|
13
|
+
// A media query is then created for each breakpoint (with exception of `xs` which doesn't need a
|
14
|
+
// media query) and a corresponding responsive custom property variant is assigned to
|
15
|
+
// `--rui-local-<PROPERTY>` that is used later in CSS, see 2.
|
16
|
+
//
|
17
|
+
// Example for `sm` breakpoint:
|
18
|
+
//
|
19
|
+
// `--rui-local-<PROPERTY>: var(--rui-local-<PROPERTY>-sm, var(--rui-local-<PROPERTY>-xs, <INITIAL FALLBACK>))`
|
20
|
+
//
|
21
|
+
// 2. Apply custom property value that is defined within current breakpoint, see 1.
|
22
|
+
|
23
|
+
@use "sass:map";
|
24
|
+
@use "../../styles/tools/spacing";
|
25
|
+
@use "settings";
|
26
|
+
@use "tools";
|
27
|
+
|
28
|
+
@layer components.grid {
|
29
|
+
.root {
|
30
|
+
@include tools.assign-responsive-custom-properties(settings.$grid-responsive-properties); // 1.
|
31
|
+
@include spacing.bottom(layouts);
|
32
|
+
|
33
|
+
display: grid;
|
34
|
+
grid-template-columns: var(--rui-local-columns); // 2.
|
35
|
+
grid-template-rows: var(--rui-local-rows); // 2.
|
36
|
+
grid-auto-flow: var(--rui-local-auto-flow); // 2.
|
37
|
+
grid-gap: var(--rui-local-row-gap) var(--rui-local-column-gap); // 2.
|
38
|
+
align-content: var(--rui-local-align-content); // 2.
|
39
|
+
align-items: var(--rui-local-align-items); // 2.
|
40
|
+
justify-content: var(--rui-local-justify-content); // 2.
|
41
|
+
justify-items: var(--rui-local-justify-items); // 2.
|
42
|
+
}
|
43
|
+
|
44
|
+
// stylelint-disable-next-line selector-max-universal -- Reset any previously added margins.
|
45
|
+
.root > * {
|
46
|
+
margin-block: 0;
|
47
|
+
}
|
48
|
+
|
49
|
+
.span {
|
50
|
+
@include tools.assign-responsive-custom-properties(settings.$grid-span-responsive-properties); // 1.
|
51
|
+
|
52
|
+
grid-column: span var(--rui-local-column-span); // 2.
|
53
|
+
grid-row: span var(--rui-local-row-span); // 2.
|
54
|
+
}
|
55
|
+
|
56
|
+
// stylelint-disable selector-no-qualifying-type
|
57
|
+
dl.root,
|
58
|
+
ol.root,
|
59
|
+
ul.root {
|
60
|
+
padding-left: 0;
|
61
|
+
margin-left: 0;
|
62
|
+
list-style: none;
|
63
|
+
}
|
64
|
+
|
65
|
+
// stylelint-enable selector-no-qualifying-type
|
66
|
+
}
|
@@ -4,7 +4,7 @@ import { withGlobalProps } from '../../provider';
|
|
4
4
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
5
5
|
import { transferProps } from '../_helpers/transferProps';
|
6
6
|
import { generateResponsiveCustomProperties } from './_helpers/generateResponsiveCustomProperties';
|
7
|
-
import styles from './Grid.scss';
|
7
|
+
import styles from './Grid.module.scss';
|
8
8
|
|
9
9
|
export const GridSpan = ({
|
10
10
|
children,
|
@@ -248,13 +248,16 @@ property. Check [MDN][grid-auto-flow] to fully understand available options.
|
|
248
248
|
## Forwarding HTML Attributes
|
249
249
|
|
250
250
|
In addition to the options below in the [component's API](#api) section, you
|
251
|
-
can specify
|
252
|
-
|
253
|
-
of your choice provided by `tag`, which is `<div>` by default.
|
254
|
-
the component interactive and helps to improve its accessibility.
|
251
|
+
can specify **any HTML attribute you like.** All attributes that don't interfere
|
252
|
+
with the API of the React component are forwarded to the root HTML element
|
253
|
+
of your choice provided by `tag`, which is `<div>` by default. This enables
|
254
|
+
making the component interactive and helps to improve its accessibility.
|
255
255
|
|
256
|
-
👉
|
257
|
-
|
256
|
+
👉 For the full list of supported attributes refer to:
|
257
|
+
|
258
|
+
- [`<div>` HTML element attributes][div-attributes]{:target="_blank"}
|
259
|
+
- [any other HTML element][all-html-elements]{:target="_blank"}
|
260
|
+
- [React common props]{:target="_blank"}
|
258
261
|
|
259
262
|
## API
|
260
263
|
|
@@ -276,6 +279,6 @@ Wrapper for content that should span multiple rows or columns.
|
|
276
279
|
[justify-items]: https://developer.mozilla.org/en-US/docs/Web/CSS/justify-items
|
277
280
|
[repeat]: https://developer.mozilla.org/en-US/docs/Web/CSS/repeat
|
278
281
|
[minmax]: https://developer.mozilla.org/en-US/docs/Web/CSS/minmax
|
279
|
-
[React
|
280
|
-
[div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
|
282
|
+
[React common props]: https://react.dev/reference/react-dom/components/common#common-props
|
283
|
+
[div-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
|
281
284
|
[all-html-elements]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element
|
@@ -13,7 +13,7 @@ import { resolveContextOrProp } from '../_helpers/resolveContextOrProp';
|
|
13
13
|
import { transferProps } from '../_helpers/transferProps';
|
14
14
|
import { FormLayoutContext } from '../FormLayout';
|
15
15
|
import { InputGroupContext } from './InputGroupContext';
|
16
|
-
import styles from './InputGroup.scss';
|
16
|
+
import styles from './InputGroup.module.scss';
|
17
17
|
|
18
18
|
export const InputGroup = ({
|
19
19
|
children,
|
@@ -0,0 +1,93 @@
|
|
1
|
+
// 1. The class name is intentionally singular because it's targeted by other mixins too.
|
2
|
+
// 2. Use a block-level display mode to prevent extra white space below grouped inputs in Safari.
|
3
|
+
// 3. Prevent individual inputs from overlapping inside narrow containers.
|
4
|
+
// 4. Legends are tricky to style, let's use a `div` instead.
|
5
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset#styling_with_css
|
6
|
+
|
7
|
+
@use "../../styles/tools/form-fields/box-field-elements";
|
8
|
+
@use "../../styles/tools/form-fields/box-field-layout";
|
9
|
+
@use "../../styles/tools/form-fields/box-field-sizes";
|
10
|
+
@use "../../styles/tools/form-fields/foundation";
|
11
|
+
@use "../../styles/tools/form-fields/variants";
|
12
|
+
@use "../../styles/tools/accessibility";
|
13
|
+
@use "../../styles/tools/reset";
|
14
|
+
@use "theme";
|
15
|
+
|
16
|
+
@layer components.input-group {
|
17
|
+
.root {
|
18
|
+
@include foundation.root();
|
19
|
+
@include foundation.fieldset();
|
20
|
+
}
|
21
|
+
|
22
|
+
// 4.
|
23
|
+
.legend {
|
24
|
+
@include accessibility.hide-text();
|
25
|
+
}
|
26
|
+
|
27
|
+
// 4.
|
28
|
+
.label {
|
29
|
+
@include foundation.label();
|
30
|
+
}
|
31
|
+
|
32
|
+
.inputGroup {
|
33
|
+
--rui-local-inner-border-radius: #{theme.$inner-border-radius};
|
34
|
+
|
35
|
+
display: flex; // 2.
|
36
|
+
gap: theme.$gap;
|
37
|
+
}
|
38
|
+
|
39
|
+
// 1.
|
40
|
+
.validationText {
|
41
|
+
@include reset.list();
|
42
|
+
@include foundation.help-text();
|
43
|
+
}
|
44
|
+
|
45
|
+
.isRootRequired .label {
|
46
|
+
@include foundation.label-required();
|
47
|
+
}
|
48
|
+
|
49
|
+
// States
|
50
|
+
.isRootStateInvalid {
|
51
|
+
@include variants.validation(invalid);
|
52
|
+
}
|
53
|
+
|
54
|
+
.isRootStateValid {
|
55
|
+
@include variants.validation(valid);
|
56
|
+
}
|
57
|
+
|
58
|
+
.isRootStateWarning {
|
59
|
+
@include variants.validation(warning);
|
60
|
+
}
|
61
|
+
|
62
|
+
// Layouts
|
63
|
+
.isRootLayoutVertical,
|
64
|
+
.isRootLayoutHorizontal {
|
65
|
+
@include box-field-layout.vertical();
|
66
|
+
}
|
67
|
+
|
68
|
+
.isRootLayoutVertical .field,
|
69
|
+
.isRootLayoutHorizontal .field {
|
70
|
+
max-width: none; // 3.
|
71
|
+
}
|
72
|
+
|
73
|
+
.isRootLayoutHorizontal {
|
74
|
+
@include box-field-layout.horizontal();
|
75
|
+
}
|
76
|
+
|
77
|
+
.isRootInFormLayout {
|
78
|
+
@include box-field-layout.in-form-layout($is-fieldset: true);
|
79
|
+
}
|
80
|
+
|
81
|
+
// Sizes
|
82
|
+
.isRootSizeSmall {
|
83
|
+
@include box-field-sizes.size(small, $has-input: false);
|
84
|
+
}
|
85
|
+
|
86
|
+
.isRootSizeMedium {
|
87
|
+
@include box-field-sizes.size(medium, $has-input: false);
|
88
|
+
}
|
89
|
+
|
90
|
+
.isRootSizeLarge {
|
91
|
+
@include box-field-sizes.size(large, $has-input: false);
|
92
|
+
}
|
93
|
+
}
|
@@ -250,13 +250,15 @@ for the underlying `<fieldset>` element.
|
|
250
250
|
## Forwarding HTML Attributes
|
251
251
|
|
252
252
|
In addition to the options below in the [component's API](#api) section, you
|
253
|
-
can specify
|
254
|
-
|
255
|
-
element
|
256
|
-
|
253
|
+
can specify **any HTML attribute you like.** All attributes that don't interfere
|
254
|
+
with the API of the React component are forwarded to the root `<fieldset>` HTML
|
255
|
+
element. This enables making the component interactive and helps to improve
|
256
|
+
its accessibility.
|
257
257
|
|
258
|
-
👉
|
259
|
-
|
258
|
+
👉 For the full list of supported attributes refer to:
|
259
|
+
|
260
|
+
- [`<fieldset>` HTML element attributes][fieldset-attributes]{:target="_blank"}
|
261
|
+
- [React common props]{:target="_blank"}
|
260
262
|
|
261
263
|
## API
|
262
264
|
|
@@ -269,7 +271,7 @@ interactive and helps to improve its accessibility.
|
|
269
271
|
| `--rui-InputGroup__gap` | Gap between elements |
|
270
272
|
| `--rui-InputGroup__inner-border-radius` | Inner border radius of elements |
|
271
273
|
|
272
|
-
[fieldset]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
|
273
274
|
[accessibility]: https://www.w3.org/WAI/tutorials/forms/grouping/
|
274
|
-
[
|
275
|
+
[fieldset]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
|
275
276
|
[fieldset-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset#attributes
|
277
|
+
[React common props]: https://react.dev/reference/react-dom/components/common#common-props
|
@@ -8,7 +8,7 @@ import { getPositionClassName } from './_helpers/getPositionClassName';
|
|
8
8
|
import { getSizeClassName } from './_helpers/getSizeClassName';
|
9
9
|
import { useModalFocus } from './_hooks/useModalFocus';
|
10
10
|
import { useModalScrollPrevention } from './_hooks/useModalScrollPrevention';
|
11
|
-
import styles from './Modal.scss';
|
11
|
+
import styles from './Modal.module.scss';
|
12
12
|
|
13
13
|
const preRender = (
|
14
14
|
children,
|
@@ -0,0 +1,80 @@
|
|
1
|
+
@use "sass:map";
|
2
|
+
@use "../../styles/theme/typography";
|
3
|
+
@use "../../styles/tools/accessibility";
|
4
|
+
@use "../../styles/tools/breakpoint";
|
5
|
+
@use "../../styles/tools/reset";
|
6
|
+
@use "../../styles/tools/spacing";
|
7
|
+
@use "settings";
|
8
|
+
@use "theme";
|
9
|
+
|
10
|
+
@layer components.modal {
|
11
|
+
.root {
|
12
|
+
--rui-local-outer-spacing: #{theme.$outer-spacing-xs};
|
13
|
+
--rui-local-max-width: calc(100% - (2 * var(--rui-local-outer-spacing)));
|
14
|
+
--rui-local-max-height: calc(100% - (2 * var(--rui-local-outer-spacing)));
|
15
|
+
|
16
|
+
position: fixed;
|
17
|
+
left: 50%;
|
18
|
+
z-index: settings.$z-index;
|
19
|
+
display: flex;
|
20
|
+
flex-direction: column;
|
21
|
+
max-width: var(--rui-local-max-width);
|
22
|
+
max-height: var(--rui-local-max-height);
|
23
|
+
overflow-y: auto;
|
24
|
+
overscroll-behavior: contain;
|
25
|
+
border-radius: settings.$border-radius;
|
26
|
+
background: theme.$background;
|
27
|
+
box-shadow: theme.$box-shadow;
|
28
|
+
transform: translateX(-50%);
|
29
|
+
|
30
|
+
@include breakpoint.up(sm) {
|
31
|
+
--rui-local-outer-spacing: #{theme.$outer-spacing-sm};
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
.backdrop {
|
36
|
+
position: fixed;
|
37
|
+
top: 0;
|
38
|
+
left: 0;
|
39
|
+
z-index: settings.$backdrop-z-index;
|
40
|
+
width: 100vw;
|
41
|
+
height: 100vh;
|
42
|
+
background: theme.$backdrop-background;
|
43
|
+
}
|
44
|
+
|
45
|
+
.isRootSizeSmall {
|
46
|
+
width: map.get(theme.$sizes, small, width);
|
47
|
+
}
|
48
|
+
|
49
|
+
.isRootSizeMedium {
|
50
|
+
width: map.get(theme.$sizes, medium, width);
|
51
|
+
}
|
52
|
+
|
53
|
+
.isRootSizeLarge {
|
54
|
+
width: map.get(theme.$sizes, large, width);
|
55
|
+
}
|
56
|
+
|
57
|
+
.isRootSizeFullscreen {
|
58
|
+
width: map.get(theme.$sizes, fullscreen, width);
|
59
|
+
height: map.get(theme.$sizes, fullscreen, height);
|
60
|
+
}
|
61
|
+
|
62
|
+
.isRootSizeFullscreen .content {
|
63
|
+
height: 100%;
|
64
|
+
}
|
65
|
+
|
66
|
+
.isRootSizeAuto {
|
67
|
+
width: auto;
|
68
|
+
min-width: min(var(--rui-local-max-width), #{map.get(theme.$sizes, auto, min-width)});
|
69
|
+
max-width: min(var(--rui-local-max-width), #{map.get(theme.$sizes, auto, max-width)});
|
70
|
+
}
|
71
|
+
|
72
|
+
.isRootPositionCenter {
|
73
|
+
top: 50%;
|
74
|
+
transform: translate(-50%, -50%);
|
75
|
+
}
|
76
|
+
|
77
|
+
.isRootPositionTop {
|
78
|
+
top: var(--rui-local-outer-spacing);
|
79
|
+
}
|
80
|
+
}
|
@@ -5,7 +5,7 @@ import { transferProps } from '../_helpers/transferProps';
|
|
5
5
|
import { classNames } from '../../utils/classNames';
|
6
6
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
7
7
|
import { getScrollingClassName } from './_helpers/getScrollingClassName';
|
8
|
-
import styles from './ModalBody.scss';
|
8
|
+
import styles from './ModalBody.module.scss';
|
9
9
|
|
10
10
|
export const ModalBody = ({
|
11
11
|
children,
|
@@ -0,0 +1,20 @@
|
|
1
|
+
@layer components.modal {
|
2
|
+
.root {
|
3
|
+
flex: 1 1 auto;
|
4
|
+
}
|
5
|
+
|
6
|
+
.isRootScrollingAuto,
|
7
|
+
.isRootScrollingCustom {
|
8
|
+
min-height: 0;
|
9
|
+
}
|
10
|
+
|
11
|
+
.isRootScrollingAuto {
|
12
|
+
overflow-y: auto;
|
13
|
+
overscroll-behavior: contain;
|
14
|
+
}
|
15
|
+
|
16
|
+
.isRootScrollingCustom {
|
17
|
+
display: flex;
|
18
|
+
flex-direction: column;
|
19
|
+
}
|
20
|
+
}
|
@@ -5,7 +5,7 @@ import {
|
|
5
5
|
withGlobalProps,
|
6
6
|
} from '../../provider';
|
7
7
|
import { transferProps } from '../_helpers/transferProps';
|
8
|
-
import styles from './ModalCloseButton.scss';
|
8
|
+
import styles from './ModalCloseButton.module.scss';
|
9
9
|
|
10
10
|
export const ModalCloseButton = React.forwardRef((props, ref) => {
|
11
11
|
const {
|
@@ -0,0 +1,20 @@
|
|
1
|
+
@use "sass:map";
|
2
|
+
@use "../../styles/theme/typography";
|
3
|
+
@use "../../styles/tools/accessibility";
|
4
|
+
@use "../../styles/tools/reset";
|
5
|
+
@use "../../styles/tools/spacing";
|
6
|
+
|
7
|
+
@layer components.modal {
|
8
|
+
.root {
|
9
|
+
@include reset.button();
|
10
|
+
@include accessibility.min-tap-target();
|
11
|
+
|
12
|
+
font-size: map.get(typography.$font-size-values, 4);
|
13
|
+
line-height: 1;
|
14
|
+
color: inherit;
|
15
|
+
|
16
|
+
&:disabled {
|
17
|
+
cursor: var(--rui-cursor-not-allowed);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
@@ -3,7 +3,7 @@ import React from 'react';
|
|
3
3
|
import { withGlobalProps } from '../../provider';
|
4
4
|
import { isChildrenEmpty } from '../_helpers/isChildrenEmpty';
|
5
5
|
import { transferProps } from '../_helpers/transferProps';
|
6
|
-
import styles from './ModalContent.scss';
|
6
|
+
import styles from './ModalContent.module.scss';
|
7
7
|
|
8
8
|
export const ModalContent = ({
|
9
9
|
children,
|