@react-ui-org/react-ui 0.47.0 → 0.48.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 (94) hide show
  1. package/dist/lib.development.js +330 -54
  2. package/dist/lib.js +1 -1
  3. package/package.json +1 -1
  4. package/src/lib/components/Alert/README.mdx +4 -2
  5. package/src/lib/components/Alert/index.js +1 -1
  6. package/src/lib/components/Badge/README.mdx +1 -1
  7. package/src/lib/components/Badge/index.js +1 -1
  8. package/src/lib/components/Button/Button.jsx +31 -31
  9. package/src/lib/components/Button/README.mdx +4 -2
  10. package/src/lib/components/Button/index.js +1 -1
  11. package/src/lib/components/ButtonGroup/ButtonGroup.jsx +2 -1
  12. package/src/lib/components/ButtonGroup/README.mdx +4 -2
  13. package/src/lib/components/Card/README.mdx +7 -5
  14. package/src/lib/components/CheckboxField/CheckboxField.jsx +27 -28
  15. package/src/lib/components/CheckboxField/README.mdx +1 -1
  16. package/src/lib/components/CheckboxField/index.js +1 -1
  17. package/src/lib/components/FileInputField/FileInputField.jsx +27 -27
  18. package/src/lib/components/FileInputField/README.mdx +1 -1
  19. package/src/lib/components/FileInputField/index.js +1 -1
  20. package/src/lib/components/FormLayout/README.mdx +15 -13
  21. package/src/lib/components/Grid/Grid.jsx +31 -28
  22. package/src/lib/components/Grid/Grid.scss +10 -15
  23. package/src/lib/components/Grid/GridSpan.jsx +5 -4
  24. package/src/lib/components/Grid/README.mdx +34 -36
  25. package/src/lib/components/Grid/_helpers/generateResponsiveCustomProperties.js +11 -3
  26. package/src/lib/components/Grid/_settings.scss +18 -0
  27. package/src/lib/components/Grid/_tools.scss +5 -5
  28. package/src/lib/components/Modal/Modal.jsx +147 -250
  29. package/src/lib/components/Modal/Modal.scss +7 -55
  30. package/src/lib/components/Modal/ModalBody.jsx +64 -0
  31. package/src/lib/components/Modal/ModalBody.scss +18 -0
  32. package/src/lib/components/Modal/ModalCloseButton.jsx +61 -0
  33. package/src/lib/components/Modal/ModalCloseButton.scss +18 -0
  34. package/src/lib/components/Modal/ModalContent.jsx +43 -0
  35. package/src/lib/components/Modal/ModalContent.scss +5 -0
  36. package/src/lib/components/Modal/ModalFooter.jsx +46 -0
  37. package/src/lib/components/Modal/ModalFooter.scss +35 -0
  38. package/src/lib/components/Modal/ModalHeader.jsx +48 -0
  39. package/src/lib/components/Modal/ModalHeader.scss +30 -0
  40. package/src/lib/components/Modal/ModalTitle.jsx +45 -0
  41. package/src/lib/components/Modal/ModalTitle.scss +10 -0
  42. package/src/lib/components/Modal/README.mdx +842 -197
  43. package/src/lib/components/Modal/_helpers/getJustifyClassName.js +19 -0
  44. package/src/lib/components/Modal/_helpers/getScrollingClassName.js +11 -0
  45. package/src/lib/components/Modal/_settings.scss +1 -5
  46. package/src/lib/components/Modal/_theme.scss +6 -0
  47. package/src/lib/components/Modal/index.js +7 -1
  48. package/src/lib/components/Paper/README.mdx +1 -1
  49. package/src/lib/components/Paper/index.js +1 -1
  50. package/src/lib/components/Popover/Popover.jsx +24 -24
  51. package/src/lib/components/Popover/Popover.scss +7 -6
  52. package/src/lib/components/Popover/PopoverWrapper.jsx +5 -5
  53. package/src/lib/components/Popover/PopoverWrapper.scss +3 -0
  54. package/src/lib/components/Popover/README.mdx +13 -11
  55. package/src/lib/components/Popover/_theme.scss +1 -1
  56. package/src/lib/components/Radio/README.mdx +1 -1
  57. package/src/lib/components/Radio/Radio.jsx +37 -27
  58. package/src/lib/components/Radio/index.js +1 -1
  59. package/src/lib/components/ScrollView/README.mdx +146 -84
  60. package/src/lib/components/ScrollView/ScrollView.jsx +104 -113
  61. package/src/lib/components/ScrollView/ScrollView.scss +18 -16
  62. package/src/lib/components/ScrollView/index.js +1 -1
  63. package/src/lib/components/SelectField/README.mdx +66 -2
  64. package/src/lib/components/SelectField/SelectField.jsx +93 -49
  65. package/src/lib/components/SelectField/_components/Option/Option.jsx +46 -0
  66. package/src/lib/components/SelectField/_components/Option/index.js +1 -0
  67. package/src/lib/components/SelectField/index.js +1 -1
  68. package/src/lib/components/Table/README.mdx +4 -2
  69. package/src/lib/components/Table/Table.jsx +1 -1
  70. package/src/lib/components/Table/index.js +1 -1
  71. package/src/lib/components/Tabs/README.mdx +5 -3
  72. package/src/lib/components/Tabs/TabsItem.scss +1 -2
  73. package/src/lib/components/Text/README.mdx +9 -7
  74. package/src/lib/components/Text/index.js +1 -1
  75. package/src/lib/components/TextArea/README.mdx +1 -1
  76. package/src/lib/components/TextArea/TextArea.jsx +33 -33
  77. package/src/lib/components/TextArea/index.js +1 -1
  78. package/src/lib/components/TextField/README.mdx +3 -3
  79. package/src/lib/components/TextField/TextField.jsx +33 -34
  80. package/src/lib/components/TextField/index.js +1 -1
  81. package/src/lib/components/TextLink/README.mdx +1 -1
  82. package/src/lib/components/TextLink/index.js +1 -1
  83. package/src/lib/components/Toggle/README.mdx +1 -1
  84. package/src/lib/components/Toggle/Toggle.jsx +28 -28
  85. package/src/lib/components/Toggle/index.js +1 -1
  86. package/src/lib/components/Toolbar/README.mdx +8 -6
  87. package/src/lib/components/_helpers/transferProps.js +1 -1
  88. package/src/lib/index.js +24 -16
  89. package/src/lib/provider/withGlobalProps.jsx +20 -3
  90. package/src/lib/theme.scss +18 -26
  91. package/src/lib/translations/en.js +1 -1
  92. package/src/lib/components/Grid/_theme.scss +0 -11
  93. package/src/lib/components/ScrollView/_theme.scss +0 -2
  94. package/src/lib/components/withForwardedRef.jsx +0 -11
@@ -0,0 +1,19 @@
1
+ export const getJustifyClassName = (value, styles) => {
2
+ if (value === 'start') {
3
+ return styles.isJustifiedToStart;
4
+ }
5
+
6
+ if (value === 'center') {
7
+ return styles.isJustifiedToCenter;
8
+ }
9
+
10
+ if (value === 'end') {
11
+ return styles.isJustifiedToEnd;
12
+ }
13
+
14
+ if (value === 'space-between') {
15
+ return styles.isJustifiedToSpaceBetween;
16
+ }
17
+
18
+ return styles.isJustifiedToStretch;
19
+ };
@@ -0,0 +1,11 @@
1
+ export const getScrollingClassName = (type, styles) => {
2
+ if (type === 'auto') {
3
+ return styles.isRootScrollingAuto;
4
+ }
5
+
6
+ if (type === 'custom') {
7
+ return styles.isRootScrollingCustom;
8
+ }
9
+
10
+ return null;
11
+ };
@@ -2,12 +2,8 @@
2
2
  @use "../../styles/settings/z-indexes";
3
3
  @use "../../styles/theme/borders";
4
4
  @use "../../styles/theme/typography";
5
- @use "../../styles/tools/spacing";
6
5
 
7
- $padding-x: spacing.of(5);
8
- $padding-y: spacing.of(3);
9
- $content-padding-bottom: spacing.of(6);
10
6
  $border-radius: borders.$radius;
11
- $head-title-font-size: map.get(typography.$size-values, 1);
12
7
  $z-index: z-indexes.$modal;
13
8
  $backdrop-z-index: z-indexes.$modal-backdrop;
9
+ $title-font-size: map.get(typography.$size-values, 1);
@@ -1,6 +1,12 @@
1
+ $padding-x: var(--rui-Modal__padding-x);
2
+ $padding-y: var(--rui-Modal__padding-y);
1
3
  $background: var(--rui-Modal__background);
2
4
  $box-shadow: var(--rui-Modal__box-shadow);
5
+ $separator-width: var(--rui-Modal__separator__width);
6
+ $separator-color: var(--rui-Modal__separator__color);
7
+ $header-gap: var(--rui-Modal__header__gap);
3
8
  $footer-background: var(--rui-Modal__footer__background);
9
+ $footer-gap: var(--rui-Modal__footer__gap);
4
10
  $backdrop-background: var(--rui-Modal__backdrop__background);
5
11
  $outer-spacing-xs: var(--rui-Modal__outer-spacing--xs);
6
12
  $outer-spacing-sm: var(--rui-Modal__outer-spacing--sm);
@@ -1 +1,7 @@
1
- export { default } from './Modal';
1
+ export { default as Modal } from './Modal';
2
+ export { default as ModalBody } from './ModalBody';
3
+ export { default as ModalCloseButton } from './ModalCloseButton';
4
+ export { default as ModalContent } from './ModalContent';
5
+ export { default as ModalHeader } from './ModalHeader';
6
+ export { default as ModalFooter } from './ModalFooter';
7
+ export { default as ModalTitle } from './ModalTitle';
@@ -10,7 +10,7 @@ import {
10
10
  Playground,
11
11
  Props,
12
12
  } from 'docz'
13
- import { Paper } from './Paper'
13
+ import { Paper } from '../..'
14
14
 
15
15
  Paper is a basic surface to hold content.
16
16
 
@@ -1 +1 @@
1
- export { default } from './Paper';
1
+ export { default as Paper } from './Paper';
@@ -4,30 +4,30 @@ import { createPortal } from 'react-dom';
4
4
  import { withGlobalProps } from '../../provider';
5
5
  import { classNames } from '../../utils/classNames';
6
6
  import { transferProps } from '../_helpers/transferProps';
7
- import withForwardedRef from '../withForwardedRef';
8
7
  import getRootSideClassName from './_helpers/getRootSideClassName';
9
8
  import getRootAlignmentClassName from './_helpers/getRootAlignmentClassName';
10
9
  import styles from './Popover.scss';
11
10
 
12
- export const Popover = ({
13
- forwardedRef,
14
- placement,
15
- children,
16
- id,
17
- portalId,
18
- ...restProps
19
- }) => {
11
+ export const Popover = React.forwardRef((props, ref) => {
12
+ const {
13
+ placement,
14
+ children,
15
+ id,
16
+ portalId,
17
+ ...restProps
18
+ } = props;
19
+
20
20
  const PopoverEl = (
21
21
  <div
22
+ {...transferProps(restProps)}
22
23
  className={classNames(
23
24
  styles.root,
24
- forwardedRef && styles.isRootControlled,
25
+ ref && styles.isRootControlled,
25
26
  getRootSideClassName(placement, styles),
26
27
  getRootAlignmentClassName(placement, styles),
27
28
  )}
28
29
  id={id}
29
- ref={forwardedRef}
30
- {...transferProps(restProps)}
30
+ ref={ref}
31
31
  >
32
32
  {children}
33
33
  <span className={styles.arrow} />
@@ -39,13 +39,13 @@ export const Popover = ({
39
39
  }
40
40
 
41
41
  return createPortal(PopoverEl, document.getElementById(portalId));
42
- };
42
+ });
43
43
 
44
44
  Popover.defaultProps = {
45
- forwardedRef: undefined,
46
45
  id: undefined,
47
46
  placement: 'bottom',
48
47
  portalId: null,
48
+ ref: undefined,
49
49
  };
50
50
 
51
51
  Popover.propTypes = {
@@ -53,14 +53,6 @@ Popover.propTypes = {
53
53
  * Popover content.
54
54
  */
55
55
  children: PropTypes.node.isRequired,
56
- /**
57
- * Reference forwarded to the root `div` element.
58
- */
59
- forwardedRef: PropTypes.oneOfType([
60
- PropTypes.func,
61
- // eslint-disable-next-line react/forbid-prop-types
62
- PropTypes.shape({ current: PropTypes.any }),
63
- ]),
64
56
  /**
65
57
  * ID of the root HTML element.
66
58
  */
@@ -87,8 +79,16 @@ Popover.propTypes = {
87
79
  * If set, popover is rendered in the React Portal with that ID.
88
80
  */
89
81
  portalId: PropTypes.string,
82
+ /**
83
+ * Reference forwarded to the root `div` element.
84
+ */
85
+ ref: PropTypes.oneOfType([
86
+ PropTypes.func,
87
+ // eslint-disable-next-line react/forbid-prop-types
88
+ PropTypes.shape({ current: PropTypes.any }),
89
+ ]),
90
90
  };
91
91
 
92
- export const PopoverWithContext = withForwardedRef(withGlobalProps(Popover, 'Popover'));
92
+ export const PopoverWithGlobalProps = withGlobalProps(Popover, 'Popover');
93
93
 
94
- export default PopoverWithContext;
94
+ export default PopoverWithGlobalProps;
@@ -4,14 +4,15 @@
4
4
 
5
5
  @use "theme";
6
6
 
7
- .wrapper {
8
- position: relative;
9
- }
10
-
11
7
  .root {
12
8
  position: absolute;
13
- width: theme.$width;
9
+ width: max-content;
10
+ max-width: theme.$max-width;
14
11
  padding: theme.$padding;
12
+ text-align: left;
13
+ white-space: normal;
14
+ word-break: normal;
15
+ word-wrap: break-word;
15
16
  color: theme.$color;
16
17
  border: theme.$border-width solid theme.$border-color;
17
18
  border-radius: theme.$border-radius;
@@ -205,7 +206,7 @@
205
206
  transform: translate(0, -100%) rotateZ(90deg);
206
207
  }
207
208
 
208
- // Controlled
209
+ // Controlled placement
209
210
  .isRootControlled.isRootAtTop,
210
211
  .isRootControlled.isRootAtBottom,
211
212
  .isRootControlled.isRootAtLeft,
@@ -1,8 +1,8 @@
1
1
  import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
- import withForwardedRef from '../withForwardedRef';
5
- import styles from './Popover.scss';
4
+ import { transferProps } from '../_helpers/transferProps';
5
+ import styles from './PopoverWrapper.scss';
6
6
 
7
7
  export const PopoverWrapper = ({
8
8
  children,
@@ -11,9 +11,9 @@ export const PopoverWrapper = ({
11
11
  ...restProps
12
12
  }) => (
13
13
  <Tag
14
- className={styles.wrapper}
14
+ {...transferProps(restProps)}
15
+ className={styles.root}
15
16
  id={id}
16
- {...restProps}
17
17
  >
18
18
  {children}
19
19
  </Tag>
@@ -40,7 +40,7 @@ PopoverWrapper.propTypes = {
40
40
  tag: PropTypes.string,
41
41
  };
42
42
 
43
- export const PopoverWrapperWithContext = withForwardedRef(withGlobalProps(PopoverWrapper, 'PopoverWrapper'));
43
+ export const PopoverWrapperWithContext = withGlobalProps(PopoverWrapper, 'PopoverWrapper');
44
44
 
45
45
  export default PopoverWrapperWithContext;
46
46
 
@@ -0,0 +1,3 @@
1
+ .root {
2
+ position: relative;
3
+ }
@@ -16,13 +16,15 @@ import {
16
16
  Props,
17
17
  } from 'docz'
18
18
  import { Placeholder } from '../../../docs/_components/Placeholder/Placeholder'
19
- import { Button } from '../Button/Button'
20
- import { ButtonGroup } from '../ButtonGroup/ButtonGroup'
21
- import { SelectField } from '../SelectField/SelectField'
22
- import { Toolbar } from '../Toolbar/Toolbar'
23
- import { ToolbarItem } from '../Toolbar/ToolbarItem'
24
- import { Popover } from './Popover'
25
- import { PopoverWrapper } from './PopoverWrapper'
19
+ import {
20
+ Button,
21
+ Popover,
22
+ ButtonGroup,
23
+ SelectField,
24
+ Toolbar,
25
+ ToolbarItem,
26
+ PopoverWrapper,
27
+ } from '../..'
26
28
 
27
29
  Popover displays additional information without interrupting user flow.
28
30
 
@@ -205,8 +207,8 @@ As opposed to the [basic setup](#placement), Popover will be placed according to
205
207
  its triggering component (`reference`), but still recognizing the closest parent
206
208
  element with `position: relative` or `position: absolute` if there is any.
207
209
 
208
- Popover reacts on the `forwardedRef` option, necessary for advanced positioning:
209
- when `forwardedRef` is set, Popover resets its built-in positioning and relies
210
+ Popover reacts on the `ref` option, necessary for advanced positioning:
211
+ when `ref` is set, Popover resets its built-in positioning and relies
210
212
  on provided `style`.
211
213
 
212
214
  👉 Please consult [Floating UI] documentation to understand how it works and to
@@ -284,13 +286,12 @@ get an idea of all possible cases you may need to cover.
284
286
  >
285
287
  <Button
286
288
  aria-describedby={isPopoverOpen ? 'my-advanced-popover' : undefined}
287
- forwardedRef={reference}
288
289
  label="Trigger Popover"
289
290
  onClick={() => setIsPopoverOpen(!isPopoverOpen)}
291
+ ref={reference}
290
292
  />
291
293
  {isPopoverOpen && (
292
294
  <Popover
293
- forwardedRef={floating}
294
295
  id="my-advanced-popover"
295
296
  placement={finalPlacement}
296
297
  style={{
@@ -298,6 +299,7 @@ get an idea of all possible cases you may need to cover.
298
299
  top: y ? y : '',
299
300
  left: x ? x : '',
300
301
  }}
302
+ ref={floating}
301
303
  >
302
304
  Auto-flipping Popover
303
305
  </Popover>
@@ -2,7 +2,7 @@
2
2
 
3
3
  @use "sass:math";
4
4
 
5
- $width: var(--rui-Popover__width);
5
+ $max-width: var(--rui-Popover__max-width);
6
6
  $padding: var(--rui-Popover__padding);
7
7
  $border-width: var(--rui-Popover__border-width);
8
8
  $border-color: var(--rui-Popover__border-color);
@@ -12,7 +12,7 @@ import {
12
12
  Playground,
13
13
  Props,
14
14
  } from 'docz'
15
- import { Radio } from './Radio'
15
+ import { Radio } from '../..'
16
16
 
17
17
  ## Basic Usage
18
18
 
@@ -50,34 +50,37 @@ export const Radio = ({
50
50
  <div className={styles.field}>
51
51
  <ul className={styles.list}>
52
52
  {
53
- options.map((option) => (
54
- <li key={option.value}>
55
- <label
56
- className={styles.option}
57
- htmlFor={id && `${id}__item__${option.value}`}
58
- id={id && `${id}__item__${option.value}__label`}
59
- >
60
- <input
61
- {...transferProps(restProps)}
62
- className={styles.input}
63
- checked={restProps.onChange
64
- ? (value === option.value) || false
65
- : undefined}
66
- disabled={disabled || option.disabled}
67
- id={id && `${id}__item__${option.value}`}
68
- name={id}
69
- type="radio"
70
- value={option.value}
71
- />
72
- <span
73
- className={styles.optionLabel}
74
- id={id && `${id}__item__${option.value}__labelText`}
53
+ options.map((option) => {
54
+ const key = option.key ?? option.value;
55
+ return (
56
+ <li key={key}>
57
+ <label
58
+ className={styles.option}
59
+ htmlFor={id && `${id}__item__${key}`}
60
+ id={id && `${id}__item__${key}__label`}
75
61
  >
76
- { option.label }
77
- </span>
78
- </label>
79
- </li>
80
- ))
62
+ <input
63
+ {...transferProps(restProps)}
64
+ className={styles.input}
65
+ checked={restProps.onChange
66
+ ? (value === option.value) || false
67
+ : undefined}
68
+ disabled={disabled || option.disabled}
69
+ id={id && `${id}__item__${key}`}
70
+ name={id}
71
+ type="radio"
72
+ value={option.value}
73
+ />
74
+ <span
75
+ className={styles.optionLabel}
76
+ id={id && `${id}__item__${key}__labelText`}
77
+ >
78
+ { option.label }
79
+ </span>
80
+ </label>
81
+ </li>
82
+ );
83
+ })
81
84
  }
82
85
  </ul>
83
86
  {helpText && (
@@ -134,6 +137,9 @@ Radio.propTypes = {
134
137
  * * `<ID>__item__<VALUE>`
135
138
  * * `<ID>__item__<VALUE>__label`
136
139
  * * `<ID>__item__<VALUE>__labelText`
140
+ *
141
+ * If `key` in the option definition object is set,
142
+ * then `option.key` is used instead of `option.value` in place of `<VALUE>`.
137
143
  */
138
144
  id: PropTypes.string,
139
145
  /**
@@ -154,9 +160,13 @@ Radio.propTypes = {
154
160
  layout: PropTypes.oneOf(['horizontal', 'vertical']),
155
161
  /**
156
162
  * Set of options to be chosen from.
163
+ *
164
+ * For generating unique IDs the `option.value` is normally used. For cases when this is not practical or
165
+ * the `option.value` values are not unique the `option.key` attribute can be set manually.
157
166
  */
158
167
  options: PropTypes.arrayOf(PropTypes.shape({
159
168
  disabled: PropTypes.bool,
169
+ key: PropTypes.string,
160
170
  label: PropTypes.string.isRequired,
161
171
  value: PropTypes.oneOfType([
162
172
  PropTypes.string,
@@ -1 +1 @@
1
- export { default } from './Radio';
1
+ export { default as Radio } from './Radio';