@iamproperty/components 7.8.2--beta2 → 7.8.2--beta4

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 (206) 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/advanced-select.component.css +1 -1
  6. package/assets/css/components/advanced-select.component.css.map +1 -1
  7. package/assets/css/components/applied-filters.css +1 -1
  8. package/assets/css/components/applied-filters.css.map +1 -1
  9. package/assets/css/components/banner.preload.css +1 -0
  10. package/assets/css/components/banner.preload.css.map +1 -0
  11. package/assets/css/components/calendar.component.css +1 -1
  12. package/assets/css/components/calendar.component.css.map +1 -1
  13. package/assets/css/components/card.component.css +1 -1
  14. package/assets/css/components/card.component.css.map +1 -1
  15. package/assets/css/components/card.module.css +1 -1
  16. package/assets/css/components/card.module.css.map +1 -1
  17. package/assets/css/components/card.preload.css +1 -0
  18. package/assets/css/components/card.preload.css.map +1 -0
  19. package/assets/css/components/carousel.component.css +1 -1
  20. package/assets/css/components/carousel.component.css.map +1 -1
  21. package/assets/css/components/carousel.config.css +1 -1
  22. package/assets/css/components/carousel.config.css.map +1 -1
  23. package/assets/css/components/config.component.css +1 -1
  24. package/assets/css/components/config.component.css.map +1 -1
  25. package/assets/css/components/content.component.css +1 -1
  26. package/assets/css/components/content.component.css.map +1 -1
  27. package/assets/css/components/fileupload.css +1 -1
  28. package/assets/css/components/fileupload.css.map +1 -1
  29. package/assets/css/components/filter-card.component.css +1 -1
  30. package/assets/css/components/filter-card.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/record-card.component.css +1 -1
  38. package/assets/css/components/record-card.component.css.map +1 -1
  39. package/assets/css/components/search.component.css +1 -1
  40. package/assets/css/components/search.component.css.map +1 -1
  41. package/assets/css/components/skeleton.global.css +1 -1
  42. package/assets/css/components/skeleton.global.css.map +1 -1
  43. package/assets/css/components/slider.css +1 -1
  44. package/assets/css/components/slider.css.map +1 -1
  45. package/assets/css/components/split-button.component.css +1 -1
  46. package/assets/css/components/split-button.component.css.map +1 -1
  47. package/assets/css/components/std-nav-standalone.component.css +1 -1
  48. package/assets/css/components/std-nav-standalone.component.css.map +1 -1
  49. package/assets/css/components/tabs.component.css +1 -1
  50. package/assets/css/components/tabs.component.css.map +1 -1
  51. package/assets/css/components/tag.component.css +1 -1
  52. package/assets/css/components/tag.component.css.map +1 -1
  53. package/assets/css/components/video-card.component.css +1 -1
  54. package/assets/css/components/video-card.component.css.map +1 -1
  55. package/assets/css/core.min.css +1 -1
  56. package/assets/css/core.min.css.map +1 -1
  57. package/assets/css/elements/badge-tag.css +1 -1
  58. package/assets/css/elements/badge-tag.css.map +1 -1
  59. package/assets/css/elements/dropdown.css +1 -1
  60. package/assets/css/elements/dropdown.css.map +1 -1
  61. package/assets/css/elements/forms.css +1 -1
  62. package/assets/css/elements/forms.css.map +1 -1
  63. package/assets/css/elements/links--global.css +1 -1
  64. package/assets/css/elements/links--global.css.map +1 -1
  65. package/assets/css/elements/links.css +1 -1
  66. package/assets/css/elements/links.css.map +1 -1
  67. package/assets/css/style.min.css +1 -1
  68. package/assets/css/style.min.css.map +1 -1
  69. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  70. package/assets/js/components/actionbar/actionbar.component.min.js +2 -2
  71. package/assets/js/components/address-lookup/address-lookup.component.min.js +4 -4
  72. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  73. package/assets/js/components/advanced-select/advanced-select.component.min.js +2 -2
  74. package/assets/js/components/applied-filters/applied-filters.component.min.js +2 -2
  75. package/assets/js/components/banner/banner.component.min.js +1 -1
  76. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  77. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  78. package/assets/js/components/bone/bone.component.min.js +1 -1
  79. package/assets/js/components/button/button.component.min.js +1 -1
  80. package/assets/js/components/calendar/calendar.component.min.js +2 -2
  81. package/assets/js/components/card/card.component.js +114 -125
  82. package/assets/js/components/card/card.component.min.js +7 -7
  83. package/assets/js/components/card/card.component.min.js.map +1 -1
  84. package/assets/js/components/carousel/carousel.component.js +83 -29
  85. package/assets/js/components/carousel/carousel.component.min.js +16 -11
  86. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  87. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  88. package/assets/js/components/config/config.component.min.js +7 -7
  89. package/assets/js/components/config/config.component.min.js.map +1 -1
  90. package/assets/js/components/content/content.component.js +28 -69
  91. package/assets/js/components/content/content.component.min.js +4 -4
  92. package/assets/js/components/content/content.component.min.js.map +1 -1
  93. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  94. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  95. package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
  96. package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
  97. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  98. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  99. package/assets/js/components/form/form.component.min.js +1 -1
  100. package/assets/js/components/header/header.component.min.js +1 -1
  101. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  102. package/assets/js/components/input/input.component.min.js +1 -1
  103. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  104. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  105. package/assets/js/components/menu/menu.component.min.js +1 -1
  106. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  107. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  108. package/assets/js/components/modal/modal.component.min.js +1 -1
  109. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  110. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +1 -1
  111. package/assets/js/components/multiselect/multiselect.component.min.js +4 -4
  112. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  113. package/assets/js/components/nav/nav.component.min.js +2 -2
  114. package/assets/js/components/notification/notification.component.min.js +1 -1
  115. package/assets/js/components/pagination/pagination.component.min.js +5 -5
  116. package/assets/js/components/password/password.component.min.js +1 -1
  117. package/assets/js/components/popover/popover.component.min.js +1 -1
  118. package/assets/js/components/rank/rank.component.min.js +1 -1
  119. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  120. package/assets/js/components/rating/rating.component.min.js +1 -1
  121. package/assets/js/components/record-card/record-card.component.min.js +6 -6
  122. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  123. package/assets/js/components/search/search.component.js +234 -186
  124. package/assets/js/components/search/search.component.min.js +12 -7
  125. package/assets/js/components/search/search.component.min.js.map +1 -1
  126. package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
  127. package/assets/js/components/slider/slider.component.min.js +2 -2
  128. package/assets/js/components/split-button/split-button.component.min.js +2 -2
  129. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +5 -5
  130. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  131. package/assets/js/components/std-nav/std-nav.component.js +10 -9
  132. package/assets/js/components/std-nav/std-nav.component.min.js +9 -12
  133. package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
  134. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +5 -5
  135. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js.map +1 -1
  136. package/assets/js/components/table/table.component.min.js +1 -1
  137. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  138. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  139. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  140. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  141. package/assets/js/components/tabs/tabs.component.min.js +4 -4
  142. package/assets/js/components/tag/tag.component.min.js +3 -3
  143. package/assets/js/components/tag/tag.component.min.js.map +1 -1
  144. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  145. package/assets/js/components/video/video.component.min.js +1 -1
  146. package/assets/js/components/video-card/video-card.component.min.js +9 -9
  147. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  148. package/assets/js/components/video-modal/video-modal.component.min.js +1 -1
  149. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  150. package/assets/js/modules/card.module.js +12 -11
  151. package/assets/js/modules/content.js +40 -8
  152. package/assets/js/modules/content.test.js +62 -12
  153. package/assets/js/modules/data-layer.js +7 -6
  154. package/assets/js/modules/dropdown.js +0 -1
  155. package/assets/js/modules/nav.js +10 -3
  156. package/assets/js/modules/search.js +153 -0
  157. package/assets/js/modules/search.test.js +125 -0
  158. package/assets/js/modules/tabs.test.js +64 -12
  159. package/assets/js/modules/testimonial.test.js +44 -6
  160. package/assets/js/modules/videos.test.js +61 -13
  161. package/assets/js/scripts.bundle.js +3 -3
  162. package/assets/js/scripts.bundle.js.map +1 -1
  163. package/assets/js/scripts.bundle.min.js +2 -2
  164. package/assets/js/scripts.bundle.min.js.map +1 -1
  165. package/assets/sass/_components.scss +2 -63
  166. package/assets/sass/components/banner.preload.scss +26 -0
  167. package/assets/sass/components/card.component.scss +1 -7
  168. package/assets/sass/components/card.module.scss +6 -6
  169. package/assets/sass/components/card.preload.scss +80 -0
  170. package/assets/sass/components/carousel.component.scss +165 -0
  171. package/assets/sass/components/carousel.config.scss +85 -249
  172. package/assets/sass/components/content.component.scss +0 -7
  173. package/assets/sass/components/nav.component.scss +2 -1
  174. package/assets/sass/components/search.component.scss +89 -7
  175. package/assets/sass/components/skeleton.global.scss +4 -0
  176. package/assets/sass/elements/badge-tag.css +1 -1
  177. package/assets/sass/elements/dropdown.css +2 -0
  178. package/assets/sass/elements/forms.scss +0 -27
  179. package/assets/sass/elements/links--global.scss +40 -2
  180. package/assets/sass/foundations/root.scss +0 -1
  181. package/assets/sass/utilities/border.css +1 -1
  182. package/assets/sass/utilities/js-display.css +2 -3
  183. package/assets/ts/components/card/card.component.ts +72 -62
  184. package/assets/ts/components/carousel/carousel.component.ts +84 -19
  185. package/assets/ts/components/content/content.component.ts +36 -100
  186. package/assets/ts/components/search/search.component.ts +257 -185
  187. package/assets/ts/components/std-nav/std-nav.component.ts +17 -16
  188. package/assets/ts/html.d.ts +6 -0
  189. package/assets/ts/modules/card.module.ts +20 -12
  190. package/assets/ts/modules/content.test.ts +84 -12
  191. package/assets/ts/modules/content.ts +56 -9
  192. package/assets/ts/modules/data-layer.ts +7 -11
  193. package/assets/ts/modules/dropdown.ts +0 -2
  194. package/assets/ts/modules/nav.ts +12 -3
  195. package/assets/ts/modules/search.test.ts +142 -0
  196. package/assets/ts/modules/search.ts +206 -0
  197. package/assets/ts/modules/tabs.test.ts +79 -12
  198. package/assets/ts/modules/testimonial.test.ts +45 -6
  199. package/assets/ts/modules/videos.test.ts +74 -14
  200. package/dist/components.es.js +25 -25
  201. package/dist/components.umd.js +164 -157
  202. package/package.json +1 -1
  203. package/assets/js/modules/carousel.js +0 -214
  204. package/assets/js/modules/carousel.test.js +0 -18
  205. package/assets/ts/modules/carousel.test.ts +0 -27
  206. package/assets/ts/modules/carousel.ts +0 -301
@@ -1,5 +1,4 @@
1
1
  @use '../_func' as *;
2
- @use '../elements/buttons' as *;
3
2
 
4
3
  *,
5
4
  *::before,
@@ -10,9 +9,3 @@
10
9
  :host {
11
10
  display: contents;
12
11
  }
13
-
14
- ::slotted(iam-marketing:first-child:last-child) {
15
- margin-bottom: 0;
16
- min-height: 100%;
17
- min-width: 100%;
18
- }
@@ -120,9 +120,10 @@
120
120
  }
121
121
 
122
122
  @media screen and (min-width: 62em) {
123
+ min-width: 3rem;
123
124
  width: fit-content;
124
125
  height: auto;
125
- margin: 0 0 0 2rem;
126
+ margin: 0 0 0 1.5rem;
126
127
  padding: 0 !important;
127
128
  text-indent: 0;
128
129
  padding-right: 0 !important;
@@ -1,5 +1,7 @@
1
-
2
- @use 'advanced-select.component';
1
+ @use '../_func' as *;
2
+ @use '../elements/forms';
3
+ @use '../elements/dropdown';
4
+ @use '../elements/prefix';
3
5
 
4
6
  @layer components {
5
7
 
@@ -18,7 +20,87 @@
18
20
  }
19
21
  }
20
22
 
23
+ :host {
24
+ display: block;
25
+ margin-top: 0.5rem;
26
+ }
27
+
28
+ .wrapper {
29
+ display: flex;
30
+ width: 100%;
31
+ position: relative;
32
+
33
+ .input__wrapper {
34
+ flex-grow: 1;
35
+ position: relative;
36
+ margin-top: 0!important;
37
+ }
38
+
39
+ .suffix {
40
+ flex-grow: 0;
41
+ }
42
+ }
43
+
44
+ ::slotted(input){
45
+
46
+ border-start-end-radius: 0 !important;
47
+ border-end-end-radius: 0 !important;
48
+ margin-top: 0!important;
49
+ }
50
+
51
+ ::slotted(label){
52
+
53
+ border-start-end-radius: 0 !important;
54
+ border-end-end-radius: 0 !important;
55
+ margin-top: 0!important;
56
+ }
57
+
58
+ ::slotted(button){
59
+ margin-top: 0!important;
60
+ }
61
+
62
+ /* #region Clear seach button */
63
+
64
+ .clear-search {
65
+ display: var(--error-hide, block);
66
+ position: absolute;
67
+ top: 50%;
68
+ transform: translate(0,-50%);
69
+ right: 0.5rem;
70
+ margin: 0;
71
+ aspect-ratio: 1 / 1;
72
+ display: none;
73
+
74
+ &:not(:hover, :focus) {
75
+ border-color: transparent!important;
76
+ background-color: transparent!important;
77
+ }
78
+ }
79
+
80
+ :host(.has-value) .clear-search {
81
+ display: block!important;
82
+ }
83
+
84
+ /* #endregion */
85
+
86
+ /* #region datalist */
87
+
88
+
89
+ slot[name="datalist"] {
90
+ display: block;
91
+ position: relative;
92
+ }
93
+
94
+ :host(:is(.js-show-datalist,.js-force-show-datalist)) ::slotted(datalist) {
95
+ display: block;
96
+ }
97
+
98
+ ::slotted(datalist:focus-within) {
99
+ display: block;
100
+ }
101
+ /* #endregion */
21
102
 
103
+ /* #region Stylised search */
22
104
  :host(.search--stylised) ::slotted(input) {
23
105
 
24
106
  outline: 1px solid var(--colour-border)!important;
@@ -38,18 +120,18 @@
38
120
  outline: 1px solid var(--colour-info)!important;
39
121
  }
40
122
 
41
- :host(.search--stylised) ::slotted(button) {
123
+ :host(.search--stylised) .suffix {
42
124
 
43
-
125
+ cursor: pointer;
44
126
  background: transparent!important;
45
127
  border-color: transparent!important;
46
- color: var(--colour-heading)!important;
128
+ color: var(--colour-primary-theme)!important;
47
129
  position: absolute!important;
48
130
  top: 0;
49
131
  left: 0;
50
132
  }
51
133
 
52
- :host(.hasInputSm) ::slotted(button) {
134
+ :host(.hasInputSm) .suffix {
53
135
 
54
136
  min-width: 2.5rem!important;
55
137
  }
@@ -60,5 +142,5 @@
60
142
  outline: none !important;
61
143
  border: none !important;
62
144
  }
63
-
145
+ /* #endregion */
64
146
  }
@@ -23,5 +23,9 @@
23
23
  }
24
24
  }
25
25
 
26
+ hr {
27
+ width: 100%;
28
+ }
29
+
26
30
 
27
31
  }
@@ -2,7 +2,7 @@
2
2
  :is(.badge, .tag) {
3
3
  font-size: 1rem;
4
4
  line-height: 1.625rem; /* 26 */
5
- border: none !important;
5
+ border: none;
6
6
  margin: 0;
7
7
  display: inline-block;
8
8
  text-align: center;
@@ -95,6 +95,7 @@
95
95
  top: 100%;
96
96
  left: 0;
97
97
 
98
+ &:has(> .js-hide):not(:has(> *:not(.js-hide))):before,
98
99
  &:empty:before {
99
100
  content: "No results found"; /* TODO Allow for text to be overwritten */
100
101
  background-color: white;
@@ -143,6 +144,7 @@
143
144
  white-space: normal;
144
145
  text-overflow: ellipsis;
145
146
  overflow: clip;
147
+ outline: none;
146
148
 
147
149
  &:not(:last-child){
148
150
  margin: 0 0 0.25rem 0 !important;
@@ -821,31 +821,4 @@ $icon-tick: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' view
821
821
  }
822
822
  }
823
823
  /* #endregion */
824
-
825
- /* #region Clear seach button */
826
-
827
- .clear-search {
828
- display: var(--error-hide, block);
829
- position: absolute;
830
- top: 50%;
831
- transform: translate(0,-50%);
832
- right: 0.5rem;
833
- margin: 0;
834
- aspect-ratio: 1 / 1;
835
-
836
- &:not(:hover, :focus) {
837
- border-color: transparent!important;
838
- background-color: transparent!important;
839
- }
840
- }
841
-
842
- .input__wrapper:has(input[disabled],input.empty) .clear-search {
843
-
844
- display: none;
845
- }
846
-
847
- .input__wrapper:has(input:is([name$="Alt"]):not([data-value],[data-placeholder])) .clear-search {
848
- display: none;
849
- }
850
- /* #endregion */
851
824
  }
@@ -136,6 +136,29 @@
136
136
  text-decoration: none;
137
137
  border-radius: var(--card-border-radius) !important;
138
138
 
139
+
140
+ $theme-colors: (
141
+ 'primary': var(--colour-primary),
142
+ 'secondary': var(--colour-secondary),
143
+ 'info': var(--colour-info),
144
+ 'warning': var(--colour-warning),
145
+ 'success': var(--colour-success),
146
+ 'complete': var(--colour-complete),
147
+ 'danger': var(--colour-danger),
148
+ 'dark': var(--colour-dark),
149
+ 'light': var(--colour-light),
150
+ );
151
+
152
+ @each $color, $value in $theme-colors {
153
+
154
+ &:has(.colour-#{$color}){
155
+
156
+ --hover-outline-colour: var(--colour-#{$color}) !important;
157
+ --card-icon-bg: var(--colour-warning)!important;
158
+ --card-icon-colour: var(--colour-primary-theme)!important;
159
+ }
160
+ }
161
+
139
162
  &:not(:hover, :focus, .hover, :active, .active) {
140
163
 
141
164
  outline: none !important;
@@ -148,16 +171,31 @@
148
171
  outline: 2px solid var(--hover-outline-colour);
149
172
  }
150
173
 
174
+ &:is(:focus) {
175
+
176
+ --card-icon-bg: var(--colour-primary-theme);
177
+ --card-icon-colour: #ffffff;
178
+ outline: 2px solid var(--hover-outline-colour);
179
+ }
180
+
151
181
  &:is(:hover, :focus, .hover) {
152
182
 
153
183
  --card-icon-bg: var(--colour-primary-theme);
154
184
  --card-icon-colour: #ffffff;
185
+
186
+ outline: 2px solid var(--hover-outline-colour);
187
+ }
188
+
189
+ &:has(.card--article):is(:hover, :focus, .hover){
190
+
191
+ outline: none !important;
155
192
  }
156
193
 
157
194
 
158
195
  &:is(:active, .active){
159
- --card-icon-bg: var(--colour-primary-theme);
160
- --card-icon-colour: #ffffff;
196
+ //--card-icon-bg: var(--colour-primary-theme);
197
+ //--card-icon-colour: #ffffff;
198
+ --card-icon-right: var(--card-icon-right-overide, 0.5rem);
161
199
  }
162
200
 
163
201
  &:before {
@@ -173,7 +173,6 @@
173
173
  --card-head-bottom-padding: 2rem;
174
174
  --card-body-top-padding: 2rem;
175
175
  --card-body-bottom-padding: 2rem;
176
- --card-footer-bottom-padding: 1.5rem;
177
176
  --card-head-height: 6rem;
178
177
  --card-top-padding: 2rem;
179
178
  --card-bottom-padding: 2rem;
@@ -60,7 +60,7 @@
60
60
  }
61
61
 
62
62
  .border-gradient {
63
- background: linear-gradient(white, white) padding-box, linear-gradient(to right, var(--colour-primary-theme), var(--colour-info)) border-box;
63
+ background: linear-gradient(var(--bg-colour,Canvas), var(--bg-colour,Canvas)) padding-box, linear-gradient(to right, var(--colour-primary-theme), var(--colour-info)) border-box;
64
64
  border: var(--border-width) solid transparent;
65
65
  }
66
66
  }
@@ -3,11 +3,10 @@
3
3
  .js-show {
4
4
  display: none !important;
5
5
  }
6
- }
7
-
8
- @media (scripting: none) {
6
+
9
7
  .js-hide {
10
8
  display: none !important;
11
9
  }
12
10
  }
11
+
13
12
  }
@@ -1,17 +1,24 @@
1
- import { trackComponent, trackComponentRegistered } from '../_global';
1
+ import { trackComponent } from '../_global';
2
2
  import { cardHTML, setupCard } from '../../modules/card.module';
3
3
  import iamMenu from '../menu/menu.component';
4
4
 
5
- trackComponentRegistered('iam-card');
5
+ type CardSelectionDetail = {
6
+ 'Card value': string;
7
+ 'input name': string | null;
8
+ };
9
+
10
+ type CardButtonDetail = {
11
+ Title: string | null;
12
+ };
13
+
14
+ const getAssetLocation = (): string => document.body.getAttribute('data-assets-location') || '/assets';
6
15
 
7
16
  class iamCard extends HTMLElement {
8
17
  constructor() {
9
18
  super();
10
- this.attachShadow({ mode: 'open' });
19
+ const shadowRoot = this.attachShadow({ mode: 'open' });
11
20
 
12
- const assetLocation = document.body.hasAttribute('data-assets-location')
13
- ? document.body.getAttribute('data-assets-location')
14
- : '/assets';
21
+ const assetLocation = getAssetLocation();
15
22
  const loadCSS = `@import "${assetLocation}/css/components/card.component.css";`;
16
23
 
17
24
  const template = document.createElement('template');
@@ -26,52 +33,51 @@ class iamCard extends HTMLElement {
26
33
  <slot name="primary-action"></slot>
27
34
  `;
28
35
 
29
- this.shadowRoot.appendChild(template.content.cloneNode(true));
36
+ shadowRoot.appendChild(template.content.cloneNode(true));
30
37
  }
31
38
 
32
- async connectedCallback(): void {
33
- // eslint-disable-next-line @typescript-eslint/no-this-alias
34
- const cardComponent = this;
35
- const cardBody = cardComponent.shadowRoot.querySelector('.card__body');
39
+ connectedCallback(): void {
40
+ const shadowRoot = this.shadowRoot;
41
+ const cardBody = shadowRoot?.querySelector<HTMLDivElement>('.card__body');
36
42
 
37
- const assetLocation = document.body.hasAttribute('data-assets-location')
38
- ? document.body.getAttribute('data-assets-location')
39
- : '/assets';
43
+ if (!shadowRoot) return;
40
44
 
41
45
  if (!window.customElements.get(`iam-menu`)) window.customElements.define(`iam-menu`, iamMenu);
42
46
 
43
- setupCard(cardComponent);
47
+ setupCard(this);
44
48
 
45
49
  // Add Illustration HTML
46
- if (cardComponent.hasAttribute('data-illustration')) {
47
- cardBody.insertAdjacentHTML(
50
+ if (this.hasAttribute('data-illustration')) {
51
+ cardBody?.insertAdjacentHTML(
48
52
  'afterbegin',
49
53
  `<div class="card__illustration"><img src="${this.getAttribute('data-illustration')}" alt="" loading="lazy" /></div>`
50
54
  );
51
55
  }
52
56
 
53
57
  // Add class that shows the right arrow icon
54
- if (!cardComponent.querySelector('[slot="btns"]') && !cardComponent.querySelector('[slot="secondary"]') && !cardComponent.classList.contains('card--article') && !cardComponent.closest('.carousel--article-cards')) {
55
- cardComponent.classList.add('show-icon');
58
+ if (!this.querySelector('[slot="btns"]') && !this.querySelector('[slot="secondary"]') && !this.classList.contains('card--article') && !this.closest('.carousel--article-cards')) {
59
+ this.classList.add('show-icon');
56
60
  }
57
61
 
58
62
  // Secondary buttons and actions
59
63
 
60
64
  // Add the dialog wrapper HTML
61
- if (cardComponent.querySelector('[slot="btns"]')) {
62
- cardComponent.shadowRoot.innerHTML += `<div class="menu__wrapper">
65
+ if (this.querySelector('[slot="btns"]')) {
66
+ const menuTemplate = document.createElement('template');
67
+ menuTemplate.innerHTML = `<div class="menu__wrapper">
63
68
  <button class="btn btn-secondary btn-compact fa-ellipsis-vertical m-0" popovertarget="actions" style="anchor-name: --anchor-el;" title="Further actions" type="button">Open further actions</button>
64
69
  <iam-menu class="dialog--fix dialog--list" id="actions" style="position-anchor: --anchor-el;" popover>
65
70
  <slot name="btns"></slot>
66
71
  </iam-menu>
67
72
  </div>`;
73
+ shadowRoot.appendChild(menuTemplate.content.cloneNode(true));
68
74
 
69
75
  // safari and firefox anchor fix for cards
70
- if (!CSS.supports('top', 'anchor(top)')) {
71
- const actionButton = this.shadowRoot?.querySelector('[popovertarget="actions"]');
72
- const actionPopover = this.shadowRoot?.querySelector('[popover]');
76
+ if (typeof CSS === 'undefined' || !CSS.supports('top', 'anchor(top)')) {
77
+ const actionButton = shadowRoot.querySelector<HTMLButtonElement>('[popovertarget="actions"]');
78
+ const actionPopover = shadowRoot.querySelector<HTMLElement>('[popover]');
73
79
 
74
- actionButton?.addEventListener('click', (event) => {
80
+ actionButton?.addEventListener('click', () => {
75
81
  this.style.setProperty('overflow', 'visible');
76
82
  this.style.setProperty('z-index', '999999');
77
83
 
@@ -79,85 +85,84 @@ class iamCard extends HTMLElement {
79
85
  const top = viewportOffset.top;
80
86
  const left = viewportOffset.left;
81
87
 
82
- actionPopover.style.setProperty('display', 'block');
83
- actionPopover.style.setProperty('top', top + 'px');
84
- actionPopover.style.setProperty('left', left - 100 + 'px');
88
+ actionPopover?.style.setProperty('display', 'block');
89
+ actionPopover?.style.setProperty('top', top + 'px');
90
+ actionPopover?.style.setProperty('left', left - 100 + 'px');
85
91
  });
86
92
 
87
- document.addEventListener('scroll', (event) => {
88
- actionPopover.style.setProperty('display', 'none');
93
+ document.addEventListener('scroll', () => {
94
+ actionPopover?.style.setProperty('display', 'none');
89
95
  });
90
96
  }
91
97
  }
92
98
 
93
99
  // Make sure slotted buttons and links have correct button classes
94
- Array.from(cardComponent.querySelectorAll('[slot="btns"]')).forEach((button) => {
100
+ this.querySelectorAll<HTMLElement>('[slot="btns"]').forEach((button) => {
95
101
  button.classList.add('btn');
96
102
  button.classList.add('btn-action');
97
103
  });
98
104
 
99
105
  // Hide the default hover and focus states when interacting with the checkbox, dialog wrapper or secondary button
100
- if (cardComponent.querySelector('[slot="checkbox"],[slot="secondary"]')) {
101
- const element = cardComponent.querySelector('[slot="checkbox"],[slot="secondary"]');
106
+ const preventHoverElement = this.querySelector<HTMLElement>('[slot="checkbox"],[slot="secondary"]');
102
107
 
103
- element.addEventListener('mouseenter', () => {
104
- cardComponent.classList.add('prevent-hover');
108
+ if (preventHoverElement) {
109
+ preventHoverElement.addEventListener('mouseenter', () => {
110
+ this.classList.add('prevent-hover');
105
111
  });
106
112
 
107
- element.addEventListener('mouseleave', () => {
108
- cardComponent.classList.remove('prevent-hover');
113
+ preventHoverElement.addEventListener('mouseleave', () => {
114
+ this.classList.remove('prevent-hover');
109
115
  });
110
116
  }
111
117
 
112
- if (cardComponent.shadowRoot.querySelector('.menu__wrapper')) {
113
- const element = cardComponent.shadowRoot.querySelector('.menu__wrapper');
118
+ const menuWrapper = shadowRoot.querySelector<HTMLElement>('.menu__wrapper');
114
119
 
115
- element.addEventListener('mouseenter', () => {
116
- cardComponent.classList.add('prevent-hover');
120
+ if (menuWrapper) {
121
+ menuWrapper.addEventListener('mouseenter', () => {
122
+ this.classList.add('prevent-hover');
117
123
  });
118
124
 
119
- element.addEventListener('mouseleave', () => {
120
- cardComponent.classList.remove('prevent-hover');
125
+ menuWrapper.addEventListener('mouseleave', () => {
126
+ this.classList.remove('prevent-hover');
121
127
  });
122
128
  }
123
129
 
124
130
  // Dispatch events of selecting checkboxes
125
- const checkbox = cardComponent.querySelector('input[type="checkbox"]');
131
+ const checkbox = this.querySelector<HTMLInputElement>('input[type="checkbox"]');
126
132
  if (checkbox) {
127
133
  checkbox.addEventListener('change', () => {
128
134
  if (checkbox.checked) {
129
- const customEvent = new CustomEvent('select-card', {
135
+ const customEvent = new CustomEvent<CardSelectionDetail>('select-card', {
130
136
  detail: { 'Card value': checkbox.value, 'input name': checkbox.getAttribute('name') },
131
137
  });
132
- cardComponent.dispatchEvent(customEvent);
138
+ this.dispatchEvent(customEvent);
133
139
  } else {
134
- const customEvent = new CustomEvent('unselect-card', {
140
+ const customEvent = new CustomEvent<CardSelectionDetail>('unselect-card', {
135
141
  detail: { 'Card value': checkbox.value, 'input name': checkbox.getAttribute('name') },
136
142
  });
137
- cardComponent.dispatchEvent(customEvent);
143
+ this.dispatchEvent(customEvent);
138
144
  }
139
145
  });
140
146
  }
141
147
 
142
148
  // Dispatch events of click onto secondary buttons
143
- const secondaryBtn = cardComponent.querySelector('[slot="secondary"]');
149
+ const secondaryBtn = this.querySelector<HTMLElement>('[slot="secondary"]');
144
150
  if (secondaryBtn) {
145
151
  secondaryBtn.addEventListener('click', () => {
146
- const customEvent = new CustomEvent('secondary-button-clicked', {
152
+ const customEvent = new CustomEvent<CardButtonDetail>('secondary-button-clicked', {
147
153
  detail: { Title: secondaryBtn.getAttribute('title') },
148
154
  });
149
- cardComponent.dispatchEvent(customEvent);
155
+ this.dispatchEvent(customEvent);
150
156
  });
151
157
  }
152
158
 
153
159
  // Dispatch events of click onto action buttons
154
- const actionBtns = cardComponent.querySelectorAll('[slot="btns"]');
155
- Array.from(actionBtns).forEach((button) => {
160
+ this.querySelectorAll<HTMLElement>('[slot="btns"]').forEach((button) => {
156
161
  button.addEventListener('click', () => {
157
- const customEvent = new CustomEvent('action-button-clicked', {
162
+ const customEvent = new CustomEvent<CardButtonDetail>('action-button-clicked', {
158
163
  detail: { Title: button.getAttribute('title') },
159
164
  });
160
- cardComponent.dispatchEvent(customEvent);
165
+ this.dispatchEvent(customEvent);
161
166
  });
162
167
  });
163
168
 
@@ -165,7 +170,7 @@ class iamCard extends HTMLElement {
165
170
  if(this.querySelector('[slot="link"]'))
166
171
  this.classList.add('hasLink');
167
172
 
168
- trackComponent(cardComponent, 'iam-card', [
173
+ trackComponent(this, 'iam-card', [
169
174
  'select-card',
170
175
  'unselect-card',
171
176
  'secondary-button-clicked',
@@ -173,22 +178,27 @@ class iamCard extends HTMLElement {
173
178
  ]);
174
179
  }
175
180
 
176
- static get observedAttributes(): any {
181
+ static get observedAttributes(): string[] {
177
182
  return ['data-image'];
178
183
  }
179
184
 
180
- attributeChangedCallback(attrName, oldVal, newVal): void {
185
+ attributeChangedCallback(attrName: string, oldVal: string | null, newVal: string | null): void {
186
+ const shadowRoot = this.shadowRoot;
187
+
188
+ if (!shadowRoot) return;
189
+
181
190
  switch (attrName) {
182
191
  case 'data-total': {
183
- if (this.shadowRoot.querySelector('.card__total'))
184
- this.shadowRoot.querySelector('.card__total').innerHTML = newVal;
192
+ const cardTotal = shadowRoot.querySelector<HTMLDivElement>('.card__total');
193
+
194
+ if (cardTotal) cardTotal.innerHTML = newVal || '';
185
195
  break;
186
196
  }
187
197
  case 'data-image': {
188
198
  if (oldVal != newVal) {
189
- const cardHeadImg = this.shadowRoot.querySelector('.card__head img');
199
+ const cardHeadImg = shadowRoot.querySelector<HTMLImageElement>('.card__head img');
190
200
 
191
- if (cardHeadImg) cardHeadImg.setAttribute('src', newVal);
201
+ if (cardHeadImg) cardHeadImg.setAttribute('src', newVal || '');
192
202
  }
193
203
  break;
194
204
  }