@jetbrains/ring-ui 6.0.7-beta.0 → 6.0.7
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.
- package/README.md +1 -1
- package/components/alert/alert.css +12 -13
- package/components/alert/container.css +4 -6
- package/components/alert-service/alert-service.stories.css +0 -3
- package/components/auth/down-notification.css +2 -4
- package/components/auth-dialog/auth-dialog.css +10 -12
- package/components/badge/badge.css +1 -3
- package/components/button/button.css +13 -14
- package/components/button-group/button-group.css +6 -5
- package/components/button-set/button-set.css +1 -2
- package/components/button-toolbar/button-toolbar.css +1 -2
- package/components/checkbox/checkbox.css +7 -7
- package/components/checkbox/checkbox.js +2 -2
- package/components/code/code.css +3 -5
- package/components/collapse/collapse-content.d.ts +11 -0
- package/components/collapse/collapse-content.js +72 -0
- package/components/collapse/collapse-context.d.ts +10 -0
- package/components/collapse/collapse-context.js +10 -0
- package/components/collapse/collapse-control.d.ts +11 -0
- package/components/collapse/collapse-control.js +22 -0
- package/components/collapse/collapse.css +40 -0
- package/components/collapse/collapse.d.ts +12 -0
- package/components/collapse/collapse.js +26 -0
- package/components/collapse/collapse.stories.css +25 -0
- package/components/collapse/consts.d.ts +4 -0
- package/components/collapse/consts.js +4 -0
- package/components/collapse/utils.d.ts +1 -0
- package/components/collapse/utils.js +1 -0
- package/components/confirm/confirm.css +1 -3
- package/components/content-layout/content-layout.css +7 -7
- package/components/data-list/data-list.css +4 -5
- package/components/date-picker/consts.js +1 -1
- package/components/date-picker/date-picker.css +40 -41
- package/components/date-picker/date-picker.js +7 -7
- package/components/date-picker/date-popup.js +4 -4
- package/components/date-picker/day.js +9 -9
- package/components/date-picker/month-names.js +6 -6
- package/components/date-picker/month-slider.js +3 -3
- package/components/date-picker/month.js +5 -5
- package/components/date-picker/months.js +6 -6
- package/components/date-picker/weekdays.js +4 -4
- package/components/date-picker/years.js +8 -8
- package/components/dialog/dialog.css +12 -13
- package/components/editable-heading/editable-heading.css +8 -8
- package/components/error-bubble/error-bubble-legacy.css +6 -8
- package/components/error-bubble/error-bubble.css +6 -8
- package/components/footer/footer.css +6 -8
- package/components/form/form.css +31 -33
- package/components/global/global.css +1 -7
- package/components/global/variables.css +2 -2
- package/components/global/variables_dark.css +6 -6
- package/components/grid/grid.css +6 -6
- package/components/group/group.css +1 -3
- package/components/header/header.css +12 -14
- package/components/header/services.css +12 -14
- package/components/icon/icon.css +7 -4
- package/components/input/input-legacy.css +2 -4
- package/components/input/input.css +8 -10
- package/components/input-size/input-size.css +4 -6
- package/components/island/island.css +6 -7
- package/components/island-legacy/island-legacy.css +6 -8
- package/components/line/line.css +1 -3
- package/components/link/link.css +1 -1
- package/components/link/link.d.ts +2 -2
- package/components/link/link.js +1 -1
- package/components/list/list.css +17 -20
- package/components/loader/loader.css +1 -3
- package/components/loader-inline/loader-inline.css +5 -6
- package/components/login-dialog/login-dialog.css +1 -3
- package/components/markdown/markdown.css +2 -3
- package/components/message/message.css +5 -8
- package/components/old-browsers-message/old-browsers-message.css +2 -4
- package/components/pager/pager.css +2 -4
- package/components/panel/panel.css +3 -5
- package/components/progress-bar/progress-bar.css +3 -4
- package/components/query-assist/query-assist.css +3 -4
- package/components/radio/radio.css +8 -11
- package/components/select/select-popup.css +9 -11
- package/components/select/select.css +13 -14
- package/components/sidebar/sidebar.css +13 -15
- package/components/table/table.css +15 -17
- package/components/table-legacy/table-legacy.css +22 -24
- package/components/table-legacy/table-legacy__toolbar.css +2 -4
- package/components/tabs/tabs.css +3 -4
- package/components/tag/tag.css +12 -13
- package/components/tags-input/tags-input.css +1 -2
- package/components/toggle/toggle.css +46 -55
- package/components/tooltip/tooltip.css +3 -5
- package/components/user-agreement/user-agreement.css +2 -2
- package/components/user-card/user-card.css +3 -5
- package/package.json +62 -61
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
This collection of UI components aims to provide all the necessary building blocks for web-based products built inside JetBrains, as well as third-party plugins developed for JetBrains' products.
|
|
7
7
|
|
|
8
8
|
## Try now
|
|
9
|
-
* Try the [codesandbox](https://codesandbox.io/p/
|
|
9
|
+
* Try the [codesandbox](https://codesandbox.io/p/sandbox/ring-ui-sandbox-6-0-demo-qk5vgv), based on `create-react-app` tooling, to see and try the UI components
|
|
10
10
|
* Check out [list of examples](https://jetbrains.github.io/ring-ui/master/index.html) for each component
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
3
|
@value link from "../link/link.css";
|
|
4
|
-
@value unit from "../global/global.css";
|
|
5
4
|
@value animation-duration: 300ms;
|
|
6
5
|
@value animation-easing: ease-out;
|
|
7
6
|
|
|
@@ -12,9 +11,9 @@
|
|
|
12
11
|
align-items: baseline;
|
|
13
12
|
|
|
14
13
|
box-sizing: border-box;
|
|
15
|
-
min-height: calc(unit * 5);
|
|
16
|
-
margin: unit auto;
|
|
17
|
-
padding: 0 calc(unit * 2);
|
|
14
|
+
min-height: calc(var(--ring-unit) * 5);
|
|
15
|
+
margin: var(--ring-unit) auto;
|
|
16
|
+
padding: 0 calc(var(--ring-unit) * 2);
|
|
18
17
|
|
|
19
18
|
transition:
|
|
20
19
|
transform animation-duration animation-easing,
|
|
@@ -28,11 +27,11 @@
|
|
|
28
27
|
box-shadow: var(--ring-popup-shadow);
|
|
29
28
|
|
|
30
29
|
font-size: var(--ring-font-size);
|
|
31
|
-
line-height: calc(unit * 5);
|
|
30
|
+
line-height: calc(var(--ring-unit) * 5);
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
.alertInline {
|
|
35
|
-
margin: unit;
|
|
34
|
+
margin: var(--ring-unit);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
.error {
|
|
@@ -42,13 +41,13 @@
|
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
.icon {
|
|
45
|
-
margin-right: unit;
|
|
44
|
+
margin-right: var(--ring-unit);
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
.caption {
|
|
49
48
|
overflow: hidden;
|
|
50
49
|
|
|
51
|
-
max-width: calc(100% - calc(unit * 5));
|
|
50
|
+
max-width: calc(100% - calc(var(--ring-unit) * 5));
|
|
52
51
|
|
|
53
52
|
margin: 12px 0;
|
|
54
53
|
|
|
@@ -65,12 +64,12 @@
|
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
&.withCloseButton {
|
|
68
|
-
margin-right: calc(unit * 5);
|
|
67
|
+
margin-right: calc(var(--ring-unit) * 5);
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
70
|
|
|
72
71
|
.badge {
|
|
73
|
-
margin-left: unit;
|
|
72
|
+
margin-left: var(--ring-unit);
|
|
74
73
|
|
|
75
74
|
vertical-align: baseline;
|
|
76
75
|
}
|
|
@@ -78,7 +77,7 @@
|
|
|
78
77
|
.loader {
|
|
79
78
|
top: 2px;
|
|
80
79
|
|
|
81
|
-
margin-right: unit;
|
|
80
|
+
margin-right: var(--ring-unit);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
.close.close {
|
|
@@ -86,8 +85,8 @@
|
|
|
86
85
|
top: 2px;
|
|
87
86
|
right: 0;
|
|
88
87
|
|
|
89
|
-
margin: calc(unit / 2);
|
|
90
|
-
padding: unit;
|
|
88
|
+
margin: calc(var(--ring-unit) / 2);
|
|
89
|
+
padding: var(--ring-unit);
|
|
91
90
|
|
|
92
91
|
font-size: 0;
|
|
93
92
|
line-height: 0;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
|
-
|
|
5
3
|
.alertContainer {
|
|
6
4
|
position: fixed;
|
|
7
5
|
z-index: var(--ring-alert-z-index);
|
|
8
|
-
right: calc(unit * 2);
|
|
9
|
-
bottom: calc(unit);
|
|
6
|
+
right: calc(var(--ring-unit) * 2);
|
|
7
|
+
bottom: calc(var(--ring-unit));
|
|
10
8
|
|
|
11
9
|
display: flex;
|
|
12
10
|
overflow: visible;
|
|
@@ -22,7 +20,7 @@
|
|
|
22
20
|
.alertInContainer {
|
|
23
21
|
composes: alert from "./alert.css";
|
|
24
22
|
|
|
25
|
-
min-width: calc(unit * 30);
|
|
26
|
-
max-width: calc(unit * 50);
|
|
23
|
+
min-width: calc(var(--ring-unit) * 30);
|
|
24
|
+
max-width: calc(var(--ring-unit) * 50);
|
|
27
25
|
margin-top: 0;
|
|
28
26
|
}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
|
-
|
|
5
3
|
.title {
|
|
6
4
|
font-weight: 600;
|
|
7
5
|
}
|
|
8
6
|
|
|
9
7
|
.error {
|
|
10
|
-
margin-top: calc(unit / 2);
|
|
8
|
+
margin-top: calc(var(--ring-unit) / 2);
|
|
11
9
|
|
|
12
10
|
word-wrap: break-word;
|
|
13
11
|
|
|
14
12
|
color: var(--ring-text-color);
|
|
15
13
|
|
|
16
|
-
line-height: calc(unit * 2);
|
|
14
|
+
line-height: calc(var(--ring-unit) * 2);
|
|
17
15
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
|
-
|
|
5
3
|
.dialog.dialog {
|
|
6
4
|
width: auto;
|
|
7
5
|
max-width: 400px;
|
|
@@ -14,23 +12,23 @@
|
|
|
14
12
|
align-items: center;
|
|
15
13
|
flex-direction: column;
|
|
16
14
|
|
|
17
|
-
margin: calc(unit * 2) 0;
|
|
15
|
+
margin: calc(var(--ring-unit) * 2) 0;
|
|
18
16
|
}
|
|
19
17
|
|
|
20
18
|
.button {
|
|
21
|
-
width: calc(unit * 25);
|
|
22
|
-
margin-top: unit;
|
|
19
|
+
width: calc(var(--ring-unit) * 25);
|
|
20
|
+
margin-top: var(--ring-unit);
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
.firstButton {
|
|
26
24
|
composes: button;
|
|
27
25
|
|
|
28
|
-
margin-top: calc(unit * 4);
|
|
26
|
+
margin-top: calc(var(--ring-unit) * 4);
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
.title.title {
|
|
32
30
|
margin-top: 0;
|
|
33
|
-
margin-bottom: unit;
|
|
31
|
+
margin-bottom: var(--ring-unit);
|
|
34
32
|
|
|
35
33
|
text-align: center;
|
|
36
34
|
|
|
@@ -38,14 +36,14 @@
|
|
|
38
36
|
}
|
|
39
37
|
|
|
40
38
|
.logo {
|
|
41
|
-
width: calc(unit * 12);
|
|
42
|
-
height: calc(unit * 12);
|
|
39
|
+
width: calc(var(--ring-unit) * 12);
|
|
40
|
+
height: calc(var(--ring-unit) * 12);
|
|
43
41
|
margin-bottom: 12px;
|
|
44
42
|
object-fit: contain;
|
|
45
43
|
|
|
46
|
-
@media (
|
|
47
|
-
width: calc(unit * 4);
|
|
48
|
-
height: calc(unit * 4);
|
|
44
|
+
@media (height <= 400px) {
|
|
45
|
+
width: calc(var(--ring-unit) * 4);
|
|
46
|
+
height: calc(var(--ring-unit) * 4);
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
49
|
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
3
|
@value button-shadow: inset 0 0 0 1px;
|
|
5
|
-
@value
|
|
6
|
-
@value loaderWidth: calc(unit * 8);
|
|
4
|
+
@value loaderWidth: calc(var(--ring-unit) * 8);
|
|
7
5
|
|
|
8
6
|
.heightS {
|
|
9
|
-
--ring-button-height: calc(unit * 3);
|
|
7
|
+
--ring-button-height: calc(var(--ring-unit) * 3);
|
|
10
8
|
--ring-button-font-size: var(--ring-font-size-smaller);
|
|
11
9
|
}
|
|
12
10
|
|
|
13
11
|
.heightM {
|
|
14
|
-
--ring-button-height: calc(unit * 3.5);
|
|
12
|
+
--ring-button-height: calc(var(--ring-unit) * 3.5);
|
|
15
13
|
--ring-button-font-size: var(--ring-font-size);
|
|
16
14
|
}
|
|
17
15
|
|
|
18
16
|
.heightL {
|
|
19
|
-
--ring-button-height: calc(unit * 4);
|
|
17
|
+
--ring-button-height: calc(var(--ring-unit) * 4);
|
|
20
18
|
--ring-button-font-size: var(--ring-font-size);
|
|
21
19
|
}
|
|
22
20
|
|
|
@@ -26,9 +24,9 @@
|
|
|
26
24
|
display: inline-block;
|
|
27
25
|
|
|
28
26
|
box-sizing: border-box;
|
|
29
|
-
height: height;
|
|
27
|
+
height: var(--ring-button-height);
|
|
30
28
|
margin: 0;
|
|
31
|
-
padding: 0 calc(unit * 2);
|
|
29
|
+
padding: 0 calc(var(--ring-unit) * 2);
|
|
32
30
|
|
|
33
31
|
cursor: pointer;
|
|
34
32
|
transition: color var(--ring-ease), background-color var(--ring-ease), box-shadow var(--ring-ease);
|
|
@@ -45,7 +43,7 @@
|
|
|
45
43
|
font-family: var(--ring-font-family);
|
|
46
44
|
font-size: var(--ring-button-font-size);
|
|
47
45
|
|
|
48
|
-
line-height: height;
|
|
46
|
+
line-height: var(--ring-button-height);
|
|
49
47
|
|
|
50
48
|
&:hover {
|
|
51
49
|
transition: none;
|
|
@@ -78,7 +76,7 @@
|
|
|
78
76
|
}
|
|
79
77
|
|
|
80
78
|
&[disabled] {
|
|
81
|
-
|
|
79
|
+
cursor: auto;
|
|
82
80
|
|
|
83
81
|
background-color: var(--ring-disabled-background-color);
|
|
84
82
|
box-shadow: button-shadow var(--ring-border-disabled-color);
|
|
@@ -94,7 +92,8 @@
|
|
|
94
92
|
color: var(--ring-disabled-color);
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
|
|
95
|
+
/* stylelint-disable-next-line selector-max-specificity */
|
|
96
|
+
&[disabled] .icon.icon {
|
|
98
97
|
color: var(--ring-icon-disabled-color);
|
|
99
98
|
}
|
|
100
99
|
|
|
@@ -247,7 +246,7 @@
|
|
|
247
246
|
}
|
|
248
247
|
|
|
249
248
|
.withIcon {
|
|
250
|
-
padding: 0 unit;
|
|
249
|
+
padding: 0 var(--ring-unit);
|
|
251
250
|
}
|
|
252
251
|
|
|
253
252
|
.text {
|
|
@@ -278,7 +277,7 @@
|
|
|
278
277
|
line-height: normal;
|
|
279
278
|
|
|
280
279
|
&:not(:last-child) {
|
|
281
|
-
margin-right: calc(unit * 0.5);
|
|
280
|
+
margin-right: calc(var(--ring-unit) * 0.5);
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
283
|
|
|
@@ -359,7 +358,7 @@
|
|
|
359
358
|
}
|
|
360
359
|
|
|
361
360
|
.short {
|
|
362
|
-
width: calc(unit * 4);
|
|
361
|
+
width: calc(var(--ring-unit) * 4);
|
|
363
362
|
padding: 0;
|
|
364
363
|
}
|
|
365
364
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
3
|
@value button, active, primary, button-shadow from "../button/button.css";
|
|
5
4
|
|
|
6
5
|
:root {
|
|
@@ -104,8 +103,9 @@
|
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
/* stylelint-disable-next-line selector-max-specificity */
|
|
107
|
-
.buttonGroup .button.button:hover,
|
|
108
|
-
|
|
106
|
+
.buttonGroup .button.button:hover:not(:disabled),
|
|
107
|
+
/* stylelint-disable-next-line selector-max-specificity */
|
|
108
|
+
.buttonGroup .button.button:active:not(:disabled) {
|
|
109
109
|
border-radius: var(--ring-border-radius);
|
|
110
110
|
box-shadow: button-shadow var(--ring-border-hover-color);
|
|
111
111
|
}
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
.caption {
|
|
155
155
|
composes: font from "../global/global.css";
|
|
156
156
|
|
|
157
|
-
margin-right: unit;
|
|
157
|
+
margin-right: var(--ring-unit);
|
|
158
158
|
|
|
159
159
|
font-size: var(--ring-font-size);
|
|
160
160
|
|
|
@@ -216,7 +216,8 @@
|
|
|
216
216
|
z-index: var(--ring-button-group-active-z-index);
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
/* stylelint-disable-next-line selector-max-specificity */
|
|
220
|
+
&:hover:not(:disabled) {
|
|
220
221
|
z-index: var(--ring-button-group-hover-z-index);
|
|
221
222
|
}
|
|
222
223
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
3
|
@value button from "../button/button.css";
|
|
5
4
|
|
|
6
5
|
.buttonSet {
|
|
@@ -13,7 +12,7 @@
|
|
|
13
12
|
font-size: 0;
|
|
14
13
|
|
|
15
14
|
& .button {
|
|
16
|
-
margin: 0 unit 0 0;
|
|
15
|
+
margin: 0 var(--ring-unit) 0 0;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
& > .button:last-child {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
3
|
@value button from "../button/button.css";
|
|
5
4
|
|
|
6
5
|
.buttonToolbar {
|
|
@@ -18,7 +17,7 @@
|
|
|
18
17
|
.buttonToolbar > .buttonGroup,
|
|
19
18
|
.buttonToolbar > .split,
|
|
20
19
|
.buttonToolbar > .buttonToolbar {
|
|
21
|
-
margin-right: unit;
|
|
20
|
+
margin-right: var(--ring-unit);
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
.buttonToolbar > :last-child {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
3
|
@value checkboxSize: 14px;
|
|
5
4
|
|
|
6
5
|
.checkbox {
|
|
@@ -43,11 +42,11 @@
|
|
|
43
42
|
.icon.icon {
|
|
44
43
|
position: absolute;
|
|
45
44
|
|
|
46
|
-
top:
|
|
47
|
-
left:
|
|
45
|
+
top: 0;
|
|
46
|
+
left: 1px;
|
|
48
47
|
|
|
49
|
-
width: calc(unit * 2);
|
|
50
|
-
height: calc(unit * 2);
|
|
48
|
+
width: calc(var(--ring-unit) * 2);
|
|
49
|
+
height: calc(var(--ring-unit) * 2);
|
|
51
50
|
|
|
52
51
|
opacity: 0;
|
|
53
52
|
color: var(--ring-white-text-color);
|
|
@@ -119,12 +118,13 @@
|
|
|
119
118
|
&[disabled]:checked + .cell,
|
|
120
119
|
&[disabled]:indeterminate + .cell {
|
|
121
120
|
border-color: var(--ring-border-selected-disabled-color);
|
|
121
|
+
background-color: var(--ring-border-selected-disabled-color);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/* stylelint-disable-next-line selector-max-specificity */
|
|
125
125
|
&[disabled]:checked + .cell .check,
|
|
126
126
|
&[disabled]:indeterminate + .cell .minus {
|
|
127
|
-
color: var(--ring-
|
|
127
|
+
color: var(--ring-disabled-background-color);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
/* stylelint-disable-next-line selector-max-specificity */
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
.label {
|
|
143
|
-
margin-left: unit;
|
|
143
|
+
margin-left: var(--ring-unit);
|
|
144
144
|
|
|
145
145
|
line-height: normal;
|
|
146
146
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React, { PureComponent } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
|
-
import checkmarkIcon from '@jetbrains/icons/checkmark-
|
|
5
|
-
import minusIcon from '@jetbrains/icons/remove-
|
|
4
|
+
import checkmarkIcon from '@jetbrains/icons/checkmark-12px';
|
|
5
|
+
import minusIcon from '@jetbrains/icons/remove-12px';
|
|
6
6
|
import Icon from '../icon/icon';
|
|
7
7
|
import { refObject } from '../global/prop-types';
|
|
8
8
|
import composeRefs from '../global/composeRefs';
|
package/components/code/code.css
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
|
-
@value unit from "../global/global.css";
|
|
4
|
-
|
|
5
3
|
.code {
|
|
6
|
-
margin: calc(unit * 2) 0;
|
|
4
|
+
margin: calc(var(--ring-unit) * 2) 0;
|
|
7
5
|
}
|
|
8
6
|
|
|
9
7
|
/* override hljs */
|
|
10
8
|
.code code {
|
|
11
9
|
display: block;
|
|
12
10
|
|
|
13
|
-
padding: calc(unit * 1.5) calc(unit * 2) calc(unit * 2);
|
|
11
|
+
padding: calc(var(--ring-unit) * 1.5) calc(var(--ring-unit) * 2) calc(var(--ring-unit) * 2);
|
|
14
12
|
|
|
15
13
|
border-radius: var(--ring-border-radius);
|
|
16
14
|
background-color: var(--ring-sidebar-background-color);
|
|
@@ -23,7 +21,7 @@
|
|
|
23
21
|
.inline code {
|
|
24
22
|
display: inline-block;
|
|
25
23
|
|
|
26
|
-
padding: 0 calc(unit / 2);
|
|
24
|
+
padding: 0 calc(var(--ring-unit) / 2);
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
.softWrap code {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React, { PropsWithChildren } from 'react';
|
|
2
|
+
type Props = {
|
|
3
|
+
minHeight?: number;
|
|
4
|
+
className?: string;
|
|
5
|
+
'data-test'?: string | null | undefined;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* @name CollapseContent
|
|
9
|
+
*/
|
|
10
|
+
export declare const CollapseContent: React.FC<PropsWithChildren<Props>>;
|
|
11
|
+
export default CollapseContent;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef, useContext, useMemo } from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import dataTests from '../global/data-tests';
|
|
4
|
+
import { getRect } from '../global/dom';
|
|
5
|
+
import { toPx } from './utils';
|
|
6
|
+
import CollapseContext from './collapse-context';
|
|
7
|
+
import { COLLAPSE_CONTENT_TEST_ID, COLLAPSE_CONTENT_CONTAINER_TEST_ID } from './consts';
|
|
8
|
+
import styles from './collapse.css';
|
|
9
|
+
const DURATION_FACTOR = 0.5;
|
|
10
|
+
const DEFAULT_HEIGHT = 0;
|
|
11
|
+
const VISIBLE = 1;
|
|
12
|
+
const HIDDEN = 0;
|
|
13
|
+
/**
|
|
14
|
+
* @name CollapseContent
|
|
15
|
+
*/
|
|
16
|
+
export const CollapseContent = ({ children, minHeight = DEFAULT_HEIGHT, 'data-test': dataTest }) => {
|
|
17
|
+
const { collapsed, duration, id, disableAnimation } = useContext(CollapseContext);
|
|
18
|
+
const containerRef = useRef(null);
|
|
19
|
+
const contentRef = useRef(null);
|
|
20
|
+
const initialContentHeight = useRef(minHeight);
|
|
21
|
+
const contentHeight = useRef(DEFAULT_HEIGHT);
|
|
22
|
+
const [dimensions, setDimensions] = useState({
|
|
23
|
+
width: 0,
|
|
24
|
+
height: 0
|
|
25
|
+
});
|
|
26
|
+
const [height, setHeight] = useState(toPx(minHeight));
|
|
27
|
+
const [showFade, setShowFade] = useState(true);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!collapsed) {
|
|
30
|
+
setShowFade(false);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
setShowFade(true);
|
|
34
|
+
}
|
|
35
|
+
}, [collapsed]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (contentRef.current) {
|
|
38
|
+
contentHeight.current = getRect(contentRef.current).height;
|
|
39
|
+
}
|
|
40
|
+
}, [minHeight, dimensions.height]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
const nextHeight = collapsed ? initialContentHeight.current : contentHeight.current;
|
|
43
|
+
setHeight(toPx(nextHeight));
|
|
44
|
+
}, [collapsed, dimensions.height]);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (contentRef.current) {
|
|
47
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
48
|
+
if (entry && entry.borderBoxSize) {
|
|
49
|
+
const { inlineSize, blockSize } = entry.borderBoxSize[0];
|
|
50
|
+
setDimensions({ width: inlineSize, height: blockSize });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
observer.observe(contentRef.current);
|
|
54
|
+
}
|
|
55
|
+
}, []);
|
|
56
|
+
const style = useMemo(() => {
|
|
57
|
+
const calculatedDuration = duration + contentHeight.current * DURATION_FACTOR;
|
|
58
|
+
return {
|
|
59
|
+
'--duration': `${calculatedDuration}ms`,
|
|
60
|
+
height,
|
|
61
|
+
opacity: collapsed && !minHeight ? HIDDEN : VISIBLE
|
|
62
|
+
};
|
|
63
|
+
}, [duration, height, collapsed, minHeight]);
|
|
64
|
+
const fadeShouldBeVisible = useMemo(() => Boolean(minHeight && showFade), [minHeight, showFade]);
|
|
65
|
+
return (<div ref={containerRef} id={`collapse-content-${id}`} data-test={dataTests(COLLAPSE_CONTENT_CONTAINER_TEST_ID)} className={classNames(styles.container, { [styles.transition]: !disableAnimation })} style={style}>
|
|
66
|
+
<div ref={contentRef} data-test={dataTests(COLLAPSE_CONTENT_TEST_ID, dataTest)}>
|
|
67
|
+
{children}
|
|
68
|
+
</div>
|
|
69
|
+
{fadeShouldBeVisible && <div className={styles.fade}/>}
|
|
70
|
+
</div>);
|
|
71
|
+
};
|
|
72
|
+
export default CollapseContent;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface CollapseContextInterface {
|
|
3
|
+
collapsed: boolean;
|
|
4
|
+
duration: number;
|
|
5
|
+
disableAnimation: boolean;
|
|
6
|
+
setCollapsed: () => void;
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const CollapseContext: import("react").Context<CollapseContextInterface>;
|
|
10
|
+
export default CollapseContext;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
import { BASE_ANIMATION_DURATION } from './consts';
|
|
3
|
+
export const CollapseContext = createContext({
|
|
4
|
+
collapsed: true,
|
|
5
|
+
duration: BASE_ANIMATION_DURATION,
|
|
6
|
+
disableAnimation: false,
|
|
7
|
+
setCollapsed: () => { },
|
|
8
|
+
id: ''
|
|
9
|
+
});
|
|
10
|
+
export default CollapseContext;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type ChildrenFunction = (collapsed: boolean) => React.ReactNode;
|
|
3
|
+
type Props = {
|
|
4
|
+
children: ChildrenFunction | React.ReactNode;
|
|
5
|
+
'data-test'?: string | null | undefined;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* @name CollapseControl
|
|
9
|
+
*/
|
|
10
|
+
export declare const CollapseControl: React.FC<Props>;
|
|
11
|
+
export default CollapseControl;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { useMemo, useContext, cloneElement } from 'react';
|
|
2
|
+
import dataTests from '../global/data-tests';
|
|
3
|
+
import { CollapseContext } from './collapse-context';
|
|
4
|
+
import { COLLAPSE_CONTROL_TEST_ID } from './consts';
|
|
5
|
+
/**
|
|
6
|
+
* @name CollapseControl
|
|
7
|
+
*/
|
|
8
|
+
export const CollapseControl = ({ children, 'data-test': dataTest }) => {
|
|
9
|
+
const { setCollapsed, collapsed, id } = useContext(CollapseContext);
|
|
10
|
+
const child = useMemo(() => {
|
|
11
|
+
if (typeof children === 'function') {
|
|
12
|
+
return <p data-test={dataTests(COLLAPSE_CONTROL_TEST_ID, dataTest)}>{children(collapsed)}</p>;
|
|
13
|
+
}
|
|
14
|
+
return <p data-test={dataTests(COLLAPSE_CONTROL_TEST_ID, dataTest)}>{children}</p>;
|
|
15
|
+
}, [children, collapsed, dataTest]);
|
|
16
|
+
return cloneElement(child, {
|
|
17
|
+
onClick: setCollapsed,
|
|
18
|
+
'aria-controls': `collapse-content-${id}`,
|
|
19
|
+
'aria-expanded': String(!collapsed)
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
export default CollapseControl;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
.container {
|
|
2
|
+
position: relative;
|
|
3
|
+
will-change: height, opacity;
|
|
4
|
+
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.transition {
|
|
10
|
+
transition: height var(--duration) ease-in-out 0s, opacity var(--duration) ease-in-out 0s;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.summary {
|
|
14
|
+
list-style: none;
|
|
15
|
+
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.trigger {
|
|
20
|
+
cursor: pointer;
|
|
21
|
+
|
|
22
|
+
border: none;
|
|
23
|
+
outline: none;
|
|
24
|
+
background: transparent;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.fade {
|
|
28
|
+
position: absolute;
|
|
29
|
+
z-index: 10;
|
|
30
|
+
right: 0;
|
|
31
|
+
bottom: 0;
|
|
32
|
+
left: 0;
|
|
33
|
+
|
|
34
|
+
height: calc(var(--ring-unit) * 3);
|
|
35
|
+
|
|
36
|
+
pointer-events: none;
|
|
37
|
+
|
|
38
|
+
color: var(--ring-content-background-color);
|
|
39
|
+
background-image: linear-gradient(to bottom, transparent 0%, currentColor 50%);
|
|
40
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React, { PropsWithChildren } from 'react';
|
|
2
|
+
type Props = {
|
|
3
|
+
onChange?: (collapsed: boolean) => void;
|
|
4
|
+
duration?: number;
|
|
5
|
+
disableAnimation?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* @name Collapse
|
|
10
|
+
*/
|
|
11
|
+
export declare const Collapse: React.FC<PropsWithChildren<Props>>;
|
|
12
|
+
export default Collapse;
|