@internetstiftelsen/styleguide 5.0.19 → 5.1.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/dist/app.js +71 -0
- package/dist/assets/js/Events.js +43 -77
- package/dist/assets/js/RequestError.js +16 -31
- package/dist/assets/js/anchorScroll.js +22 -15
- package/dist/assets/js/charCounter.js +100 -142
- package/dist/assets/js/className.js +19 -20
- package/dist/assets/js/conditional.js +96 -152
- package/dist/assets/js/debounce.js +15 -22
- package/dist/assets/js/el.js +108 -159
- package/dist/assets/js/getCookieByName.js +13 -11
- package/dist/assets/js/hasCookieConsent.js +30 -40
- package/dist/assets/js/htmlTextLength.js +12 -10
- package/dist/assets/js/iconToggle.js +16 -20
- package/dist/assets/js/nodeAdded.js +40 -53
- package/dist/assets/js/objToQuery.js +25 -41
- package/dist/assets/js/offset.js +29 -25
- package/dist/assets/js/ot.js +10 -13
- package/dist/assets/js/parallax.js +23 -23
- package/dist/assets/js/queryToObj.js +16 -22
- package/dist/assets/js/readSpeakerHandling.js +26 -28
- package/dist/assets/js/request.js +43 -52
- package/dist/assets/js/responsivePosition.js +46 -74
- package/dist/assets/js/stringToNode.js +11 -10
- package/dist/assets/js/template.js +15 -21
- package/dist/assets/js/textToggle.js +19 -24
- package/dist/assets/js/track.js +14 -12
- package/dist/assets/js/uid.js +10 -6
- package/dist/assets/js/utmGenerator.js +27 -33
- package/dist/assets/js/validationMessage.js +18 -25
- package/dist/assets/js/youtube.js +134 -170
- package/dist/atoms/button/Button.js +42 -55
- package/dist/atoms/file/file.js +25 -29
- package/dist/atoms/file/filePreview.js +27 -31
- package/dist/atoms/grid-toggle/grid-toggle.js +6 -9
- package/dist/atoms/height-limiter/height-limiter.js +37 -50
- package/dist/atoms/password-toggle/password-toggle.js +9 -11
- package/dist/atoms/range/range.js +32 -39
- package/dist/atoms/textarea/rich-text.js +221 -251
- package/dist/atoms/tooltip/tooltip.js +13 -17
- package/dist/components.js +42 -77
- package/dist/focusTrap.js +66 -77
- package/dist/molecules/alert/alert.js +15 -20
- package/dist/molecules/context-menu/context-menu.js +11 -16
- package/dist/molecules/continue-video-guide/continue-video-guide.js +90 -101
- package/dist/molecules/cookie-disclaimer/cookie-disclaimer.js +24 -33
- package/dist/molecules/form/Form.js +242 -352
- package/dist/molecules/form/index.js +15 -14
- package/dist/molecules/glider/glider-course.js +62 -75
- package/dist/molecules/glider/glider-hero.js +88 -101
- package/dist/molecules/glider/glider.js +49 -45
- package/dist/molecules/modal/modal.js +256 -325
- package/dist/molecules/multi-select/multi-select.js +198 -304
- package/dist/molecules/natural-language-form/natural-language-form.js +32 -46
- package/dist/molecules/overview-navigation/overview-navigation.js +90 -141
- package/dist/molecules/share/share.js +15 -20
- package/dist/molecules/system-error/system-error.js +6 -9
- package/dist/organisms/accordion/accordion.js +44 -50
- package/dist/organisms/footer/footer.js +1 -1
- package/dist/organisms/haveibeenpwned/haveibeenpwned.js +17 -16
- package/dist/organisms/mailchimp/mailchimp.js +72 -89
- package/dist/organisms/map-box/map-box.js +3 -4
- package/dist/organisms/mega-menu/mega-menu.js +177 -212
- package/dist/organisms/podcast/podcast.js +192 -215
- package/dist/organisms/schedule/schedule-filter.js +9 -15
- package/dist/organisms/tabs/tabs.js +194 -253
- package/dist/organisms/timeline/openTimelineItem.js +38 -51
- package/dist/organisms/timeline/timeline.js +111 -128
- package/dist/organisms/video-guide/VideoGuidePlayback.js +210 -286
- package/dist/organisms/video-guide/VideoGuideSubtitles.js +57 -80
- package/dist/organisms/video-guide/VideoGuideTimeline.js +74 -108
- package/dist/organisms/video-guide/getCurrentCueIndex.js +11 -9
- package/dist/organisms/video-guide/video-guide.js +66 -103
- package/dist/utilities/tab-highlighting/tab-highlighting.js +14 -22
- package/dist/vendor/toggle/a11y.toggle-switcher.js +10 -16
- package/package.json +78 -99
- package/src/app.js +5 -5
- package/src/assets/js/anchorScroll.js +1 -1
- package/src/assets/js/offset.js +1 -1
- package/src/atoms/button/Button.js +1 -1
- package/src/atoms/icon/richtext-ordered-list.svg +1 -1
- package/src/atoms/icon/sprite.svg +6 -5
- package/src/molecules/glider/glider-course.js +0 -2
- package/src/molecules/glider/glider.js +2 -2
- package/src/organisms/accordion/accordion.js +1 -2
- package/src/organisms/timeline/timeline.js +2 -3
- package/dist/atoms/timeline/anchorScroll.js +0 -13
- package/dist/atoms/toggle-high-contrast/toggle-high-contrast.js +0 -12
- package/dist/molecules/glider/glider-single.js +0 -68
- package/dist/molecules/modal/modal-graph.js +0 -40
- package/dist/molecules/timeline-navigation/timeline-navigation.js +0 -34
- /package/src/atoms/icon/{heading-3.svg → richtext-heading-3.svg} +0 -0
- /package/src/molecules/alert/{_alert.scss → alert.scss} +0 -0
|
@@ -1,142 +1,91 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
}, {
|
|
91
|
-
key: 'minimize',
|
|
92
|
-
value: function minimize() {
|
|
93
|
-
if (this.minimized === true) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
this.button.style.transition = 'none';
|
|
98
|
-
this.updateButtonPosition();
|
|
99
|
-
|
|
100
|
-
this.element.offsetHeight; // force reflow
|
|
101
|
-
this.button.style.transition = 'right 0.25s ease-out, bottom 0.25s ease-out, opacity 0.25s ease-out';
|
|
102
|
-
|
|
103
|
-
this.element.setAttribute('aria-hidden', 'true');
|
|
104
|
-
this.element.classList.add('is-minimized');
|
|
105
|
-
|
|
106
|
-
this.button.setAttribute('aria-expanded', 'false');
|
|
107
|
-
this.button.classList.add('is-fixed');
|
|
108
|
-
this.button.style.opacity = 1;
|
|
109
|
-
|
|
110
|
-
this.minimized = true;
|
|
111
|
-
}
|
|
112
|
-
}, {
|
|
113
|
-
key: 'maximize',
|
|
114
|
-
value: function maximize() {
|
|
115
|
-
if (this.minimized === false) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
this.element.setAttribute('aria-hidden', 'false');
|
|
120
|
-
this.element.classList.remove('is-minimized');
|
|
121
|
-
|
|
122
|
-
this.element.offsetHeight; // force reflow
|
|
123
|
-
|
|
124
|
-
this.updateButtonPosition();
|
|
125
|
-
this.button.setAttribute('aria-expanded', 'true');
|
|
126
|
-
this.button.classList.remove('is-fixed');
|
|
127
|
-
this.button.style.opacity = 0;
|
|
128
|
-
|
|
129
|
-
this.minimized = false;
|
|
130
|
-
}
|
|
131
|
-
}]);
|
|
132
|
-
|
|
133
|
-
return OverviewNavigation;
|
|
134
|
-
}();
|
|
135
|
-
|
|
136
|
-
var overviewNavigations = document.querySelectorAll('.js-overview-navigation');
|
|
137
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
class OverviewNavigation {
|
|
3
|
+
attach() {
|
|
4
|
+
window.addEventListener('resize', this.onResize.bind(this));
|
|
5
|
+
window.addEventListener('scroll', this.onScroll.bind(this));
|
|
6
|
+
}
|
|
7
|
+
update() {
|
|
8
|
+
if (this.isSmallScreen || this.isOutOfView) {
|
|
9
|
+
this.minimize();
|
|
10
|
+
} else {
|
|
11
|
+
this.maximize();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
onResize() {
|
|
15
|
+
this.isSmallScreen = window.innerWidth <= 961;
|
|
16
|
+
this.update();
|
|
17
|
+
}
|
|
18
|
+
onScroll() {
|
|
19
|
+
const viewportOffset = this.element.getBoundingClientRect();
|
|
20
|
+
if (viewportOffset.top < 0) {
|
|
21
|
+
this.isOutOfView = true;
|
|
22
|
+
} else if (window.scrollY === 0) {
|
|
23
|
+
this.isOutOfView = false;
|
|
24
|
+
}
|
|
25
|
+
this.update();
|
|
26
|
+
}
|
|
27
|
+
// Close the overview menu when clicking any link inside it
|
|
28
|
+
closeMenu() {
|
|
29
|
+
const links = this.element.querySelectorAll('a');
|
|
30
|
+
[].forEach.call(links, (link)=>{
|
|
31
|
+
link.addEventListener('click', ()=>{
|
|
32
|
+
this.button.click();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
updateButtonPosition() {
|
|
37
|
+
const elementOffset = this.element.getBoundingClientRect();
|
|
38
|
+
const buttonRect = this.button.getBoundingClientRect();
|
|
39
|
+
// Use right and bottom to place this.button at the top left corner of the element
|
|
40
|
+
this.button.style.right = `${window.innerWidth - elementOffset.right + elementOffset.width - buttonRect.width}px`;
|
|
41
|
+
this.button.style.bottom = `${window.innerHeight - elementOffset.top - buttonRect.height}px`;
|
|
42
|
+
}
|
|
43
|
+
minimize() {
|
|
44
|
+
if (this.minimized === true) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.button.style.transition = 'none';
|
|
48
|
+
this.updateButtonPosition();
|
|
49
|
+
this.element.offsetHeight; // force reflow
|
|
50
|
+
this.button.style.transition = 'right 0.25s ease-out, bottom 0.25s ease-out, opacity 0.25s ease-out';
|
|
51
|
+
this.element.setAttribute('aria-hidden', 'true');
|
|
52
|
+
this.element.classList.add('is-minimized');
|
|
53
|
+
this.button.setAttribute('aria-expanded', 'false');
|
|
54
|
+
this.button.classList.add('is-fixed');
|
|
55
|
+
this.button.style.opacity = 1;
|
|
56
|
+
this.minimized = true;
|
|
57
|
+
}
|
|
58
|
+
maximize() {
|
|
59
|
+
if (this.minimized === false) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.element.setAttribute('aria-hidden', 'false');
|
|
63
|
+
this.element.classList.remove('is-minimized');
|
|
64
|
+
this.element.offsetHeight; // force reflow
|
|
65
|
+
this.updateButtonPosition();
|
|
66
|
+
this.button.setAttribute('aria-expanded', 'true');
|
|
67
|
+
this.button.classList.remove('is-fixed');
|
|
68
|
+
this.button.style.opacity = 0;
|
|
69
|
+
this.minimized = false;
|
|
70
|
+
}
|
|
71
|
+
constructor(element){
|
|
72
|
+
this.element = element;
|
|
73
|
+
this.button = this.element.querySelector('.js-overview-navigation-button');
|
|
74
|
+
this.isSmallScreen = false;
|
|
75
|
+
this.isOutOfView = false;
|
|
76
|
+
this.minimized = null;
|
|
77
|
+
// a11y-toggle doesn't have a callback for when it's done initializing
|
|
78
|
+
// so we have to wait for the next tick
|
|
79
|
+
document.addEventListener('DOMContentLoaded', ()=>{
|
|
80
|
+
setTimeout(()=>{
|
|
81
|
+
this.attach();
|
|
82
|
+
this.onResize();
|
|
83
|
+
this.closeMenu();
|
|
84
|
+
}, 0);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const overviewNavigations = document.querySelectorAll('.js-overview-navigation');
|
|
138
89
|
if (overviewNavigations) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
});
|
|
142
|
-
}
|
|
90
|
+
[].forEach.call(overviewNavigations, (overviewNavigation)=>new OverviewNavigation(overviewNavigation));
|
|
91
|
+
}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
3
2
|
function openPopup(e) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return false;
|
|
3
|
+
e.preventDefault();
|
|
4
|
+
const width = 500;
|
|
5
|
+
const height = 550;
|
|
6
|
+
const left = window.innerWidth / 2 - width / 2;
|
|
7
|
+
const top = window.innerHeight / 2 - height / 2;
|
|
8
|
+
const url = this.href;
|
|
9
|
+
const opts = `${'status=1' + ',width='}${width},height=${height},top=${top},left=${left}`;
|
|
10
|
+
window.open(url, 'socialMedia', opts);
|
|
11
|
+
return false;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
|
-
var popupButtons = Array.prototype.slice.call(document.querySelectorAll('.js-share-popup'));
|
|
18
|
-
|
|
13
|
+
const popupButtons = Array.prototype.slice.call(document.querySelectorAll('.js-share-popup'));
|
|
19
14
|
if (popupButtons) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
15
|
+
popupButtons.forEach((popup)=>{
|
|
16
|
+
popup.addEventListener('click', openPopup);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var element = document.querySelector('.js-history');
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
const element = document.querySelector('.js-history');
|
|
5
3
|
function goBack(e) {
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
e.preventDefault();
|
|
5
|
+
window.history.go(-1);
|
|
8
6
|
}
|
|
9
|
-
|
|
10
7
|
if (element) {
|
|
11
|
-
|
|
12
|
-
}
|
|
8
|
+
element.addEventListener('click', goBack);
|
|
9
|
+
}
|
|
@@ -1,56 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _debounce = /*#__PURE__*/ _interop_require_default(require("../../assets/js/debounce"));
|
|
6
|
+
require("van11y-accessible-accordion-aria");
|
|
7
|
+
function _interop_require_default(obj) {
|
|
8
|
+
return obj && obj.__esModule ? obj : {
|
|
9
|
+
default: obj
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const className = 'o-accordion';
|
|
13
|
+
const accordionElement = document.querySelector(`.js-${className}`);
|
|
14
|
+
let oAccordion = null;
|
|
15
15
|
function attachAccordion() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
oAccordion.attach();
|
|
16
|
+
if (!oAccordion) {
|
|
17
|
+
const namespace = getComputedStyle(accordionElement, ':before').content.replace(/["']/g, '');
|
|
18
|
+
oAccordion = window.van11yAccessibleAccordionAria({
|
|
19
|
+
ACCORDION_PREFIX_IDS: className,
|
|
20
|
+
ACCORDION_JS: `js-${className}`,
|
|
21
|
+
ACCORDION_STYLE: `${namespace}${className}`,
|
|
22
|
+
ACCORDION_TITLE_STYLE: `${namespace}${className}__title`,
|
|
23
|
+
ACCORDION_HEADER_STYLE: `${namespace}${className}__header`,
|
|
24
|
+
ACCORDION_PANEL_STYLE: `${namespace}${className}__panel`
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
oAccordion.attach();
|
|
30
28
|
}
|
|
31
|
-
|
|
32
29
|
if (accordionElement) {
|
|
33
|
-
|
|
30
|
+
attachAccordion();
|
|
34
31
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
attachAccordion();
|
|
41
|
-
}
|
|
32
|
+
const checkElements = (0, _debounce.default)(()=>{
|
|
33
|
+
const accordionElementFresh = document.querySelector(`.js-${className}`);
|
|
34
|
+
if (accordionElementFresh) {
|
|
35
|
+
attachAccordion();
|
|
36
|
+
}
|
|
42
37
|
}, 50);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
checkElements();
|
|
51
|
-
});
|
|
38
|
+
const observeHandler = (mutationsList)=>{
|
|
39
|
+
mutationsList.forEach((mutation)=>{
|
|
40
|
+
if (mutation.type !== 'childList') {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
checkElements();
|
|
44
|
+
});
|
|
52
45
|
};
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
const observer = new MutationObserver(observeHandler);
|
|
47
|
+
observer.observe(document.body, {
|
|
48
|
+
childList: true,
|
|
49
|
+
subtree: true
|
|
50
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _track = /*#__PURE__*/ _interop_require_default(require("../../assets/js/track"));
|
|
6
|
+
function _interop_require_default(obj) {
|
|
7
|
+
return obj && obj.__esModule ? obj : {
|
|
8
|
+
default: obj
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const haveIBeenPwnedSubmit = document.querySelector('#o-search-result-submit');
|
|
11
12
|
if (haveIBeenPwnedSubmit) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
13
|
+
haveIBeenPwnedSubmit.addEventListener('submit', function() {
|
|
14
|
+
(0, _track.default)({
|
|
15
|
+
event: 'guided_tour'
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -1,110 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var urlParams = new URLSearchParams(queryString);
|
|
26
|
-
var noForm = urlParams.get('noForm');
|
|
27
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _debounce = /*#__PURE__*/ _interop_require_default(require("../../assets/js/debounce"));
|
|
6
|
+
const _hasCookieConsent = /*#__PURE__*/ _interop_require_default(require("../../assets/js/hasCookieConsent"));
|
|
7
|
+
function _interop_require_default(obj) {
|
|
8
|
+
return obj && obj.__esModule ? obj : {
|
|
9
|
+
default: obj
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
let consent = (0, _hasCookieConsent.default)('C0003');
|
|
13
|
+
const slidingForm = document.querySelector('[class*="--sliding"]');
|
|
14
|
+
const staticForm = document.querySelector('[class*="--static"]');
|
|
15
|
+
const closeButton = document.querySelector('[class*="--sliding"] .js-close-mailchimp-popup');
|
|
16
|
+
let timeout;
|
|
17
|
+
let timer;
|
|
18
|
+
const throttle = 66; // Trigger event every 66ms
|
|
19
|
+
const visibleClass = 'is-visible';
|
|
20
|
+
const cookieName = 'internetstiftelsen-mailchimp-form-closed';
|
|
21
|
+
const currentProtocol = document.location.protocol;
|
|
22
|
+
const queryString = window.location.search;
|
|
23
|
+
const urlParams = new URLSearchParams(queryString);
|
|
24
|
+
const noForm = urlParams.get('noForm');
|
|
28
25
|
// Set cookie
|
|
29
26
|
function setCookie(name, value, days) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
27
|
+
const d = new Date();
|
|
28
|
+
d.setTime(d.getTime() + 24 * 60 * 60 * 1000 * days);
|
|
29
|
+
if (currentProtocol === 'https:') {
|
|
30
|
+
document.cookie = `${name}=${value};path=/;SameSite=Strict;Secure;expires=${d.toGMTString()}`;
|
|
31
|
+
} else {
|
|
32
|
+
document.cookie = `${name}=${value};path=/;SameSite=Strict;expires=${d.toGMTString()}`;
|
|
33
|
+
}
|
|
38
34
|
}
|
|
39
|
-
|
|
40
35
|
// Get cookie
|
|
41
36
|
function getCookie(name) {
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
const v = document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`);
|
|
38
|
+
return v ? v[2] : null;
|
|
44
39
|
}
|
|
45
|
-
|
|
46
40
|
// User is sent from email campaign with URL parameter ?noForm=true,
|
|
47
41
|
// set cookie and don't show slide-in form
|
|
48
42
|
if (noForm) {
|
|
49
|
-
|
|
43
|
+
setCookie(cookieName, 'YES', 7);
|
|
50
44
|
}
|
|
51
|
-
|
|
52
45
|
if (slidingForm) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
slidingForm.setAttribute('aria-hidden', 'true');
|
|
46
|
+
timeout = slidingForm.getAttribute('data-slider-delay');
|
|
47
|
+
// Add hidden attribute on page load
|
|
48
|
+
slidingForm.setAttribute('aria-hidden', 'true');
|
|
57
49
|
}
|
|
58
|
-
|
|
59
50
|
function isInViewport(element) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return top < window.pageYOffset + window.innerHeight && top + height > window.pageYOffset;
|
|
51
|
+
let top = element.offsetTop;
|
|
52
|
+
const height = element.offsetHeight;
|
|
53
|
+
while(element.offsetParent){
|
|
54
|
+
// eslint-disable-next-line no-param-reassign
|
|
55
|
+
element = element.offsetParent;
|
|
56
|
+
top += element.offsetTop;
|
|
57
|
+
}
|
|
58
|
+
return top < window.pageYOffset + window.innerHeight && top + height > window.pageYOffset;
|
|
70
59
|
}
|
|
71
|
-
|
|
72
60
|
function slideForm() {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
61
|
+
if (!getCookie(cookieName)) {
|
|
62
|
+
const inViewport = isInViewport(staticForm);
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
if (!inViewport) {
|
|
65
|
+
// The static form is not in the viewport, start timeout to show the sliding form
|
|
66
|
+
timer = setTimeout(()=>{
|
|
67
|
+
slidingForm.classList.add(visibleClass);
|
|
68
|
+
slidingForm.setAttribute('aria-hidden', 'false');
|
|
69
|
+
}, timeout);
|
|
70
|
+
} else {
|
|
71
|
+
slidingForm.classList.remove(visibleClass);
|
|
72
|
+
slidingForm.setAttribute('aria-hidden', 'true');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
88
75
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
76
|
+
const elementIsInViewport = (0, _debounce.default)(()=>{
|
|
77
|
+
if (consent && slidingForm) {
|
|
78
|
+
slideForm();
|
|
79
|
+
}
|
|
94
80
|
}, throttle);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
elementIsInViewport();
|
|
81
|
+
window.addEventListener('scroll', ()=>{
|
|
82
|
+
elementIsInViewport();
|
|
98
83
|
});
|
|
99
|
-
|
|
100
84
|
function closeForm() {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
85
|
+
setCookie(cookieName, 'YES', 7);
|
|
86
|
+
slidingForm.classList.remove(visibleClass);
|
|
87
|
+
slidingForm.setAttribute('aria-hidden', 'true');
|
|
104
88
|
}
|
|
105
|
-
|
|
106
89
|
if (closeButton) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
90
|
+
closeButton.addEventListener('click', ()=>{
|
|
91
|
+
closeForm();
|
|
92
|
+
});
|
|
93
|
+
}
|