@helsenorge/designsystem-react 3.0.0 → 3.0.1

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 (131) hide show
  1. package/CHANGELOG.md +380 -668
  2. package/HelpBubble.js +1 -1
  3. package/HelpBubble.js.map +1 -1
  4. package/HorizontalScroll.js.map +1 -1
  5. package/Input.js +1 -1
  6. package/Input.js.map +1 -1
  7. package/ListHeader.js +1 -1
  8. package/ListHeader.js.map +1 -1
  9. package/Modal.js.map +1 -1
  10. package/PopOver.js +1 -1
  11. package/PopOver.js.map +1 -1
  12. package/RadioButton.js +1 -1
  13. package/RadioButton.js.map +1 -1
  14. package/Textarea.js +1 -1
  15. package/Textarea.js.map +1 -1
  16. package/Title.js.map +1 -1
  17. package/Tooltip.js.map +1 -1
  18. package/TooltipWord.js +1 -1
  19. package/TooltipWord.js.map +1 -1
  20. package/components/AnchorLink/styles.module.scss +11 -6
  21. package/components/Avatar/styles.module.scss +2 -2
  22. package/components/Badge/styles.module.scss +7 -1
  23. package/components/Button/styles.module.scss +35 -21
  24. package/components/Checkbox/styles.module.scss +12 -12
  25. package/components/Close/styles.module.scss +15 -7
  26. package/components/Dropdown/index.js +1 -1
  27. package/components/Dropdown/index.js.map +1 -1
  28. package/components/Dropdown/styles.module.scss +31 -10
  29. package/components/Duolist/styles.module.scss +5 -3
  30. package/components/ErrorWrapper/styles.module.scss +8 -6
  31. package/components/Expander/styles.module.scss +46 -15
  32. package/components/ExpanderHierarchy/expander.module.scss +13 -8
  33. package/components/ExpanderHierarchy/expander.module.scss.d.ts +1 -1
  34. package/components/ExpanderHierarchy/styles.module.scss +3 -3
  35. package/components/ExpanderList/index.js.map +1 -1
  36. package/components/ExpanderList/styles.module.scss +17 -6
  37. package/components/FormExample/FormExample.d.ts.map +1 -1
  38. package/components/FormExample/index.js.map +1 -1
  39. package/components/FormExample/styles.module.scss +6 -6
  40. package/components/FormGroup/styles.module.scss +5 -4
  41. package/components/FormLayout/styles.module.scss +5 -2
  42. package/components/HelpBubble/HelpBubble.d.ts +2 -2
  43. package/components/HelpBubble/HelpBubble.d.ts.map +1 -1
  44. package/components/HelpBubble/index.js +1 -1
  45. package/components/HelpBubble/styles.module.scss +10 -10
  46. package/components/HelpBubble/styles.module.scss.d.ts +0 -1
  47. package/components/HelpBubbleExample/index.js +1 -1
  48. package/components/HighlightBox/index.js.map +1 -1
  49. package/components/HighlightBox/styles.module.scss +38 -29
  50. package/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
  51. package/components/HorizontalScroll/styles.module.scss +10 -3
  52. package/components/Icons/SortUp.js +1 -1
  53. package/components/Icons/SortUp.js.map +1 -1
  54. package/components/Input/Input.d.ts.map +1 -1
  55. package/components/Input/styles.module.scss +8 -7
  56. package/components/LinkList/styles.module.scss +23 -5
  57. package/components/List/styles.module.scss +4 -0
  58. package/components/ListHeader/ListHeader.d.ts +9 -7
  59. package/components/ListHeader/ListHeader.d.ts.map +1 -1
  60. package/components/ListHeader/styles.module.scss +36 -11
  61. package/components/Loader/styles.module.scss +40 -18
  62. package/components/Logo/index.js.map +1 -1
  63. package/components/MaxCharacters/styles.module.scss +7 -5
  64. package/components/Modal/styles.module.scss +39 -23
  65. package/components/NotificationPanel/DetailButton/styles.module.scss +9 -5
  66. package/components/NotificationPanel/index.js.map +1 -1
  67. package/components/NotificationPanel/styles.module.scss +45 -12
  68. package/components/Panel/styles.module.scss +53 -29
  69. package/components/PanelList/styles.module.scss +6 -5
  70. package/components/PopMenu/PopMenu.d.ts.map +1 -1
  71. package/components/PopMenu/styles.module.scss +28 -7
  72. package/components/PopOver/PopOver.d.ts +5 -3
  73. package/components/PopOver/PopOver.d.ts.map +1 -1
  74. package/components/PopOver/componentdata.json +1 -1
  75. package/components/PopOver/styles.module.scss +16 -13
  76. package/components/RadioButton/RadioButton.d.ts.map +1 -1
  77. package/components/RadioButton/styles.module.scss +12 -14
  78. package/components/Select/styles.module.scss +14 -8
  79. package/components/Slider/Slider.d.ts.map +1 -1
  80. package/components/Slider/index.js +1 -1
  81. package/components/Slider/index.js.map +1 -1
  82. package/components/Slider/styles.module.scss +1 -1
  83. package/components/Spacer/styles.module.scss +13 -1
  84. package/components/StatusDot/styles.module.scss +2 -2
  85. package/components/Stepper/styles.module.scss +28 -20
  86. package/components/Table/Table.d.ts.map +1 -1
  87. package/components/Table/index.js +1 -1
  88. package/components/Table/index.js.map +1 -1
  89. package/components/Table/styles.module.scss +32 -20
  90. package/components/Tag/styles.module.scss +39 -27
  91. package/components/TagList/styles.module.scss +3 -3
  92. package/components/Textarea/Textarea.d.ts.map +1 -1
  93. package/components/Textarea/styles.module.scss +6 -5
  94. package/components/Tile/styles.module.scss +11 -6
  95. package/components/Title/Title.d.ts +1 -1
  96. package/components/Title/Title.d.ts.map +1 -1
  97. package/components/Title/styles.module.scss +5 -0
  98. package/components/Tooltip/TooltipWord/TooltipWord.d.ts +1 -1
  99. package/components/Tooltip/TooltipWord/TooltipWord.d.ts.map +1 -1
  100. package/components/Tooltip/TooltipWord/styles.module.scss +3 -3
  101. package/components/Tooltip/index.js +1 -1
  102. package/components/TooltipExample/index.js +1 -1
  103. package/components/Validation/styles.module.scss +3 -3
  104. package/hoc/withBreakpoint/withBreakpoint.d.ts +1 -1
  105. package/hoc/withBreakpoint/withBreakpoint.d.ts.map +1 -1
  106. package/hoc/withBreakpoint/withBreakpoint.js.map +1 -1
  107. package/hooks/useFocusTrap.d.ts.map +1 -1
  108. package/hooks/useFocusTrap.js.map +1 -1
  109. package/hooks/useSize.js.map +1 -1
  110. package/package.json +1 -1
  111. package/scss/_body.scss +3 -1
  112. package/scss/_breakpoints.scss +5 -8
  113. package/scss/_figma-tokens.scss +2 -2
  114. package/scss/_fonts.scss +36 -21
  115. package/scss/_grid.scss +5 -4
  116. package/scss/_input.scss +20 -11
  117. package/scss/_palette.scss +3 -11
  118. package/scss/_print.scss +58 -18
  119. package/scss/_screen-reader.scss +0 -2
  120. package/scss/_spacers.scss +17 -15
  121. package/scss/_title.scss +11 -5
  122. package/scss/helsenorge.scss +1 -1
  123. package/scss/typography.module.scss +20 -13
  124. package/utils/component.d.ts +1 -0
  125. package/utils/component.d.ts.map +1 -1
  126. package/utils/component.js +1 -1
  127. package/utils/component.js.map +1 -1
  128. package/utils/debounce.d.ts +1 -2
  129. package/utils/debounce.d.ts.map +1 -1
  130. package/utils/debounce.js +1 -1
  131. package/utils/debounce.js.map +1 -1
@@ -1,14 +1,15 @@
1
- @import '../../scss/_spacers.scss';
2
- @import '../../scss/_breakpoints.scss';
3
- @import '../../scss/_palette.scss';
4
- @import '../../scss/_font-settings.scss';
5
- @import '../../scss/_screen-reader.scss';
1
+ @use 'sass:map';
2
+ @import '../../scss/spacers';
3
+ @import '../../scss/breakpoints';
4
+ @import '../../scss/palette';
5
+ @import '../../scss/font-settings';
6
+ @import '../../scss/screen-reader';
6
7
 
7
8
  .dropdown {
8
9
  position: relative;
9
10
 
10
11
  &__label {
11
- @include sr-only();
12
+ @include sr-only;
12
13
  }
13
14
 
14
15
  &__toggle {
@@ -24,7 +25,7 @@
24
25
  font-size: $font-size-sm;
25
26
  line-height: 1.3rem; // Custom fordi teksten skal henge bedre sammen om den går over to linjer
26
27
 
27
- @media (min-width: map-get($grid-breakpoints, md)) {
28
+ @media (min-width: map.get($grid-breakpoints, md)) {
28
29
  padding: getSpacer(3xs) getSpacer(3xs) getSpacer(3xs) getSpacer(s);
29
30
  font-size: $font-size-md;
30
31
  line-height: 1.5rem;
@@ -43,10 +44,12 @@
43
44
  &--on-grey {
44
45
  border-color: $neutral700;
45
46
  background-color: $white;
47
+
46
48
  &:hover {
47
49
  background-color: $neutral50;
48
50
  box-shadow: 0 0 0 1px $neutral700;
49
51
  }
52
+
50
53
  &:focus {
51
54
  border-color: $black;
52
55
  box-shadow: 0 0 0 1px $black;
@@ -56,10 +59,12 @@
56
59
  &--on-blueberry {
57
60
  border-color: $blueberry500;
58
61
  background-color: $white;
62
+
59
63
  &:hover {
60
64
  background-color: $blueberry50;
61
65
  box-shadow: 0 0 0 1px $blueberry500;
62
66
  }
67
+
63
68
  &:focus {
64
69
  border-color: $black;
65
70
  box-shadow: 0 0 0 1px $black;
@@ -69,10 +74,12 @@
69
74
  &--on-cherry {
70
75
  border-color: $cherry500;
71
76
  background-color: $white;
77
+
72
78
  &:hover {
73
79
  background-color: $cherry50;
74
80
  box-shadow: 0 0 0 1px $cherry500;
75
81
  }
82
+
76
83
  &:focus {
77
84
  border-color: $black;
78
85
  box-shadow: 0 0 0 1px $black;
@@ -82,6 +89,7 @@
82
89
  &--open#{&}--on-white,
83
90
  &--open#{&}--on-grey {
84
91
  background-color: $neutral50;
92
+
85
93
  &:hover {
86
94
  background-color: $white;
87
95
  }
@@ -89,6 +97,7 @@
89
97
 
90
98
  &--open#{&}--on-blueberry {
91
99
  background-color: $blueberry50;
100
+
92
101
  &:hover {
93
102
  background-color: $white;
94
103
  }
@@ -96,6 +105,7 @@
96
105
 
97
106
  &--open#{&}--on-cherry {
98
107
  background-color: $cherry50;
108
+
99
109
  &:hover {
100
110
  background-color: $white;
101
111
  }
@@ -125,6 +135,7 @@
125
135
 
126
136
  &--transparent#{&}--open#{&}--on-grey {
127
137
  background-color: $neutral100;
138
+
128
139
  &:hover {
129
140
  background-color: transparent;
130
141
  }
@@ -132,6 +143,7 @@
132
143
 
133
144
  &--transparent#{&}--open#{&}--on-blueberry {
134
145
  background-color: $blueberry100;
146
+
135
147
  &:hover {
136
148
  background-color: transparent;
137
149
  }
@@ -139,6 +151,7 @@
139
151
 
140
152
  &--transparent#{&}--open#{&}--on-cherry {
141
153
  background-color: $cherry100;
154
+
142
155
  &:hover {
143
156
  background-color: transparent;
144
157
  }
@@ -150,7 +163,8 @@
150
163
 
151
164
  &__label {
152
165
  padding: getSpacer(3xs) 0;
153
- @media (min-width: map-get($grid-breakpoints, md)) {
166
+
167
+ @media (min-width: map.get($grid-breakpoints, md)) {
154
168
  padding: getSpacer(2xs) 0;
155
169
  }
156
170
  }
@@ -166,10 +180,12 @@
166
180
  background-color: $white;
167
181
  margin-top: getSpacer(2xs);
168
182
  box-shadow: 0 0 0 2px $blueberry500;
183
+
169
184
  &--open {
170
185
  display: block;
171
186
  }
172
187
  }
188
+
173
189
  &__options {
174
190
  overflow-x: hidden;
175
191
  overflow-y: auto;
@@ -177,19 +193,24 @@
177
193
  list-style: none;
178
194
  padding: 0;
179
195
  margin: 0;
180
- @media (min-width: map-get($grid-breakpoints, md)) {
196
+
197
+ @media (min-width: map.get($grid-breakpoints, md)) {
181
198
  max-height: 464px;
182
199
  }
183
200
  }
201
+
184
202
  &__close {
185
203
  padding: getSpacer(s);
186
204
  }
205
+
187
206
  &__input {
188
207
  border-bottom: 1px solid $neutral300;
189
208
  padding: getSpacer(2xs) getSpacer(s) getSpacer(2xs) getSpacer(s);
190
- @media (min-width: map-get($grid-breakpoints, md)) {
209
+
210
+ @media (min-width: map.get($grid-breakpoints, md)) {
191
211
  padding: getSpacer(s);
192
212
  }
213
+
193
214
  &:last-child {
194
215
  border-bottom: none;
195
216
  }
@@ -1,4 +1,5 @@
1
- @import '../../scss/_breakpoints.scss';
1
+ @use 'sass:map';
2
+ @import '../../scss/breakpoints';
2
3
  @import '../../scss/font-settings';
3
4
  @import '../../scss/palette';
4
5
  @import '../../scss/spacers';
@@ -8,6 +9,7 @@
8
9
  padding: getSpacer(s) getSpacer(s) getSpacer(l);
9
10
  border: 0.062rem solid $neutral500;
10
11
  }
12
+
11
13
  &--extra-padding-top {
12
14
  padding-top: getSpacer(xl);
13
15
  padding-bottom: getSpacer(xl);
@@ -19,7 +21,7 @@
19
21
  margin: 0;
20
22
  display: grid;
21
23
 
22
- @media (min-width: map-get($grid-breakpoints, sm)) {
24
+ @media (min-width: map.get($grid-breakpoints, sm)) {
23
25
  font-size: $font-size-md;
24
26
  }
25
27
 
@@ -45,7 +47,7 @@
45
47
  &__dt {
46
48
  padding-right: getSpacer(l);
47
49
 
48
- @media (min-width: map-get($grid-breakpoints, sm)) {
50
+ @media (min-width: map.get($grid-breakpoints, sm)) {
49
51
  padding-right: 2.6669rem;
50
52
  }
51
53
 
@@ -1,11 +1,13 @@
1
- @import '../../scss/_spacers.scss';
2
- @import '../../scss/_breakpoints.scss';
3
- @import '../../scss/_palette.scss';
4
- @import '../../scss/font-settings.scss';
1
+ @use 'sass:map';
2
+ @import '../../scss/spacers';
3
+ @import '../../scss/breakpoints';
4
+ @import '../../scss/palette';
5
+ @import '../../scss/font-settings';
5
6
 
6
7
  .error-wrapper {
7
8
  padding-bottom: getSpacer(m);
8
- @media (min-width: map-get($grid-breakpoints, md)) {
9
+
10
+ @media (min-width: map.get($grid-breakpoints, md)) {
9
11
  padding-bottom: getSpacer(l);
10
12
  }
11
13
 
@@ -18,7 +20,7 @@
18
20
  background-color: $cherry100;
19
21
  border-left: getSpacer(3xs) solid $cherry600;
20
22
 
21
- @media (min-width: map-get($grid-breakpoints, md)) {
23
+ @media (min-width: map.get($grid-breakpoints, md)) {
22
24
  margin-left: (getSpacer(m) + 0.25rem) * -1;
23
25
  margin-right: (getSpacer(m) + 0.25rem) * -1;
24
26
  padding-left: getSpacer(m);
@@ -1,7 +1,8 @@
1
- @import '../../scss/_spacers.scss';
2
- @import '../../scss/_breakpoints.scss';
3
- @import '../../scss/_palette.scss';
4
- @import '../../scss/_font-settings.scss';
1
+ @use 'sass:map';
2
+ @import '../../scss/spacers';
3
+ @import '../../scss/breakpoints';
4
+ @import '../../scss/palette';
5
+ @import '../../scss/font-settings';
5
6
 
6
7
  .expander {
7
8
  position: relative;
@@ -18,17 +19,21 @@
18
19
  &__icon {
19
20
  display: flex;
20
21
  align-items: center;
22
+
21
23
  &--left {
22
24
  margin-right: getSpacer(2xs);
23
- @media (min-width: map-get($grid-breakpoints, md)) {
25
+
26
+ @media (min-width: map.get($grid-breakpoints, md)) {
24
27
  margin-right: getSpacer(s);
25
28
  }
26
29
  }
30
+
27
31
  &--right {
28
32
  margin-left: auto;
29
33
  padding-left: getSpacer(2xs);
30
34
  }
31
35
  }
36
+
32
37
  &__button {
33
38
  position: relative;
34
39
  padding-right: getSpacer(s);
@@ -37,12 +42,15 @@
37
42
  &:hover {
38
43
  background-color: $blueberry50;
39
44
  }
45
+
40
46
  &--expanded {
41
47
  background-color: $blueberry50;
42
48
  }
43
49
  }
50
+
44
51
  &__trigger {
45
52
  $trigger: &;
53
+
46
54
  position: relative;
47
55
  display: flex;
48
56
  align-items: center;
@@ -52,7 +60,8 @@
52
60
  line-height: $lineheight-size-sm;
53
61
  font-weight: 600;
54
62
  text-align: left;
55
- @media (min-width: map-get($grid-breakpoints, md)) {
63
+
64
+ @media (min-width: map.get($grid-breakpoints, md)) {
56
65
  font-size: $font-size-md;
57
66
  line-height: $lineheight-size-md;
58
67
  }
@@ -61,13 +70,15 @@
61
70
  width: 100%;
62
71
  padding: getSpacer(xs) getSpacer(2xs) getSpacer(xs) getSpacer(s);
63
72
 
64
- @media (min-width: map-get($grid-breakpoints, md)) {
73
+ @media (min-width: map.get($grid-breakpoints, md)) {
65
74
  padding: getSpacer(xs) getSpacer(s) getSpacer(xs) getSpacer(l);
66
75
  }
67
76
  }
77
+
68
78
  &--icon {
69
79
  padding-left: getSpacer(2xs);
70
- @media (min-width: map-get($grid-breakpoints, md)) {
80
+
81
+ @media (min-width: map.get($grid-breakpoints, md)) {
71
82
  padding-left: getSpacer(s);
72
83
  }
73
84
  }
@@ -76,17 +87,20 @@
76
87
 
77
88
  @each $color in $colors {
78
89
  &--#{$color} {
79
- background-color: map-get($palette-map, #{$color}50);
90
+ background-color: map.get($palette-map, #{$color}50);
91
+
80
92
  &:hover {
81
- background-color: map-get($palette-map, #{$color}100);
93
+ background-color: map.get($palette-map, #{$color}100);
82
94
  }
95
+
83
96
  &:focus {
84
97
  box-shadow: 0 0 0 1.5px $neutral600, inset 0 0 0 1.5px $neutral600;
85
98
  }
86
99
  &#{$trigger}--expanded {
87
- background-color: map-get($palette-map, #{$color}100);
100
+ background-color: map.get($palette-map, #{$color}100);
101
+
88
102
  &:hover {
89
- background-color: map-get($palette-map, #{$color}200);
103
+ background-color: map.get($palette-map, #{$color}200);
90
104
  }
91
105
  }
92
106
  }
@@ -95,33 +109,40 @@
95
109
  // Hvit bakgrunn har egne regler for bakgrunnsfarge, hover og fokus
96
110
  &--white {
97
111
  background-color: $white;
112
+
98
113
  &:hover {
99
114
  background-color: $neutral100;
100
115
  }
116
+
101
117
  &:focus {
102
118
  box-shadow: 0 0 0 1.5px $neutral600, inset 0 0 0 1.5px $neutral600;
103
119
  }
104
120
  &#{$trigger}--expanded {
105
121
  box-shadow: inset 0 0 0 6px $neutral100;
122
+
106
123
  &:focus {
107
124
  box-shadow: 0 0 0 1.5px $neutral600, inset 0 0 0 1.5px $neutral600, inset 0 0 0 6px $neutral100;
108
125
  }
109
126
  }
110
127
  }
111
128
  }
129
+
112
130
  &__button,
113
131
  &__trigger {
114
132
  &--sticky {
115
133
  position: fixed;
116
134
  top: 0;
117
135
  }
136
+
118
137
  &--absolute {
119
138
  position: absolute;
120
139
  bottom: 0;
121
140
  }
122
141
  }
142
+
123
143
  &__content {
124
144
  $content: &;
145
+
125
146
  display: none;
126
147
  width: 100%;
127
148
 
@@ -136,46 +157,56 @@
136
157
  &--small {
137
158
  margin-top: getSpacer(s);
138
159
  }
160
+
139
161
  &--nested-line {
140
162
  padding-left: getSpacer(s);
141
163
  border-left: solid 3px $neutral200;
142
- @media (min-width: map-get($grid-breakpoints, md)) {
164
+
165
+ @media (min-width: map.get($grid-breakpoints, md)) {
143
166
  margin-left: calc(38px / 2 - 1px); // Halvparten av chevron-ikonets bredde minus halve bredden på border
144
167
  padding-left: calc(
145
168
  38px / 2 + 12px - 2px
146
169
  ); // Halvparten av chevron-ikonets bredde, pluss ikonets margin-right på tablet, minus bredden på border
147
170
  }
148
171
  }
172
+
149
173
  &--large {
150
174
  padding: getSpacer(s) getSpacer(m) getSpacer(l) getSpacer(s);
151
175
 
152
- @media (min-width: map-get($grid-breakpoints, md)) {
176
+ @media (min-width: map.get($grid-breakpoints, md)) {
153
177
  padding: getSpacer(m) getSpacer(l) getSpacer(xl) getSpacer(l);
154
178
  }
155
179
  &#{$content}--icon {
156
- @media (min-width: map-get($grid-breakpoints, md)) {
180
+ @media (min-width: map.get($grid-breakpoints, md)) {
157
181
  padding-left: 70px;
158
182
  }
159
183
  }
160
184
  }
185
+
161
186
  &--neutral {
162
187
  background-color: $neutral50;
163
188
  }
189
+
164
190
  &--blueberry {
165
191
  background-color: $blueberry50;
166
192
  }
193
+
167
194
  &--cherry {
168
195
  background-color: $cherry50;
169
196
  }
197
+
170
198
  &--kiwi {
171
199
  background-color: $kiwi50;
172
200
  }
201
+
173
202
  &--banana {
174
203
  background-color: $banana50;
175
204
  }
205
+
176
206
  &--plum {
177
207
  background-color: $plum50;
178
208
  }
209
+
179
210
  &--white {
180
211
  background-color: $white;
181
212
  }
@@ -1,3 +1,4 @@
1
+ @use 'sass:map';
1
2
  @import '../../scss/breakpoints';
2
3
  @import '../../scss/palette';
3
4
  @import '../../scss/spacers';
@@ -5,8 +6,9 @@
5
6
 
6
7
  .expander {
7
8
  $item: &;
9
+
8
10
  @media (prefers-reduced-motion: no-preference) {
9
- animation: fadeIn 150ms linear forwards;
11
+ animation: fade-in 150ms linear forwards;
10
12
  }
11
13
 
12
14
  &:first-of-type {
@@ -25,7 +27,7 @@
25
27
  border-bottom: 1px solid $neutral500;
26
28
  padding: getSpacer(xs) 0 getSpacer(xs) 0;
27
29
 
28
- @media (min-width: map-get($grid-breakpoints, lg)) {
30
+ @media (min-width: map.get($grid-breakpoints, lg)) {
29
31
  flex-direction: row-reverse;
30
32
  justify-content: start;
31
33
  padding: getSpacer(s) getSpacer(s) getSpacer(s) getSpacer(2xs);
@@ -61,7 +63,8 @@
61
63
 
62
64
  &--2-and-lower {
63
65
  padding: getSpacer(2xs) 0 getSpacer(2xs) 0;
64
- @media (min-width: map-get($grid-breakpoints, lg)) {
66
+
67
+ @media (min-width: map.get($grid-breakpoints, lg)) {
65
68
  padding: getSpacer(xs) getSpacer(s) getSpacer(xs) getSpacer(2xs);
66
69
  }
67
70
  }
@@ -100,13 +103,13 @@
100
103
 
101
104
  &--1,
102
105
  &--2 {
103
- @media (min-width: map-get($grid-breakpoints, lg)) {
106
+ @media (min-width: map.get($grid-breakpoints, lg)) {
104
107
  padding-left: getSpacer(2xl);
105
108
  }
106
109
  }
107
110
 
108
111
  &--3-and-lower {
109
- @media (min-width: map-get($grid-breakpoints, lg)) {
112
+ @media (min-width: map.get($grid-breakpoints, lg)) {
110
113
  padding-left: getSpacer(xl);
111
114
  }
112
115
  }
@@ -119,27 +122,29 @@
119
122
  margin-left: getSpacer(xs);
120
123
  }
121
124
 
122
- @media (min-width: map-get($grid-breakpoints, lg)) {
125
+ @media (min-width: map.get($grid-breakpoints, lg)) {
123
126
  margin-left: 0;
124
127
  margin-right: getSpacer(s);
125
128
  }
126
129
 
127
130
  &--3-and-lower {
128
- @media (min-width: map-get($grid-breakpoints, lg)) {
131
+ @media (min-width: map.get($grid-breakpoints, lg)) {
129
132
  margin-right: getSpacer(xs);
130
133
  }
131
134
  }
132
135
  }
133
136
  }
134
137
 
135
- @keyframes fadeIn {
138
+ @keyframes fade-in {
136
139
  0% {
137
140
  opacity: 0;
138
141
  max-height: 0;
139
142
  }
143
+
140
144
  99% {
141
145
  max-height: 24rem;
142
146
  }
147
+
143
148
  100% {
144
149
  opacity: 1;
145
150
  max-height: none;
@@ -15,7 +15,7 @@ export type Styles = {
15
15
  'expander__title--2': string;
16
16
  'expander__title--3': string;
17
17
  'expander__title--4-and-lower': string;
18
- fadeIn: string;
18
+ 'fade-in': string;
19
19
  };
20
20
 
21
21
  export type ClassNames = keyof Styles;
@@ -1,6 +1,6 @@
1
- @import '../../scss/_palette.scss';
2
- @import '../../scss/_spacers.scss';
3
- @import '../../scss/_title.scss';
1
+ @import '../../scss/palette';
2
+ @import '../../scss/spacers';
3
+ @import '../../scss/title';
4
4
 
5
5
  .expanderhierarchy {
6
6
  list-style: none;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/ExpanderList/ExpanderList.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId, ZIndex } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { useHover } from '../../hooks/useHover';\nimport { useSticky } from '../../hooks/useSticky';\nimport { useUuid } from '../../hooks/useUuid';\nimport { PaletteNames } from '../../theme/palette';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport { ListHeaderType, renderListHeader } from '../ListHeader/ListHeader';\nimport { TitleTags } from '../Title';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = PaletteNames;\nexport interface ExpanderType extends React.ForwardRefExoticComponent<ExpanderProps & React.RefAttributes<HTMLLIElement>> {\n ListHeader?: ListHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.ForwardRefExoticComponent<ExpanderListProps & React.RefAttributes<HTMLUListElement>> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** @deprecated Skal fases ut - Brukes ikke lenger. */\n bottomBorder?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the link list background color on hover. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Opens the first item in the list. */\n /** @deprecated Skal fases ut til fordel for å bruke expanded-prop på første ExpanderList.Expander */\n isOpen?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** @deprecated Skal fases ut - Brukes ikke lenger. */\n topBorder?: boolean;\n /** Stick expander trigger to top of screen while scrolling down */\n sticky?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: JSX.Element | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'sticky' | 'variant'>;\n\nconst Expander: ExpanderType = React.forwardRef<HTMLLIElement, ExpanderProps>((props, ref) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n sticky,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered } = useHover(triggerRef);\n\n const { isOutsideWindow, isLeavingWindow, offsetHeight, contentWidth } = useSticky(expanderRef, triggerRef);\n const isSticky = sticky && isExpanded && isOutsideWindow;\n const isJsxTitle = typeof title === 'object';\n\n const itemClasses = classNames(className, {\n [expanderListStyles['expander-list__item--' + variant]]: variant,\n [expanderListStyles['expander-list__item--jsx']]: isJsxTitle,\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles['expander-list-link--fill']]: variant === 'fill',\n [expanderListStyles['expander-list-link--closed']]: !isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n [expanderListStyles['expander-list-link--jsx']]: isJsxTitle,\n [expanderListStyles['expander-list-link--sticky']]: isSticky && !isLeavingWindow,\n [expanderListStyles['expander-list-link--absolute']]: isSticky && isLeavingWindow,\n });\n\n const renderContent = () => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(\n expanderListStyles['expander-list-link__main-content'],\n isExpanded && expanderListStyles['expander-list-link__main-content--expanded'],\n padding ? expanderListStyles['expander-list-link__main-content--padding'] : ''\n );\n\n return <div className={mainContentClasses}>{children}</div>;\n };\n\n return (\n <li\n className={itemClasses}\n ref={mergeRefs([ref, expanderRef])}\n style={{ paddingTop: isSticky && offsetHeight ? `${offsetHeight}px` : undefined }}\n >\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isHovered || isSticky ? ZIndex.ExpanderTrigger : undefined,\n width: isSticky && contentWidth ? `${contentWidth}px` : undefined,\n }}\n >\n {renderListHeader(title, titleHtmlMarkup, isHovered, large ? 'large' : 'medium', isExpanded ? ChevronUp : ChevronDown, icon)}\n </button>\n {renderContent()}\n </li>\n );\n});\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: {} | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nexport const ExpanderList = React.forwardRef((props: ExpanderListProps, ref: React.Ref<HTMLUListElement>) => {\n const {\n children,\n childPadding = true,\n large,\n isOpen = false,\n renderChildrenWhenClosed = false,\n color,\n className = '',\n accordion = false,\n topBorder = true,\n bottomBorder = true,\n sticky = false,\n testId,\n variant,\n } = props;\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const uuid = useUuid();\n const childCount = React.Children.count(children);\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className);\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n /** Returns the class modifier top when we want to show the top border and no-bottom when we don't want to show the bottom border */\n const getExpanderItemClass = (index: number) => {\n return classNames(expanderListStyles['expander-list__item'], {\n [expanderListStyles['expander-list__item--top']]: index === 0 && topBorder,\n [expanderListStyles['expander-list__item--no-bottom']]: index === childCount - 1 && !bottomBorder,\n });\n };\n\n const getExpanderId = (index: number) => `${uuid}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n useEffect(() => {\n if (isOpen) {\n const id = getExpanderId(0);\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n const newActiveExpander = React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }\n }, [children]);\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n const expanderItemClass = getExpanderItemClass(index);\n\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n id,\n key: index,\n expanded,\n padding: childPadding,\n color,\n large,\n sticky,\n 'aria-expanded': expanded,\n className: expanderItemClass,\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => handleExpanderClick(event, `${uuid}-${index}`),\n renderChildrenWhenClosed,\n variant,\n });\n }\n return child;\n })}\n </ul>\n );\n}) as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n"],"names":["Expander","React","props","ref","id","children","padding","color","className","icon","large","title","titleHtmlMarkup","expanded","sticky","testId","handleExpanderClick","onExpand","renderChildrenWhenClosed","variant","isExpanded","useExpand","expanderRef","useRef","triggerRef","isHovered","useHover","isOutsideWindow","isLeavingWindow","offsetHeight","contentWidth","useSticky","isSticky","isJsxTitle","itemClasses","classNames","expanderListStyles","expanderClasses","renderContent","mainContentClasses","mergeRefs","AnalyticsId","ZIndex","renderListHeader","ChevronUp","ChevronDown","isExpanderComponent","element","ExpanderList","childPadding","isOpen","accordion","topBorder","bottomBorder","activeExpander","setActiveExpander","useState","latestExpander","setLatestExpander","uuid","useUuid","childCount","expanderListClasses","event","prevState","getExpanderItemClass","index","getExpanderId","useEffect","isElementInViewport","newActiveExpander","_a","child","acc","expanderItemClass","ExpanderList$1"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/ExpanderList/ExpanderList.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId, ZIndex } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { useHover } from '../../hooks/useHover';\nimport { useSticky } from '../../hooks/useSticky';\nimport { useUuid } from '../../hooks/useUuid';\nimport { PaletteNames } from '../../theme/palette';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport { ListHeaderType, renderListHeader } from '../ListHeader/ListHeader';\nimport { TitleTags } from '../Title';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = PaletteNames;\nexport interface ExpanderType extends React.ForwardRefExoticComponent<ExpanderProps & React.RefAttributes<HTMLLIElement>> {\n ListHeader?: ListHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.ForwardRefExoticComponent<ExpanderListProps & React.RefAttributes<HTMLUListElement>> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** @deprecated Skal fases ut - Brukes ikke lenger. */\n bottomBorder?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the link list background color on hover. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Opens the first item in the list. */\n /** @deprecated Skal fases ut til fordel for å bruke expanded-prop på første ExpanderList.Expander */\n isOpen?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** @deprecated Skal fases ut - Brukes ikke lenger. */\n topBorder?: boolean;\n /** Stick expander trigger to top of screen while scrolling down */\n sticky?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: JSX.Element | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'sticky' | 'variant'>;\n\nconst Expander: ExpanderType = React.forwardRef<HTMLLIElement, ExpanderProps>((props, ref) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n sticky,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered } = useHover(triggerRef);\n\n const { isOutsideWindow, isLeavingWindow, offsetHeight, contentWidth } = useSticky(expanderRef, triggerRef);\n const isSticky = sticky && isExpanded && isOutsideWindow;\n const isJsxTitle = typeof title === 'object';\n\n const itemClasses = classNames(className, {\n [expanderListStyles['expander-list__item--' + variant]]: variant,\n [expanderListStyles['expander-list__item--jsx']]: isJsxTitle,\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles['expander-list-link--fill']]: variant === 'fill',\n [expanderListStyles['expander-list-link--closed']]: !isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n [expanderListStyles['expander-list-link--jsx']]: isJsxTitle,\n [expanderListStyles['expander-list-link--sticky']]: isSticky && !isLeavingWindow,\n [expanderListStyles['expander-list-link--absolute']]: isSticky && isLeavingWindow,\n });\n\n const renderContent = () => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(\n expanderListStyles['expander-list-link__main-content'],\n isExpanded && expanderListStyles['expander-list-link__main-content--expanded'],\n padding ? expanderListStyles['expander-list-link__main-content--padding'] : ''\n );\n\n return <div className={mainContentClasses}>{children}</div>;\n };\n\n return (\n <li\n className={itemClasses}\n ref={mergeRefs([ref, expanderRef])}\n style={{ paddingTop: isSticky && offsetHeight ? `${offsetHeight}px` : undefined }}\n >\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isHovered || isSticky ? ZIndex.ExpanderTrigger : undefined,\n width: isSticky && contentWidth ? `${contentWidth}px` : undefined,\n }}\n >\n {renderListHeader(title, titleHtmlMarkup, isHovered, large ? 'large' : 'medium', isExpanded ? ChevronUp : ChevronDown, icon)}\n </button>\n {renderContent()}\n </li>\n );\n});\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: {} | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nexport const ExpanderList = React.forwardRef((props: ExpanderListProps, ref: React.Ref<HTMLUListElement>) => {\n const {\n children,\n childPadding = true,\n large,\n isOpen = false,\n renderChildrenWhenClosed = false,\n color,\n className = '',\n accordion = false,\n topBorder = true,\n bottomBorder = true,\n sticky = false,\n testId,\n variant,\n } = props;\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const uuid = useUuid();\n const childCount = React.Children.count(children);\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className);\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n /** Returns the class modifier top when we want to show the top border and no-bottom when we don't want to show the bottom border */\n const getExpanderItemClass = (index: number) => {\n return classNames(expanderListStyles['expander-list__item'], {\n [expanderListStyles['expander-list__item--top']]: index === 0 && topBorder,\n [expanderListStyles['expander-list__item--no-bottom']]: index === childCount - 1 && !bottomBorder,\n });\n };\n\n const getExpanderId = (index: number) => `${uuid}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n useEffect(() => {\n if (isOpen) {\n const id = getExpanderId(0);\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n const newActiveExpander = React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }\n }, [children]);\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n const expanderItemClass = getExpanderItemClass(index);\n\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n id,\n key: index,\n expanded,\n padding: childPadding,\n color,\n large,\n sticky,\n 'aria-expanded': expanded,\n className: expanderItemClass,\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => handleExpanderClick(event, `${uuid}-${index}`),\n renderChildrenWhenClosed,\n variant,\n });\n }\n return child;\n })}\n </ul>\n );\n}) as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n"],"names":["Expander","React","props","ref","id","children","padding","color","className","icon","large","title","titleHtmlMarkup","expanded","sticky","testId","handleExpanderClick","onExpand","renderChildrenWhenClosed","variant","isExpanded","useExpand","expanderRef","useRef","triggerRef","isHovered","useHover","isOutsideWindow","isLeavingWindow","offsetHeight","contentWidth","useSticky","isSticky","isJsxTitle","itemClasses","classNames","expanderListStyles","expanderClasses","renderContent","mainContentClasses","mergeRefs","AnalyticsId","ZIndex","renderListHeader","ChevronUp","ChevronDown","isExpanderComponent","element","ExpanderList","childPadding","isOpen","accordion","topBorder","bottomBorder","activeExpander","setActiveExpander","useState","latestExpander","setLatestExpander","uuid","useUuid","childCount","expanderListClasses","event","prevState","getExpanderItemClass","index","getExpanderId","useEffect","isElementInViewport","newActiveExpander","_a","child","acc","expanderItemClass","ExpanderList$1"],"mappings":"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"}