@react-ui-org/react-ui 0.47.0 → 0.49.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 (142) hide show
  1. package/dist/lib.development.js +465 -93
  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 +18 -2
  7. package/src/lib/components/Alert/index.js +1 -1
  8. package/src/lib/components/Badge/Badge.jsx +4 -8
  9. package/src/lib/components/Badge/Badge.scss +21 -21
  10. package/src/lib/components/Badge/README.mdx +15 -1
  11. package/src/lib/components/Badge/index.js +1 -1
  12. package/src/lib/components/Button/Button.jsx +23 -34
  13. package/src/lib/components/Button/README.mdx +21 -7
  14. package/src/lib/components/Button/_base.scss +20 -20
  15. package/src/lib/components/Button/_priorities.scss +35 -35
  16. package/src/lib/components/Button/helpers/getRootLabelVisibilityClassName.js +7 -7
  17. package/src/lib/components/Button/helpers/getRootPriorityClassName.js +3 -3
  18. package/src/lib/components/Button/index.js +1 -1
  19. package/src/lib/components/ButtonGroup/ButtonGroup.jsx +2 -8
  20. package/src/lib/components/ButtonGroup/README.mdx +18 -2
  21. package/src/lib/components/Card/Card.jsx +6 -10
  22. package/src/lib/components/Card/Card.scss +13 -13
  23. package/src/lib/components/Card/CardBody.jsx +6 -10
  24. package/src/lib/components/Card/CardFooter.jsx +6 -7
  25. package/src/lib/components/Card/README.mdx +21 -5
  26. package/src/lib/components/CheckboxField/CheckboxField.jsx +17 -44
  27. package/src/lib/components/CheckboxField/README.mdx +18 -6
  28. package/src/lib/components/CheckboxField/index.js +1 -1
  29. package/src/lib/components/FileInputField/FileInputField.jsx +20 -29
  30. package/src/lib/components/FileInputField/FileInputField.scss +3 -3
  31. package/src/lib/components/FileInputField/README.mdx +30 -28
  32. package/src/lib/components/FileInputField/index.js +1 -1
  33. package/src/lib/components/FormLayout/FormLayout.jsx +5 -9
  34. package/src/lib/components/FormLayout/FormLayout.scss +3 -3
  35. package/src/lib/components/FormLayout/FormLayoutCustomField.jsx +4 -1
  36. package/src/lib/components/FormLayout/FormLayoutCustomField.scss +8 -8
  37. package/src/lib/components/FormLayout/README.mdx +28 -13
  38. package/src/lib/components/Grid/Grid.jsx +31 -35
  39. package/src/lib/components/Grid/Grid.scss +10 -15
  40. package/src/lib/components/Grid/GridSpan.jsx +5 -11
  41. package/src/lib/components/Grid/README.mdx +48 -36
  42. package/src/lib/components/Grid/_helpers/generateResponsiveCustomProperties.js +11 -3
  43. package/src/lib/components/Grid/_settings.scss +18 -0
  44. package/src/lib/components/Grid/_tools.scss +5 -5
  45. package/src/lib/components/Modal/Modal.jsx +147 -254
  46. package/src/lib/components/Modal/Modal.scss +7 -55
  47. package/src/lib/components/Modal/ModalBody.jsx +60 -0
  48. package/src/lib/components/Modal/ModalBody.scss +18 -0
  49. package/src/lib/components/Modal/ModalCloseButton.jsx +45 -0
  50. package/src/lib/components/Modal/ModalCloseButton.scss +18 -0
  51. package/src/lib/components/Modal/ModalContent.jsx +39 -0
  52. package/src/lib/components/Modal/ModalContent.scss +5 -0
  53. package/src/lib/components/Modal/ModalFooter.jsx +42 -0
  54. package/src/lib/components/Modal/ModalFooter.scss +35 -0
  55. package/src/lib/components/Modal/ModalHeader.jsx +44 -0
  56. package/src/lib/components/Modal/ModalHeader.scss +30 -0
  57. package/src/lib/components/Modal/ModalTitle.jsx +44 -0
  58. package/src/lib/components/Modal/ModalTitle.scss +10 -0
  59. package/src/lib/components/Modal/README.mdx +865 -195
  60. package/src/lib/components/Modal/_helpers/getJustifyClassName.js +19 -0
  61. package/src/lib/components/Modal/_helpers/getScrollingClassName.js +11 -0
  62. package/src/lib/components/Modal/_settings.scss +1 -5
  63. package/src/lib/components/Modal/_theme.scss +6 -0
  64. package/src/lib/components/Modal/index.js +7 -1
  65. package/src/lib/components/Paper/Paper.jsx +5 -9
  66. package/src/lib/components/Paper/Paper.scss +2 -2
  67. package/src/lib/components/Paper/README.mdx +15 -1
  68. package/src/lib/components/Paper/index.js +1 -1
  69. package/src/lib/components/Popover/Popover.jsx +14 -30
  70. package/src/lib/components/Popover/Popover.scss +7 -6
  71. package/src/lib/components/Popover/PopoverWrapper.jsx +5 -12
  72. package/src/lib/components/Popover/PopoverWrapper.scss +3 -0
  73. package/src/lib/components/Popover/README.mdx +32 -11
  74. package/src/lib/components/Popover/_theme.scss +1 -1
  75. package/src/lib/components/Radio/README.mdx +13 -6
  76. package/src/lib/components/Radio/Radio.jsx +39 -29
  77. package/src/lib/components/Radio/Radio.scss +3 -3
  78. package/src/lib/components/Radio/index.js +1 -1
  79. package/src/lib/components/ScrollView/README.mdx +165 -84
  80. package/src/lib/components/ScrollView/ScrollView.jsx +115 -117
  81. package/src/lib/components/ScrollView/ScrollView.scss +18 -16
  82. package/src/lib/components/ScrollView/index.js +1 -1
  83. package/src/lib/components/SelectField/README.mdx +83 -7
  84. package/src/lib/components/SelectField/SelectField.jsx +86 -61
  85. package/src/lib/components/SelectField/SelectField.scss +8 -8
  86. package/src/lib/components/SelectField/_components/Option/Option.jsx +46 -0
  87. package/src/lib/components/SelectField/_components/Option/index.js +1 -0
  88. package/src/lib/components/SelectField/index.js +1 -1
  89. package/src/lib/components/Table/README.mdx +25 -9
  90. package/src/lib/components/Table/Table.jsx +43 -101
  91. package/src/lib/components/Table/Table.scss +0 -24
  92. package/src/lib/components/Table/_components/TableBodyCell/TableBodyCell.jsx +46 -0
  93. package/src/lib/components/Table/_components/TableBodyCell/index.js +1 -0
  94. package/src/lib/components/Table/_components/TableCell.scss +25 -0
  95. package/src/lib/components/Table/_components/TableHeaderCell/TableHeaderCell.jsx +71 -0
  96. package/src/lib/components/Table/_components/TableHeaderCell/index.js +1 -0
  97. package/src/lib/components/Table/index.js +1 -1
  98. package/src/lib/components/Tabs/README.mdx +21 -3
  99. package/src/lib/components/Tabs/Tabs.jsx +6 -1
  100. package/src/lib/components/Tabs/TabsItem.jsx +3 -0
  101. package/src/lib/components/Tabs/TabsItem.scss +1 -2
  102. package/src/lib/components/Text/README.mdx +25 -7
  103. package/src/lib/components/Text/Text.jsx +3 -7
  104. package/src/lib/components/Text/Text.scss +6 -6
  105. package/src/lib/components/Text/_helpers/getRootClampClassName.js +2 -2
  106. package/src/lib/components/Text/_helpers/getRootHyphensClassName.js +2 -2
  107. package/src/lib/components/Text/_helpers/getRootWordWrappingClassName.js +2 -2
  108. package/src/lib/components/Text/index.js +1 -1
  109. package/src/lib/components/TextArea/README.mdx +34 -31
  110. package/src/lib/components/TextArea/TextArea.jsx +23 -63
  111. package/src/lib/components/TextArea/TextArea.scss +8 -8
  112. package/src/lib/components/TextArea/index.js +1 -1
  113. package/src/lib/components/TextField/README.mdx +56 -54
  114. package/src/lib/components/TextField/TextField.jsx +25 -52
  115. package/src/lib/components/TextField/TextField.scss +9 -9
  116. package/src/lib/components/TextField/index.js +1 -1
  117. package/src/lib/components/TextLink/README.mdx +13 -6
  118. package/src/lib/components/TextLink/TextLink.jsx +0 -10
  119. package/src/lib/components/TextLink/index.js +1 -1
  120. package/src/lib/components/Toggle/README.mdx +18 -6
  121. package/src/lib/components/Toggle/Toggle.jsx +18 -44
  122. package/src/lib/components/Toggle/index.js +1 -1
  123. package/src/lib/components/Toolbar/README.mdx +21 -6
  124. package/src/lib/components/Toolbar/Toolbar.jsx +9 -43
  125. package/src/lib/components/Toolbar/Toolbar.scss +24 -12
  126. package/src/lib/components/Toolbar/ToolbarGroup.jsx +7 -26
  127. package/src/lib/components/Toolbar/ToolbarItem.jsx +3 -7
  128. package/src/lib/components/Toolbar/_helpers/getAlignClassName.js +19 -0
  129. package/src/lib/components/Toolbar/_helpers/getJustifyClassName.js +16 -0
  130. package/src/lib/components/_helpers/getRootColorClassName.js +10 -10
  131. package/src/lib/components/_helpers/getRootSizeClassName.js +3 -3
  132. package/src/lib/components/_helpers/transferProps.js +1 -1
  133. package/src/lib/index.js +24 -16
  134. package/src/lib/provider/withGlobalProps.jsx +20 -3
  135. package/src/lib/styles/tools/form-fields/_box-field-layout.scss +15 -15
  136. package/src/lib/styles/tools/form-fields/_inline-field-elements.scss +1 -1
  137. package/src/lib/styles/tools/form-fields/_inline-field-layout.scss +9 -9
  138. package/src/lib/theme.scss +18 -26
  139. package/src/lib/translations/en.js +1 -1
  140. package/src/lib/components/Grid/_theme.scss +0 -11
  141. package/src/lib/components/ScrollView/_theme.scss +0 -2
  142. package/src/lib/components/withForwardedRef.jsx +0 -11
@@ -11,6 +11,7 @@ import {
11
11
  withGlobalProps,
12
12
  } from '../../provider';
13
13
  import { classNames } from '../../utils/classNames';
14
+ import { transferProps } from '../_helpers/transferProps';
14
15
  import { getElementsPositionDifference } from './_helpers/getElementsPositionDifference';
15
16
  import { useLoadResize } from './_hooks/useLoadResizeHook';
16
17
  import { useScrollPosition } from './_hooks/useScrollPositionHook';
@@ -21,23 +22,30 @@ import styles from './ScrollView.scss';
21
22
  // every value less or equal to 1px as start/end.
22
23
  const EDGE_DETECTION_INACCURACY_PX = 1;
23
24
 
24
- export const ScrollView = (props) => {
25
+ export const ScrollView = React.forwardRef((props, ref) => {
25
26
  const {
26
27
  arrows,
27
- arrowsColor,
28
28
  arrowsScrollStep,
29
29
  autoScroll,
30
30
  children,
31
- customEndShadowStyle,
32
- customNextArrow,
33
- customPrevArrow,
34
- customStartShadowStyle,
31
+ endShadowBackground,
32
+ endShadowInitialOffset,
33
+ endShadowSize,
35
34
  id,
36
35
  debounce,
37
36
  direction,
37
+ nextArrowColor,
38
+ nextArrowElement,
39
+ nextArrowInitialOffset,
40
+ prevArrowColor,
41
+ prevArrowElement,
42
+ prevArrowInitialOffset,
38
43
  scrollbar,
39
- shadowColor,
40
- shadowSize,
44
+ shadows,
45
+ startShadowBackground,
46
+ startShadowInitialOffset,
47
+ startShadowSize,
48
+ ...restProps
41
49
  } = props;
42
50
 
43
51
  const { translations } = useContext(RUIContext);
@@ -49,7 +57,8 @@ export const ScrollView = (props) => {
49
57
  const scrollPositionStart = direction === 'horizontal' ? 'left' : 'top';
50
58
  const scrollPositionEnd = direction === 'horizontal' ? 'right' : 'bottom';
51
59
  const scrollViewContentEl = useRef(null);
52
- const scrollViewViewportEl = useRef(null);
60
+ const blankRef = useRef(null);
61
+ const scrollViewViewportEl = ref ?? blankRef;
53
62
 
54
63
  const handleScrollViewState = (currentPosition) => {
55
64
  const isScrolledAtStartActive = currentPosition[scrollPositionStart]
@@ -84,7 +93,7 @@ export const ScrollView = (props) => {
84
93
 
85
94
  /**
86
95
  * If autoScroll is enabled, it automatically scrolls viewport element to the end of the
87
- * the viewport when content is changed. It is performed only when viewport element is
96
+ * viewport when content is changed. It is performed only when viewport element is
88
97
  * scrolled to the end of the viewport or when viewport element is in any position but
89
98
  * autoScroll triggered by previous change is still in progress.
90
99
  */
@@ -156,43 +165,6 @@ export const ScrollView = (props) => {
156
165
  [autoScroll, autoScrollChildrenKeys, autoScrollChildrenLength],
157
166
  );
158
167
 
159
- const setAlpha = (rgba, alpha) => ({
160
- ...rgba,
161
- alpha,
162
- });
163
-
164
- const rgbaToString = (rgba) => (
165
- `rgba(${rgba.red}, ${rgba.green}, ${rgba.blue}, ${rgba.alpha})`
166
- );
167
-
168
- const inlineStyle = (
169
- scrollDirection,
170
- customArrowsColor,
171
- customShadowColor,
172
- customShadowSize,
173
- startShadowStyle,
174
- endShadowStyle,
175
- ) => {
176
- const shadowStartColor = rgbaToString(customShadowColor);
177
- const shadowEndColor = rgbaToString(setAlpha(customShadowColor, 0));
178
-
179
- /* eslint-disable sort-keys */
180
- return {
181
- '--rui-local-arrow-color': customArrowsColor || 'inherit',
182
- '--rui-local-shadow-width': scrollDirection === 'horizontal' ? shadowSize : 'auto',
183
- '--rui-local-shadow-height': scrollDirection === 'horizontal' ? 'auto' : shadowSize,
184
- '--rui-local-start-shadow-background':
185
- startShadowStyle.background
186
- || `linear-gradient(${direction === 'horizontal' ? 'to right' : 'to bottom'}, ${shadowStartColor}, ${shadowEndColor})`,
187
- '--rui-local-start-shadow-box-shadow': startShadowStyle.boxShadow || 'none',
188
- '--rui-local-end-shadow-background':
189
- endShadowStyle.background
190
- || `linear-gradient(${direction === 'horizontal' ? 'to left' : 'to top'}, ${shadowStartColor}, ${shadowEndColor})`,
191
- '--rui-local-end-shadow-box-shadow': endShadowStyle.boxShadow || 'none',
192
- };
193
- /* eslint-enable sort-keys */
194
- };
195
-
196
168
  const arrowHandler = (contentEl, viewportEl, scrollViewDirection, shiftDirection, step) => {
197
169
  const offset = shiftDirection === 'next' ? step : -1 * step;
198
170
  const differenceX = scrollViewDirection === 'horizontal' ? offset : 0;
@@ -203,6 +175,7 @@ export const ScrollView = (props) => {
203
175
 
204
176
  return (
205
177
  <div
178
+ {...transferProps(restProps)}
206
179
  className={classNames(
207
180
  styles.root,
208
181
  isScrolledAtStart && styles.isRootScrolledAtStart,
@@ -210,31 +183,42 @@ export const ScrollView = (props) => {
210
183
  !scrollbar && styles.hasRootScrollbarDisabled,
211
184
  direction === 'horizontal' ? styles.isRootHorizontal : styles.isRootVertical,
212
185
  )}
213
- style={inlineStyle(
214
- direction,
215
- arrowsColor,
216
- shadowColor,
217
- shadowSize,
218
- customStartShadowStyle,
219
- customEndShadowStyle,
220
- )}
221
186
  id={id}
187
+ style={{
188
+ '--rui-local-end-shadow-background': endShadowBackground,
189
+ '--rui-local-end-shadow-direction': direction === 'horizontal' ? 'to left' : 'to top',
190
+ '--rui-local-end-shadow-initial-offset': endShadowInitialOffset,
191
+ '--rui-local-end-shadow-size': endShadowSize,
192
+ '--rui-local-next-arrow-color': nextArrowColor,
193
+ '--rui-local-next-arrow-initial-offset': nextArrowInitialOffset,
194
+ '--rui-local-prev-arrow-color': prevArrowColor,
195
+ '--rui-local-prev-arrow-initial-offset': prevArrowInitialOffset,
196
+ '--rui-local-start-shadow-background': startShadowBackground,
197
+ '--rui-local-start-shadow-direction': direction === 'horizontal' ? 'to right' : 'to bottom',
198
+ '--rui-local-start-shadow-initial-offset': startShadowInitialOffset,
199
+ '--rui-local-start-shadow-size': startShadowSize,
200
+ }}
222
201
  >
223
- <div className={styles.viewport} ref={scrollViewViewportEl}>
202
+ <div
203
+ className={styles.viewport}
204
+ ref={scrollViewViewportEl}
205
+ >
224
206
  <div
225
207
  className={styles.content}
226
- ref={scrollViewContentEl}
227
208
  id={id && `${id}__content`}
209
+ ref={scrollViewContentEl}
228
210
  >
229
211
  {children}
230
212
  </div>
231
213
  </div>
232
- <div className={styles.scrollingShadows} aria-hidden />
214
+ {shadows && (
215
+ <div className={styles.scrollingShadows} aria-hidden />
216
+ )}
233
217
  {arrows && (
234
218
  <>
235
219
  <button
236
- type="button"
237
220
  className={styles.arrowPrev}
221
+ id={id && `${id}__arrowPrevButton`}
238
222
  onClick={() => arrowHandler(
239
223
  scrollViewContentEl,
240
224
  scrollViewViewportEl,
@@ -243,15 +227,15 @@ export const ScrollView = (props) => {
243
227
  arrowsScrollStep,
244
228
  )}
245
229
  title={translations.ScrollView.previous}
246
- id={id && `${id}__arrowPrevButton`}
230
+ type="button"
247
231
  >
248
- {customPrevArrow || (
232
+ {prevArrowElement || (
249
233
  <span className={styles.arrowIcon} aria-hidden />
250
234
  )}
251
235
  </button>
252
236
  <button
253
- type="button"
254
237
  className={styles.arrowNext}
238
+ id={id && `${id}__arrowNextButton`}
255
239
  onClick={() => arrowHandler(
256
240
  scrollViewContentEl,
257
241
  scrollViewViewportEl,
@@ -260,9 +244,9 @@ export const ScrollView = (props) => {
260
244
  arrowsScrollStep,
261
245
  )}
262
246
  title={translations.ScrollView.next}
263
- id={id && `${id}__arrowNextButton`}
247
+ type="button"
264
248
  >
265
- {customNextArrow || (
249
+ {nextArrowElement || (
266
250
  <span className={styles.arrowIcon} aria-hidden />
267
251
  )}
268
252
  </button>
@@ -270,29 +254,30 @@ export const ScrollView = (props) => {
270
254
  )}
271
255
  </div>
272
256
  );
273
- };
257
+ });
274
258
 
275
259
  ScrollView.defaultProps = {
276
260
  arrows: false,
277
- arrowsColor: undefined,
278
261
  arrowsScrollStep: 200,
279
262
  autoScroll: 'off',
280
263
  children: null,
281
- customEndShadowStyle: {},
282
- customNextArrow: null,
283
- customPrevArrow: null,
284
- customStartShadowStyle: {},
285
264
  debounce: 50,
286
265
  direction: 'vertical',
266
+ endShadowBackground: 'linear-gradient(var(--rui-local-end-shadow-direction), rgba(255 255 255 / 1), rgba(255 255 255 / 0))',
267
+ endShadowInitialOffset: '-1rem',
268
+ endShadowSize: '2em',
287
269
  id: undefined,
270
+ nextArrowColor: undefined,
271
+ nextArrowElement: null,
272
+ nextArrowInitialOffset: '-0.5rem',
273
+ prevArrowColor: undefined,
274
+ prevArrowElement: null,
275
+ prevArrowInitialOffset: '-0.5rem',
288
276
  scrollbar: true,
289
- shadowColor: {
290
- alpha: 1,
291
- blue: 255,
292
- green: 255,
293
- red: 255,
294
- },
295
- shadowSize: '2em',
277
+ shadows: true,
278
+ startShadowBackground: 'linear-gradient(var(--rui-local-start-shadow-direction), rgba(255 255 255 / 1), rgba(255 255 255 / 0))',
279
+ startShadowInitialOffset: '-1rem',
280
+ startShadowSize: '2em',
296
281
  };
297
282
 
298
283
  ScrollView.propTypes = {
@@ -300,21 +285,17 @@ ScrollView.propTypes = {
300
285
  * If `true`, display the arrow controls.
301
286
  */
302
287
  arrows: PropTypes.bool,
303
- /**
304
- * Text color of the arrow controls. Accepts any valid CSS color value.
305
- */
306
- arrowsColor: PropTypes.string,
307
288
  /**
308
289
  * Portion to scroll by when the arrows are clicked, in px.
309
290
  */
310
291
  arrowsScrollStep: PropTypes.number,
311
292
  /**
312
- * Auto scroll mechanism requires to have the `key` prop set for every child present in `children`
313
- * prop because it detects changes of these keys. Without the keys, it will not work.
293
+ * The auto-scroll mechanism requires having the `key` prop set for every child present in `children`
294
+ * because it detects changes of those keys. Without the keys, the auto-scroll will not work.
314
295
  *
315
- * Option `always` means that auto scroll scrolls to the end every time the content changes.
316
- * Option `detectEnd` means that auto scroll scrolls to the end only when the content is changed
317
- * and the user scrolled at the end of the viewport at the moment of the change.
296
+ * Option `always` means the auto-scroll scrolls to the end every time the content changes.
297
+ * Option `detectEnd` means the auto-scroll scrolls to the end only when the content is changed
298
+ * and the user has scrolled at the end of the viewport at the moment of the change.
318
299
  *
319
300
  * See https://reactjs.org/docs/lists-and-keys.html#keys
320
301
  */
@@ -324,35 +305,26 @@ ScrollView.propTypes = {
324
305
  */
325
306
  children: PropTypes.node,
326
307
  /**
327
- * Custom CSS to replace the default end scrolling shadow.
328
- */
329
- customEndShadowStyle: PropTypes.shape({
330
- background: PropTypes.string,
331
- boxShadow: PropTypes.string,
332
- }),
333
- /**
334
- * Custom HTML or React Component to replace the default next-arrow control.
308
+ * Delay in ms before the display of arrows and scrolling shadows is evaluated during interaction.
335
309
  */
336
- customNextArrow: PropTypes.node,
310
+ debounce: PropTypes.number,
337
311
  /**
338
- * Custom HTML or React Component to replace the default prev-arrow control.
312
+ * Direction of scrolling.
339
313
  */
340
- customPrevArrow: PropTypes.node,
314
+ direction: PropTypes.oneOf(['horizontal', 'vertical']),
341
315
  /**
342
- * Custom CSS to replace the default start scrolling shadow.
316
+ * Custom background of the end scrolling shadow. Can be a CSS gradient or an image `url()`.
343
317
  */
344
- customStartShadowStyle: PropTypes.shape({
345
- background: PropTypes.string,
346
- boxShadow: PropTypes.string,
347
- }),
318
+ endShadowBackground: PropTypes.string,
348
319
  /**
349
- * Delay in ms before the display of arrows and scrolling shadows is evaluated during interaction.
320
+ * Initial offset of the end scrolling shadow (transitioned). If set, the end scrolling shadow slides in
321
+ * by this distance.
350
322
  */
351
- debounce: PropTypes.number,
323
+ endShadowInitialOffset: PropTypes.string,
352
324
  /**
353
- * Direction of scrolling.
325
+ * Size of the end scrolling shadow. Accepts any valid CSS length value.
354
326
  */
355
- direction: PropTypes.oneOf(['horizontal', 'vertical']),
327
+ endShadowSize: PropTypes.string,
356
328
  /**
357
329
  * ID of the root HTML element. It also serves as base for nested elements:
358
330
  * * `<ID>__content`
@@ -360,25 +332,51 @@ ScrollView.propTypes = {
360
332
  * * `<ID>__arrowNextButton`
361
333
  */
362
334
  id: PropTypes.string,
335
+ /**
336
+ * Text color of the end arrow control. Accepts any valid CSS color value.
337
+ */
338
+ nextArrowColor: PropTypes.string,
339
+ /**
340
+ * Custom HTML or React Component to replace the default next-arrow control.
341
+ */
342
+ nextArrowElement: PropTypes.node,
343
+ /**
344
+ * Initial offset of the end arrow control (transitioned). If set, the next arrow slides in by this distance.
345
+ */
346
+ nextArrowInitialOffset: PropTypes.string,
347
+ /**
348
+ * Text color of the start arrow control. Accepts any valid CSS color value.
349
+ */
350
+ prevArrowColor: PropTypes.string,
351
+ /**
352
+ * Custom HTML or React Component to replace the default prev-arrow control.
353
+ */
354
+ prevArrowElement: PropTypes.node,
355
+ /**
356
+ * Initial offset of the start arrow control (transitioned). If set, the prev arrow slides in by this distance.
357
+ */
358
+ prevArrowInitialOffset: PropTypes.string,
363
359
  /**
364
360
  * If `false`, the system scrollbar will be hidden.
365
361
  */
366
362
  scrollbar: PropTypes.bool,
367
363
  /**
368
- * Color of the default scrolling shadows in the RGBA format. It doesn't have effect on custom
369
- * scrolling shadows.
364
+ * If `true`, display scrolling shadows.
365
+ */
366
+ shadows: PropTypes.bool,
367
+ /**
368
+ * Custom background of the start scrolling shadow. Can be a CSS gradient or an image `url()`.
369
+ */
370
+ startShadowBackground: PropTypes.string,
371
+ /**
372
+ * Initial offset of the start scrolling shadow (transitioned). If set, the start scrolling shadow slides in
373
+ * by this distance.
370
374
  */
371
- shadowColor: PropTypes.shape({
372
- alpha: PropTypes.number.isRequired,
373
- blue: PropTypes.number.isRequired,
374
- green: PropTypes.number.isRequired,
375
- red: PropTypes.number.isRequired,
376
- }),
375
+ startShadowInitialOffset: PropTypes.string,
377
376
  /**
378
- * Size of scrolling shadows. Works as height in the vertical mode and as width in the horizontal
379
- * mode.
377
+ * Size of the start scrolling shadow. Accepts any valid CSS length value.
380
378
  */
381
- shadowSize: PropTypes.string,
379
+ startShadowSize: PropTypes.string,
382
380
  };
383
381
 
384
382
  export const ScrollViewWithGlobalProps = withGlobalProps(ScrollView, 'ScrollView');
@@ -1,7 +1,7 @@
1
1
  // 1. Scrolling shadows are implemented as pseudo elements. This way we can customise them only
2
2
  // with custom properties.
3
3
  //
4
- // 2. Stack scrolling shadows over viewport content while keeping the content interactive.
4
+ // 2. Stack scrolling shadows over viewport content while keeping the content interactive.
5
5
  //
6
6
  // - `.scrollingShadows` is positioned absolutely over the `.root`, with auto `z-index` (this is
7
7
  // important!), and with `overflow: hidden` to clip the shadows (ie. its pseudo elements).
@@ -27,7 +27,6 @@
27
27
  @use "../../styles/tools/scrollbar";
28
28
  @use "../../styles/tools/spacing";
29
29
  @use "../../styles/tools/transition";
30
- @use "theme";
31
30
 
32
31
  $_arrow-inner-spacing: spacing.of(2);
33
32
  $_arrow-outer-spacing: spacing.of(4);
@@ -45,6 +44,7 @@ $_arrow-outer-spacing: spacing.of(4);
45
44
  width: 100%; // 2.
46
45
  height: 100%; // 2.
47
46
  overflow: hidden; // 2.
47
+ pointer-events: none; // 2.
48
48
 
49
49
  &::before,
50
50
  &::after {
@@ -54,20 +54,16 @@ $_arrow-outer-spacing: spacing.of(4);
54
54
  position: absolute;
55
55
  z-index: 2; // 2.
56
56
  display: block;
57
- width: var(--rui-local-shadow-width);
58
- height: var(--rui-local-shadow-height);
59
57
  visibility: hidden;
60
58
  opacity: 0;
61
59
  }
62
60
 
63
61
  &::before {
64
62
  background: var(--rui-local-start-shadow-background);
65
- box-shadow: var(--rui-local-start-shadow-box-shadow);
66
63
  }
67
64
 
68
65
  &::after {
69
66
  background: var(--rui-local-end-shadow-background);
70
- box-shadow: var(--rui-local-end-shadow-box-shadow);
71
67
  }
72
68
  }
73
69
 
@@ -75,7 +71,6 @@ $_arrow-outer-spacing: spacing.of(4);
75
71
  z-index: 1; // 2.
76
72
  width: 100%;
77
73
  scroll-behavior: smooth;
78
- -webkit-overflow-scrolling: touch;
79
74
  }
80
75
 
81
76
  .arrowPrev,
@@ -89,7 +84,6 @@ $_arrow-outer-spacing: spacing.of(4);
89
84
  display: flex;
90
85
  align-items: center;
91
86
  justify-content: center;
92
- color: var(--rui-local-arrow-color);
93
87
  visibility: hidden;
94
88
  opacity: 0;
95
89
  }
@@ -116,7 +110,8 @@ $_arrow-outer-spacing: spacing.of(4);
116
110
  width: 100%;
117
111
  padding-top: $_arrow-outer-spacing;
118
112
  padding-bottom: $_arrow-inner-spacing;
119
- transform: translateY(theme.$arrow-initial-offset);
113
+ color: var(--rui-local-prev-arrow-color);
114
+ transform: translateY(var(--rui-local-prev-arrow-initial-offset));
120
115
  }
121
116
 
122
117
  .isRootVertical .arrowPrev .arrowIcon {
@@ -130,7 +125,8 @@ $_arrow-outer-spacing: spacing.of(4);
130
125
  width: 100%;
131
126
  padding-top: $_arrow-inner-spacing;
132
127
  padding-bottom: $_arrow-outer-spacing;
133
- transform: translateY(calc(-1 * #{theme.$arrow-initial-offset}));
128
+ color: var(--rui-local-next-arrow-color);
129
+ transform: translateY(calc(-1 * var(--rui-local-next-arrow-initial-offset)));
134
130
  }
135
131
 
136
132
  .isRootHorizontal {
@@ -143,7 +139,7 @@ $_arrow-outer-spacing: spacing.of(4);
143
139
  left: 0;
144
140
  padding-right: $_arrow-inner-spacing;
145
141
  padding-left: $_arrow-outer-spacing;
146
- transform: translateX(theme.$arrow-initial-offset);
142
+ transform: translateX(var(--rui-local-prev-arrow-initial-offset));
147
143
  }
148
144
 
149
145
  .isRootHorizontal .arrowPrev .arrowIcon {
@@ -156,7 +152,7 @@ $_arrow-outer-spacing: spacing.of(4);
156
152
  bottom: 0;
157
153
  padding-right: $_arrow-outer-spacing;
158
154
  padding-left: $_arrow-inner-spacing;
159
- transform: translateX(calc(-1 * #{theme.$arrow-initial-offset}));
155
+ transform: translateX(calc(-1 * var(--rui-local-next-arrow-initial-offset)));
160
156
  }
161
157
 
162
158
  .isRootHorizontal .arrowNext .arrowIcon {
@@ -167,16 +163,19 @@ $_arrow-outer-spacing: spacing.of(4);
167
163
  .isRootVertical .scrollingShadows::after {
168
164
  right: 0;
169
165
  left: 0;
166
+ width: auto;
170
167
  }
171
168
 
172
169
  .isRootVertical .scrollingShadows::before {
173
170
  top: 0;
174
- transform: translateY(theme.$shadow-initial-offset);
171
+ height: var(--rui-local-start-shadow-size);
172
+ transform: translateY(var(--rui-local-start-shadow-initial-offset));
175
173
  }
176
174
 
177
175
  .isRootVertical .scrollingShadows::after {
178
176
  bottom: 0;
179
- transform: translateY(calc(-1 * #{theme.$shadow-initial-offset}));
177
+ height: var(--rui-local-end-shadow-size);
178
+ transform: translateY(calc(-1 * var(--rui-local-end-shadow-initial-offset)));
180
179
  }
181
180
 
182
181
  .isRootHorizontal .viewport {
@@ -193,16 +192,19 @@ $_arrow-outer-spacing: spacing.of(4);
193
192
  .isRootHorizontal .scrollingShadows::after {
194
193
  top: 0;
195
194
  bottom: 0;
195
+ height: auto;
196
196
  }
197
197
 
198
198
  .isRootHorizontal .scrollingShadows::before {
199
199
  left: 0;
200
- transform: translateX(theme.$shadow-initial-offset);
200
+ width: var(--rui-local-start-shadow-size);
201
+ transform: translateX(var(--rui-local-start-shadow-initial-offset));
201
202
  }
202
203
 
203
204
  .isRootHorizontal .scrollingShadows::after {
204
205
  right: 0;
205
- transform: translateX(calc(-1 * #{theme.$shadow-initial-offset}));
206
+ width: var(--rui-local-end-shadow-size);
207
+ transform: translateX(calc(-1 * var(--rui-local-end-shadow-initial-offset)));
206
208
  }
207
209
 
208
210
  .isRootScrolledAtStart .scrollingShadows::before,
@@ -1 +1 @@
1
- export { default } from './ScrollView';
1
+ export { default as ScrollView } from './ScrollView';
@@ -12,7 +12,7 @@ import {
12
12
  Playground,
13
13
  Props,
14
14
  } from 'docz'
15
- import { SelectField } from './SelectField'
15
+ import { SelectField } from '../..'
16
16
 
17
17
  ## Basic Usage
18
18
 
@@ -79,7 +79,7 @@ See [API](#api) for all available options.
79
79
  entered.
80
80
 
81
81
  - In case of a large amount of options, consider **grouping related items
82
- together** by nesting them (implements the `optgroup` HTML element).
82
+ together** by nesting them.
83
83
 
84
84
  👉 We use the **native `select`** HTML element to improve user experience on
85
85
  mobile devices by using the native select of the platform.
@@ -240,6 +240,70 @@ Full-width fields span the full width of a parent:
240
240
  }}
241
241
  </Playground>
242
242
 
243
+ ## Grouping Related Options
244
+
245
+ For a large amount of options you can group related items together by nesting
246
+ them (implements the `optgroup` HTML element).
247
+
248
+ <Playground>
249
+ {() => {
250
+ const [crop, setCrop] = React.useState('apple');
251
+ const options = [
252
+ {
253
+ label: 'Fruits',
254
+ options: [
255
+ {
256
+ label: 'Apple',
257
+ value: 'apple',
258
+ },
259
+ {
260
+ label: 'Banana',
261
+ value: 'banana',
262
+ },
263
+ {
264
+ label: 'Grapefruit',
265
+ value: 'grapefruit',
266
+ },
267
+ ],
268
+ },
269
+ {
270
+ label: 'Vegetables',
271
+ options: [
272
+ {
273
+ label: 'Beetroot',
274
+ value: 'beetroot',
275
+ },
276
+ {
277
+ label: 'Carrot',
278
+ value: 'carrot',
279
+ },
280
+ {
281
+ label: 'Tomato',
282
+ value: 'tomato',
283
+ },
284
+ ],
285
+ },
286
+ ];
287
+ return (
288
+ <>
289
+ <SelectField
290
+ label="Your favourite crop"
291
+ onChange={(e) => setCrop(e.target.value)}
292
+ options={options}
293
+ value={crop}
294
+ />
295
+ <SelectField
296
+ label="Your favourite crop"
297
+ onChange={(e) => setCrop(e.target.value)}
298
+ options={options}
299
+ value={crop}
300
+ variant="filled"
301
+ />
302
+ </>
303
+ );
304
+ }}
305
+ </Playground>
306
+
243
307
  ## Invisible Label
244
308
 
245
309
  While it may be acceptable for login screens with just a few fields or for other
@@ -594,12 +658,22 @@ It's possible to disable just some options or the whole input.
594
658
  }}
595
659
  </Playground>
596
660
 
597
- ## API
661
+ ## Forwarding HTML Attributes
662
+
663
+ In addition to the options below in the [component's API](#api) section, you
664
+ can specify [React synthetic events] or you can **add whatever HTML attribute
665
+ you like.** All attributes that don't interfere with the API are forwarded to
666
+ the native HTML `<select>`. This enables making the component interactive and helps
667
+ to improve its accessibility.
668
+
669
+ 👉 Refer to the MDN reference for the full list of supported attributes of the
670
+ [select] element.
598
671
 
599
- In addition to the options below, you can specify [React synthetic events] or
600
- any custom HTML attributes that do not interfere with the API, and they will be
601
- passed to the `<select>` HTML element. This enables making the component
602
- interactive and helps improve its accessibility.
672
+ ## Forwarding ref
673
+
674
+ If you provide [ref], it is forwarded to the native HTML `<select>` element.
675
+
676
+ ## API
603
677
 
604
678
  <Props table of={SelectField} />
605
679
 
@@ -615,3 +689,5 @@ options. On top of that, the following options are available for SelectField.
615
689
  | `--rui-FormField--box--select__option--disabled__color` | Text color of disabled SelectField options |
616
690
 
617
691
  [React synthetic events]: https://reactjs.org/docs/events.html
692
+ [select]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select#attributes
693
+ [ref]: https://reactjs.org/docs/refs-and-the-dom.html