@iamproperty/components 7.7.1--beta4 → 7.7.1--beta5

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 (156) 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/address-lookup.component.css +1 -1
  4. package/assets/css/components/address-lookup.component.css.map +1 -1
  5. package/assets/css/components/applied-filters.css +1 -1
  6. package/assets/css/components/applied-filters.css.map +1 -1
  7. package/assets/css/components/barchart.component.css +1 -1
  8. package/assets/css/components/barchart.component.css.map +1 -1
  9. package/assets/css/components/calendar.component.css +1 -1
  10. package/assets/css/components/calendar.component.css.map +1 -1
  11. package/assets/css/components/card.component.css +1 -1
  12. package/assets/css/components/card.component.css.map +1 -1
  13. package/assets/css/components/carousel.component.css +1 -1
  14. package/assets/css/components/carousel.component.css.map +1 -1
  15. package/assets/css/components/collapsible-side.css +1 -1
  16. package/assets/css/components/collapsible-side.css.map +1 -1
  17. package/assets/css/components/config.component.css +1 -1
  18. package/assets/css/components/config.component.css.map +1 -1
  19. package/assets/css/components/content.component.css +1 -1
  20. package/assets/css/components/content.component.css.map +1 -1
  21. package/assets/css/components/doughnutchart.component.css +1 -1
  22. package/assets/css/components/doughnutchart.component.css.map +1 -1
  23. package/assets/css/components/fileupload.css +1 -1
  24. package/assets/css/components/fileupload.css.map +1 -1
  25. package/assets/css/components/inline-edit.css +1 -1
  26. package/assets/css/components/inline-edit.css.map +1 -1
  27. package/assets/css/components/modal.component.css +1 -1
  28. package/assets/css/components/modal.component.css.map +1 -1
  29. package/assets/css/components/multi-step-modal.component.css +1 -1
  30. package/assets/css/components/multi-step-modal.component.css.map +1 -1
  31. package/assets/css/components/multiselect.css +1 -1
  32. package/assets/css/components/multiselect.css.map +1 -1
  33. package/assets/css/components/nav.component.css +1 -1
  34. package/assets/css/components/nav.component.css.map +1 -1
  35. package/assets/css/components/pagination.css +1 -1
  36. package/assets/css/components/pagination.css.map +1 -1
  37. package/assets/css/components/split-button.component.css +1 -1
  38. package/assets/css/components/split-button.component.css.map +1 -1
  39. package/assets/css/components/tabs.component.css +1 -1
  40. package/assets/css/components/tabs.component.css.map +1 -1
  41. package/assets/css/components/tabs.config.css +1 -1
  42. package/assets/css/components/tabs.config.css.map +1 -1
  43. package/assets/css/components/video-card.component.css +1 -1
  44. package/assets/css/components/video-card.component.css.map +1 -1
  45. package/assets/css/components/video-modal.component.css +1 -1
  46. package/assets/css/components/video-modal.component.css.map +1 -1
  47. package/assets/css/components/video.component.css +1 -0
  48. package/assets/css/components/video.component.css.map +1 -0
  49. package/assets/css/core.min.css +1 -1
  50. package/assets/css/core.min.css.map +1 -1
  51. package/assets/css/elements/badge-tag.css +1 -1
  52. package/assets/css/elements/badge-tag.css.map +1 -1
  53. package/assets/css/elements/buttons--action.css +1 -1
  54. package/assets/css/elements/buttons--action.css.map +1 -1
  55. package/assets/css/elements/buttons--global.css +1 -1
  56. package/assets/css/elements/buttons--global.css.map +1 -1
  57. package/assets/css/elements/buttons.css +1 -1
  58. package/assets/css/elements/buttons.css.map +1 -1
  59. package/assets/css/elements/links.css +1 -1
  60. package/assets/css/elements/links.css.map +1 -1
  61. package/assets/css/style.min.css +1 -1
  62. package/assets/css/style.min.css.map +1 -1
  63. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  64. package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
  65. package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
  66. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  67. package/assets/js/components/advanced-select/advanced-select.component.min.js +1 -1
  68. package/assets/js/components/applied-filters/applied-filters.component.min.js +2 -2
  69. package/assets/js/components/barchart/barchart.component.min.js +6 -6
  70. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  71. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  72. package/assets/js/components/calendar/calendar.component.min.js +2 -2
  73. package/assets/js/components/card/card.component.min.js +2 -2
  74. package/assets/js/components/carousel/carousel.component.min.js +3 -3
  75. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
  76. package/assets/js/components/config/config.component.min.js +2 -2
  77. package/assets/js/components/content/content.component.min.js +2 -2
  78. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  79. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +4 -4
  80. package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
  81. package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
  82. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  83. package/assets/js/components/form/form.component.min.js +1 -1
  84. package/assets/js/components/header/header.component.min.js +1 -1
  85. package/assets/js/components/inline-edit/inline-edit.component.min.js +4 -4
  86. package/assets/js/components/input/input.component.min.js +1 -1
  87. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  88. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  89. package/assets/js/components/menu/menu.component.min.js +1 -1
  90. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  91. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  92. package/assets/js/components/modal/modal.component.js +2 -2
  93. package/assets/js/components/modal/modal.component.min.js +4 -4
  94. package/assets/js/components/modal/modal.component.min.js.map +1 -1
  95. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  96. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +2 -2
  97. package/assets/js/components/multiselect/multiselect.component.min.js +2 -2
  98. package/assets/js/components/nav/nav.component.min.js +2 -2
  99. package/assets/js/components/notification/notification.component.min.js +1 -1
  100. package/assets/js/components/pagination/pagination.component.min.js +2 -2
  101. package/assets/js/components/password/password.component.min.js +1 -1
  102. package/assets/js/components/popover/popover.component.min.js +1 -1
  103. package/assets/js/components/rank/rank.component.min.js +1 -1
  104. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  105. package/assets/js/components/rating/rating.component.min.js +1 -1
  106. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  107. package/assets/js/components/search/search.component.min.js +1 -1
  108. package/assets/js/components/slider/slider.component.min.js +1 -1
  109. package/assets/js/components/split-button/split-button.component.min.js +2 -2
  110. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +4 -4
  111. package/assets/js/components/table/table.component.min.js +1 -1
  112. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  113. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  114. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  115. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  116. package/assets/js/components/tabs/tabs.component.js +13 -0
  117. package/assets/js/components/tabs/tabs.component.min.js +4 -4
  118. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  119. package/assets/js/components/tag/tag.component.min.js +1 -1
  120. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  121. package/assets/js/components/video/video.component.js +67 -0
  122. package/assets/js/components/video/video.component.min.js +21 -0
  123. package/assets/js/components/video/video.component.min.js.map +1 -0
  124. package/assets/js/components/video-card/video-card.component.js +42 -59
  125. package/assets/js/components/video-card/video-card.component.min.js +15 -7
  126. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  127. package/assets/js/components/video-modal/video-modal.component.js +10 -44
  128. package/assets/js/components/video-modal/video-modal.component.min.js +12 -6
  129. package/assets/js/components/video-modal/video-modal.component.min.js.map +1 -1
  130. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  131. package/assets/js/modules/modal.js +4 -2
  132. package/assets/js/modules/videos.js +42 -0
  133. package/assets/js/scripts.bundle.js +1 -1
  134. package/assets/js/scripts.bundle.min.js +1 -1
  135. package/assets/sass/_components.scss +1 -1
  136. package/assets/sass/components/tabs.component.scss +25 -0
  137. package/assets/sass/components/tabs.config.scss +5 -1
  138. package/assets/sass/components/video-card.component.scss +36 -62
  139. package/assets/sass/components/video-modal.component.scss +6 -4
  140. package/assets/sass/components/video.component.scss +75 -0
  141. package/assets/sass/elements/badge-tag.css +1 -1
  142. package/assets/sass/elements/buttons--action.css +17 -0
  143. package/assets/sass/elements/buttons--global.scss +5 -1
  144. package/assets/sass/elements/links.scss +53 -31
  145. package/assets/sass/foundations/animations.scss +1 -1
  146. package/assets/ts/components/modal/modal.component.ts +2 -2
  147. package/assets/ts/components/tabs/tabs.component.ts +19 -0
  148. package/assets/ts/components/video/video.component.ts +74 -0
  149. package/assets/ts/components/video-card/video-card.component.ts +54 -75
  150. package/assets/ts/components/video-modal/video-modal.component.ts +10 -59
  151. package/assets/ts/modules/modal.ts +4 -2
  152. package/assets/ts/modules/videos.ts +57 -0
  153. package/dist/components.es.js +25 -25
  154. package/dist/components.umd.js +138 -108
  155. package/package.json +1 -1
  156. package/src/components/Video/Video.vue +22 -0
@@ -1,75 +1,49 @@
1
1
  @use '../_func' as *;
2
- @use 'card.module' as *;
2
+ @use 'card.module';
3
+ @use './modal.component';
4
+ @use './video-modal.component';
5
+ @use '../elements/buttons--global';
6
+ @use '../elements/buttons--compact';
3
7
 
4
8
  :host {
5
9
  --card-right-padding: 1rem;
6
-
7
10
  --card-head-height: 10rem;
8
-
9
- font-size: 1.5rem;
10
11
  --line-height: 2rem;
12
+ display: flex;
13
+ font-size: 1.5rem;
11
14
  }
12
15
 
13
- //video-card--top
14
-
15
- :host(:is([data-youtube], [data-vimeo]):not(.video-card--top)) .card__head {
16
+ // #region video-card--top
17
+ :host(:not(.video-card--top)) .card__head {
16
18
  order: 2;
17
19
  }
18
20
 
19
- :host(:is([data-youtube], [data-vimeo])) .card__head {
20
- cursor: pointer;
21
- position: relative;
22
-
23
- > *:not(img) {
24
- z-index: -1;
25
- }
26
-
27
- &:before {
28
- content: '';
29
- display: block;
30
- background-color: var(--video-btn-colour, var(--colour-success));
31
- height: 5rem;
32
- width: 5rem;
33
- position: absolute;
34
- top: calc(50% - 2.5rem);
35
- left: calc(50% - 2.5rem);
36
- z-index: 2;
37
- border-radius: 2.5rem;
21
+ @layer components {
22
+ .card__head {
23
+ cursor: pointer;
24
+ position: relative;
25
+
26
+ > *:not(img) {
27
+ z-index: -1;
28
+ }
29
+
30
+ .fa-play {
31
+ position: absolute;
32
+ z-index: 1!important;
33
+ top: 50%;
34
+ left: 50%;
35
+ pointer-events: none;
36
+ margin: 0!important;
37
+ translate: -50% -50%;
38
+ }
39
+
40
+ &:is(:hover,:focus):not(:active) .fa-play {
41
+ --colour-btn-bg: var(--colour-white)!important;
42
+ --colour-btn-border: var(--colour-white)!important;
43
+ }
44
+ &:is(:active) .fa-play {
45
+ filter: brightness(85%);
46
+ }
38
47
  }
39
-
40
- &:after {
41
- $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>");
42
- --icon: #{$icon-play};
43
-
44
- content: '';
45
- display: block;
46
- height: 2rem;
47
- width: 2rem;
48
- position: absolute;
49
- top: calc(50% - 1rem);
50
- left: calc(50% - 0.8rem);
51
- z-index: 5;
52
- background: var(--colour-primary-theme);
53
- mask-image: var(--icon);
54
- mask-size: 80%;
55
- mask-repeat: no-repeat;
56
- mask-position: 50% 50%;
57
- -webkit-mask-image: var(--icon);
58
- -webkit-mask-size: 80%;
59
- -webkit-mask-repeat: no-repeat;
60
- -webkit-mask-position: 50% 50%;
61
- }
62
-
63
- &:is(:hover, :focus) {
64
- --video-btn-colour: var(--colour-canvas);
65
- }
66
- &:is(:active) {
67
- --video-btn-colour: color-mix(in oklab, var(--colour-success), #000000 20%) !important;
68
- }
69
- }
70
-
71
- .embed {
72
- aspect-ratio: 1 / 1;
73
- display: block;
74
- width: 10rem;
75
48
  }
49
+ // #endregion
@@ -1,4 +1,5 @@
1
1
  @use './modal.component';
2
+ @use './video.component';
2
3
 
3
4
  @layer components {
4
5
 
@@ -7,6 +8,7 @@
7
8
  max-width: 50rem !important;
8
9
  padding: 0;
9
10
  aspect-ratio: 16 / 9;
11
+ overflow: hidden;
10
12
 
11
13
  &[open]::before {
12
14
 
@@ -17,9 +19,9 @@
17
19
 
18
20
  display: none;
19
21
  }
20
- }
21
- ::slotted(.embed) {
22
- aspect-ratio: 16 / 9;
23
- width: 100%;
22
+
23
+ .video-wrapper button {
24
+ display: none;
25
+ }
24
26
  }
25
27
  }
@@ -0,0 +1,75 @@
1
+ @use '../foundations/animations';
2
+ @use '../elements/buttons--global';
3
+ @use '../elements/buttons--compact';
4
+ @use '../utilities/colours';
5
+
6
+ @layer components {
7
+ .video-wrapper {
8
+ display: block;
9
+ position: relative;
10
+ width: 100%;
11
+ height: auto;
12
+ aspect-ratio: 16/9;
13
+ background-color: var(--colour-light);
14
+ margin-bottom: 2rem;
15
+ cursor: pointer;
16
+
17
+ &:before {
18
+ font-family: 'Font Awesome 7 Pro';
19
+ content: '\f3f4';
20
+ position: absolute;
21
+ font-weight: 900;
22
+ color: var(--colour-heading);
23
+ animation: spin 1.5s infinite steps(10);
24
+ font-size: 1.5em;
25
+ top: 50%;
26
+ left: 50%;
27
+ translate: -50% -50%;
28
+ z-index: 1;
29
+ }
30
+
31
+ img {
32
+ position: absolute;
33
+ inset: 0;
34
+ z-index: 3;
35
+ width: calc(100% + 2px);
36
+ height: 100%;
37
+ object-fit: cover;
38
+ margin-inline: -1px;
39
+ }
40
+
41
+ button {
42
+
43
+ pointer-events: none;
44
+ position: absolute;
45
+ top: 50%;
46
+ left: 50%;
47
+ z-index: 4;
48
+ transform: translate(-50%, -50%);
49
+ }
50
+
51
+ &:is(:hover,:focus):not(:active) button {
52
+ --colour-btn-bg: var(--colour-white)!important;
53
+ --colour-btn-border: var(--colour-white)!important;
54
+ }
55
+ &:is(:active) button {
56
+ filter: brightness(85%);
57
+ }
58
+ }
59
+
60
+ dialog .video-wrapper {
61
+ margin-bottom: 0;
62
+ }
63
+ }
64
+
65
+ ::slotted(.embed) {
66
+
67
+ position: absolute;
68
+ inset: 0;
69
+ z-index: 4;
70
+ aspect-ratio: 16 / 9;
71
+ width: calc(100% + 2px);
72
+ height: 100%;
73
+ margin-inline: -1px;
74
+ margin-block: 0;
75
+ }
@@ -11,7 +11,7 @@
11
11
  color: #262626;
12
12
  position: relative;
13
13
  background: var(--wider-colour, var(--wider-colour-1));
14
- margin-bottom: 1rem;
14
+ margin-bottom: 0.5rem;
15
15
 
16
16
  &:has(+ :is(.badge, .tag)) {
17
17
  margin-right: 0.375rem; /* 6 */
@@ -24,6 +24,23 @@
24
24
  content: var(--fa);
25
25
  margin-right: 0.375rem; /* 6 */
26
26
  }
27
+ &.icon-only {
28
+ position: relative;
29
+ text-indent: -300vw;
30
+ overflow: hidden;
31
+ min-width: 1.75rem;
32
+
33
+ &:before {
34
+ position: absolute;
35
+ left: 0;
36
+ top: 0;
37
+ min-width: 1.75rem;
38
+ text-align: center;
39
+ text-indent: 0;
40
+ padding-inline: 0.25rem;
41
+ line-height: 1.85rem;
42
+ }
43
+ }
27
44
 
28
45
  a:not(.btn-primary):is(:hover, :focus, .hover, :focus-within):not([disabled], :active, .active) &,
29
46
  &:not(.btn-primary):is(:hover, :focus, .hover, :focus-within):not([disabled], :active, .active) {
@@ -121,10 +121,14 @@
121
121
  // #endregion
122
122
 
123
123
  // #region btn with colour success
124
- .btn.colour-success {
124
+ .btn.btn-complete {
125
+ --colour: var(--colour-success);
125
126
  --colour-btn-bg-hover: var(--colour);
126
127
  --colour-btn-border-hover: var(--colour);
127
128
  --colour-btn-hover: var(--colour-primary-theme);
129
+ --colour-btn-bg: var(--colour);
130
+ --colour-btn-border: var(--colour);
131
+
128
132
  position: relative;
129
133
  padding-left: 3.5rem; /*56 */
130
134
  padding-right: 3.5rem; /*56 */
@@ -171,50 +171,72 @@
171
171
  // #endregion
172
172
  }
173
173
 
174
- :is(.youtube-link, .vimeo-link) {
174
+ :is(.video-link, .youtube-link, .vimeo-link) {
175
175
  position: relative;
176
+ --compact-size: 3rem;
176
177
 
177
- &:before {
178
- content: '';
178
+ &:before,
179
+ &:after {
180
+ content: "\f04b";
181
+ font-family: "Font Awesome 7 Pro" !important;
179
182
  display: block;
180
- background-color: var(--video-btn-colour, var(--colour-success));
181
- height: 3rem;
182
- width: 3rem;
183
183
  position: absolute;
184
- top: calc(50% - 1.5rem);
185
- left: calc(50% - 1.5rem);
186
- z-index: 2;
187
- border-radius: 1.5rem;
184
+
185
+ text-indent: 0;
186
+ line-height: calc(var(--compact-size) - .25rem);
187
+ font-weight: 900;
188
+ font-size: 1rem !important;
189
+ text-align: center;
190
+
191
+
192
+ position: absolute;
193
+ top: 50%;
194
+ left: 50%;
195
+ z-index: 4;
196
+ transform: translate(-50%, -50%);
197
+
198
+
199
+ --compact-size: 3rem;
200
+ padding: 0 !important;
201
+ margin-bottom: .5rem;
202
+ text-align: center;
203
+ width: var(--compact-size);
204
+ min-width: var(--compact-size);
205
+ max-width: var(--compact-size);
206
+ height: var(--compact-size) !important;
207
+ min-height: var(--compact-size) !important;
208
+ max-height: var(--compact-size) !important;
209
+ align-content: center;
210
+ line-height: 1 !important;
211
+ overflow: hidden;
188
212
  }
189
213
 
190
214
  &:after {
191
- $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>");
192
- --icon: #{$icon-play};
193
215
 
194
- content: '';
195
- display: block;
196
- height: 1rem;
197
- width: 1rem;
216
+ border-radius: 50% !important;
198
217
  position: absolute;
199
- top: calc(50% - 0.5rem);
200
- left: calc(50% - 0.4rem);
201
- z-index: 5;
202
- background: var(--colour-primary-theme);
203
- mask-image: var(--icon);
204
- mask-size: 80%;
205
- mask-repeat: no-repeat;
206
- mask-position: 50% 50%;
207
- -webkit-mask-image: var(--icon);
208
- -webkit-mask-size: 80%;
209
- -webkit-mask-repeat: no-repeat;
210
- -webkit-mask-position: 50% 50%;
218
+ top: 50%;
219
+ left: 50%;
220
+ z-index: 3;
221
+ background-color: var(--colour-success);
222
+ border: 1px solid var(--colour-success);
211
223
  }
212
224
 
213
- &:is(:hover, :focus) {
214
- --video-btn-colour: var(--colour-canvas);
225
+
226
+
227
+ &:is(:hover, :focus):not(:active) {
228
+ &:after {
229
+
230
+ background-color: var(--colour-white);
231
+ border-color: var(--colour-white);
232
+ }
215
233
  }
216
234
  &:is(:active) {
217
- --video-btn-colour: color-mix(in oklab, var(--colour-success), #000000 20%) !important;
235
+
236
+ &:after {
237
+
238
+ filter: brightness(85%);
239
+ }
218
240
  }
219
241
  }
220
242
 
@@ -1,2 +1,2 @@
1
1
 
2
- @keyframes spin {to{transform: rotate(1turn)}}
2
+ @keyframes spin {to{rotate: 1turn}}
@@ -62,14 +62,14 @@ class iamModal extends HTMLElement {
62
62
  document.addEventListener('click', (e) => {
63
63
 
64
64
  if(e.target.matches(`[command="show-modal"][commandfor="${id}"]`) || e.target.matches(`[data-modal="${id}"]`)){
65
- openModal(id, this);
65
+ openModal(this);
66
66
  }
67
67
  });
68
68
 
69
69
  document.addEventListener('click', (e) => {
70
70
 
71
71
  if(e.target.matches(`[command="close"][commandfor="${id}"]`)){
72
- closeModal(id, this);
72
+ closeModal(this);
73
73
  }
74
74
  });
75
75
 
@@ -45,6 +45,25 @@ class iamTabs extends HTMLElement {
45
45
  this.shadowRoot.querySelector('.tabs').setAttribute('class', `tabs ${classList}`);
46
46
 
47
47
  tabs(this);
48
+
49
+ // #region Allow togle tags to control the tabs
50
+ Array.from(this.querySelectorAll('details[id]')).forEach((details) => {
51
+ const detailsID = details.getAttribute('id');
52
+
53
+ Array.from(document.querySelectorAll(`[command="show-tab"][commandfor="${detailsID}"]`)).forEach((radioField) => {
54
+
55
+ radioField.closest('label').addEventListener('click', (e) => {
56
+
57
+ details.setAttribute('open','open');
58
+
59
+ Array.from(document.querySelectorAll(`input[type="radio"][command="show-tab"][commandfor="${detailsID}"]`)).forEach((input) => {
60
+
61
+ input.checked = true;
62
+ });
63
+ });
64
+ });
65
+ });
66
+ // #endregion
48
67
  }
49
68
  }
50
69
 
@@ -0,0 +1,74 @@
1
+ import { trackComponent, trackComponentRegistered } from '../_global';
2
+ import { videoHTML, loadYouTubeScripts, createYoutTubeVideo, openYoutubeVideo, openVimeoVideo } from '../../modules/videos';
3
+
4
+ trackComponentRegistered('iam-video-modal');
5
+
6
+ class iamVideo extends HTMLElement {
7
+ constructor() {
8
+ super();
9
+ this.attachShadow({ mode: 'open' });
10
+
11
+ const assetLocation = document.body.hasAttribute('data-assets-location')
12
+ ? document.body.getAttribute('data-assets-location')
13
+ : '/assets';
14
+ const loadCSS = `@import "${assetLocation}/css/components/video.component.css";`;
15
+
16
+ const template = document.createElement('template');
17
+ template.innerHTML = /*HTML*/`
18
+ <style>
19
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
20
+
21
+ ${loadCSS}
22
+ </style>
23
+
24
+ <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous" />
25
+ ${videoHTML}
26
+ `;
27
+
28
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
29
+ }
30
+
31
+
32
+ async connectedCallback(): void {
33
+
34
+ const id = this.getAttribute('id');
35
+ const button = this.shadowRoot?.querySelector('button');
36
+ const videoWrapper = this.shadowRoot?.querySelector('.video-wrapper');
37
+ const img = this.shadowRoot.querySelector('img');
38
+
39
+ this.innerHTML = `<div class="embed" slot="video"></div>`;
40
+ const embed = this.querySelector('.embed');
41
+
42
+
43
+ videoWrapper.tabIndex = 6;
44
+ button?.tabIndex = -1;
45
+
46
+ if(this.hasAttribute('data-youtube')){
47
+
48
+ const youtubeId = this.getAttribute('data-youtube');
49
+ img.setAttribute('src',`http://img.youtube.com/vi/${youtubeId}/hqdefault.jpg`);
50
+
51
+ videoWrapper.addEventListener('click', async (e) => {
52
+
53
+ embed?.setAttribute('id',youtubeId);
54
+ openYoutubeVideo(this);
55
+ button?.remove();
56
+ img?.remove();
57
+ });
58
+ }
59
+ else if(this.hasAttribute('data-vimeo')){
60
+
61
+ const vimeoId = this.getAttribute('data-vimeo');
62
+
63
+ img.setAttribute('src',`https://vumbnail.com/${vimeoId}.jpg`);
64
+
65
+ videoWrapper.addEventListener('click', async (e) => {
66
+ openVimeoVideo(this);
67
+ button?.remove();
68
+ img?.remove();
69
+ });
70
+ }
71
+ }
72
+ }
73
+
74
+ export default iamVideo;
@@ -1,6 +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';
3
+ import { videoHTML, loadYouTubeScripts, createYoutTubeVideo,openYoutubeVideo,openVimeoVideo } from '../../modules/videos';
4
+ import { openModal,closeModal,closeButtonHtml } from '../../modules/modal';
4
5
 
5
6
  trackComponentRegistered('iam-video-card');
6
7
 
@@ -21,9 +22,11 @@ class iamVideoCard extends HTMLElement {
21
22
 
22
23
  ${loadCSS}
23
24
  </style>
25
+ <link rel="stylesheet" href="https://kit.fontawesome.com/8bd0fca975.css" crossorigin="anonymous" />
24
26
  ${cardHTML}
25
27
  <dialog>
26
- <div class="embed"></div>
28
+ ${closeButtonHtml}
29
+ ${videoHTML}
27
30
  </dialog>
28
31
  `;
29
32
 
@@ -34,97 +37,73 @@ class iamVideoCard extends HTMLElement {
34
37
  // eslint-disable-next-line @typescript-eslint/no-this-alias
35
38
  const cardComponent = this;
36
39
  const cardHead = cardComponent.shadowRoot.querySelector('.card__head');
40
+ const closeButton = this.shadowRoot?.querySelector('[data-close]');
37
41
 
38
- const randLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
39
- const link_id = randLetter + Date.now();
40
-
41
- let dialog;
42
- let embed;
42
+ this.insertAdjacentHTML('beforeend', `<div class="embed" slot="video"></div>`);
43
+ const embed = this.querySelector('.embed');
43
44
 
44
45
  setupCard(cardComponent);
46
+
47
+ if (cardComponent.querySelector('[data-youtube]')){
48
+
49
+ cardComponent.setAttribute('data-youtube',cardComponent.querySelector('[data-youtube]').getAttribute('data-youtube'));
50
+ cardComponent.querySelector('[data-youtube]')?.remove();
51
+ }
45
52
 
46
- // Check if youtube or vimeo video link is present
47
- if (cardComponent.querySelector('[data-youtube]'))
48
- cardComponent.setAttribute(
49
- 'data-youtube',
50
- cardComponent.querySelector('[data-youtube]').getAttribute('data-youtube')
51
- );
52
-
53
- if (cardComponent.querySelector('[data-vimeo]'))
53
+ if (cardComponent.querySelector('[data-vimeo]')){
54
+
54
55
  cardComponent.setAttribute('data-vimeo', cardComponent.querySelector('[data-vimeo]').getAttribute('data-vimeo'));
56
+ cardComponent.querySelector('[data-vimeo]')?.remove();
57
+ }
58
+
59
+
55
60
 
56
- // General dialog stuff
57
- if (cardComponent.hasAttribute('data-youtube') || cardComponent.hasAttribute('data-vimeo')) {
58
- cardHead.setAttribute('tabindex', '0');
59
-
60
- // Add dialog to page
61
- if (!document.getElementById(`${link_id}-dialog`)) {
62
- document.body.insertAdjacentHTML(
61
+ cardHead.insertAdjacentHTML(
63
62
  'beforeend',
64
- `<dialog id="${link_id}-dialog"><div class="embed" id="${link_id}"></div></dialog>`
63
+ `<button class="btn btn-compact fa-play colour-success">Play</button>`
65
64
  );
66
- }
67
-
68
- dialog = document.getElementById(`${link_id}-dialog`);
69
- embed = document.getElementById(link_id);
70
- }
71
-
72
- // Youtube
73
- if (cardComponent.hasAttribute('data-youtube')) {
74
- // Load the scripts only once
75
- if (!document.body.classList.contains('youtubeLoaded')) {
76
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
77
- const loaded = await loadYouTubeScripts();
78
- }
79
- cardHead.addEventListener('click', function () {
80
- const customEvent = new CustomEvent('play-video', {
81
- detail: { 'Video Type': 'YoutTube', ID: cardComponent.getAttribute('data-youtube') },
82
- });
83
- cardComponent.dispatchEvent(customEvent);
84
-
85
- createYoutTubeVideo(embed, this.getAttribute('[data-youtube]'));
86
- dialog.showModal();
87
- });
88
-
89
- dialog.addEventListener('close', () => {
90
- if (
91
- window.player[embed.getAttribute('id')] &&
92
- typeof window.player[embed.getAttribute('id')].pauseVideo == 'function'
93
- ) {
94
- window.player[embed.getAttribute('id')].pauseVideo();
95
- }
96
65
 
97
- const customEvent = new CustomEvent('close-video', {
98
- detail: { 'Video Type': 'YoutTube', ID: cardComponent.getAttribute('data-youtube') },
99
- });
100
- cardComponent.dispatchEvent(customEvent);
101
- });
102
- } else if (cardComponent.hasAttribute('data-vimeo')) {
103
- // Vimeo
66
+
67
+ const button = cardHead?.querySelector('button');
104
68
 
105
- cardHead.addEventListener('click', function () {
106
- const videoId = cardComponent.getAttribute('data-vimeo');
69
+ cardHead.tabIndex = 6;
70
+ button?.tabIndex = -1;
107
71
 
108
- const customEvent = new CustomEvent('play-video', {
109
- detail: { 'Video Type': 'Vimeo', ID: videoId },
110
- });
111
- cardComponent.dispatchEvent(customEvent);
72
+ cardHead.addEventListener('click', () => {
73
+
74
+ if(this.hasAttribute('data-youtube')){
75
+ const youtubeId = this.getAttribute('data-youtube');
76
+ embed?.setAttribute('id',youtubeId);
77
+ openYoutubeVideo(this);
78
+ openModal(this);
79
+ }
80
+ else if(this.hasAttribute('data-vimeo')) {
81
+ openVimeoVideo(this);
82
+ openModal(this);
83
+ }
84
+ });
112
85
 
113
- if (!embed.querySelector('iframe'))
114
- 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>`;
86
+ closeButton?.addEventListener('click', () => {
87
+ closeModal(this);
115
88
 
116
- dialog.showModal();
117
- });
89
+ if(this.hasAttribute('data-youtube')){
90
+ const youtubeId = this.getAttribute('data-youtube');
118
91
 
119
- dialog.addEventListener('close', () => {
92
+ if (window.player[youtubeId] && typeof window.player[youtubeId].pauseVideo == 'function') {
93
+ window.player[youtubeId].pauseVideo();
94
+ }
95
+ }
96
+ else if(this.hasAttribute('data-vimeo')) {
97
+
120
98
  embed.innerHTML = ``; // Remove the video since we cant pause it
121
99
 
122
100
  const customEvent = new CustomEvent('close-video', {
123
- detail: { 'Video Type': 'Vimeo', ID: cardComponent.getAttribute('data-vimeo') },
101
+ detail: { 'Video Type': 'Vimeo', ID: this.getAttribute('data-vimeo') },
124
102
  });
125
- cardComponent.dispatchEvent(customEvent);
126
- });
127
- }
103
+ this.dispatchEvent(customEvent);
104
+ window.dataLayer.push(customEvent.detail);
105
+ }
106
+ });
128
107
 
129
108
  trackComponent(cardComponent, 'iam-video-card', ['play-video', 'close-video']);
130
109
  }