@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.
- package/CHANGELOG.md +380 -668
- package/HelpBubble.js +1 -1
- package/HelpBubble.js.map +1 -1
- package/HorizontalScroll.js.map +1 -1
- package/Input.js +1 -1
- package/Input.js.map +1 -1
- package/ListHeader.js +1 -1
- package/ListHeader.js.map +1 -1
- package/Modal.js.map +1 -1
- package/PopOver.js +1 -1
- package/PopOver.js.map +1 -1
- package/RadioButton.js +1 -1
- package/RadioButton.js.map +1 -1
- package/Textarea.js +1 -1
- package/Textarea.js.map +1 -1
- package/Title.js.map +1 -1
- package/Tooltip.js.map +1 -1
- package/TooltipWord.js +1 -1
- package/TooltipWord.js.map +1 -1
- package/components/AnchorLink/styles.module.scss +11 -6
- package/components/Avatar/styles.module.scss +2 -2
- package/components/Badge/styles.module.scss +7 -1
- package/components/Button/styles.module.scss +35 -21
- package/components/Checkbox/styles.module.scss +12 -12
- package/components/Close/styles.module.scss +15 -7
- package/components/Dropdown/index.js +1 -1
- package/components/Dropdown/index.js.map +1 -1
- package/components/Dropdown/styles.module.scss +31 -10
- package/components/Duolist/styles.module.scss +5 -3
- package/components/ErrorWrapper/styles.module.scss +8 -6
- package/components/Expander/styles.module.scss +46 -15
- package/components/ExpanderHierarchy/expander.module.scss +13 -8
- package/components/ExpanderHierarchy/expander.module.scss.d.ts +1 -1
- package/components/ExpanderHierarchy/styles.module.scss +3 -3
- package/components/ExpanderList/index.js.map +1 -1
- package/components/ExpanderList/styles.module.scss +17 -6
- package/components/FormExample/FormExample.d.ts.map +1 -1
- package/components/FormExample/index.js.map +1 -1
- package/components/FormExample/styles.module.scss +6 -6
- package/components/FormGroup/styles.module.scss +5 -4
- package/components/FormLayout/styles.module.scss +5 -2
- package/components/HelpBubble/HelpBubble.d.ts +2 -2
- package/components/HelpBubble/HelpBubble.d.ts.map +1 -1
- package/components/HelpBubble/index.js +1 -1
- package/components/HelpBubble/styles.module.scss +10 -10
- package/components/HelpBubble/styles.module.scss.d.ts +0 -1
- package/components/HelpBubbleExample/index.js +1 -1
- package/components/HighlightBox/index.js.map +1 -1
- package/components/HighlightBox/styles.module.scss +38 -29
- package/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/components/HorizontalScroll/styles.module.scss +10 -3
- package/components/Icons/SortUp.js +1 -1
- package/components/Icons/SortUp.js.map +1 -1
- package/components/Input/Input.d.ts.map +1 -1
- package/components/Input/styles.module.scss +8 -7
- package/components/LinkList/styles.module.scss +23 -5
- package/components/List/styles.module.scss +4 -0
- package/components/ListHeader/ListHeader.d.ts +9 -7
- package/components/ListHeader/ListHeader.d.ts.map +1 -1
- package/components/ListHeader/styles.module.scss +36 -11
- package/components/Loader/styles.module.scss +40 -18
- package/components/Logo/index.js.map +1 -1
- package/components/MaxCharacters/styles.module.scss +7 -5
- package/components/Modal/styles.module.scss +39 -23
- package/components/NotificationPanel/DetailButton/styles.module.scss +9 -5
- package/components/NotificationPanel/index.js.map +1 -1
- package/components/NotificationPanel/styles.module.scss +45 -12
- package/components/Panel/styles.module.scss +53 -29
- package/components/PanelList/styles.module.scss +6 -5
- package/components/PopMenu/PopMenu.d.ts.map +1 -1
- package/components/PopMenu/styles.module.scss +28 -7
- package/components/PopOver/PopOver.d.ts +5 -3
- package/components/PopOver/PopOver.d.ts.map +1 -1
- package/components/PopOver/componentdata.json +1 -1
- package/components/PopOver/styles.module.scss +16 -13
- package/components/RadioButton/RadioButton.d.ts.map +1 -1
- package/components/RadioButton/styles.module.scss +12 -14
- package/components/Select/styles.module.scss +14 -8
- package/components/Slider/Slider.d.ts.map +1 -1
- package/components/Slider/index.js +1 -1
- package/components/Slider/index.js.map +1 -1
- package/components/Slider/styles.module.scss +1 -1
- package/components/Spacer/styles.module.scss +13 -1
- package/components/StatusDot/styles.module.scss +2 -2
- package/components/Stepper/styles.module.scss +28 -20
- package/components/Table/Table.d.ts.map +1 -1
- package/components/Table/index.js +1 -1
- package/components/Table/index.js.map +1 -1
- package/components/Table/styles.module.scss +32 -20
- package/components/Tag/styles.module.scss +39 -27
- package/components/TagList/styles.module.scss +3 -3
- package/components/Textarea/Textarea.d.ts.map +1 -1
- package/components/Textarea/styles.module.scss +6 -5
- package/components/Tile/styles.module.scss +11 -6
- package/components/Title/Title.d.ts +1 -1
- package/components/Title/Title.d.ts.map +1 -1
- package/components/Title/styles.module.scss +5 -0
- package/components/Tooltip/TooltipWord/TooltipWord.d.ts +1 -1
- package/components/Tooltip/TooltipWord/TooltipWord.d.ts.map +1 -1
- package/components/Tooltip/TooltipWord/styles.module.scss +3 -3
- package/components/Tooltip/index.js +1 -1
- package/components/TooltipExample/index.js +1 -1
- package/components/Validation/styles.module.scss +3 -3
- package/hoc/withBreakpoint/withBreakpoint.d.ts +1 -1
- package/hoc/withBreakpoint/withBreakpoint.d.ts.map +1 -1
- package/hoc/withBreakpoint/withBreakpoint.js.map +1 -1
- package/hooks/useFocusTrap.d.ts.map +1 -1
- package/hooks/useFocusTrap.js.map +1 -1
- package/hooks/useSize.js.map +1 -1
- package/package.json +1 -1
- package/scss/_body.scss +3 -1
- package/scss/_breakpoints.scss +5 -8
- package/scss/_figma-tokens.scss +2 -2
- package/scss/_fonts.scss +36 -21
- package/scss/_grid.scss +5 -4
- package/scss/_input.scss +20 -11
- package/scss/_palette.scss +3 -11
- package/scss/_print.scss +58 -18
- package/scss/_screen-reader.scss +0 -2
- package/scss/_spacers.scss +17 -15
- package/scss/_title.scss +11 -5
- package/scss/helsenorge.scss +1 -1
- package/scss/typography.module.scss +20 -13
- package/utils/component.d.ts +1 -0
- package/utils/component.d.ts.map +1 -1
- package/utils/component.js +1 -1
- package/utils/component.js.map +1 -1
- package/utils/debounce.d.ts +1 -2
- package/utils/debounce.d.ts.map +1 -1
- package/utils/debounce.js +1 -1
- package/utils/debounce.js.map +1 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
@
|
|
2
|
-
@import '../../scss/
|
|
3
|
-
@import '../../scss/
|
|
4
|
-
@import '../../scss/
|
|
5
|
-
@import '../../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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
@
|
|
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
|
|
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
|
|
50
|
+
@media (min-width: map.get($grid-breakpoints, sm)) {
|
|
49
51
|
padding-right: 2.6669rem;
|
|
50
52
|
}
|
|
51
53
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
@
|
|
2
|
-
@import '../../scss/
|
|
3
|
-
@import '../../scss/
|
|
4
|
-
@import '../../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
|
-
|
|
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
|
|
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
|
-
@
|
|
2
|
-
@import '../../scss/
|
|
3
|
-
@import '../../scss/
|
|
4
|
-
@import '../../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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
90
|
+
background-color: map.get($palette-map, #{$color}50);
|
|
91
|
+
|
|
80
92
|
&:hover {
|
|
81
|
-
background-color: map
|
|
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
|
|
100
|
+
background-color: map.get($palette-map, #{$color}100);
|
|
101
|
+
|
|
88
102
|
&:hover {
|
|
89
|
-
background-color: map
|
|
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
|
-
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
@@ -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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"}
|