@iamproperty/components 6.1.0--beta → 6.1.0--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 (144) hide show
  1. package/assets/css/components/actionbar.css.map +1 -1
  2. package/assets/css/components/actionbar.global.css.map +1 -1
  3. package/assets/css/components/card.component.css +1 -1
  4. package/assets/css/components/card.component.css.map +1 -1
  5. package/assets/css/components/card.module.css +1 -1
  6. package/assets/css/components/card.module.css.map +1 -1
  7. package/assets/css/components/carousel.component.css +1 -0
  8. package/assets/css/components/carousel.component.css.map +1 -0
  9. package/assets/css/components/carousel.config.css +1 -0
  10. package/assets/css/components/carousel.config.css.map +1 -0
  11. package/assets/css/components/collapsible-side.css.map +1 -1
  12. package/assets/css/components/fileupload.css.map +1 -1
  13. package/assets/css/components/filter-card.component.css +1 -1
  14. package/assets/css/components/filter-card.component.css.map +1 -1
  15. package/assets/css/components/header.css +1 -1
  16. package/assets/css/components/header.css.map +1 -1
  17. package/assets/css/components/marketing.css.map +1 -1
  18. package/assets/css/components/multi-step.component.css +1 -0
  19. package/assets/css/components/multi-step.component.css.map +1 -0
  20. package/assets/css/components/multiselect.preload.css.map +1 -1
  21. package/assets/css/components/nav.css.map +1 -1
  22. package/assets/css/components/nav.docs.css.map +1 -1
  23. package/assets/css/components/nav.global.css.map +1 -1
  24. package/assets/css/components/nav.old.css.map +1 -1
  25. package/assets/css/components/nav.preload.css +1 -1
  26. package/assets/css/components/nav.preload.css.map +1 -1
  27. package/assets/css/components/notification.css.map +1 -1
  28. package/assets/css/components/pagination.css.map +1 -1
  29. package/assets/css/components/property-searchbar.css.map +1 -1
  30. package/assets/css/components/record-card.component.css +1 -1
  31. package/assets/css/components/record-card.component.css.map +1 -1
  32. package/assets/css/components/slider.css.map +1 -1
  33. package/assets/css/components/snapshot.css.map +1 -1
  34. package/assets/css/components/stepper.css.map +1 -1
  35. package/assets/css/components/table.global.css.map +1 -1
  36. package/assets/css/components/tabs.css +1 -1
  37. package/assets/css/components/tabs.css.map +1 -1
  38. package/assets/css/components/testimonial.css.map +1 -1
  39. package/assets/css/components/timeline.css.map +1 -1
  40. package/assets/css/components/video-card.component.css +1 -1
  41. package/assets/css/components/video-card.component.css.map +1 -1
  42. package/assets/css/core.min.css +1 -1
  43. package/assets/css/core.min.css.map +1 -1
  44. package/assets/css/style.min.css +1 -1
  45. package/assets/css/style.min.css.map +1 -1
  46. package/assets/img/illustrations/not-found.png +0 -0
  47. package/assets/js/components/accordion/accordion.component.min.js +2 -2
  48. package/assets/js/components/actionbar/actionbar.component.min.js +6 -6
  49. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  50. package/assets/js/components/address-lookup/address-lookup.component.min.js +2 -2
  51. package/assets/js/components/applied-filters/applied-filters.component.min.js +2 -2
  52. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  53. package/assets/js/components/card/card.component.min.js +4 -4
  54. package/assets/js/components/card/card.component.min.js.map +1 -1
  55. package/assets/js/components/carousel/carousel.component.js +36 -41
  56. package/assets/js/components/carousel/carousel.component.min.js +18 -12
  57. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  58. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +2 -2
  59. package/assets/js/components/fileupload/fileupload.component.min.js +2 -2
  60. package/assets/js/components/filter-card/filter-card.component.min.js +5 -5
  61. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  62. package/assets/js/components/filterlist/filterlist.component.min.js +2 -2
  63. package/assets/js/components/header/header.component.min.js +3 -3
  64. package/assets/js/components/inline-edit/inline-edit.component.min.js +2 -2
  65. package/assets/js/components/marketing/marketing.component.min.js +2 -2
  66. package/assets/js/components/multi-step/multi-step.component.js +162 -0
  67. package/assets/js/components/multiselect/multiselect.component.min.js +2 -2
  68. package/assets/js/components/nav/nav.component.min.js +2 -2
  69. package/assets/js/components/notification/notification.component.min.js +2 -2
  70. package/assets/js/components/pagination/pagination.component.min.js +2 -2
  71. package/assets/js/components/record-card/record-card.component.min.js +6 -6
  72. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  73. package/assets/js/components/search/search.component.min.js +2 -2
  74. package/assets/js/components/slider/slider.component.min.js +2 -2
  75. package/assets/js/components/table/table.component.js +1 -1
  76. package/assets/js/components/table/table.component.min.js +3 -3
  77. package/assets/js/components/table/table.component.min.js.map +1 -1
  78. package/assets/js/components/tabs/tabs.component.min.js +3 -3
  79. package/assets/js/components/video-card/video-card.component.min.js +6 -6
  80. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  81. package/assets/js/components.bundle.js +3 -3
  82. package/assets/js/components.bundle.js.map +1 -1
  83. package/assets/js/components.js +1 -1
  84. package/assets/js/modules/card.module.js +4 -1
  85. package/assets/js/modules/carousel.js +110 -8
  86. package/assets/js/modules/dialogs.js +5 -123
  87. package/assets/js/scripts.bundle.js +4 -4
  88. package/assets/js/scripts.bundle.js.map +1 -1
  89. package/assets/js/scripts.bundle.min.js +3 -3
  90. package/assets/js/scripts.bundle.min.js.map +1 -1
  91. package/assets/sass/_components.scss +3 -19
  92. package/assets/sass/_corefiles.scss +15 -0
  93. package/assets/sass/_func.scss +3 -0
  94. package/assets/sass/_functions/functions.scss +304 -1
  95. package/assets/sass/_functions/mixins.scss +458 -2
  96. package/assets/sass/_functions/utilities.scss +647 -2
  97. package/assets/sass/_functions/variables.scss +1724 -2
  98. package/assets/sass/_utilities.scss +126 -7
  99. package/assets/sass/components/card.module.scss +1 -1
  100. package/assets/sass/components/carousel.component.scss +605 -0
  101. package/assets/sass/components/carousel.config.scss +84 -0
  102. package/assets/sass/components/header.scss +1 -0
  103. package/assets/sass/components/multi-step.component.scss +148 -0
  104. package/assets/sass/components/nav.preload.scss +5 -0
  105. package/assets/sass/components/tabs.scss +1 -1
  106. package/assets/sass/elements/admin-panel.scss +2 -1
  107. package/assets/sass/elements/buttons.scss +33 -0
  108. package/assets/sass/elements/container.scss +16 -6
  109. package/assets/sass/elements/details.scss +2 -0
  110. package/assets/sass/elements/forms.scss +236 -24
  111. package/assets/sass/elements/links.scss +27 -4
  112. package/assets/sass/elements/lists.scss +46 -0
  113. package/assets/sass/elements/media.scss +11 -1
  114. package/assets/sass/elements/modal.scss +138 -238
  115. package/assets/sass/elements/table.element.scss +35 -0
  116. package/assets/sass/elements/type.scss +38 -2
  117. package/assets/sass/error.scss +32 -1
  118. package/assets/sass/foundations/bs_grid.scss +33 -0
  119. package/assets/sass/foundations/grid.scss +270 -0
  120. package/assets/sass/foundations/reboot.scss +71 -49
  121. package/assets/sass/foundations/root.scss +16 -2
  122. package/assets/ts/components/carousel/carousel.component.ts +51 -44
  123. package/assets/ts/components/multi-step/multi-step.component.ts +262 -0
  124. package/assets/ts/components/table/table.component.ts +2 -1
  125. package/assets/ts/components.ts +1 -1
  126. package/assets/ts/modules/card.module.ts +4 -1
  127. package/assets/ts/modules/carousel.ts +161 -7
  128. package/assets/ts/modules/dialogs.ts +6 -174
  129. package/dist/components.es.js +177 -193
  130. package/dist/components.umd.js +73 -67
  131. package/dist/style.css +1 -1
  132. package/package.json +3 -2
  133. package/src/components/Carousel/Carousel.vue +1 -15
  134. package/src/components/FilterCard/FilterCard.vue +1 -1
  135. package/src/components/MultiStep/MultiStep.vue +25 -0
  136. package/src/components/RecordCard/RecordCard.vue +1 -1
  137. package/src/components/VideoCard/VideoCard.vue +1 -1
  138. package/assets/css/components/carousel.css +0 -1
  139. package/assets/css/components/carousel.css.map +0 -1
  140. package/assets/css/components/carousel.preload.css +0 -1
  141. package/assets/css/components/carousel.preload.css.map +0 -1
  142. package/assets/sass/components/carousel.preload.scss +0 -82
  143. package/assets/sass/components/carousel.scss +0 -258
  144. package/assets/ts/tests/dialogs.spec.js +0 -50
@@ -0,0 +1,262 @@
1
+ // @ts-nocheck
2
+ import {trackComponent, trackComponentRegistered} from "../_global";
3
+
4
+ trackComponentRegistered("iam-multi-step");
5
+
6
+ class iamMultiStep extends HTMLElement {
7
+
8
+ constructor(){
9
+ super();
10
+ this.attachShadow({ mode: 'open'});
11
+
12
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
13
+ const loadCSS = `@import "${assetLocation}/css/components/multi-step.component.css";`;
14
+
15
+ const template = document.createElement('template');
16
+ template.innerHTML = `
17
+ <style>
18
+ ${loadCSS}
19
+ </style>
20
+ <div class="steps" parts="steps">
21
+ </div>
22
+ <slot></slot>
23
+ `;
24
+
25
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
26
+ }
27
+
28
+
29
+ connectedCallback() {
30
+
31
+ const MultiStepComponent = this;
32
+ const steps = this.shadowRoot.querySelector('.steps');
33
+ const form = this.querySelector('form');
34
+
35
+ let fieldsets = Array.from(MultiStepComponent.querySelectorAll('fieldset[data-title]'));
36
+
37
+ fieldsets.forEach((fieldset,index) => {
38
+
39
+ steps.insertAdjacentHTML('beforeend',`<button data-title="${fieldset.getAttribute('data-title')}" type="button" class="${index == 0 ? "active":""}" tabindex="-1">${fieldset.getAttribute('data-title')}</button>`);
40
+
41
+ if(index === 0)
42
+ fieldset.classList.add('active');
43
+
44
+ const btnWrapper = document.createElement("div");
45
+ btnWrapper.classList.add('btn--wrapper');
46
+ fieldset.appendChild(btnWrapper);
47
+
48
+ if(index != 0)
49
+ btnWrapper.innerHTML += `<button data-title="${fieldsets[index-1].getAttribute('data-title')}" class="btn btn-secondary mb-0" data-previous type="button">Previous</button>`;
50
+
51
+ if(index != fieldsets.length - 1)
52
+ btnWrapper.innerHTML += `<button data-title="${fieldsets[index+1].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="button">Next</button>`;
53
+
54
+ // Last fieldset
55
+ if(index == fieldsets.length - 1){
56
+ if(form && form.querySelector(':scope > button[type="submit"]')){
57
+
58
+ let existingButton = form.querySelector(':scope > button[type="submit"]');
59
+ existingButton.classList.add('mb-0')
60
+
61
+ btnWrapper.insertAdjacentElement('beforeend',existingButton);
62
+ }
63
+ else
64
+ btnWrapper.innerHTML += `<button data-title="${fieldsets[index].getAttribute('data-title')}" class="btn btn-primary mb-0" data-next type="submit">Submit</button>`;
65
+ }
66
+ });
67
+
68
+
69
+
70
+ // Open the fieldset with an error inside
71
+ let validatedFieldsets = Array.from(MultiStepComponent.querySelectorAll('fieldset.was-validated'));
72
+ for (let i = 0; i < validatedFieldsets.length; i++) {
73
+
74
+ let fieldset = validatedFieldsets[i];
75
+ let fieldsetID = fieldset.getAttribute('data-title');
76
+
77
+ if(fieldset.querySelector('.is-invalid')){
78
+
79
+ Array.from(MultiStepComponent.querySelectorAll(`[data-title="${fieldsetID}"]`)).forEach((element, index) => {
80
+
81
+ element.classList.add('active');
82
+ });
83
+
84
+ break;
85
+ }
86
+ else {
87
+
88
+ Array.from(MultiStepComponent.querySelectorAll(`[data-title="${fieldsetID}"]`)).forEach((element, index) => {
89
+
90
+ element.classList.add('valid');
91
+ });
92
+ }
93
+ }
94
+
95
+ // Prevent the bubble messages
96
+ MultiStepComponent.addEventListener('invalid', (function () {
97
+ return function (e) {
98
+ e.preventDefault();
99
+ };
100
+ })(), true);
101
+
102
+
103
+
104
+
105
+ function validateFieldset(button){
106
+
107
+ const currentFieldset = MultiStepComponent.querySelector(`fieldset.active`) ? MultiStepComponent.querySelector(`fieldset.active`) : MultiStepComponent.querySelector(`fieldset[data-title]`);
108
+ const currentFieldsetID = currentFieldset.getAttribute('data-title');
109
+ let isFieldsetValid = true;
110
+
111
+ currentFieldset.classList.add('was-validated');
112
+
113
+ Array.from(currentFieldset.querySelectorAll('input')).forEach((input, index) => {
114
+
115
+ if (!input.checkValidity())
116
+ isFieldsetValid = false;
117
+ });
118
+
119
+ // If valid mode to next field set
120
+ if(!isFieldsetValid){
121
+
122
+ Array.from(MultiStepComponent.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
123
+
124
+ element.classList.remove('valid');
125
+ });
126
+
127
+ Array.from(MultiStepComponent.shadowRoot.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
128
+
129
+ element.classList.remove('valid');
130
+ });
131
+ }
132
+ else {
133
+
134
+ Array.from(MultiStepComponent.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
135
+
136
+ element.classList.add('valid');
137
+ });
138
+
139
+ Array.from(MultiStepComponent.shadowRoot.querySelectorAll(`[data-title="${currentFieldsetID}"]`)).forEach((element, index) => {
140
+
141
+ element.classList.add('valid');
142
+ });
143
+ }
144
+
145
+ // Allow the previous button to navigate
146
+ if(isFieldsetValid || !button.hasAttribute('data-next')){
147
+
148
+ const fieldset = MultiStepComponent.querySelector(`fieldset[data-title="${button.getAttribute('data-title')}"]`);
149
+ const step = MultiStepComponent.shadowRoot.querySelector(`.steps button[data-title="${button.getAttribute('data-title')}"]`);
150
+
151
+ Array.from(MultiStepComponent.querySelectorAll('button')).forEach((button, index) => {
152
+ button.classList.remove('active');
153
+ });
154
+ Array.from(MultiStepComponent.querySelectorAll('fieldset')).forEach((button, index) => {
155
+ button.classList.remove('active');
156
+ });
157
+
158
+ step.classList.add('active');
159
+ fieldset.classList.add('active');
160
+ }
161
+
162
+
163
+ let fieldsetCount = Array.from(MultiStepComponent.querySelectorAll(`fieldset`)).length;
164
+ let validFieldsetCount = Array.from(MultiStepComponent.querySelectorAll(`fieldset.valid`)).length;
165
+
166
+ // update the progress bar
167
+ MultiStepComponent.style.setProperty('--progress', `${(validFieldsetCount/(fieldsetCount - 1) * 100)}%`);
168
+ }
169
+
170
+ // remove error messages from server
171
+ MultiStepComponent.addEventListener('keydown', (event) => {
172
+ if (event && event.target instanceof HTMLElement && event.target.closest('button')){
173
+
174
+ const button = event.target.closest('button');
175
+
176
+ if(event.keyCode == 13 && button.getAttribute('type') != "submit"){
177
+
178
+ event.preventDefault();
179
+ validateFieldset(button);
180
+ }
181
+
182
+ }
183
+
184
+ if (event && event.target instanceof HTMLElement && event.target.closest('input')){
185
+ const input = event.target.closest('input');
186
+
187
+ input.classList.remove('is-invalid');
188
+
189
+ if(event.keyCode == 13){
190
+
191
+ event.preventDefault();
192
+ }
193
+ }
194
+ });
195
+
196
+
197
+ MultiStepComponent.addEventListener('click', (event) => {
198
+ if (event && event.target instanceof HTMLElement && event.target.closest('button[type="submit"]')){
199
+
200
+ const form = event.target.closest('form');
201
+ form.classList.add('was-validated');
202
+ }
203
+ return null
204
+ });
205
+
206
+
207
+ MultiStepComponent.shadowRoot.addEventListener('click', (event) => {
208
+ if (event && event.target instanceof HTMLElement && event.target.closest('button[data-title]')){
209
+
210
+ const button = event.target.closest('button[data-title]');
211
+
212
+ validateFieldset(button);
213
+ };
214
+ return null
215
+ });
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+ trackComponent(MultiStepComponent,"iam-multi-step",[]);
244
+ }
245
+
246
+ static get observedAttributes() {
247
+ return ["data-image"];
248
+ }
249
+
250
+ attributeChangedCallback(attrName, oldVal, newVal) {
251
+ switch (attrName) {
252
+ case "data-total": {
253
+ if(this.shadowRoot.querySelector('.card__total'))
254
+ this.shadowRoot.querySelector('.card__total').innerHTML = newVal;
255
+ break;
256
+ }
257
+ }
258
+
259
+ }
260
+ }
261
+
262
+ export default iamMultiStep;
@@ -171,10 +171,11 @@ class iamTable extends HTMLElement {
171
171
 
172
172
  Array.from(this.table.querySelectorAll('tbody tr')).forEach((row,index) => {
173
173
 
174
+
174
175
  let rowID = `row${uniqueID(index)}`;
175
176
  row.insertAdjacentHTML(
176
177
  'afterbegin',
177
- `<td class="td--fixed selectrow"><input type="checkbox" name="row" id="${rowID}"/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`
178
+ `<td class="td--fixed selectrow selected"><input type="checkbox" name="row" id="${rowID}" ${row.hasAttribute('data-selected') ? `checked="true"` : ''}/><label for="${rowID}"><span class="visually-hidden">Select row</span></label></td>`
178
179
  );
179
180
  });
180
181
 
@@ -1,5 +1,5 @@
1
1
  // @ts-nocheck
2
- const components = ["accordion","header","table","tabs",'card','filter-card','video-card','record-card',"filterlist",'applied-filters','pagination','notification','actionbar','nav','collapsible-side','address-lookup','fileupload','search','inline-edit','multiselect','slider','carousel','marketing','barchart'];
2
+ const components = ["accordion","header","table","tabs",'card','filter-card','video-card','record-card',"filterlist",'applied-filters','pagination','notification','actionbar','nav','collapsible-side','address-lookup','fileupload','search','inline-edit','multiselect','multi-step','slider','carousel','marketing','barchart'];
3
3
 
4
4
  const prefix = "iam"
5
5
  const options = {
@@ -38,6 +38,9 @@ export const setupCard = (cardComponent:any) => {
38
38
  }
39
39
 
40
40
  if(!cardComponent.querySelector('[slot="badges"]')){
41
- cardComponent.shadowRoot.querySelector('.card__badges').remove();
41
+ cardComponent.shadowRoot.querySelector('.card__badges').classList.add('empty');
42
+ }
43
+ else{
44
+ cardComponent.shadowRoot.querySelector('.card__badges').classList.remove('empty');
42
45
  }
43
46
  }
@@ -1,12 +1,94 @@
1
1
  // @ts-nocheck
2
- function carousel(carouselElement, row) {
2
+
3
+ export const generateThumbnailList = function(carouselComponent){
4
+
5
+ let thumbnailImages = [];
6
+
7
+ Array.from(carouselComponent.querySelectorAll(':scope > div')).forEach((slide, index) => {
8
+
9
+ if(slide.hasAttribute('data-thumbnail')){
10
+
11
+ thumbnailImages[index] = slide.getAttribute('data-thumbnail');
12
+ }
13
+ });
14
+
15
+ return thumbnailImages;
16
+ }
17
+
18
+
19
+ export const generatePipsHTML = function(carouselComponent,thumbnailImages){
20
+
21
+ let itemCount = carouselComponent.querySelectorAll(':scope > div').length;
22
+
23
+ let pips = "";
24
+ for (let i = 1; i <= itemCount; i++) {
25
+ let pipContent = null;
26
+ let pipClass = '';
27
+
28
+ if (thumbnailImages.length && thumbnailImages[i - 1]) {
29
+ pipClass = 'has-thumbnail';
30
+ pipContent = `<img src="${thumbnailImages[i - 1]}" alt="Slide ${i}" height="148"/>`;
31
+ } else {
32
+ pipContent = `Slide ${i}`;
33
+ }
34
+
35
+ pips += `<button class="control-${i} ${pipClass}" data-slide="${i}" ${i == 1 ? "aria-current":""}>${pipContent}</button>`;
36
+ }
37
+
38
+ return pips;
39
+ }
40
+
41
+
42
+ const getProgressMax = function(itemCount,visibleItems){
43
+
44
+ if(visibleItems == 1){
45
+ return itemCount;
46
+ }
47
+
48
+ let max = (Math.ceil(itemCount / visibleItems) * visibleItems) - visibleItems;
49
+
50
+ return max + 1;
51
+ }
52
+
53
+ const getProgressPercent = function(value,max){
54
+
55
+ return (((value-1)/(max-1)) * 100);
56
+ }
57
+
58
+ export const carousel = function (carouselComponent) {
3
59
 
4
60
  var scrollTimeout;
5
61
 
62
+ const carouselElement = carouselComponent.shadowRoot.querySelector('.carousel');
63
+
6
64
  let carouselInner = carouselElement.querySelector('.carousel__inner');
7
65
  let carouselControls = carouselElement.querySelector('.carousel__controls');
8
- let itemCount = row.querySelectorAll(':scope > .col').length;
66
+ let carouselProgress = carouselElement.querySelector('.carousel__progress [type="range"]');
67
+ let itemCount = carouselComponent.querySelectorAll(':scope > div').length;
68
+ let scrollArea = carouselInner.clientWidth;
69
+ let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
70
+ let visibleItems = Math.round(scrollArea / itemWidth);
71
+
72
+ carouselProgress.setAttribute('min',1);
73
+ carouselProgress.setAttribute('step',visibleItems);
74
+
75
+ let progressMax = getProgressMax(itemCount,visibleItems);
76
+
77
+ carouselProgress.setAttribute('max',progressMax);
78
+ carouselProgress.value = 1;
79
+
80
+ let percent = getProgressPercent(1,progressMax);
9
81
 
82
+ carouselProgress.style.setProperty('--percent', percent + "%");
83
+
84
+ let stepperInterval, stepperEvent = "mouseup", stepperStart = "mousedown";
85
+
86
+ if("ontouchstart" in document.documentElement) {
87
+ stepperEvent = "touchend";
88
+ stepperStart = "touchstart";
89
+ }
90
+
91
+
10
92
  // On scroll we need to make sure the buttons get corrected and the next testimonial is shown
11
93
  carouselInner.addEventListener('scroll', function(e){
12
94
  clearTimeout(scrollTimeout);
@@ -17,8 +99,8 @@ function carousel(carouselElement, row) {
17
99
  let scrollLeft = carouselInner.scrollLeft;
18
100
  let targetSlide = Math.round((scrollLeft / scrollWidth) * itemCount) + 1;
19
101
 
20
- let itemWidth = row.querySelector(':scope > .col').scrollWidth;
21
- let lastItemOffset = row.querySelector(':scope > .col:last-child').offsetLeft;
102
+ let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
103
+ let lastItemOffset = carouselComponent.querySelector(':scope > div:last-child').offsetLeft;
22
104
  //+60px here is to account for when the next offscreen slide is visible beneath the next arrow
23
105
  let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
24
106
 
@@ -27,6 +109,9 @@ function carousel(carouselElement, row) {
27
109
  //Check if theres room for more slides than we have
28
110
  let leftOverSpace = (Math.ceil(itemCount / visibleItems) * visibleItems) - itemCount;
29
111
 
112
+ carouselProgress.setAttribute('step',visibleItems);
113
+
114
+
30
115
  if(leftOverSpace > 0 && lastItemInView){
31
116
  targetSlide = (Math.floor(itemCount / visibleItems) * visibleItems) + 1;
32
117
  }
@@ -49,6 +134,16 @@ function carousel(carouselElement, row) {
49
134
  else
50
135
  carouselElement.querySelector('.btn-next').removeAttribute('disabled');
51
136
 
137
+ carouselProgress.value = targetSlide;
138
+
139
+
140
+ progressMax = getProgressMax(itemCount,visibleItems);
141
+
142
+ carouselProgress.setAttribute('max',progressMax);
143
+ percent = (targetSlide/progressMax) * 100;
144
+ percent = getProgressPercent(targetSlide,progressMax);
145
+ carouselProgress.style.setProperty('--percent', percent + "%");
146
+
52
147
  }, 100);
53
148
 
54
149
  }, false);
@@ -65,8 +160,15 @@ function carousel(carouselElement, row) {
65
160
  button.removeAttribute('aria-current');
66
161
  });
67
162
  target.setAttribute('aria-current', true);
163
+
164
+ const customEvent = new CustomEvent("pip-clicked", { detail: {
165
+ 'slide': target.getAttribute('data-slide')
166
+ }
167
+ });
168
+
169
+ carouselComponent.dispatchEvent(customEvent);
68
170
 
69
- const el = row.querySelector(`:scope > *:nth-child(${target.getAttribute('data-slide')})`);
171
+ const el = carouselComponent.querySelector(`:scope > *:nth-child(${target.getAttribute('data-slide')})`);
70
172
 
71
173
  carouselInner.scroll({
72
174
  top: 0,
@@ -83,11 +185,11 @@ function carousel(carouselElement, row) {
83
185
 
84
186
  let scrollArea = carouselInner.clientWidth;
85
187
  let scrollWidth = carouselInner.scrollWidth;
86
- let itemWidth = row.querySelector(':scope > .col').scrollWidth;
188
+ let itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
87
189
 
88
190
  let visibleItems = Math.round(scrollArea / itemWidth);
89
191
 
90
- let lastItemOffset = row.querySelector(':scope > .col:last-child').offsetLeft;
192
+ let lastItemOffset = carouselComponent.querySelector(':scope > div:last-child').offsetLeft;
91
193
  let lastItemInView = carouselInner.scrollLeft + scrollArea + carouselInner.getBoundingClientRect().left >= (lastItemOffset + 60);
92
194
 
93
195
  //Check if theres room for more slides than we have
@@ -104,6 +206,15 @@ function carousel(carouselElement, row) {
104
206
 
105
207
  for (var target = e.target; target && target != this; target = target.parentNode) {
106
208
  if (typeof target.matches == "function" && target.matches('.btn-next, .btn-prev')) {
209
+
210
+ let direction = target.matches('.btn-next') ? 'next' : 'prev';
211
+
212
+ const customEvent = new CustomEvent(`${direction}-clicked`, { detail: {
213
+ 'slide': target.getAttribute('data-go')
214
+ }
215
+ });
216
+
217
+ carouselComponent.dispatchEvent(customEvent);
107
218
 
108
219
  e.preventDefault();
109
220
  let scrollTo = target.classList.contains('btn-prev') ? carouselInner.scrollLeft - movement : carouselInner.scrollLeft + carouselInner.clientWidth;
@@ -117,6 +228,49 @@ function carousel(carouselElement, row) {
117
228
  }
118
229
  }
119
230
  }, false);
231
+
232
+
233
+ carouselProgress.addEventListener(stepperStart,function(event){
234
+
235
+ clearInterval(stepperInterval);
236
+ stepperInterval = setInterval(function() {
237
+ scrollArea = carouselInner.clientWidth;
238
+ itemWidth = carouselComponent.querySelector(':scope > div').scrollWidth;
239
+ visibleItems = Math.round(scrollArea / itemWidth);
240
+ carouselProgress.setAttribute('step',visibleItems);
241
+ progressMax = getProgressMax(itemCount,visibleItems);
242
+ carouselProgress.setAttribute('max',progressMax);
243
+ percent = getProgressPercent(carouselProgress.value,progressMax);
244
+
245
+ carouselProgress.style.setProperty('--percent', percent + "%");
246
+ }, 10);
247
+ });
248
+
249
+ carouselProgress.addEventListener(stepperEvent,function(event){
250
+ clearInterval(stepperInterval);
251
+ });
252
+
253
+ carouselProgress.addEventListener('change', function(e){
254
+
255
+ clearInterval(stepperInterval);
256
+ let target = carouselComponent.querySelector(`:scope > *:nth-child(${carouselProgress.value})`);
257
+
258
+ carouselInner.scroll({
259
+ top: 0,
260
+ left: target ? target.offsetLeft - carouselInner.getBoundingClientRect().left : 0,
261
+ behavior: 'smooth'
262
+ });
263
+
264
+ let direction = target.matches('.btn-next') ? 'next' : 'prev';
265
+
266
+ const customEvent = new CustomEvent(`slider-changed`, { detail: {
267
+ 'slide': carouselProgress.value
268
+ }
269
+ });
270
+
271
+ carouselComponent.dispatchEvent(customEvent);
272
+
273
+ }, false);
120
274
  }
121
275
 
122
276
  export default carousel