@react-ui-org/react-ui 0.50.2 → 0.52.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.
Files changed (82) hide show
  1. package/dist/lib.development.js +157 -49
  2. package/dist/lib.js +1 -1
  3. package/package.json +1 -1
  4. package/src/lib/components/Alert/Alert.jsx +1 -3
  5. package/src/lib/components/Alert/Alert.scss +1 -9
  6. package/src/lib/components/Alert/README.mdx +0 -20
  7. package/src/lib/components/Alert/_settings.scss +1 -1
  8. package/src/lib/components/Alert/_theme.scss +0 -10
  9. package/src/lib/components/Badge/Badge.jsx +1 -3
  10. package/src/lib/components/Badge/Badge.scss +25 -44
  11. package/src/lib/components/Badge/README.mdx +6 -14
  12. package/src/lib/components/Button/Button.jsx +20 -10
  13. package/src/lib/components/Button/README.mdx +8 -3
  14. package/src/lib/components/Button/_base.scss +21 -12
  15. package/src/lib/components/Button/_priorities.scss +13 -18
  16. package/src/lib/components/Button/_settings.scss +1 -1
  17. package/src/lib/components/Button/_theme.scss +0 -10
  18. package/src/lib/components/ButtonGroup/ButtonGroup.jsx +5 -3
  19. package/src/lib/components/ButtonGroup/ButtonGroup.scss +26 -1
  20. package/src/lib/components/ButtonGroup/README.mdx +85 -59
  21. package/src/lib/components/ButtonGroup/_theme.scss +13 -0
  22. package/src/lib/components/Card/Card.jsx +1 -3
  23. package/src/lib/components/Card/Card.scss +0 -9
  24. package/src/lib/components/Card/README.mdx +0 -16
  25. package/src/lib/components/Card/_theme.scss +0 -10
  26. package/src/lib/components/FormLayout/README.mdx +22 -8
  27. package/src/lib/components/Grid/_helpers/generateResponsiveCustomProperties.js +1 -1
  28. package/src/lib/components/InputGroup/InputGroup.jsx +170 -0
  29. package/src/lib/components/InputGroup/InputGroup.scss +92 -0
  30. package/src/lib/components/InputGroup/InputGroupContext.js +3 -0
  31. package/src/lib/components/InputGroup/README.mdx +278 -0
  32. package/src/lib/components/InputGroup/_theme.scss +2 -0
  33. package/src/lib/components/InputGroup/index.js +2 -0
  34. package/src/lib/components/Modal/Modal.jsx +58 -97
  35. package/src/lib/components/Modal/ModalCloseButton.scss +2 -2
  36. package/src/lib/components/Modal/README.mdx +392 -128
  37. package/src/lib/components/Modal/_helpers/getPositionClassName.js +7 -0
  38. package/src/lib/components/Modal/_helpers/getSizeClassName.js +19 -0
  39. package/src/lib/components/Modal/_hooks/useModalFocus.js +126 -0
  40. package/src/lib/components/Modal/_hooks/useModalScrollPrevention.js +35 -0
  41. package/src/lib/components/Modal/_settings.scss +2 -2
  42. package/src/lib/components/Popover/README.mdx +7 -4
  43. package/src/lib/components/Radio/README.mdx +9 -1
  44. package/src/lib/components/Radio/Radio.jsx +39 -31
  45. package/src/lib/components/Radio/Radio.scss +11 -1
  46. package/src/lib/components/ScrollView/README.mdx +2 -2
  47. package/src/lib/components/SelectField/SelectField.jsx +21 -8
  48. package/src/lib/components/SelectField/SelectField.scss +5 -0
  49. package/src/lib/components/Table/_components/TableCell.scss +6 -5
  50. package/src/lib/components/Table/_components/TableHeaderCell/TableHeaderCell.jsx +8 -5
  51. package/src/lib/components/Table/_settings.scss +5 -6
  52. package/src/lib/components/Text/README.mdx +14 -8
  53. package/src/lib/components/TextField/TextField.jsx +21 -8
  54. package/src/lib/components/TextField/TextField.scss +5 -0
  55. package/src/lib/components/TextLink/README.mdx +8 -6
  56. package/src/lib/components/TextLink/TextLink.scss +5 -0
  57. package/src/lib/components/TextLink/_theme.scss +2 -0
  58. package/src/lib/components/Toolbar/README.mdx +19 -11
  59. package/src/lib/components/_helpers/getRootColorClassName.js +4 -0
  60. package/src/lib/index.js +1 -0
  61. package/src/lib/styles/elements/_code.scss +1 -3
  62. package/src/lib/styles/elements/_page.scss +1 -0
  63. package/src/lib/styles/elements/_rulers.scss +1 -3
  64. package/src/lib/styles/elements/_small.scss +1 -1
  65. package/src/lib/styles/settings/_form-fields.scss +1 -1
  66. package/src/lib/styles/settings/_utilities.scss +46 -14
  67. package/src/lib/styles/theme/_accessibility.scss +4 -4
  68. package/src/lib/styles/theme/_borders.scss +3 -2
  69. package/src/lib/styles/theme/_code.scss +2 -2
  70. package/src/lib/styles/theme/_links.scss +6 -4
  71. package/src/lib/styles/theme/_lists.scss +1 -1
  72. package/src/lib/styles/theme/_page.scss +2 -2
  73. package/src/lib/styles/theme/_spacing.scss +11 -11
  74. package/src/lib/styles/theme/_typography.scss +19 -18
  75. package/src/lib/styles/theme-constants/_colors.scss +23 -23
  76. package/src/lib/styles/tools/_spacing.scss +1 -1
  77. package/src/lib/styles/tools/form-fields/_box-field-elements.scss +19 -2
  78. package/src/lib/styles/tools/form-fields/_box-field-sizes.scss +11 -8
  79. package/src/lib/styles/tools/form-fields/_foundation.scss +7 -0
  80. package/src/lib/theme.scss +650 -567
  81. package/src/lib/styles/theme/_colors.scss +0 -65
  82. /package/src/lib/components/{Button/helpers → _helpers}/getRootPriorityClassName.js +0 -0
@@ -0,0 +1,92 @@
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
+ .root {
17
+ @include foundation.root();
18
+ @include foundation.fieldset();
19
+ }
20
+
21
+ // 4.
22
+ .legend {
23
+ @include accessibility.hide-text();
24
+ }
25
+
26
+ // 4.
27
+ .label {
28
+ @include foundation.label();
29
+ }
30
+
31
+ .inputGroup {
32
+ --rui-local-inner-border-radius: #{theme.$inner-border-radius};
33
+
34
+ display: flex; // 2.
35
+ gap: theme.$gap;
36
+ }
37
+
38
+ // 1.
39
+ .validationText {
40
+ @include reset.list();
41
+ @include foundation.help-text();
42
+ }
43
+
44
+ // States
45
+ .isRootStateInvalid {
46
+ @include variants.validation(invalid);
47
+ }
48
+
49
+ .isRootStateValid {
50
+ @include variants.validation(valid);
51
+ }
52
+
53
+ .isRootStateWarning {
54
+ @include variants.validation(warning);
55
+ }
56
+
57
+ // Invisible label
58
+ .isLabelHidden {
59
+ @include accessibility.hide-text();
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();
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
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+
3
+ export const InputGroupContext = React.createContext(null);
@@ -0,0 +1,278 @@
1
+ ---
2
+ name: InputGroup
3
+ menu: 'Layouts'
4
+ route: /components/input-group
5
+ ---
6
+
7
+ # InputGroup
8
+
9
+ InputGroup visually groups related form fields and actions together.
10
+
11
+ import {
12
+ Playground,
13
+ Props,
14
+ } from 'docz'
15
+ import Icon from '../../../docs/_components/Icon'
16
+ import {
17
+ Button,
18
+ InputGroup,
19
+ SelectField,
20
+ TextField,
21
+ } from '../..'
22
+
23
+ ## Basic Usage
24
+
25
+ To implement the InputGroup component, you need to import it first:
26
+
27
+ ```js
28
+ import { InputGroup } from '@react-ui-org/react-ui';
29
+ ```
30
+
31
+ And use it:
32
+
33
+ <Playground>
34
+ {() => {
35
+ const [fruit, setFruit] = React.useState('apple');
36
+ const options = [
37
+ {
38
+ label: 'Apple',
39
+ value: 'apple',
40
+ },
41
+ {
42
+ label: 'Pear',
43
+ value: 'pear',
44
+ },
45
+ {
46
+ label: 'Cherry',
47
+ value: 'cherry',
48
+ },
49
+ ];
50
+ return (
51
+ <InputGroup label="Your favourite fruit">
52
+ <SelectField
53
+ label="Your favourite fruit"
54
+ onChange={(e) => setFruit(e.target.value)}
55
+ options={options}
56
+ value={fruit}
57
+ />
58
+ <TextField
59
+ label="Variety"
60
+ placeholder="Eg. Golden delicious"
61
+ />
62
+ <Button label="Submit" />
63
+ </InputGroup>
64
+ );
65
+ }}
66
+ </Playground>
67
+
68
+ See [API](#api) for all available options.
69
+
70
+ ## General Guidelines
71
+
72
+ - Use input group to group **related fields and actions** that a user can take.
73
+ Input fields and buttons should not be grouped just to save space on the
74
+ screen.
75
+
76
+ - While the number of child inputs is not limited, keep in mind the layout of
77
+ InputGroup is currently **not responsive: the inputs do not shrink nor wrap**.
78
+ Make sure your inputs fit their container, especially on small screens.
79
+
80
+ - In the background, InputGroup uses the [`fieldset`][fieldset] element. Not
81
+ only it improves the [accessibility] of the group, it also allows you to make
82
+ use of its built-in features like disabling all nested inputs or pairing the
83
+ group with a form outside. Consult [the MDN docs][fieldset] to learn more.
84
+
85
+ - InputGroup currently **supports grouping of**
86
+ [TextField](/components/text-field), [SelectField](/components/select-field),
87
+ and [Button](/components/button) components.
88
+
89
+ - To group [Buttons](/components/button) only, use the
90
+ [ButtonGroup](/components/button-group) component which is designed
91
+ specifically for that purpose.
92
+
93
+ ## Sizes
94
+
95
+ All existing field and button sizes are also available on the input group level:
96
+ small, medium, and large.
97
+
98
+ <Playground>
99
+ <InputGroup
100
+ label="Small size"
101
+ size="small"
102
+ >
103
+ <TextField label="Input" />
104
+ <Button label="Submit" />
105
+ </InputGroup>
106
+ <InputGroup label="Medium size">
107
+ <TextField label="Input" />
108
+ <Button label="Submit" />
109
+ </InputGroup>
110
+ <InputGroup
111
+ label="Large size"
112
+ size="large"
113
+ >
114
+ <TextField label="Input" />
115
+ <Button label="Submit" />
116
+ </InputGroup>
117
+ </Playground>
118
+
119
+ ### Shared Property
120
+
121
+ You can set the `size` property directly on InputGroup to be shared for all
122
+ fields and buttons inside the group. This property is then passed over to
123
+ individual elements. At the same time, it **cannot be overridden** on the
124
+ fields' or buttons' level. While technically possible, from the design point of
125
+ view it's undesirable to group elements of totally different types or sizes.
126
+
127
+ ## Invisible Label
128
+
129
+ In some cases, it may be convenient to visually hide the group label. The label
130
+ remains accessible to assistive technologies. Labels of individual inputs are
131
+ always visually hidden.
132
+
133
+ While it may be acceptable for login screens with just a few fields or for other
134
+ simple forms, it's dangerous to hide labels from users in most cases. Keep in
135
+ mind you should **provide another visual clue** so users know what to fill into
136
+ the input.
137
+
138
+ <Playground>
139
+ <InputGroup
140
+ isLabelVisible={false}
141
+ label="First and last name"
142
+ >
143
+ <TextField
144
+ label="First name"
145
+ placeholder="Eg. John"
146
+ />
147
+ <TextField
148
+ label="Last name"
149
+ placeholder="Eg. Doe"
150
+ />
151
+ <Button label="Submit" />
152
+ </InputGroup>
153
+ </Playground>
154
+
155
+ ## Horizontal layout
156
+
157
+ The default vertical layout is very easy to use and work with. However, there
158
+ are situations where horizontal layout suits better — and that's why React UI
159
+ supports this kind of layout as well.
160
+
161
+ <Playground>
162
+ <InputGroup
163
+ label="Horizontal layout"
164
+ layout="horizontal"
165
+ >
166
+ <TextField label="Label" />
167
+ <Button label="Submit" />
168
+ </InputGroup>
169
+ </Playground>
170
+
171
+ ## States
172
+
173
+ ### Disabled State
174
+
175
+ Disables all fields and buttons inside the group.
176
+
177
+ <Playground>
178
+ <InputGroup disabled label="Disabled group">
179
+ <TextField label="Label" />
180
+ <Button label="Submit" />
181
+ </InputGroup>
182
+ </Playground>
183
+
184
+ ### Validation States
185
+
186
+ Validation states visually present the result of validation of the grouped
187
+ inputs. Input group's validation state is taken from its child inputs. You
188
+ should always **provide validation messages for states other than valid**
189
+ directly through `validationTexts` prop so users know what happened and what
190
+ action they should take or what options they have. These messages are not
191
+ semantically tied to the `children` elements, the connection should be expressed
192
+ in textual form in the actual message. The individual `children` elements must
193
+ not show any `validationText`, they only show their respective `validationState`.
194
+ Validation messages passed to input elements' `validationText` prop will be
195
+ ignored.
196
+
197
+ <Playground>
198
+ <InputGroup
199
+ label="First and last name"
200
+ validationTexts={[
201
+ "First name must be filled in.",
202
+ "Last name must be filled in.",
203
+ ]}
204
+ >
205
+ <TextField
206
+ label="First name"
207
+ placeholder="Eg. John"
208
+ validationState="invalid"
209
+ />
210
+ <TextField
211
+ label="Last name"
212
+ placeholder="Eg. Doe"
213
+ validationState="invalid"
214
+ />
215
+ <Button label="Submit" />
216
+ </InputGroup>
217
+ <InputGroup
218
+ label="First and last name"
219
+ validationTexts={[
220
+ "Last name should not include any digits.",
221
+ ]}
222
+ >
223
+ <TextField
224
+ label="First name"
225
+ placeholder="Eg. John"
226
+ value="John"
227
+ />
228
+ <TextField
229
+ label="Last name"
230
+ placeholder="Eg. Doe"
231
+ validationState="warning"
232
+ value="123Doe"
233
+ />
234
+ <Button label="Submit" />
235
+ </InputGroup>
236
+ <InputGroup label="First and last name">
237
+ <TextField
238
+ label="First name"
239
+ placeholder="Eg. John"
240
+ validationState="valid"
241
+ value="John"
242
+ />
243
+ <TextField
244
+ label="Last name"
245
+ placeholder="Eg. Doe"
246
+ validationState="valid"
247
+ value="Doe"
248
+ />
249
+ <Button label="Submit" />
250
+ </InputGroup>
251
+ </Playground>
252
+
253
+ ## Forwarding HTML Attributes
254
+
255
+ In addition to the options below in the [component's API](#api) section, you
256
+ can specify [React synthetic events] or **any HTML attribute you like.** All
257
+ attributes that don't interfere with the API are forwarded to the `<div>` HTML
258
+ element which wraps elements to be grouped. This enables making the component
259
+ interactive and helps to improve its accessibility.
260
+
261
+ 👉 Refer to the MDN reference for the full list of supported attributes of the
262
+ [div] element.
263
+
264
+ ## API
265
+
266
+ <Props table of={InputGroup} />
267
+
268
+ ## Theming
269
+
270
+ | Custom Property | Description |
271
+ |--------------------------------------------------------------------|------------------------------------------------|
272
+ | `--rui-InputGroup__gap` | Gap between elements |
273
+ | `--rui-InputGroup__inner-border-radius` | Inner border radius of elements |
274
+
275
+ [fieldset]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
276
+ [accessibility]: https://www.w3.org/WAI/tutorials/forms/grouping/
277
+ [React synthetic events]: https://reactjs.org/docs/events.html
278
+ [div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
@@ -0,0 +1,2 @@
1
+ $gap: var(--rui-InputGroup__gap);
2
+ $inner-border-radius: var(--rui-InputGroup__inner-border-radius);
@@ -0,0 +1,2 @@
1
+ export { default as InputGroup } from './InputGroup';
2
+ export { InputGroupContext } from './InputGroupContext';
@@ -1,12 +1,13 @@
1
1
  import PropTypes from 'prop-types';
2
- import React, {
3
- useEffect,
4
- useRef,
5
- } from 'react';
2
+ import React, { useRef } from 'react';
6
3
  import { createPortal } from 'react-dom';
7
4
  import { withGlobalProps } from '../../provider';
8
5
  import { transferProps } from '../_helpers/transferProps';
9
6
  import { classNames } from '../../utils/classNames';
7
+ import { getPositionClassName } from './_helpers/getPositionClassName';
8
+ import { getSizeClassName } from './_helpers/getSizeClassName';
9
+ import { useModalFocus } from './_hooks/useModalFocus';
10
+ import { useModalScrollPrevention } from './_hooks/useModalScrollPrevention';
10
11
  import styles from './Modal.scss';
11
12
 
12
13
  const preRender = (
@@ -16,63 +17,34 @@ const preRender = (
16
17
  position,
17
18
  restProps,
18
19
  size,
19
- ) => {
20
- const sizeClass = (modalSize) => {
21
- if (modalSize === 'small') {
22
- return styles.isRootSizeSmall;
23
- }
24
-
25
- if (modalSize === 'medium') {
26
- return styles.isRootSizeMedium;
27
- }
28
-
29
- if (modalSize === 'large') {
30
- return styles.isRootSizeLarge;
31
- }
32
-
33
- if (modalSize === 'fullscreen') {
34
- return styles.isRootSizeFullscreen;
35
- }
36
-
37
- return styles.isRootSizeAuto;
38
- };
39
-
40
- const positionClass = (modalPosition) => {
41
- if (modalPosition === 'top') {
42
- return styles.isRootPositionTop;
43
- }
44
-
45
- return styles.isRootPositionCenter;
46
- };
47
-
48
- return (
20
+ ) => (
21
+ <div
22
+ className={styles.backdrop}
23
+ onClick={(e) => {
24
+ e.preventDefault();
25
+ if (closeButtonRef?.current != null) {
26
+ closeButtonRef.current.click();
27
+ }
28
+ }}
29
+ role="presentation"
30
+ >
49
31
  <div
50
- className={styles.backdrop}
51
- onClick={() => {
52
- if (closeButtonRef?.current != null) {
53
- closeButtonRef.current.click();
54
- }
32
+ {...transferProps(restProps)}
33
+ className={classNames(
34
+ styles.root,
35
+ getSizeClassName(size, styles),
36
+ getPositionClassName(position, styles),
37
+ )}
38
+ onClick={(e) => {
39
+ e.stopPropagation();
55
40
  }}
56
41
  role="presentation"
42
+ ref={childrenWrapperRef}
57
43
  >
58
- <div
59
- {...transferProps(restProps)}
60
- className={classNames(
61
- styles.root,
62
- sizeClass(size),
63
- positionClass(position),
64
- )}
65
- onClick={(e) => {
66
- e.stopPropagation();
67
- }}
68
- role="presentation"
69
- ref={childrenWrapperRef}
70
- >
71
- {children}
72
- </div>
44
+ {children}
73
45
  </div>
74
- );
75
- };
46
+ </div>
47
+ );
76
48
 
77
49
  export const Modal = ({
78
50
  autoFocus,
@@ -80,52 +52,21 @@ export const Modal = ({
80
52
  closeButtonRef,
81
53
  portalId,
82
54
  position,
55
+ preventScrollUnderneath,
83
56
  primaryButtonRef,
84
57
  size,
85
58
  ...restProps
86
59
  }) => {
87
60
  const childrenWrapperRef = useRef();
88
61
 
89
- const keyPressHandler = (e) => {
90
- if (e.key === 'Escape' && closeButtonRef?.current != null) {
91
- closeButtonRef.current.click();
92
- }
93
-
94
- if (e.key === 'Enter' && e.target.nodeName !== 'BUTTON' && primaryButtonRef?.current != null) {
95
- primaryButtonRef.current.click();
96
- }
97
- };
98
-
99
- useEffect(() => {
100
- window.document.addEventListener('keydown', keyPressHandler, false);
101
- const removeKeyPressHandler = () => {
102
- window.document.removeEventListener('keydown', keyPressHandler, false);
103
- };
104
-
105
- // If `autoFocus` is set to `true`, following code finds first form field element
106
- // (input, textarea or select) or primary button and auto focuses it. This is necessary
107
- // to have focus on one of those elements to be able to submit form by pressing Enter key.
108
- if (autoFocus) {
109
- if (childrenWrapperRef?.current != null) {
110
- const childrenWrapperElement = childrenWrapperRef.current;
111
- const childrenElements = childrenWrapperElement.querySelectorAll('*');
112
- const formFieldEl = Array.from(childrenElements).find(
113
- (element) => ['INPUT', 'TEXTAREA', 'SELECT'].includes(element.nodeName) && !element.disabled,
114
- );
115
-
116
- if (formFieldEl) {
117
- formFieldEl.focus();
118
- return removeKeyPressHandler;
119
- }
120
- }
121
-
122
- if (primaryButtonRef?.current != null) {
123
- primaryButtonRef.current.focus();
124
- }
125
- }
62
+ useModalFocus(
63
+ autoFocus,
64
+ childrenWrapperRef,
65
+ primaryButtonRef,
66
+ closeButtonRef,
67
+ );
126
68
 
127
- return removeKeyPressHandler;
128
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
69
+ useModalScrollPrevention(preventScrollUnderneath);
129
70
 
130
71
  if (portalId === null) {
131
72
  return preRender(
@@ -157,14 +98,16 @@ Modal.defaultProps = {
157
98
  closeButtonRef: null,
158
99
  portalId: null,
159
100
  position: 'center',
101
+ preventScrollUnderneath: 'default',
160
102
  primaryButtonRef: null,
161
103
  size: 'medium',
162
104
  };
163
105
 
164
106
  Modal.propTypes = {
165
107
  /**
166
- * If `true`, focus the first input element in the modal or primary button (referenced by the `primaryButtonRef` prop)
167
- * when the modal is opened.
108
+ * If `true`, focus the first input element in the `Modal`, or primary button (referenced by the `primaryButtonRef`
109
+ * prop), or other focusable element when the `Modal` is opened. If there are none or `autoFocus` is set to `false`,
110
+ * focus the Modal itself.
168
111
  */
169
112
  autoFocus: PropTypes.bool,
170
113
  /**
@@ -192,6 +135,24 @@ Modal.propTypes = {
192
135
  * Vertical position of the modal inside browser window.
193
136
  */
194
137
  position: PropTypes.oneOf(['top', 'center']),
138
+ /**
139
+ * Mode in which Modal prevents scroll of elements bellow:
140
+ * * `default` - Modal prevents scroll on the `body` element
141
+ * * `off` - Modal does not prevent any scroll
142
+ * * object
143
+ * * * `reset` - method called on Modal's unmount to reset scroll prevention
144
+ * * * `start` - method called on Modal's mount to custom scroll prevention
145
+ */
146
+ preventScrollUnderneath: PropTypes.oneOfType([
147
+ PropTypes.oneOf([
148
+ 'default',
149
+ 'off',
150
+ ]),
151
+ PropTypes.shape({
152
+ reset: PropTypes.func,
153
+ start: PropTypes.func,
154
+ }),
155
+ ]),
195
156
  /**
196
157
  * Reference to primary button element. It is used to submit modal when Enter key is pressed and as fallback
197
158
  * when `autoFocus` functionality does not find any input element to be focused.
@@ -8,11 +8,11 @@
8
8
  @include reset.button();
9
9
  @include accessibility.min-tap-target();
10
10
 
11
- font-size: map.get(typography.$size-values, 3);
11
+ font-size: map.get(typography.$font-size-values, 4);
12
12
  line-height: 1;
13
13
  color: inherit;
14
14
 
15
15
  &:disabled {
16
- cursor: var(--rui-disabled-cursor);
16
+ cursor: var(--rui-cursor-not-allowed);
17
17
  }
18
18
  }