@iamproperty/components 7.2.2--beta1 → 7.2.2--beta3
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/assets/css/components/actionbar.component.css +1 -1
- package/assets/css/components/actionbar.component.css.map +1 -1
- package/assets/css/components/fileupload.css +1 -1
- package/assets/css/components/fileupload.css.map +1 -1
- package/assets/css/components/nav.component.css +1 -1
- package/assets/css/components/nav.component.css.map +1 -1
- package/assets/css/components/rank.component.css +1 -1
- package/assets/css/components/rank.component.css.map +1 -1
- package/assets/css/components/rankings.component.css +1 -1
- package/assets/css/components/rankings.component.css.map +1 -1
- package/assets/css/components/rankings.global.css +1 -1
- package/assets/css/components/rankings.global.css.map +1 -1
- package/assets/css/components/slider.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/mobile-core.min.css +1 -1
- package/assets/css/mobile-core.min.css.map +1 -1
- package/assets/css/mobile.min.css +1 -1
- package/assets/css/mobile.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/img/thumbnail.png +0 -0
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
- package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/barchart/barchart.component.min.js +1 -1
- package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
- package/assets/js/components/card/card.component.js +19 -0
- package/assets/js/components/card/card.component.min.js +6 -6
- package/assets/js/components/card/card.component.min.js.map +1 -1
- package/assets/js/components/carousel/carousel.component.min.js +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
- package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/menu/menu.component.min.js +1 -1
- package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
- package/assets/js/components/nav/nav.component.min.js +2 -2
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +1 -1
- package/assets/js/components/rank/rank.component.min.js +4 -4
- package/assets/js/components/rankings/rankings.component.min.js +5 -5
- package/assets/js/components/record-card/record-card.component.min.js +1 -1
- package/assets/js/components/search/search.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.min.js +1 -1
- package/assets/js/components/table/table.component.min.js +1 -1
- package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
- package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
- package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
- package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +1 -1
- package/assets/js/components/video-card/video-card.component.js +3 -66
- package/assets/js/components/video-card/video-card.component.min.js +5 -5
- package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
- package/assets/js/modules/videos.js +147 -0
- package/assets/js/scripts.bundle.js +3 -3
- package/assets/js/scripts.bundle.js.map +1 -1
- package/assets/js/scripts.bundle.min.js +2 -2
- package/assets/js/scripts.bundle.min.js.map +1 -1
- package/assets/js/scripts.js +13 -2
- package/assets/sass/_elements.scss +6 -0
- package/assets/sass/_functions/functions.scss +6 -6
- package/assets/sass/_functions/variables.scss +24 -30
- package/assets/sass/_utility-mixins.scss +1 -0
- package/assets/sass/components/fileupload.scss +3 -3
- package/assets/sass/components/nav.component.scss +2 -4
- package/assets/sass/elements/details.scss +2 -4
- package/assets/sass/elements/forms.scss +10 -4
- package/assets/sass/elements/links.scss +49 -1
- package/assets/sass/elements/toggle-button.scss +55 -0
- package/assets/sass/elements/type.scss +15 -46
- package/assets/sass/error.scss +3 -9
- package/assets/sass/templates/form.scss +4 -8
- package/assets/ts/components/card/card.component.ts +29 -0
- package/assets/ts/components/video-card/video-card.component.ts +4 -77
- package/assets/ts/modules/videos.ts +194 -0
- package/assets/ts/scripts.ts +7 -1
- package/dist/components.es.js +18 -18
- package/dist/components.umd.js +94 -94
- package/package.json +1 -1
|
@@ -58,7 +58,7 @@ $darkMode: 'true' !default;
|
|
|
58
58
|
position: relative;
|
|
59
59
|
font-weight: bold;
|
|
60
60
|
|
|
61
|
-
&:not(.text-decoration-none)
|
|
61
|
+
&:not(.text-decoration-none) {
|
|
62
62
|
&:after {
|
|
63
63
|
position: absolute;
|
|
64
64
|
content: '';
|
|
@@ -159,3 +159,51 @@ $darkMode: 'true' !default;
|
|
|
159
159
|
|
|
160
160
|
// #endregion
|
|
161
161
|
}
|
|
162
|
+
|
|
163
|
+
:is(.youtube-link[data-youtube], .vimeo-link[data-vimeo]){
|
|
164
|
+
|
|
165
|
+
position: relative;
|
|
166
|
+
|
|
167
|
+
&:before {
|
|
168
|
+
content: '';
|
|
169
|
+
display: block;
|
|
170
|
+
background-color: var(--video-btn-colour, var(--colour-success));
|
|
171
|
+
height: 3rem;
|
|
172
|
+
width: 3rem;
|
|
173
|
+
position: absolute;
|
|
174
|
+
top: calc(50% - 1.5rem);
|
|
175
|
+
left: calc(50% - 1.5rem);
|
|
176
|
+
z-index: 2;
|
|
177
|
+
border-radius: 1.5rem;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
&:after {
|
|
181
|
+
$icon-play: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'><path d='M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z'/></svg>");
|
|
182
|
+
--icon: #{$icon-play};
|
|
183
|
+
|
|
184
|
+
content: '';
|
|
185
|
+
display: block;
|
|
186
|
+
height: 1rem;
|
|
187
|
+
width: 1rem;
|
|
188
|
+
position: absolute;
|
|
189
|
+
top: calc(50% - 0.5rem);
|
|
190
|
+
left: calc(50% - 0.4rem);
|
|
191
|
+
z-index: 5;
|
|
192
|
+
background: var(--colour-primary-theme);
|
|
193
|
+
mask-image: var(--icon);
|
|
194
|
+
mask-size: 80%;
|
|
195
|
+
mask-repeat: no-repeat;
|
|
196
|
+
mask-position: 50% 50%;
|
|
197
|
+
-webkit-mask-image: var(--icon);
|
|
198
|
+
-webkit-mask-size: 80%;
|
|
199
|
+
-webkit-mask-repeat: no-repeat;
|
|
200
|
+
-webkit-mask-position: 50% 50%;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
&:is(:hover, :focus) {
|
|
204
|
+
--video-btn-colour: var(--colour-canvas);
|
|
205
|
+
}
|
|
206
|
+
&:is(:active) {
|
|
207
|
+
--video-btn-colour: color-mix(in oklab, var(--colour-success), #000000 20%) !important;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
@use '../_func' as *;
|
|
2
|
+
|
|
3
|
+
$layers: 'true' !default;
|
|
4
|
+
$mobileOnly: 'false' !default;
|
|
5
|
+
$darkMode: 'true' !default;
|
|
6
|
+
|
|
7
|
+
@include layer('elements', $layers) {
|
|
8
|
+
|
|
9
|
+
// #region toggle
|
|
10
|
+
.toggle {
|
|
11
|
+
--outline-width: 0.25rem!important;
|
|
12
|
+
padding-left: 3.25rem !important;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.toggle:before {
|
|
16
|
+
border-radius: 2rem !important;
|
|
17
|
+
background-color: var(--colour-canvas) !important;
|
|
18
|
+
border: 2px solid var(--colour-heading) !important;
|
|
19
|
+
transition: 0.4s !important;
|
|
20
|
+
width: 2.5rem !important;
|
|
21
|
+
left: 0.25rem !important;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
label.toggle:has(:is(input[type='checkbox'],input[type="radio"]):not([disabled]):checked):before {
|
|
25
|
+
background: var(--colour-primary-theme) !important;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.toggle:after {
|
|
29
|
+
position: absolute !important;
|
|
30
|
+
content: '' !important;
|
|
31
|
+
display: block!important;
|
|
32
|
+
top: 0.5rem !important;
|
|
33
|
+
height: 1em !important;
|
|
34
|
+
width: 1em !important;
|
|
35
|
+
left: 0.25em !important;
|
|
36
|
+
background-color: var(--colour-heading) !important;
|
|
37
|
+
-webkit-transition: 0.4s !important;
|
|
38
|
+
transition: 0.4s !important;
|
|
39
|
+
margin: 0.25em !important;
|
|
40
|
+
border-radius: 0.5em;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
label.toggle:has(:is(input[type='checkbox'],input[type='radio']):not([disabled]):not([disabled]):checked):after {
|
|
44
|
+
background: var(--colour-primary-theme) !important;
|
|
45
|
+
background-color: white !important;
|
|
46
|
+
-webkit-transform: translateX(1rem) !important;
|
|
47
|
+
-ms-transform: translateX(1rem) !important;
|
|
48
|
+
transform: translateX(1rem) !important;
|
|
49
|
+
}
|
|
50
|
+
// #endregion
|
|
51
|
+
|
|
52
|
+
label.toggle:has(+ label.toggle) {
|
|
53
|
+
margin-bottom: 0!important;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -17,19 +17,18 @@ $darkMode: 'true' !default;
|
|
|
17
17
|
// #region headings
|
|
18
18
|
|
|
19
19
|
%heading {
|
|
20
|
-
|
|
21
|
-
// From bootstrap reboot
|
|
20
|
+
|
|
22
21
|
margin-top: 0; // 1
|
|
23
|
-
margin-bottom:
|
|
22
|
+
margin-bottom: 0;
|
|
24
23
|
font-family: $headings-font-family;
|
|
25
24
|
font-style: $headings-font-style;
|
|
26
25
|
font-weight: bold;
|
|
27
|
-
|
|
26
|
+
|
|
27
|
+
line-height: round(calc(1em * var(--type-scale)),0.25rem);
|
|
28
|
+
padding-bottom: round(calc(1em * var(--type-scale)),0.25rem);
|
|
28
29
|
color: $headings-color;
|
|
29
|
-
// END:Bootstap reboot
|
|
30
30
|
clear: both;
|
|
31
31
|
display: block;
|
|
32
|
-
padding-bottom: 2rem;
|
|
33
32
|
|
|
34
33
|
[class*='fa-'] {
|
|
35
34
|
margin-right: 0.5rem;
|
|
@@ -41,60 +40,31 @@ $darkMode: 'true' !default;
|
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
:is(.h1, h1) {
|
|
44
|
-
--line-height: #{rem(map.get($heading-sizes, 'h1_lh'))};
|
|
45
43
|
|
|
46
|
-
font-size:
|
|
47
|
-
padding-bottom: rem(map.get($heading-sizes, 'h1_pb'));
|
|
44
|
+
font-size: map.get($heading-sizes, 'h1_fs');
|
|
48
45
|
font-weight: 900;
|
|
49
|
-
|
|
50
|
-
@include media-breakpoint-up(sm, $mobileOnly) {
|
|
51
|
-
font-size: rem(map.get($heading-sizes, 'h1_fs_sm'));
|
|
52
|
-
--line-height: #{rem(map.get($heading-sizes, 'h1_lh_sm'))};
|
|
53
|
-
padding-bottom: rem(map.get($heading-sizes, 'h1_pb_sm'));
|
|
54
|
-
}
|
|
55
46
|
}
|
|
56
47
|
|
|
48
|
+
|
|
57
49
|
:is(h2, .h2) {
|
|
58
|
-
font-size:
|
|
59
|
-
--line-height: #{rem(map.get($heading-sizes, 'h2_lh'))};
|
|
60
|
-
padding-bottom: rem(map.get($heading-sizes, 'h1_pb'));
|
|
50
|
+
font-size: map.get($heading-sizes, 'h2_fs');
|
|
61
51
|
font-weight: 900;
|
|
62
|
-
|
|
63
|
-
@include media-breakpoint-up(sm, $mobileOnly) {
|
|
64
|
-
font-size: rem(map.get($heading-sizes, 'h2_fs_sm'));
|
|
65
|
-
--line-height: #{rem(map.get($heading-sizes, 'h2_lh_sm'))};
|
|
66
|
-
padding-bottom: rem(map.get($heading-sizes, 'h2_pb_sm'));
|
|
67
|
-
}
|
|
68
52
|
}
|
|
69
53
|
|
|
70
54
|
:is(h3, .h3) {
|
|
71
|
-
font-size:
|
|
72
|
-
--line-height: #{rem(map.get($heading-sizes, 'h3_lh'))};
|
|
73
|
-
padding-bottom: rem(map.get($heading-sizes, 'h3_pb'));
|
|
55
|
+
font-size: map.get($heading-sizes, 'h3_fs');
|
|
74
56
|
max-width: var(--content-max-width);
|
|
75
|
-
font-weight: 900;
|
|
76
57
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
--line-height: #{rem(map.get($heading-sizes, 'h3_lh_sm'))};
|
|
80
|
-
padding-bottom: rem(map.get($heading-sizes, 'h3_pb_sm'));
|
|
81
|
-
}
|
|
58
|
+
line-height: round(calc(1em * var(--type-scale)),0.25rem);
|
|
59
|
+
padding-bottom: round(calc(1em * var(--type-scale)),0.25rem);
|
|
82
60
|
}
|
|
83
61
|
|
|
84
62
|
:is(.h4, h4, .h5, h5, .h6, h6) {
|
|
85
|
-
font-size:
|
|
86
|
-
--line-height: #{rem(map.get($heading-sizes, 'h4_lh'))};
|
|
87
|
-
padding-bottom: rem(map.get($heading-sizes, 'h4_pb'));
|
|
63
|
+
font-size: map.get($heading-sizes, 'h4_fs');
|
|
88
64
|
max-width: var(--content-max-width);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
font-size: rem(map.get($heading-sizes,"h4_fs_sm"));
|
|
94
|
-
line-height: rem(map.get($heading-sizes,"h4_lh_sm"));
|
|
95
|
-
padding-bottom: rem(map.get($heading-sizes,"h4_pb_sm"));
|
|
96
|
-
}
|
|
97
|
-
*/
|
|
65
|
+
|
|
66
|
+
line-height: round(calc(1em * var(--type-scale)),0.25rem);
|
|
67
|
+
padding-bottom: round(calc(1em * var(--type-scale)),0.25rem);
|
|
98
68
|
}
|
|
99
69
|
// #endregion
|
|
100
70
|
|
|
@@ -125,7 +95,6 @@ $darkMode: 'true' !default;
|
|
|
125
95
|
line-height: rem(map.get($heading-sizes, 'small_lh'));
|
|
126
96
|
padding-bottom: rem(map.get($heading-sizes, 'small_pb'));
|
|
127
97
|
max-width: var(--content-max-width);
|
|
128
|
-
font-family: arial, sans-serif;
|
|
129
98
|
font-weight: normal;
|
|
130
99
|
}
|
|
131
100
|
|
package/assets/sass/error.scss
CHANGED
|
@@ -20,17 +20,11 @@
|
|
|
20
20
|
|
|
21
21
|
@include layer('elements') {
|
|
22
22
|
.h1 {
|
|
23
|
-
--line-height: #{
|
|
23
|
+
--line-height: #{map.get($heading-sizes, 'h1_lh')};
|
|
24
24
|
|
|
25
|
-
font-size:
|
|
26
|
-
padding-bottom:
|
|
25
|
+
font-size: map.get($heading-sizes, 'h1_fs');
|
|
26
|
+
padding-bottom: map.get($heading-sizes, 'h1_pb');
|
|
27
27
|
font-weight: 900;
|
|
28
|
-
|
|
29
|
-
@include media-breakpoint-up(sm, $mobileOnly) {
|
|
30
|
-
font-size: rem(map.get($heading-sizes, 'h1_fs_sm'));
|
|
31
|
-
--line-height: #{rem(map.get($heading-sizes, 'h1_lh_sm'))};
|
|
32
|
-
padding-bottom: rem(map.get($heading-sizes, 'h1_pb_sm'));
|
|
33
|
-
}
|
|
34
28
|
}
|
|
35
29
|
}
|
|
36
30
|
|
|
@@ -31,16 +31,12 @@ $darkMode: 'true' !default;
|
|
|
31
31
|
|
|
32
32
|
// Make H2's look like H3's
|
|
33
33
|
:is(h2, .h2) {
|
|
34
|
-
font-size:
|
|
35
|
-
line-height:
|
|
36
|
-
padding-bottom:
|
|
34
|
+
font-size: map.get($heading-sizes, 'h3_fs');
|
|
35
|
+
line-height: map.get($heading-sizes, 'h3_lh');
|
|
36
|
+
padding-bottom: map.get($heading-sizes, 'h3_pb');
|
|
37
37
|
max-width: var(--content-max-width);
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
font-size: rem(map.get($heading-sizes, 'h3_fs_sm'));
|
|
41
|
-
line-height: rem(map.get($heading-sizes, 'h3_lh_sm'));
|
|
42
|
-
padding-bottom: rem(map.get($heading-sizes, 'h3_pb_sm'));
|
|
43
|
-
}
|
|
39
|
+
|
|
44
40
|
}
|
|
45
41
|
|
|
46
42
|
@include light-mode($darkMode) {
|
|
@@ -57,8 +57,37 @@ class iamCard extends HTMLElement {
|
|
|
57
57
|
<slot name="btns"></slot>
|
|
58
58
|
</div>
|
|
59
59
|
</div>`;
|
|
60
|
+
|
|
61
|
+
// safari and firefox anchor fix for cards
|
|
62
|
+
if (!CSS.supports('top', 'anchor(top)')) {
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const actionButton = this.shadowRoot?.querySelector('[popovertarget="actions"]');
|
|
66
|
+
const actionPopover = this.shadowRoot?.querySelector('[popover]');
|
|
67
|
+
|
|
68
|
+
actionButton?.addEventListener('click', (event) => {
|
|
69
|
+
|
|
70
|
+
this.style.setProperty('overflow', 'visible');
|
|
71
|
+
this.style.setProperty('z-index', '999999');
|
|
72
|
+
|
|
73
|
+
const viewportOffset = actionButton.getBoundingClientRect();
|
|
74
|
+
const top = viewportOffset.top;
|
|
75
|
+
const left = viewportOffset.left;
|
|
76
|
+
|
|
77
|
+
actionPopover.style.setProperty('display', 'block');
|
|
78
|
+
actionPopover.style.setProperty('top', top + 'px');
|
|
79
|
+
actionPopover.style.setProperty('left', (left - 100) + 'px');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
document.addEventListener("scroll", (event) => {
|
|
83
|
+
|
|
84
|
+
actionPopover.style.setProperty('display', 'none');
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
}
|
|
60
88
|
}
|
|
61
89
|
|
|
90
|
+
|
|
62
91
|
// Make sure slotted buttons and links have correct button classes
|
|
63
92
|
Array.from(cardComponent.querySelectorAll('[slot="btns"]')).forEach((button) => {
|
|
64
93
|
button.classList.add('btn');
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { trackComponent, trackComponentRegistered } from '../_global';
|
|
2
2
|
import { cardHTML, setupCard } from '../../modules/card.module';
|
|
3
|
+
import {loadYouTubeScripts,createYoutTubeVideo} from '../../modules/videos';
|
|
4
|
+
|
|
3
5
|
|
|
4
6
|
trackComponentRegistered('iam-video-card');
|
|
5
7
|
|
|
@@ -73,7 +75,7 @@ class iamVideoCard extends HTMLElement {
|
|
|
73
75
|
// Load the scripts only once
|
|
74
76
|
if (!document.body.classList.contains('youtubeLoaded')) {
|
|
75
77
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
76
|
-
const loaded = await
|
|
78
|
+
const loaded = await loadYouTubeScripts();
|
|
77
79
|
}
|
|
78
80
|
cardHead.addEventListener('click', function () {
|
|
79
81
|
const customEvent = new CustomEvent('play-video', {
|
|
@@ -81,7 +83,7 @@ class iamVideoCard extends HTMLElement {
|
|
|
81
83
|
});
|
|
82
84
|
cardComponent.dispatchEvent(customEvent);
|
|
83
85
|
|
|
84
|
-
|
|
86
|
+
createYoutTubeVideo(embed,this.getAttribute('[data-youtbue]'));
|
|
85
87
|
dialog.showModal();
|
|
86
88
|
});
|
|
87
89
|
|
|
@@ -128,81 +130,6 @@ class iamVideoCard extends HTMLElement {
|
|
|
128
130
|
trackComponent(cardComponent, 'iam-video-card', ['play-video', 'close-video']);
|
|
129
131
|
}
|
|
130
132
|
|
|
131
|
-
loadYouTubeScripts(): any {
|
|
132
|
-
return new Promise((resolve, reject) => {
|
|
133
|
-
const image = new Image();
|
|
134
|
-
image.onload = function (): any {
|
|
135
|
-
// This code loads the IFrame Player API code asynchronously.
|
|
136
|
-
const tag = document.createElement('script');
|
|
137
|
-
tag.src = 'https://www.youtube.com/iframe_api';
|
|
138
|
-
const firstScriptTag = document.getElementsByTagName('script')[0];
|
|
139
|
-
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
|
140
|
-
document.body.classList.add('youtubeLoaded');
|
|
141
|
-
resolve(true);
|
|
142
|
-
};
|
|
143
|
-
image.onerror = function (): any {
|
|
144
|
-
reject(false);
|
|
145
|
-
};
|
|
146
|
-
image.src = 'https://youtube.com/favicon.ico';
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
createYoutTubeVideo(target): void | boolean {
|
|
151
|
-
if (typeof window.player == 'undefined') {
|
|
152
|
-
window.player = [];
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const link_id = target.getAttribute('id');
|
|
156
|
-
const video_id = this.getAttribute('data-youtube');
|
|
157
|
-
|
|
158
|
-
console.log(window.player);
|
|
159
|
-
|
|
160
|
-
if (typeof window.player[link_id] != 'undefined' && typeof window.player[link_id].pauseVideo == 'function') {
|
|
161
|
-
window.player[link_id].playVideo();
|
|
162
|
-
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// This function creates an <iframe> (and YouTube player) after the API code downloads.
|
|
167
|
-
//function onYouTubeIframeAPIReady() {
|
|
168
|
-
|
|
169
|
-
window.player[link_id] = new YT.Player(link_id, {
|
|
170
|
-
height: '100%',
|
|
171
|
-
width: '100%',
|
|
172
|
-
videoId: video_id,
|
|
173
|
-
playerVars: {
|
|
174
|
-
modestbranding: 1,
|
|
175
|
-
playsinline: 1,
|
|
176
|
-
rel: 0,
|
|
177
|
-
showinfo: 0,
|
|
178
|
-
},
|
|
179
|
-
events: {
|
|
180
|
-
onReady: onPlayerReady,
|
|
181
|
-
onStateChange: onPlayerStateChange,
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
//}
|
|
185
|
-
//onYouTubeIframeAPIReady();
|
|
186
|
-
|
|
187
|
-
// The API will call this function when the video player is ready.
|
|
188
|
-
function onPlayerReady(event): void {
|
|
189
|
-
// Play the video straight away
|
|
190
|
-
event.target.playVideo();
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// The API calls this function when the player's state changes.
|
|
194
|
-
// The function indicates that when playing a video (state=1)
|
|
195
|
-
let done = false;
|
|
196
|
-
function onPlayerStateChange(event): void {
|
|
197
|
-
if (event.data == YT.PlayerState.PLAYING && !done) {
|
|
198
|
-
const link = document.getElementById(link_id);
|
|
199
|
-
link.classList.add('player-ready');
|
|
200
|
-
|
|
201
|
-
done = true;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
133
|
static get observedAttributes(): any {
|
|
207
134
|
return ['data-image'];
|
|
208
135
|
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
const videoSupport = async(body): void => {
|
|
2
|
+
|
|
3
|
+
if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
+
const loaded = await loadYouTubeScripts();
|
|
6
|
+
}
|
|
7
|
+
setTimeout(async() => {
|
|
8
|
+
|
|
9
|
+
if (document.querySelector('.youtube-link[data-youtube]') && !document.body.classList.contains('youtubeLoaded')) {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
|
+
const loaded = await loadYouTubeScripts();
|
|
12
|
+
}
|
|
13
|
+
}, "2000");
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
body.addEventListener('click', async(event) => {
|
|
17
|
+
|
|
18
|
+
let target = (event.target as HTMLElement).closest<HTMLElement>('.youtube-link[data-youtube]');
|
|
19
|
+
|
|
20
|
+
if(!target){
|
|
21
|
+
target = (event.target as HTMLElement).closest<HTMLElement>('.vimeo-link[data-vimeo]');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if(target && target.hasAttribute('data-youtube')){
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
|
|
30
|
+
if (!document.body.classList.contains('youtubeLoaded')) {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
32
|
+
const loaded = await loadYouTubeScripts();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const link_id = 'youtube-' + target.getAttribute('data-youtube');
|
|
36
|
+
|
|
37
|
+
if (!document.getElementById(`${link_id}-dialog`)) {
|
|
38
|
+
document.body.insertAdjacentHTML(
|
|
39
|
+
'beforeend',
|
|
40
|
+
`<dialog id="${link_id}-dialog"><div class="embed" id="${link_id}"></div></dialog>`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const dialog = document.getElementById(`${link_id}-dialog`);
|
|
45
|
+
const embed = document.getElementById(link_id);
|
|
46
|
+
|
|
47
|
+
const customEvent = new CustomEvent('play-video', {
|
|
48
|
+
detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },
|
|
49
|
+
});
|
|
50
|
+
target.dispatchEvent(customEvent);
|
|
51
|
+
window.dataLayer.push(customEvent.detail);
|
|
52
|
+
|
|
53
|
+
createYoutTubeVideo(embed, target.getAttribute('data-youtube'));
|
|
54
|
+
dialog.showModal();
|
|
55
|
+
|
|
56
|
+
dialog.addEventListener('close', () => {
|
|
57
|
+
if (
|
|
58
|
+
window.player[embed.getAttribute('id')] &&
|
|
59
|
+
typeof window.player[embed.getAttribute('id')].pauseVideo == 'function'
|
|
60
|
+
) {
|
|
61
|
+
window.player[embed.getAttribute('id')].pauseVideo();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const customEvent = new CustomEvent('close-video', {
|
|
65
|
+
detail: { 'Video Type': 'YoutTube', ID: target.getAttribute('data-youtube') },
|
|
66
|
+
});
|
|
67
|
+
target.dispatchEvent(customEvent);
|
|
68
|
+
window.dataLayer.push(customEvent.detail);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
else if(target && target.hasAttribute('data-vimeo')){
|
|
73
|
+
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
|
|
76
|
+
const link_id = 'vimeo-' + target.getAttribute('data-youtube');
|
|
77
|
+
|
|
78
|
+
if (!document.getElementById(`${link_id}-dialog`)) {
|
|
79
|
+
document.body.insertAdjacentHTML(
|
|
80
|
+
'beforeend',
|
|
81
|
+
`<dialog id="${link_id}-dialog"><div class="embed" id="${link_id}"></div></dialog>`
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const dialog = document.getElementById(`${link_id}-dialog`);
|
|
86
|
+
const embed = document.getElementById(link_id);
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
const videoId = target.getAttribute('data-vimeo');
|
|
90
|
+
|
|
91
|
+
const customEvent = new CustomEvent('play-video', {
|
|
92
|
+
detail: { 'Video Type': 'Vimeo', ID: videoId },
|
|
93
|
+
});
|
|
94
|
+
target.dispatchEvent(customEvent);
|
|
95
|
+
window.dataLayer.push(customEvent.detail);
|
|
96
|
+
|
|
97
|
+
if (!embed.querySelector('iframe'))
|
|
98
|
+
embed.innerHTML = `<iframe src="https://player.vimeo.com/video/${videoId}?autoplay=1" width="100%" height="100%" frameborder="0" allow="autoplay; encrypted-media" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>`;
|
|
99
|
+
|
|
100
|
+
dialog.showModal();
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
dialog.addEventListener('close', () => {
|
|
104
|
+
embed.innerHTML = ``; // Remove the video since we cant pause it
|
|
105
|
+
|
|
106
|
+
const customEvent = new CustomEvent('close-video', {
|
|
107
|
+
detail: { 'Video Type': 'Vimeo', ID: target.getAttribute('data-vimeo') },
|
|
108
|
+
});
|
|
109
|
+
target.dispatchEvent(customEvent);
|
|
110
|
+
window.dataLayer.push(customEvent.detail);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
export const loadYouTubeScripts = async(): any => {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
|
|
123
|
+
const image = new Image();
|
|
124
|
+
image.onload = function (): any {
|
|
125
|
+
// This code loads the IFrame Player API code asynchronously.
|
|
126
|
+
const tag = document.createElement('script');
|
|
127
|
+
tag.src = 'https://www.youtube.com/iframe_api';
|
|
128
|
+
const firstScriptTag = document.getElementsByTagName('script')[0];
|
|
129
|
+
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
|
130
|
+
document.body.classList.add('youtubeLoaded');
|
|
131
|
+
resolve(true);
|
|
132
|
+
};
|
|
133
|
+
image.onerror = function (): any {
|
|
134
|
+
reject(false);
|
|
135
|
+
};
|
|
136
|
+
image.src = 'https://youtube.com/favicon.ico';
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
export const createYoutTubeVideo = async(target, video_id): void | boolean => {
|
|
142
|
+
if (typeof window.player == 'undefined') {
|
|
143
|
+
window.player = [];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const link_id = target.getAttribute('id');
|
|
147
|
+
|
|
148
|
+
if (typeof window.player[link_id] != 'undefined' && typeof window.player[link_id].pauseVideo == 'function') {
|
|
149
|
+
window.player[link_id].playVideo();
|
|
150
|
+
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// This function creates an <iframe> (and YouTube player) after the API code downloads.
|
|
155
|
+
//function onYouTubeIframeAPIReady() {
|
|
156
|
+
|
|
157
|
+
window.player[link_id] = new YT.Player(link_id, {
|
|
158
|
+
height: '100%',
|
|
159
|
+
width: '100%',
|
|
160
|
+
videoId: video_id,
|
|
161
|
+
playerVars: {
|
|
162
|
+
modestbranding: 1,
|
|
163
|
+
playsinline: 1,
|
|
164
|
+
rel: 0,
|
|
165
|
+
showinfo: 0,
|
|
166
|
+
},
|
|
167
|
+
events: {
|
|
168
|
+
onReady: onPlayerReady,
|
|
169
|
+
onStateChange: onPlayerStateChange,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
//}
|
|
173
|
+
//onYouTubeIframeAPIReady();
|
|
174
|
+
|
|
175
|
+
// The API will call this function when the video player is ready.
|
|
176
|
+
function onPlayerReady(event): void {
|
|
177
|
+
// Play the video straight away
|
|
178
|
+
event.target.playVideo();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// The API calls this function when the player's state changes.
|
|
182
|
+
// The function indicates that when playing a video (state=1)
|
|
183
|
+
let done = false;
|
|
184
|
+
function onPlayerStateChange(event): void {
|
|
185
|
+
if (event.data == YT.PlayerState.PLAYING && !done) {
|
|
186
|
+
const link = document.getElementById(link_id);
|
|
187
|
+
link.classList.add('player-ready');
|
|
188
|
+
|
|
189
|
+
done = true;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export default videoSupport;
|
package/assets/ts/scripts.ts
CHANGED
|
@@ -4,6 +4,7 @@ import extendDialogs from './modules/dialogs';
|
|
|
4
4
|
import createDataLayer from './modules/data-layer';
|
|
5
5
|
import extendInputs from './modules/inputs';
|
|
6
6
|
import createDynamicEvents from './modules/dynamicEvents';
|
|
7
|
+
import videoSupport from './modules/videos';
|
|
7
8
|
|
|
8
9
|
const components = [
|
|
9
10
|
'accordion',
|
|
@@ -39,7 +40,7 @@ const components = [
|
|
|
39
40
|
];
|
|
40
41
|
|
|
41
42
|
// Attach classes to dom elements
|
|
42
|
-
document.addEventListener('DOMContentLoaded',
|
|
43
|
+
document.addEventListener('DOMContentLoaded', async():void => {
|
|
43
44
|
createDataLayer();
|
|
44
45
|
createDynamicEvents();
|
|
45
46
|
|
|
@@ -49,6 +50,11 @@ document.addEventListener('DOMContentLoaded', function () {
|
|
|
49
50
|
|
|
50
51
|
extendDialogs(document.body);
|
|
51
52
|
extendInputs(document.body);
|
|
53
|
+
|
|
54
|
+
videoSupport(document.body);
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
52
58
|
/*
|
|
53
59
|
const prefix = 'iam';
|
|
54
60
|
const options = {
|