@iamproperty/components 7.2.2--beta2 → 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.
Files changed (83) hide show
  1. package/assets/css/components/actionbar.component.css +1 -1
  2. package/assets/css/components/actionbar.component.css.map +1 -1
  3. package/assets/css/components/fileupload.css +1 -1
  4. package/assets/css/components/fileupload.css.map +1 -1
  5. package/assets/css/components/nav.component.css +1 -1
  6. package/assets/css/components/nav.component.css.map +1 -1
  7. package/assets/css/components/rank.component.css +1 -1
  8. package/assets/css/components/rank.component.css.map +1 -1
  9. package/assets/css/components/rankings.component.css +1 -1
  10. package/assets/css/components/rankings.component.css.map +1 -1
  11. package/assets/css/components/rankings.global.css +1 -1
  12. package/assets/css/components/rankings.global.css.map +1 -1
  13. package/assets/css/components/slider.css.map +1 -1
  14. package/assets/css/core.min.css +1 -1
  15. package/assets/css/core.min.css.map +1 -1
  16. package/assets/css/mobile-core.min.css +1 -1
  17. package/assets/css/mobile-core.min.css.map +1 -1
  18. package/assets/css/mobile.min.css +1 -1
  19. package/assets/css/mobile.min.css.map +1 -1
  20. package/assets/css/style.min.css +1 -1
  21. package/assets/css/style.min.css.map +1 -1
  22. package/assets/img/thumbnail.png +0 -0
  23. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  24. package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
  25. package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
  26. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  27. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  28. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  29. package/assets/js/components/card/card.component.min.js +1 -1
  30. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  31. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  32. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  33. package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
  34. package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
  35. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  36. package/assets/js/components/header/header.component.min.js +1 -1
  37. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  38. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  39. package/assets/js/components/menu/menu.component.min.js +1 -1
  40. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  41. package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
  42. package/assets/js/components/nav/nav.component.min.js +2 -2
  43. package/assets/js/components/notification/notification.component.min.js +1 -1
  44. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  45. package/assets/js/components/rank/rank.component.min.js +4 -4
  46. package/assets/js/components/rankings/rankings.component.min.js +5 -5
  47. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  48. package/assets/js/components/search/search.component.min.js +1 -1
  49. package/assets/js/components/slider/slider.component.min.js +1 -1
  50. package/assets/js/components/table/table.component.min.js +1 -1
  51. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  52. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  53. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  54. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  55. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  56. package/assets/js/components/video-card/video-card.component.js +3 -66
  57. package/assets/js/components/video-card/video-card.component.min.js +5 -5
  58. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  59. package/assets/js/modules/videos.js +147 -0
  60. package/assets/js/scripts.bundle.js +3 -3
  61. package/assets/js/scripts.bundle.js.map +1 -1
  62. package/assets/js/scripts.bundle.min.js +2 -2
  63. package/assets/js/scripts.bundle.min.js.map +1 -1
  64. package/assets/js/scripts.js +13 -2
  65. package/assets/sass/_elements.scss +6 -0
  66. package/assets/sass/_functions/functions.scss +6 -6
  67. package/assets/sass/_functions/variables.scss +24 -30
  68. package/assets/sass/_utility-mixins.scss +1 -0
  69. package/assets/sass/components/fileupload.scss +3 -3
  70. package/assets/sass/components/nav.component.scss +2 -4
  71. package/assets/sass/elements/details.scss +2 -4
  72. package/assets/sass/elements/forms.scss +10 -4
  73. package/assets/sass/elements/links.scss +49 -1
  74. package/assets/sass/elements/toggle-button.scss +55 -0
  75. package/assets/sass/elements/type.scss +15 -46
  76. package/assets/sass/error.scss +3 -9
  77. package/assets/sass/templates/form.scss +4 -8
  78. package/assets/ts/components/video-card/video-card.component.ts +4 -77
  79. package/assets/ts/modules/videos.ts +194 -0
  80. package/assets/ts/scripts.ts +7 -1
  81. package/dist/components.es.js +18 -18
  82. package/dist/components.umd.js +68 -68
  83. 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
- --line-height: #{$headings-line-height};
21
- // From bootstrap reboot
20
+
22
21
  margin-top: 0; // 1
23
- margin-bottom: $headings-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
- line-height: var(--line-height);
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: rem(map.get($heading-sizes, 'h1_fs'));
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: rem(map.get($heading-sizes, 'h2_fs'));
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: rem(map.get($heading-sizes, 'h3_fs'));
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
- @include media-breakpoint-up(sm, $mobileOnly) {
78
- font-size: rem(map.get($heading-sizes, 'h3_fs_sm'));
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: rem(map.get($heading-sizes, 'h4_fs'));
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
- /* The values for mobile and tablet are exactly the same, but if that changes this block needs to be re-instated
91
- @include media-breakpoint-up(sm,$mobileOnly) {
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
 
@@ -20,17 +20,11 @@
20
20
 
21
21
  @include layer('elements') {
22
22
  .h1 {
23
- --line-height: #{rem(map.get($heading-sizes, 'h1_lh'))};
23
+ --line-height: #{map.get($heading-sizes, 'h1_lh')};
24
24
 
25
- font-size: rem(map.get($heading-sizes, 'h1_fs'));
26
- padding-bottom: rem(map.get($heading-sizes, 'h1_pb'));
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: rem(map.get($heading-sizes, 'h3_fs'));
35
- line-height: rem(map.get($heading-sizes, 'h3_lh'));
36
- padding-bottom: rem(map.get($heading-sizes, 'h3_pb'));
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
- @include media-breakpoint-up(sm, $mobileOnly) {
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) {
@@ -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 this.loadYouTubeScripts();
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
- cardComponent.createYoutTubeVideo(embed);
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;
@@ -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', function () {
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 = {