@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.
Files changed (91) hide show
  1. package/README.md +1 -1
  2. package/components/alert/alert.css +12 -13
  3. package/components/alert/container.css +4 -6
  4. package/components/alert-service/alert-service.stories.css +0 -3
  5. package/components/auth/down-notification.css +2 -4
  6. package/components/auth-dialog/auth-dialog.css +10 -12
  7. package/components/badge/badge.css +1 -3
  8. package/components/button/button.css +13 -14
  9. package/components/button-group/button-group.css +6 -5
  10. package/components/button-set/button-set.css +1 -2
  11. package/components/button-toolbar/button-toolbar.css +1 -2
  12. package/components/checkbox/checkbox.css +7 -7
  13. package/components/checkbox/checkbox.js +2 -2
  14. package/components/code/code.css +3 -5
  15. package/components/collapse/collapse-content.d.ts +11 -0
  16. package/components/collapse/collapse-content.js +72 -0
  17. package/components/collapse/collapse-context.d.ts +10 -0
  18. package/components/collapse/collapse-context.js +10 -0
  19. package/components/collapse/collapse-control.d.ts +11 -0
  20. package/components/collapse/collapse-control.js +22 -0
  21. package/components/collapse/collapse.css +40 -0
  22. package/components/collapse/collapse.d.ts +12 -0
  23. package/components/collapse/collapse.js +26 -0
  24. package/components/collapse/collapse.stories.css +25 -0
  25. package/components/collapse/consts.d.ts +4 -0
  26. package/components/collapse/consts.js +4 -0
  27. package/components/collapse/utils.d.ts +1 -0
  28. package/components/collapse/utils.js +1 -0
  29. package/components/confirm/confirm.css +1 -3
  30. package/components/content-layout/content-layout.css +7 -7
  31. package/components/data-list/data-list.css +4 -5
  32. package/components/date-picker/consts.js +1 -1
  33. package/components/date-picker/date-picker.css +40 -41
  34. package/components/date-picker/date-picker.js +7 -7
  35. package/components/date-picker/date-popup.js +4 -4
  36. package/components/date-picker/day.js +9 -9
  37. package/components/date-picker/month-names.js +6 -6
  38. package/components/date-picker/month-slider.js +3 -3
  39. package/components/date-picker/month.js +5 -5
  40. package/components/date-picker/months.js +6 -6
  41. package/components/date-picker/weekdays.js +4 -4
  42. package/components/date-picker/years.js +8 -8
  43. package/components/dialog/dialog.css +12 -13
  44. package/components/editable-heading/editable-heading.css +8 -8
  45. package/components/error-bubble/error-bubble-legacy.css +6 -8
  46. package/components/error-bubble/error-bubble.css +6 -8
  47. package/components/footer/footer.css +6 -8
  48. package/components/form/form.css +31 -33
  49. package/components/global/global.css +1 -7
  50. package/components/global/variables.css +2 -2
  51. package/components/global/variables_dark.css +6 -6
  52. package/components/grid/grid.css +6 -6
  53. package/components/group/group.css +1 -3
  54. package/components/header/header.css +12 -14
  55. package/components/header/services.css +12 -14
  56. package/components/icon/icon.css +7 -4
  57. package/components/input/input-legacy.css +2 -4
  58. package/components/input/input.css +8 -10
  59. package/components/input-size/input-size.css +4 -6
  60. package/components/island/island.css +6 -7
  61. package/components/island-legacy/island-legacy.css +6 -8
  62. package/components/line/line.css +1 -3
  63. package/components/link/link.css +1 -1
  64. package/components/link/link.d.ts +2 -2
  65. package/components/link/link.js +1 -1
  66. package/components/list/list.css +17 -20
  67. package/components/loader/loader.css +1 -3
  68. package/components/loader-inline/loader-inline.css +5 -6
  69. package/components/login-dialog/login-dialog.css +1 -3
  70. package/components/markdown/markdown.css +2 -3
  71. package/components/message/message.css +5 -8
  72. package/components/old-browsers-message/old-browsers-message.css +2 -4
  73. package/components/pager/pager.css +2 -4
  74. package/components/panel/panel.css +3 -5
  75. package/components/progress-bar/progress-bar.css +3 -4
  76. package/components/query-assist/query-assist.css +3 -4
  77. package/components/radio/radio.css +8 -11
  78. package/components/select/select-popup.css +9 -11
  79. package/components/select/select.css +13 -14
  80. package/components/sidebar/sidebar.css +13 -15
  81. package/components/table/table.css +15 -17
  82. package/components/table-legacy/table-legacy.css +22 -24
  83. package/components/table-legacy/table-legacy__toolbar.css +2 -4
  84. package/components/tabs/tabs.css +3 -4
  85. package/components/tag/tag.css +12 -13
  86. package/components/tags-input/tags-input.css +1 -2
  87. package/components/toggle/toggle.css +46 -55
  88. package/components/tooltip/tooltip.css +3 -5
  89. package/components/user-agreement/user-agreement.css +2 -2
  90. package/components/user-card/user-card.css +3 -5
  91. 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/devbox/ring-ui-6-0-demo-l5v5fk), based on `create-react-app` tooling, to see and try the UI components
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,9 +1,6 @@
1
1
  @import "../global/variables.css";
2
2
 
3
- @value unit from "../global/global.css";
4
3
  @value icon from "../button/button.css";
5
- @value animation-duration: 300ms;
6
- @value animation-easing: ease-out;
7
4
 
8
5
  .customAlert {
9
6
  color: var(--ring-white-text-color);
@@ -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 (max-height: 400px) {
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,13 +1,11 @@
1
1
  @import "../global/variables.css";
2
2
 
3
- @value unit from "../global/global.css";
4
-
5
3
  .badge {
6
4
  display: inline-block;
7
5
 
8
6
  box-sizing: border-box;
9
7
  height: 20px;
10
- padding: 0 unit;
8
+ padding: 0 var(--ring-unit);
11
9
 
12
10
  cursor: default;
13
11
 
@@ -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 height: var(--ring-button-height);
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
- pointer-events: none;
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
- &[disabled] .icon {
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
- .buttonGroup .button.button:active {
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
- &:hover {
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: -1px;
47
- left: -1px;
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-icon-disabled-color);
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-14px';
5
- import minusIcon from '@jetbrains/icons/remove-14px';
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';
@@ -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;