@react-ui-org/react-ui 0.54.0 → 0.55.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 (148) hide show
  1. package/README.md +7 -5
  2. package/dist/react-ui.css +36 -38
  3. package/dist/react-ui.development.css +10021 -10523
  4. package/dist/react-ui.development.js +211 -231
  5. package/dist/react-ui.js +1 -1
  6. package/package.json +3 -2
  7. package/src/components/Alert/Alert.jsx +1 -1
  8. package/src/components/Alert/Alert.module.scss +100 -0
  9. package/src/components/Alert/README.md +9 -7
  10. package/src/components/Badge/Badge.jsx +1 -1
  11. package/src/components/Badge/Badge.module.scss +109 -0
  12. package/src/components/Badge/README.md +9 -7
  13. package/src/components/Button/Button.jsx +1 -1
  14. package/src/components/Button/README.md +9 -7
  15. package/src/components/Button/_base.scss +117 -115
  16. package/src/components/Button/_priorities.scss +135 -133
  17. package/src/components/ButtonGroup/ButtonGroup.jsx +1 -1
  18. package/src/components/ButtonGroup/ButtonGroup.module.scss +35 -0
  19. package/src/components/ButtonGroup/README.md +10 -8
  20. package/src/components/Card/Card.jsx +1 -1
  21. package/src/components/Card/Card.module.scss +72 -0
  22. package/src/components/Card/CardBody.jsx +1 -1
  23. package/src/components/Card/CardFooter.jsx +1 -1
  24. package/src/components/Card/README.md +9 -7
  25. package/src/components/CheckboxField/CheckboxField.jsx +1 -1
  26. package/src/components/CheckboxField/CheckboxField.module.scss +63 -0
  27. package/src/components/CheckboxField/README.md +10 -8
  28. package/src/components/FileInputField/FileInputField.jsx +1 -1
  29. package/src/components/FileInputField/FileInputField.module.scss +65 -0
  30. package/src/components/FileInputField/README.md +10 -8
  31. package/src/components/FormLayout/FormLayout.jsx +1 -1
  32. package/src/components/FormLayout/{FormLayout.scss → FormLayout.module.scss} +30 -28
  33. package/src/components/FormLayout/FormLayoutCustomField.jsx +1 -1
  34. package/src/components/FormLayout/FormLayoutCustomField.module.scss +65 -0
  35. package/src/components/FormLayout/README.md +11 -9
  36. package/src/components/Grid/Grid.jsx +1 -1
  37. package/src/components/Grid/Grid.module.scss +66 -0
  38. package/src/components/Grid/GridSpan.jsx +1 -1
  39. package/src/components/Grid/README.md +11 -8
  40. package/src/components/InputGroup/InputGroup.jsx +1 -1
  41. package/src/components/InputGroup/InputGroup.module.scss +93 -0
  42. package/src/components/InputGroup/README.md +10 -8
  43. package/src/components/Modal/Modal.jsx +1 -1
  44. package/src/components/Modal/Modal.module.scss +80 -0
  45. package/src/components/Modal/ModalBody.jsx +1 -1
  46. package/src/components/Modal/ModalBody.module.scss +20 -0
  47. package/src/components/Modal/ModalCloseButton.jsx +1 -1
  48. package/src/components/Modal/ModalCloseButton.module.scss +20 -0
  49. package/src/components/Modal/ModalContent.jsx +1 -1
  50. package/src/components/Modal/ModalContent.module.scss +7 -0
  51. package/src/components/Modal/ModalFooter.jsx +1 -1
  52. package/src/components/Modal/ModalFooter.module.scss +37 -0
  53. package/src/components/Modal/ModalHeader.jsx +1 -1
  54. package/src/components/Modal/ModalHeader.module.scss +32 -0
  55. package/src/components/Modal/ModalTitle.jsx +1 -1
  56. package/src/components/Modal/ModalTitle.module.scss +12 -0
  57. package/src/components/Modal/README.md +17 -14
  58. package/src/components/Paper/Paper.jsx +1 -1
  59. package/src/components/Paper/Paper.module.scss +19 -0
  60. package/src/components/Paper/README.md +9 -7
  61. package/src/components/Popover/Popover.jsx +1 -1
  62. package/src/components/Popover/Popover.module.scss +238 -0
  63. package/src/components/Popover/PopoverWrapper.jsx +1 -2
  64. package/src/components/Popover/PopoverWrapper.module.scss +5 -0
  65. package/src/components/Popover/README.md +9 -7
  66. package/src/components/Radio/README.md +12 -10
  67. package/src/components/Radio/Radio.jsx +1 -1
  68. package/src/components/Radio/Radio.module.scss +85 -0
  69. package/src/components/ScrollView/README.md +10 -8
  70. package/src/components/ScrollView/ScrollView.jsx +1 -1
  71. package/src/components/ScrollView/ScrollView.module.scss +233 -0
  72. package/src/components/SelectField/README.md +10 -8
  73. package/src/components/SelectField/SelectField.jsx +1 -1
  74. package/src/components/SelectField/SelectField.module.scss +111 -0
  75. package/src/components/Table/README.md +10 -8
  76. package/src/components/Table/Table.jsx +1 -1
  77. package/src/components/Table/Table.module.scss +30 -0
  78. package/src/components/Table/_components/TableBodyCell/TableBodyCell.jsx +1 -1
  79. package/src/components/Table/_components/TableCell.module.scss +28 -0
  80. package/src/components/Table/_components/TableHeaderCell/TableHeaderCell.jsx +1 -1
  81. package/src/components/Tabs/README.md +16 -10
  82. package/src/components/Tabs/Tabs.jsx +1 -1
  83. package/src/components/Tabs/Tabs.module.scss +31 -0
  84. package/src/components/Tabs/TabsItem.jsx +1 -1
  85. package/src/components/Tabs/TabsItem.module.scss +119 -0
  86. package/src/components/Text/README.md +15 -9
  87. package/src/components/Text/Text.jsx +1 -1
  88. package/src/components/Text/Text.module.scss +42 -0
  89. package/src/components/TextArea/README.md +10 -8
  90. package/src/components/TextArea/TextArea.jsx +1 -1
  91. package/src/components/TextArea/TextArea.module.scss +97 -0
  92. package/src/components/TextField/README.md +13 -8
  93. package/src/components/TextField/TextField.jsx +1 -1
  94. package/src/components/TextField/TextField.module.scss +109 -0
  95. package/src/components/TextLink/README.md +10 -8
  96. package/src/components/TextLink/TextLink.jsx +1 -1
  97. package/src/components/TextLink/TextLink.module.scss +18 -0
  98. package/src/components/Toggle/README.md +10 -8
  99. package/src/components/Toggle/Toggle.jsx +1 -1
  100. package/src/components/Toggle/Toggle.module.scss +63 -0
  101. package/src/components/Toolbar/README.md +9 -7
  102. package/src/components/Toolbar/Toolbar.jsx +1 -1
  103. package/src/components/Toolbar/Toolbar.module.scss +85 -0
  104. package/src/components/Toolbar/ToolbarGroup.jsx +1 -1
  105. package/src/components/Toolbar/ToolbarItem.jsx +1 -1
  106. package/src/components/_helpers/transferProps.js +47 -7
  107. package/src/foundation.scss +22 -17
  108. package/src/helpers.scss +12 -8
  109. package/src/index.js +3 -4
  110. package/src/index.scss +7 -0
  111. package/src/layers.scss +4 -0
  112. package/src/styles/elements/_page.scss +0 -4
  113. package/src/styles/helpers/_animation.scss +2 -2
  114. package/src/styles/tools/_utilities.scss +1 -1
  115. package/src/theme.scss +1040 -1038
  116. package/src/components/Alert/Alert.scss +0 -98
  117. package/src/components/Badge/Badge.scss +0 -107
  118. package/src/components/ButtonGroup/ButtonGroup.scss +0 -33
  119. package/src/components/Card/Card.scss +0 -70
  120. package/src/components/CheckboxField/CheckboxField.scss +0 -61
  121. package/src/components/FileInputField/FileInputField.scss +0 -63
  122. package/src/components/FormLayout/FormLayoutCustomField.scss +0 -63
  123. package/src/components/Grid/Grid.scss +0 -63
  124. package/src/components/InputGroup/InputGroup.scss +0 -91
  125. package/src/components/Modal/Modal.scss +0 -78
  126. package/src/components/Modal/ModalBody.scss +0 -18
  127. package/src/components/Modal/ModalCloseButton.scss +0 -18
  128. package/src/components/Modal/ModalContent.scss +0 -5
  129. package/src/components/Modal/ModalFooter.scss +0 -35
  130. package/src/components/Modal/ModalHeader.scss +0 -30
  131. package/src/components/Modal/ModalTitle.scss +0 -10
  132. package/src/components/Paper/Paper.scss +0 -17
  133. package/src/components/Popover/Popover.scss +0 -236
  134. package/src/components/Popover/PopoverWrapper.scss +0 -3
  135. package/src/components/Radio/Radio.scss +0 -83
  136. package/src/components/ScrollView/ScrollView.scss +0 -227
  137. package/src/components/SelectField/SelectField.scss +0 -109
  138. package/src/components/Table/Table.scss +0 -28
  139. package/src/components/Table/_components/TableCell.scss +0 -26
  140. package/src/components/Tabs/Tabs.scss +0 -28
  141. package/src/components/Tabs/TabsItem.scss +0 -117
  142. package/src/components/Text/Text.scss +0 -40
  143. package/src/components/TextArea/TextArea.scss +0 -95
  144. package/src/components/TextField/TextField.scss +0 -107
  145. package/src/components/TextLink/TextLink.scss +0 -16
  146. package/src/components/Toggle/Toggle.scss +0 -61
  147. package/src/components/Toolbar/Toolbar.scss +0 -83
  148. /package/src/components/Button/{Button.scss → Button.module.scss} +0 -0
@@ -4,7 +4,7 @@ import { withGlobalProps } from '../../provider';
4
4
  import { transferProps } from '../_helpers/transferProps';
5
5
  import { classNames } from '../../utils/classNames';
6
6
  import { getJustifyClassName } from './_helpers/getJustifyClassName';
7
- import styles from './ModalFooter.scss';
7
+ import styles from './ModalFooter.module.scss';
8
8
 
9
9
  export const ModalFooter = ({
10
10
  children,
@@ -0,0 +1,37 @@
1
+ @use "settings";
2
+ @use "theme";
3
+
4
+ @layer components.modal {
5
+ .root {
6
+ display: flex;
7
+ flex: none;
8
+ flex-wrap: wrap;
9
+ gap: theme.$footer-gap;
10
+ align-items: center;
11
+ padding: theme.$padding-y theme.$padding-x;
12
+ border-top: theme.$separator-width solid theme.$separator-color;
13
+ border-bottom-right-radius: settings.$border-radius;
14
+ border-bottom-left-radius: settings.$border-radius;
15
+ background: theme.$footer-background;
16
+ }
17
+
18
+ .isRootJustifiedToStart {
19
+ justify-content: flex-start;
20
+ }
21
+
22
+ .isRootJustifiedToCenter {
23
+ justify-content: center;
24
+ }
25
+
26
+ .isRootJustifiedToEnd {
27
+ justify-content: flex-end;
28
+ }
29
+
30
+ .isRootJustifiedToSpaceBetween {
31
+ justify-content: space-between;
32
+ }
33
+
34
+ .isRootJustifiedToStretch {
35
+ display: block;
36
+ }
37
+ }
@@ -6,7 +6,7 @@ import {
6
6
  import { transferProps } from '../_helpers/transferProps';
7
7
  import { classNames } from '../../utils/classNames';
8
8
  import { getJustifyClassName } from './_helpers/getJustifyClassName';
9
- import styles from './ModalHeader.scss';
9
+ import styles from './ModalHeader.module.scss';
10
10
 
11
11
  export const ModalHeader = ({
12
12
  children,
@@ -0,0 +1,32 @@
1
+ @use "theme";
2
+
3
+ @layer components.modal {
4
+ .root {
5
+ display: flex;
6
+ flex: none;
7
+ gap: theme.$header-gap;
8
+ align-items: baseline;
9
+ padding: theme.$padding-y theme.$padding-x;
10
+ border-bottom: theme.$separator-width solid theme.$separator-color;
11
+ }
12
+
13
+ .isRootJustifiedToStart {
14
+ justify-content: flex-start;
15
+ }
16
+
17
+ .isRootJustifiedToCenter {
18
+ justify-content: center;
19
+ }
20
+
21
+ .isRootJustifiedToEnd {
22
+ justify-content: flex-end;
23
+ }
24
+
25
+ .isRootJustifiedToSpaceBetween {
26
+ justify-content: space-between;
27
+ }
28
+
29
+ .isRootJustifiedToStretch {
30
+ display: block;
31
+ }
32
+ }
@@ -4,7 +4,7 @@ import {
4
4
  withGlobalProps,
5
5
  } from '../../provider';
6
6
  import { transferProps } from '../_helpers/transferProps';
7
- import styles from './ModalTitle.scss';
7
+ import styles from './ModalTitle.module.scss';
8
8
 
9
9
  export const ModalTitle = ({
10
10
  children,
@@ -0,0 +1,12 @@
1
+ @use "settings";
2
+
3
+ @layer components.modal {
4
+ .root {
5
+ margin-block: 0;
6
+ font-size: settings.$title-font-size;
7
+
8
+ &:not(:last-child) {
9
+ margin-bottom: 0;
10
+ }
11
+ }
12
+ }
@@ -1015,22 +1015,25 @@ opened.
1015
1015
  ## Forwarding HTML Attributes
1016
1016
 
1017
1017
  In addition to the options below in the [component's API](#api) section, you
1018
- can specify [React synthetic events] or **any HTML attribute you like.** All
1019
- attributes that don't interfere with the API are forwarded to the:
1018
+ can specify **any HTML attribute you like.** All attributes that don't interfere
1019
+ with the API of the React component are forwarded to:
1020
1020
 
1021
- - `<div>` HTML element in case of the `Modal` component. This `<div>` is not the
1022
- root, but its first child which represents the modal window.
1023
- - root `<div>` HTML element in case of `ModalHeader`, `ModalBody`, `ModalContent`
1021
+ - the `<div>` HTML element in case of the `Modal` component. This `<div>` is not
1022
+ the root, but its first child which represents the modal window.
1023
+ - the root `<div>` HTML element in case of `ModalHeader`, `ModalBody`, `ModalContent`
1024
1024
  and `ModalFooter` components.
1025
- - heading HTML element, which level can be specified through `level` option, in
1026
- case of the `ModalTitle` component.
1027
- - native HTML `<button>` in case of the `ModalCloseButton` component.
1025
+ - the heading (e.g. `<h1>`) HTML element in case of the `ModalTitle` component.
1026
+ - the native HTML `<button>` in case of the `ModalCloseButton` component.
1028
1027
 
1029
1028
  This enables making the component interactive and helps to improve its
1030
1029
  accessibility.
1031
1030
 
1032
- 👉 Refer to the MDN reference for the full list of supported attributes of the
1033
- [div], [heading] and [button] element.
1031
+ 👉 For the full list of supported attributes refer to:
1032
+
1033
+ - [`<div>` HTML element attributes][div-attributes]{:target="_blank"}
1034
+ - [`<h1>`-`<h6>` HTML element attributes][heading-attributes]{:target="_blank"}
1035
+ - [`<button>` HTML element attributes][button-attributes]{:target="_blank"}
1036
+ - [React common props]{:target="_blank"}
1034
1037
 
1035
1038
  ## API
1036
1039
 
@@ -1084,7 +1087,7 @@ accessibility.
1084
1087
  | `--rui-Modal--fullscreen__width` | Width of fullscreen modal |
1085
1088
  | `--rui-Modal--fullscreen__height` | Height of fullscreen modal |
1086
1089
 
1087
- [React synthetic events]: https://reactjs.org/docs/events.html
1088
- [div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
1089
- [heading]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#attributes
1090
- [button]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes
1090
+ [button-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attributes
1091
+ [div-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
1092
+ [heading-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#attributes
1093
+ [React common props]: https://react.dev/reference/react-dom/components/common#common-props
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
4
  import { classNames } from '../../utils/classNames';
5
5
  import { transferProps } from '../_helpers/transferProps';
6
- import styles from './Paper.scss';
6
+ import styles from './Paper.module.scss';
7
7
 
8
8
  export const Paper = ({
9
9
  children,
@@ -0,0 +1,19 @@
1
+ @use "theme";
2
+
3
+ @layer components.paper {
4
+ .root {
5
+ padding: theme.$padding;
6
+ border: theme.$border-width solid theme.$border-color;
7
+ border-radius: theme.$border-radius;
8
+ background-color: theme.$background-color;
9
+ }
10
+
11
+ .isRootMuted {
12
+ background-color: theme.$muted-background-color;
13
+ opacity: theme.$muted-opacity;
14
+ }
15
+
16
+ .isRootRaised {
17
+ box-shadow: theme.$raised-box-shadow;
18
+ }
19
+ }
@@ -54,13 +54,15 @@ Dim background and add transparency to visually suppress the Paper.
54
54
  ## Forwarding HTML Attributes
55
55
 
56
56
  In addition to the options below in the [component's API](#api) section, you
57
- can specify [React synthetic events] or **any HTML attribute you like.** All
58
- attributes that don't interfere with the API are forwarded to the root `<div>`
59
- HTML element. This enables making the component interactive and helps to improve
57
+ can specify **any HTML attribute you like.** All attributes that don't interfere
58
+ with the API of the React component are forwarded to the root `<div>` HTML
59
+ element. This enables making the component interactive and helps to improve
60
60
  its accessibility.
61
61
 
62
- 👉 Refer to the MDN reference for the full list of supported attributes of the
63
- [div] element.
62
+ 👉 For the full list of supported attributes refer to:
63
+
64
+ - [`<div>` HTML element attributes][div-attributes]{:target="_blank"}
65
+ - [React common props]{:target="_blank"}
64
66
 
65
67
  ## API
66
68
 
@@ -79,5 +81,5 @@ its accessibility.
79
81
  | `--rui-Paper--muted__opacity` | Opacity of muted paper |
80
82
  | `--rui-Paper--raised__box-shadow` | Box shadow of raised paper |
81
83
 
82
- [React synthetic events]: https://reactjs.org/docs/events.html
83
- [div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
84
+ [div-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
85
+ [React common props]: https://react.dev/reference/react-dom/components/common#common-props
@@ -6,7 +6,7 @@ import { classNames } from '../../utils/classNames';
6
6
  import { transferProps } from '../_helpers/transferProps';
7
7
  import getRootSideClassName from './_helpers/getRootSideClassName';
8
8
  import getRootAlignmentClassName from './_helpers/getRootAlignmentClassName';
9
- import styles from './Popover.scss';
9
+ import styles from './Popover.module.scss';
10
10
 
11
11
  export const Popover = React.forwardRef((props, ref) => {
12
12
  const {
@@ -0,0 +1,238 @@
1
+ // 1. Reset positioning for controlled variant.
2
+ // 2. Shift Popover so there is space for the arrow between Popover and reference element.
3
+ // 3. Add top offset in case it's not defined by external library.
4
+
5
+ @use "theme";
6
+
7
+ @layer components.popover {
8
+ .root {
9
+ position: absolute;
10
+ width: max-content;
11
+ max-width: theme.$max-width;
12
+ padding: theme.$padding;
13
+ text-align: left;
14
+ white-space: normal;
15
+ word-break: normal;
16
+ word-wrap: break-word;
17
+ color: theme.$color;
18
+ border: theme.$border-width solid theme.$border-color;
19
+ border-radius: theme.$border-radius;
20
+ background-color: theme.$background-color;
21
+ box-shadow: theme.$box-shadow;
22
+ }
23
+
24
+ .arrow {
25
+ position: absolute;
26
+ width: theme.$arrow-width;
27
+ height: theme.$arrow-height;
28
+ transform-origin: center bottom;
29
+
30
+ &::before,
31
+ &::after {
32
+ content: "";
33
+ position: absolute;
34
+ display: block;
35
+ border-style: solid;
36
+ border-color: transparent;
37
+ }
38
+
39
+ &::before {
40
+ bottom: 0;
41
+ border-width: theme.$arrow-height theme.$arrow-height 0;
42
+ border-top-color: theme.$border-color;
43
+ }
44
+
45
+ &::after {
46
+ bottom: theme.$border-width;
47
+ border-width: theme.$arrow-height theme.$arrow-height 0;
48
+ border-top-color: theme.$background-color;
49
+ }
50
+ }
51
+
52
+ // Sides
53
+ .isRootAtTop {
54
+ bottom: 100%;
55
+ }
56
+
57
+ .isRootAtBottom {
58
+ top: 100%;
59
+ }
60
+
61
+ .isRootAtLeft {
62
+ right: 100%;
63
+ }
64
+
65
+ .isRootAtRight {
66
+ left: 100%;
67
+ }
68
+
69
+ // Arrows
70
+ .isRootAtTop > .arrow {
71
+ top: 100%;
72
+ }
73
+
74
+ .isRootAtBottom > .arrow {
75
+ bottom: 100%;
76
+ }
77
+
78
+ .isRootAtLeft > .arrow {
79
+ left: 100%;
80
+ }
81
+
82
+ .isRootAtRight > .arrow {
83
+ right: 100%;
84
+ }
85
+
86
+ // Side alignments: top
87
+ .isRootAtTop.isRootAtCenter {
88
+ left: 50%;
89
+ transform: translate(-50%, #{-1 * theme.$arrow-height});
90
+ }
91
+
92
+ .isRootAtTop.isRootAtStart {
93
+ left: 0;
94
+ transform: translate(0, #{-1 * theme.$arrow-height});
95
+ }
96
+
97
+ .isRootAtTop.isRootAtEnd {
98
+ right: 0;
99
+ transform: translate(0, #{-1 * theme.$arrow-height});
100
+ }
101
+
102
+ .isRootAtTop.isRootAtCenter > .arrow {
103
+ left: 50%;
104
+ transform: translate(-50%, 0) rotateZ(0);
105
+ }
106
+
107
+ .isRootAtTop.isRootAtStart > .arrow {
108
+ left: theme.$arrow-corner-offset;
109
+ transform: translate(0, 0) rotateZ(0);
110
+ }
111
+
112
+ .isRootAtTop.isRootAtEnd > .arrow {
113
+ right: theme.$arrow-corner-offset;
114
+ transform: translate(0, 0) rotateZ(0);
115
+ }
116
+
117
+ // Side alignments: bottom
118
+ .isRootAtBottom.isRootAtCenter {
119
+ left: 50%;
120
+ transform: translate(-50%, #{theme.$arrow-height});
121
+ }
122
+
123
+ .isRootAtBottom.isRootAtStart {
124
+ left: 0;
125
+ transform: translate(0, #{theme.$arrow-height});
126
+ }
127
+
128
+ .isRootAtBottom.isRootAtEnd {
129
+ right: 0;
130
+ transform: translate(0, #{theme.$arrow-height});
131
+ }
132
+
133
+ .isRootAtBottom.isRootAtCenter > .arrow {
134
+ left: 50%;
135
+ transform: translate(-50%, -100%) rotateZ(180deg);
136
+ }
137
+
138
+ .isRootAtBottom.isRootAtStart > .arrow {
139
+ left: theme.$arrow-corner-offset;
140
+ transform: translate(0, -100%) rotateZ(180deg);
141
+ }
142
+
143
+ .isRootAtBottom.isRootAtEnd > .arrow {
144
+ right: theme.$arrow-corner-offset;
145
+ transform: translate(0, -100%) rotateZ(180deg);
146
+ }
147
+
148
+ // Side alignments: left
149
+ .isRootAtLeft.isRootAtCenter {
150
+ top: 50%;
151
+ transform: translate(#{-1 * theme.$arrow-height}, -50%);
152
+ }
153
+
154
+ .isRootAtLeft.isRootAtStart {
155
+ top: 0;
156
+ transform: translate(#{-1 * theme.$arrow-height}, 0);
157
+ }
158
+
159
+ .isRootAtLeft.isRootAtEnd {
160
+ bottom: 0;
161
+ transform: translate(#{-1 * theme.$arrow-height}, 0);
162
+ }
163
+
164
+ .isRootAtLeft.isRootAtCenter > .arrow {
165
+ top: 50%;
166
+ transform: translate(0, -100%) rotateZ(-90deg);
167
+ }
168
+
169
+ .isRootAtLeft.isRootAtStart > .arrow {
170
+ top: theme.$arrow-corner-offset;
171
+ transform: translate(0, 0) rotateZ(-90deg);
172
+ }
173
+
174
+ .isRootAtLeft.isRootAtEnd > .arrow {
175
+ bottom: theme.$arrow-corner-offset;
176
+ transform: translate(0, -100%) rotateZ(-90deg);
177
+ }
178
+
179
+ // Side alignments: right
180
+ .isRootAtRight.isRootAtCenter {
181
+ top: 50%;
182
+ transform: translate(#{theme.$arrow-height}, -50%);
183
+ }
184
+
185
+ .isRootAtRight.isRootAtStart {
186
+ top: 0;
187
+ transform: translate(#{theme.$arrow-height}, 0);
188
+ }
189
+
190
+ .isRootAtRight.isRootAtEnd {
191
+ bottom: 0;
192
+ transform: translate(#{theme.$arrow-height}, 0);
193
+ }
194
+
195
+ .isRootAtRight.isRootAtCenter > .arrow {
196
+ top: 50%;
197
+ transform: translate(0, -100%) rotateZ(90deg);
198
+ }
199
+
200
+ .isRootAtRight.isRootAtStart > .arrow {
201
+ top: theme.$arrow-corner-offset;
202
+ transform: translate(0, 0) rotateZ(90deg);
203
+ }
204
+
205
+ .isRootAtRight.isRootAtEnd > .arrow {
206
+ bottom: theme.$arrow-corner-offset;
207
+ transform: translate(0, -100%) rotateZ(90deg);
208
+ }
209
+
210
+ // Controlled placement
211
+ .isRootControlled.isRootAtTop,
212
+ .isRootControlled.isRootAtBottom,
213
+ .isRootControlled.isRootAtLeft,
214
+ .isRootControlled.isRootAtRight {
215
+ inset: unset; // 1.
216
+ }
217
+
218
+ .isRootControlled.isRootAtTop {
219
+ transform: translate(0, #{-1 * theme.$arrow-height}); // 2.
220
+ }
221
+
222
+ .isRootControlled.isRootAtBottom {
223
+ transform: translate(0, #{theme.$arrow-height}); // 2.
224
+ }
225
+
226
+ .isRootControlled.isRootAtLeft {
227
+ transform: translate(#{-1 * theme.$arrow-height}, 0); // 2.
228
+ }
229
+
230
+ .isRootControlled.isRootAtRight {
231
+ transform: translate(#{theme.$arrow-height}, 0); // 2.
232
+ }
233
+
234
+ .isRootControlled.isRootAtLeft.isRootAtStart,
235
+ .isRootControlled.isRootAtRight.isRootAtStart {
236
+ top: 0; // 3.
237
+ }
238
+ }
@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
2
2
  import React from 'react';
3
3
  import { withGlobalProps } from '../../provider';
4
4
  import { transferProps } from '../_helpers/transferProps';
5
- import styles from './PopoverWrapper.scss';
5
+ import styles from './PopoverWrapper.module.scss';
6
6
 
7
7
  export const PopoverWrapper = ({
8
8
  children,
@@ -36,4 +36,3 @@ PopoverWrapper.propTypes = {
36
36
  export const PopoverWrapperWithContext = withGlobalProps(PopoverWrapper, 'PopoverWrapper');
37
37
 
38
38
  export default PopoverWrapperWithContext;
39
-
@@ -0,0 +1,5 @@
1
+ @layer components.popover {
2
+ .root {
3
+ position: relative;
4
+ }
5
+ }
@@ -287,13 +287,15 @@ React.createElement(() => {
287
287
  ## Forwarding HTML Attributes
288
288
 
289
289
  In addition to the options below in the [component's API](#api) section, you
290
- can specify [React synthetic events] or **any HTML attribute you like.** All
291
- attributes that don't interfere with the API are forwarded to the root `<div>`
292
- HTML element. This enables making the component interactive and helps to improve
290
+ can specify **any HTML attribute you like.** All attributes that don't interfere
291
+ with the API of the React component are forwarded to the root `<div>` HTML
292
+ element. This enables making the component interactive and helps to improve
293
293
  its accessibility.
294
294
 
295
- 👉 Refer to the MDN reference for the full list of supported attributes of the
296
- [div] element.
295
+ 👉 For the full list of supported attributes refer to:
296
+
297
+ - [`<div>` HTML element attributes][div-attributes]{:target="_blank"}
298
+ - [React common props]{:target="_blank"}
297
299
 
298
300
  ## Forwarding ref
299
301
 
@@ -321,7 +323,7 @@ which enables [Advanced Positioning](#advanced-positioning).
321
323
  | `--rui-Popover__background-color` | Background color |
322
324
  | `--rui-Popover__box-shadow` | Popover box shadow |
323
325
 
326
+ [div-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
324
327
  [Floating UI]: https://floating-ui.com/docs/react-dom
325
- [React synthetic events]: https://reactjs.org/docs/events.html
326
- [div]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#attributes
328
+ [React common props]: https://react.dev/reference/react-dom/components/common#common-props
327
329
  [ref]: https://reactjs.org/docs/refs-and-the-dom.html
@@ -279,13 +279,15 @@ It's possible to disable just some options or the whole set.
279
279
  ## Forwarding HTML Attributes
280
280
 
281
281
  In addition to the options below in the [component's API](#api) section, you
282
- can specify [React synthetic events] or you can **add whatever HTML attribute
283
- you like.** All attributes that don't interfere with the API are forwarded to
284
- the native HTML `<input>` elements. This enables making the component
285
- interactive and helps to improve its accessibility.
282
+ can specify **any HTML attribute you like.** All attributes that don't interfere
283
+ with the API of the React component are forwarded to the root `<input>` HTML
284
+ element. This enables making the component interactive and helps to improve
285
+ its accessibility.
286
286
 
287
- 👉 Refer to the MDN reference for the full list of supported attributes of the
288
- [radio] input type.
287
+ 👉 For the full list of supported attributes refer to:
288
+
289
+ - [`<input type="radio" />` HTML element attributes][radio-attributes]{:target="_blank"}
290
+ - [React common props]{:target="_blank"}
289
291
 
290
292
  ## API
291
293
 
@@ -301,8 +303,8 @@ options. On top of that, the following options are available for Radio.
301
303
  | `--rui-FormField--check__input--radio__border-radius` | Input corner radius |
302
304
  | `--rui-FormField--check__input--radio--checked__background-image` | Checked input background image (inline, URL, …) |
303
305
 
304
- [nng-radio]: https://www.nngroup.com/articles/checkboxes-vs-radio-buttons/
305
- [fieldset]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
306
306
  [accessibility]: https://www.w3.org/WAI/tutorials/forms/grouping/
307
- [React synthetic events]: https://reactjs.org/docs/events.html
308
- [radio]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio#additional_attributes
307
+ [fieldset]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
308
+ [nng-radio]: https://www.nngroup.com/articles/checkboxes-vs-radio-buttons/
309
+ [radio-attributes]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio#additional_attributes
310
+ [React common props]: https://react.dev/reference/react-dom/components/common#common-props
@@ -6,7 +6,7 @@ import { getRootValidationStateClassName } from '../_helpers/getRootValidationSt
6
6
  import { resolveContextOrProp } from '../_helpers/resolveContextOrProp';
7
7
  import { transferProps } from '../_helpers/transferProps';
8
8
  import { FormLayoutContext } from '../FormLayout';
9
- import styles from './Radio.scss';
9
+ import styles from './Radio.module.scss';
10
10
 
11
11
  export const Radio = ({
12
12
  disabled,
@@ -0,0 +1,85 @@
1
+ // 1. Legends are tricky to style, let's use a `div` instead.
2
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset#styling_with_css
3
+
4
+ @use "../../styles/tools/form-fields/box-field-elements";
5
+ @use "../../styles/tools/form-fields/box-field-layout";
6
+ @use "../../styles/tools/form-fields/foundation";
7
+ @use "../../styles/tools/form-fields/inline-field-elements";
8
+ @use "../../styles/tools/form-fields/inline-field-layout";
9
+ @use "../../styles/tools/form-fields/variants";
10
+ @use "../../styles/tools/accessibility";
11
+ @use "../../styles/tools/reset";
12
+ @use "../../styles/tools/spacing";
13
+
14
+ @layer components.radio {
15
+ // Foundation
16
+ .root {
17
+ @include foundation.root();
18
+ @include foundation.fieldset();
19
+ @include variants.visual(check);
20
+ }
21
+
22
+ // 1.
23
+ .legend {
24
+ @include accessibility.hide-text();
25
+ }
26
+
27
+ // 1.
28
+ .label,
29
+ .optionLabel {
30
+ @include foundation.label();
31
+ }
32
+
33
+ .options {
34
+ @include reset.list();
35
+ }
36
+
37
+ .option {
38
+ @include inline-field-layout.field($type: radio);
39
+ @include inline-field-elements.min-tap-target($type: radio);
40
+ }
41
+
42
+ .input {
43
+ @include inline-field-elements.check-input($type: radio);
44
+ }
45
+
46
+ .helpText,
47
+ .validationText {
48
+ @include foundation.help-text();
49
+ }
50
+
51
+ .isRootRequired .label {
52
+ @include foundation.label-required();
53
+ }
54
+
55
+ // States
56
+ .isRootStateInvalid {
57
+ @include variants.validation(invalid);
58
+ }
59
+
60
+ .isRootStateValid {
61
+ @include variants.validation(valid);
62
+ }
63
+
64
+ .isRootStateWarning {
65
+ @include variants.validation(warning);
66
+ }
67
+
68
+ // Layouts
69
+ .isRootLayoutVertical,
70
+ .isRootLayoutHorizontal {
71
+ @include box-field-layout.vertical($has-list: true);
72
+ }
73
+
74
+ .isRootLayoutHorizontal {
75
+ @include box-field-layout.horizontal($has-min-tap-target: true);
76
+ }
77
+
78
+ .isRootFullWidth {
79
+ @include box-field-layout.full-width();
80
+ }
81
+
82
+ .isRootInFormLayout {
83
+ @include box-field-layout.in-form-layout($is-fieldset: true);
84
+ }
85
+ }