@iamproperty/components 5.7.1-beta2 → 5.7.1-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.
- package/assets/css/components/barchart.component.css +1 -0
- package/assets/css/components/barchart.component.css.map +1 -0
- package/assets/css/components/charts.config.css +1 -0
- package/assets/css/components/charts.config.css.map +1 -0
- package/assets/css/components/charts.module.css +1 -0
- package/assets/css/components/charts.module.css.map +1 -0
- package/assets/css/components/tabs.css +1 -1
- package/assets/css/components/tabs.css.map +1 -1
- package/assets/css/core.min.css +1 -1
- package/assets/css/core.min.css.map +1 -1
- package/assets/css/style.min.css +1 -1
- package/assets/css/style.min.css.map +1 -1
- package/assets/js/components/accordion/accordion.component.min.js +1 -1
- package/assets/js/components/actionbar/actionbar.component.min.js +1 -1
- package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
- package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
- package/assets/js/components/barchart/barchart.component.js +53 -0
- package/assets/js/components/barchart/barchart.component.min.js +21 -0
- package/assets/js/components/barchart/barchart.component.min.js.map +1 -0
- package/assets/js/components/card/card.component.min.js +1 -1
- package/assets/js/components/carousel/carousel.component.min.js +1 -1
- package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
- package/assets/js/components/fileupload/fileupload.component.js +2 -1
- package/assets/js/components/fileupload/fileupload.component.min.js +4 -4
- package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
- package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
- package/assets/js/components/header/header.component.min.js +1 -1
- package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
- package/assets/js/components/marketing/marketing.component.min.js +1 -1
- package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
- package/assets/js/components/nav/nav.component.min.js +1 -1
- package/assets/js/components/notification/notification.component.min.js +1 -1
- package/assets/js/components/pagination/pagination.component.min.js +1 -1
- package/assets/js/components/search/search.component.min.js +1 -1
- package/assets/js/components/slider/slider.component.min.js +1 -1
- package/assets/js/components/table/table.component.min.js +1 -1
- package/assets/js/components/tabs/tabs.component.min.js +4 -4
- package/assets/js/dynamic.min.js +1 -1
- package/assets/js/modules/chart.module.js +350 -0
- package/assets/js/scripts.bundle.js +1 -1
- package/assets/js/scripts.bundle.min.js +1 -1
- package/assets/sass/_components.scss +0 -8
- package/assets/sass/_corefiles.scss +2 -0
- package/assets/sass/components/barchart.component.scss +341 -0
- package/assets/sass/components/charts.config.scss +79 -0
- package/assets/sass/components/charts.module.scss +652 -0
- package/assets/sass/components/tabs.scss +3 -14
- package/assets/ts/components/barchart/README.md +37 -0
- package/assets/ts/components/barchart/barchart.component.ts +79 -0
- package/assets/ts/components/fileupload/fileupload.component.ts +2 -1
- package/assets/ts/modules/chart.module.ts +506 -0
- package/dist/components.es.js +11 -11
- package/dist/components.umd.js +24 -24
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/BarChart/BarChart.vue +25 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { numberOfDays } from './helpers.js';
|
|
2
|
+
// #region Functions that setup and trigger other functions
|
|
3
|
+
export const addClasses = (chartElement) => {
|
|
4
|
+
// add colour classes
|
|
5
|
+
for (let i = 1; i <= 10; i++) {
|
|
6
|
+
if (chartElement.hasAttribute(`data-colour-${i}`)) {
|
|
7
|
+
let colour = chartElement.getAttribute(`data-colour-${i}`);
|
|
8
|
+
chartElement.style.setProperty(`--chart-colour-${i}`, `var(--chart-colour-${colour})`);
|
|
9
|
+
chartElement.style.setProperty(`--chart-colour-${i}-hover`, `var(--chart-colour-${colour}-hover)`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
};
|
|
14
|
+
export const setupChart = (chartElement, chartOuter, tableElement) => {
|
|
15
|
+
// #region Reset the chart
|
|
16
|
+
// empty divs to re-populate
|
|
17
|
+
const chartKey = chartOuter.querySelector('.chart__key');
|
|
18
|
+
chartKey.innerHTML = '';
|
|
19
|
+
const chartGuidelines = chartOuter.querySelector('.chart__guidelines');
|
|
20
|
+
chartGuidelines.innerHTML = ``;
|
|
21
|
+
const chartYaxis = chartOuter.querySelector('.chart__yaxis');
|
|
22
|
+
chartYaxis.innerHTML = ``;
|
|
23
|
+
// Remove old input fields
|
|
24
|
+
Array.from(chartOuter.querySelectorAll(':scope > input[type="checkbox"],:scope > input[type="radio"]')).map((element) => { element.remove(); });
|
|
25
|
+
// #endregion
|
|
26
|
+
let { xaxis } = getChartData(chartElement, chartOuter);
|
|
27
|
+
setCellData(chartElement, chartOuter, tableElement);
|
|
28
|
+
createChartKey(chartOuter, tableElement, chartKey);
|
|
29
|
+
createChartGuidelines(chartElement, chartOuter, chartGuidelines);
|
|
30
|
+
createChartYaxis(chartElement, chartOuter, chartYaxis);
|
|
31
|
+
if (xaxis) {
|
|
32
|
+
createXaxis(chartElement, chartOuter, xaxis);
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
// #endregion
|
|
37
|
+
// #region Event handlers and observers
|
|
38
|
+
export const setEventListener = function (chartOuter) {
|
|
39
|
+
let chart = chartOuter.querySelector('.chart');
|
|
40
|
+
chart.addEventListener('mousemove', (event) => {
|
|
41
|
+
if (event && event.target instanceof HTMLElement && event.target.closest('td:not(:first-child')) {
|
|
42
|
+
let column = event.target.closest('td:not(:first-child');
|
|
43
|
+
var rect = column.getBoundingClientRect();
|
|
44
|
+
let x = event.clientX - rect.left;
|
|
45
|
+
let y = event.clientY - rect.top;
|
|
46
|
+
chart.setAttribute('style', `--cursor-x: ${x}px; --cursor-y: ${y}px;`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// Use the part for the chart items to pass through states to the pages CSS
|
|
50
|
+
let labels = chartOuter.querySelectorAll('label');
|
|
51
|
+
Array.from(labels).forEach((label) => {
|
|
52
|
+
if (chartOuter.querySelector(`input#${label.getAttribute('for')}`).checked)
|
|
53
|
+
label.setAttribute('part', 'key-checked');
|
|
54
|
+
else
|
|
55
|
+
label.setAttribute('part', 'key-unchecked');
|
|
56
|
+
});
|
|
57
|
+
chartOuter.addEventListener('change', function () {
|
|
58
|
+
Array.from(labels).forEach((label) => {
|
|
59
|
+
if (chartOuter.querySelector(`input#${label.getAttribute('for')}`).checked)
|
|
60
|
+
label.setAttribute('part', 'key-checked');
|
|
61
|
+
else
|
|
62
|
+
label.setAttribute('part', 'key-unchecked');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
export const setEventObservers = function (chartElement, chartOuter) {
|
|
67
|
+
let table = chartElement.querySelector('table');
|
|
68
|
+
let shadowTable = chartOuter.querySelector('table');
|
|
69
|
+
const attributesUpdated = (mutationList, observer) => {
|
|
70
|
+
observer.disconnect();
|
|
71
|
+
observer2.disconnect();
|
|
72
|
+
for (const mutation of mutationList) {
|
|
73
|
+
if (mutation.attributeName == 'class' || (mutation.type === 'attributes' && mutation.attributeName === 'data-total') || mutation.type === 'attributes') {
|
|
74
|
+
shadowTable.innerHTML = table.innerHTML;
|
|
75
|
+
setupChart(chartElement, chartOuter, shadowTable);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
observer.observe(table, { characterData: true, subtree: true });
|
|
79
|
+
observer2.observe(chartElement, { attributes: true });
|
|
80
|
+
};
|
|
81
|
+
const tableUpdated = (mutationList, observer) => {
|
|
82
|
+
observer.disconnect();
|
|
83
|
+
observer2.disconnect();
|
|
84
|
+
for (const mutation of mutationList) {
|
|
85
|
+
if (mutation.type == "characterData" || (mutation.type == "childList" && mutation.addedNodes.length)) {
|
|
86
|
+
shadowTable.innerHTML = table.innerHTML;
|
|
87
|
+
setupChart(chartElement, chartOuter, shadowTable);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
observer.observe(table, { characterData: true, subtree: true });
|
|
91
|
+
observer2.observe(chartElement, { attributes: true });
|
|
92
|
+
};
|
|
93
|
+
let observer = new MutationObserver(tableUpdated);
|
|
94
|
+
let observer2 = new MutationObserver(attributesUpdated);
|
|
95
|
+
observer.observe(table, { characterData: true, subtree: true });
|
|
96
|
+
observer2.observe(chartElement, { attributes: true });
|
|
97
|
+
return true;
|
|
98
|
+
};
|
|
99
|
+
// #endregion
|
|
100
|
+
// #region GET functions
|
|
101
|
+
export const getChartData = function (chartElement, chartOuter) {
|
|
102
|
+
let table = chartOuter.querySelector('.chart__wrapper table');
|
|
103
|
+
let min = chartElement.hasAttribute('data-min') ? chartElement.getAttribute('data-min') : 0;
|
|
104
|
+
let max = chartElement.hasAttribute('data-max') ? chartElement.getAttribute('data-max') : getLargestValue(table);
|
|
105
|
+
let type = chartElement.hasAttribute('data-type') ? chartElement.getAttribute('data-type') : 'column';
|
|
106
|
+
let yaxis = chartElement.hasAttribute('data-yaxis') ? chartElement.getAttribute('data-yaxis').split(',') : [];
|
|
107
|
+
let guidelines = chartElement.hasAttribute('data-guidelines') ? chartElement.getAttribute('data-guidelines').split(',') : [];
|
|
108
|
+
let targets = chartElement.hasAttribute('data-targets') ? JSON.parse(chartElement.getAttribute('data-targets')) : null;
|
|
109
|
+
let events = chartElement.hasAttribute('data-events') ? JSON.parse(chartElement.getAttribute('data-events')) : null;
|
|
110
|
+
let xaxis = chartElement.hasAttribute('data-xaxis') ? chartElement.getAttribute('data-xaxis').split(',') : null;
|
|
111
|
+
let increment = chartElement.hasAttribute('data-increment') ? chartElement.getAttribute('data-increment') : null;
|
|
112
|
+
let start = chartElement.hasAttribute('data-start') ? chartElement.getAttribute('data-start') : 0;
|
|
113
|
+
let end = chartElement.hasAttribute('data-end') ? chartElement.getAttribute('data-end') : getLargestValue(table); // TODO - get largest value from the data-xaxis
|
|
114
|
+
let slope = chartElement.hasAttribute('data-slope') ? chartElement.getAttribute('data-slope') : null;
|
|
115
|
+
let yInt = chartElement.hasAttribute('data-yint') ? chartElement.getAttribute('data-yint') : null;
|
|
116
|
+
return { min, max, type, yaxis, targets, events, xaxis, increment, start, end, slope, yInt, guidelines };
|
|
117
|
+
};
|
|
118
|
+
function getLargestValue(table) {
|
|
119
|
+
let values = Array.from(table.querySelectorAll('tbody td:not(:first-child)')).map((element) => {
|
|
120
|
+
let currentValue = String(element.textContent);
|
|
121
|
+
currentValue = currentValue.replace('£', '');
|
|
122
|
+
currentValue = currentValue.replace('%', '');
|
|
123
|
+
currentValue = currentValue.replace(',', '');
|
|
124
|
+
currentValue = Number.parseFloat(currentValue);
|
|
125
|
+
return currentValue;
|
|
126
|
+
});
|
|
127
|
+
let largetValue = Math.max(...values);
|
|
128
|
+
// TO DO round to the nearest 10, 100, 1000 and so on
|
|
129
|
+
return Math.ceil(largetValue);
|
|
130
|
+
}
|
|
131
|
+
const getValues = function (value, min, max, start) {
|
|
132
|
+
let cleanValue = String(value);
|
|
133
|
+
cleanValue = cleanValue.replace('£', '');
|
|
134
|
+
cleanValue = cleanValue.replace('%', '');
|
|
135
|
+
cleanValue = cleanValue.replace(',', '');
|
|
136
|
+
cleanValue = Number.parseFloat(cleanValue);
|
|
137
|
+
let percent = ((cleanValue - min) / (max - min)) * 100;
|
|
138
|
+
let axis = percent;
|
|
139
|
+
let bottom = 0;
|
|
140
|
+
if (start && start != 0) {
|
|
141
|
+
bottom = ((start - min) / (max - min)) * 100;
|
|
142
|
+
}
|
|
143
|
+
// If the value is negative the position below the 0 line
|
|
144
|
+
if (min < 0) {
|
|
145
|
+
bottom = Math.abs(((min) / (max - min)) * 100);
|
|
146
|
+
if (cleanValue < 0) {
|
|
147
|
+
percent = bottom - percent;
|
|
148
|
+
bottom = bottom - percent;
|
|
149
|
+
axis = bottom;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
percent = percent - bottom;
|
|
153
|
+
axis = percent + bottom;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { percent, axis, bottom };
|
|
157
|
+
};
|
|
158
|
+
// #endregion
|
|
159
|
+
// #region SET functions - set data attributes and classes
|
|
160
|
+
export const setCellData = function (chartElement, chartOuter, table) {
|
|
161
|
+
let { min, max } = getChartData(chartElement, chartOuter);
|
|
162
|
+
let increment = chartElement.getAttribute('data-increment');
|
|
163
|
+
let startDay = min;
|
|
164
|
+
Array.from(table.querySelectorAll('tbody tr')).forEach((tr, index) => {
|
|
165
|
+
let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').textContent : '';
|
|
166
|
+
tr.setAttribute('part', 'group');
|
|
167
|
+
// Set the data numeric value if not set
|
|
168
|
+
Array.from(tr.querySelectorAll('td:not([data-numeric]):not(:first-child)')).forEach((td) => {
|
|
169
|
+
let value = parseFloat(td.textContent.replace('£', '').replace('%', '').replace(',', ''));
|
|
170
|
+
let start = 0;
|
|
171
|
+
if (increment == "days") {
|
|
172
|
+
let dates = td.textContent.split(' - ');
|
|
173
|
+
if (dates[1]) {
|
|
174
|
+
value = numberOfDays(dates[0], dates[1]);
|
|
175
|
+
start = numberOfDays(startDay, dates[0]) - 1;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
td.setAttribute('data-numeric', value);
|
|
179
|
+
td.setAttribute('data-value', td.textContent);
|
|
180
|
+
td.setAttribute('data-start', start);
|
|
181
|
+
});
|
|
182
|
+
// Set the data label value if not set
|
|
183
|
+
Array.from(tr.querySelectorAll('td:not([data-label])')).forEach((td, index) => {
|
|
184
|
+
if (index == 0)
|
|
185
|
+
td.setAttribute('part', 'xaxis-label'); // PART
|
|
186
|
+
else
|
|
187
|
+
td.setAttribute('part', 'value');
|
|
188
|
+
if (tr.querySelectorAll('td').length > 2)
|
|
189
|
+
td.setAttribute('data-label', table.querySelectorAll('thead th')[index].textContent);
|
|
190
|
+
});
|
|
191
|
+
/*
|
|
192
|
+
if(tr.querySelector('[data-label="Total"]')){
|
|
193
|
+
tr.setAttribute('data-total',tr.querySelector('[data-label="Total"][data-numeric]').getAttribute('data-numeric'));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if(tr.querySelector('[data-label="Min"]')){
|
|
197
|
+
tr.setAttribute('data-min',tr.querySelector('[data-label="Min"][data-numeric]').getAttribute('data-numeric'));
|
|
198
|
+
}
|
|
199
|
+
if(tr.querySelector('[data-label="Max"]')){
|
|
200
|
+
tr.setAttribute('data-max',tr.querySelector('[data-label="Max"][data-numeric]').getAttribute('data-numeric'));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
*/
|
|
204
|
+
let rowMin = tr.hasAttribute('data-min') ? tr.getAttribute('data-min') : min;
|
|
205
|
+
let rowMax = tr.hasAttribute('data-max') ? tr.getAttribute('data-max') : max;
|
|
206
|
+
if (rowMin < 0) {
|
|
207
|
+
let minBottom = Math.abs(((rowMin) / (rowMax - rowMin)) * 100);
|
|
208
|
+
chartElement.setAttribute('style', `--min-bottom: ${minBottom}%;`);
|
|
209
|
+
}
|
|
210
|
+
// Add a useful index css var for the use of animatons.
|
|
211
|
+
tr.style.setProperty('--row-index', index + 1);
|
|
212
|
+
// Add css vars to cells
|
|
213
|
+
Array.from(tr.querySelectorAll('td[data-numeric]:not([data-label="Min"]):not([data-label="Max"]):not(:first-child)')).forEach((td) => {
|
|
214
|
+
let display = getComputedStyle(td).display;
|
|
215
|
+
if (display == 'none')
|
|
216
|
+
return;
|
|
217
|
+
const content = td.innerHTML;
|
|
218
|
+
const value = Number.parseFloat(td.getAttribute('data-numeric'));
|
|
219
|
+
const start = Number.parseFloat(td.getAttribute('data-start'));
|
|
220
|
+
if (!td.querySelector('span[data-group]'))
|
|
221
|
+
td.innerHTML = `<span data-group="${group}" ${td.hasAttribute('data-label') ? `data-label="${td.getAttribute('data-label')}"` : ''} part="popover">${content}</span>`;
|
|
222
|
+
if (!td.hasAttribute('style')) {
|
|
223
|
+
let { percent, bottom, axis } = getValues(value, rowMin, rowMax, start);
|
|
224
|
+
td.setAttribute('data-percent', percent);
|
|
225
|
+
td.setAttribute("style", `--bottom:${bottom}%;--percent:${percent}%;--axis:${axis}%;`);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
export const setLongestLabel = function (chartOuter) {
|
|
231
|
+
let chartWrapper = chartOuter.querySelector('.chart__wrapper');
|
|
232
|
+
let chartSpacer = chartOuter.querySelector('.chart__spacer span');
|
|
233
|
+
let table = chartOuter.querySelector('.chart table');
|
|
234
|
+
// set the longest label attr so that the bar chart knows what margin to set on the left
|
|
235
|
+
let longestLabel = '';
|
|
236
|
+
Array.from(table.querySelectorAll('tbody tr td:first-child')).forEach((td) => {
|
|
237
|
+
if (typeof td.textContent != "undefined" && td.textContent.length > longestLabel.length) {
|
|
238
|
+
longestLabel = td.textContent;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
chartWrapper.setAttribute('data-longest-label', longestLabel);
|
|
242
|
+
chartSpacer.innerHTML = longestLabel;
|
|
243
|
+
};
|
|
244
|
+
export const setLongestValue = function (chartOuter) {
|
|
245
|
+
let chartWrapper = chartOuter.querySelector('.chart__wrapper');
|
|
246
|
+
let table = chartOuter.querySelector('.chart table');
|
|
247
|
+
let longestValue = '';
|
|
248
|
+
Array.from(table.querySelectorAll('tbody tr td:not(:first-child) span')).forEach((td) => {
|
|
249
|
+
if (typeof td.textContent != "undefined" && td.textContent.length > longestValue.length)
|
|
250
|
+
longestValue = td.textContent;
|
|
251
|
+
});
|
|
252
|
+
chartWrapper.setAttribute('data-longest-value', longestValue);
|
|
253
|
+
};
|
|
254
|
+
// #endregion
|
|
255
|
+
// #region CREATE function
|
|
256
|
+
export const createChartKey = function (chartOuter, tableElement, chartKey) {
|
|
257
|
+
const chartID = `chart-${Date.now() + (Math.floor(Math.random() * 100) + 1)}`;
|
|
258
|
+
//const chartOuter = chartElement.querySelector('.chart__outer');
|
|
259
|
+
let previousInput;
|
|
260
|
+
let headings = Array.from(tableElement.querySelectorAll('thead th'));
|
|
261
|
+
headings.forEach((arrayElement, index) => {
|
|
262
|
+
if (index != 0) {
|
|
263
|
+
previousInput = createChartKeyItem(chartID, index, arrayElement.textContent, chartKey, chartOuter, previousInput);
|
|
264
|
+
}
|
|
265
|
+
if (index == 50) {
|
|
266
|
+
headings.length = index + 1;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return true;
|
|
270
|
+
};
|
|
271
|
+
function createChartKeyItem(chartID, index, text, chartKey, chartOuter, previousInput) {
|
|
272
|
+
let input = document.createElement('input');
|
|
273
|
+
input.setAttribute('name', `${chartID}-dataset-${index}`);
|
|
274
|
+
input.setAttribute('id', `${chartID}-dataset-${index}`);
|
|
275
|
+
input.checked = true;
|
|
276
|
+
input.setAttribute('type', `checkbox`);
|
|
277
|
+
if (index == 1)
|
|
278
|
+
chartOuter.prepend(input);
|
|
279
|
+
else
|
|
280
|
+
chartOuter.insertBefore(input, previousInput.nextSibling);
|
|
281
|
+
previousInput = input;
|
|
282
|
+
let label = document.createElement('label');
|
|
283
|
+
label.setAttribute('class', `key btn btn-action`);
|
|
284
|
+
label.setAttribute('for', `${chartID}-dataset-${index}`);
|
|
285
|
+
label.setAttribute('data-label', `${text}`);
|
|
286
|
+
label.setAttribute('part', `key`);
|
|
287
|
+
label.innerHTML = `${text}`;
|
|
288
|
+
chartKey.append(label);
|
|
289
|
+
return previousInput;
|
|
290
|
+
}
|
|
291
|
+
export const createChartGuidelines = function (chartElement, chartOuter, chartGuidelines) {
|
|
292
|
+
let { min, max, yaxis, increment, guidelines } = getChartData(chartElement, chartOuter);
|
|
293
|
+
if (!guidelines.length)
|
|
294
|
+
guidelines = yaxis;
|
|
295
|
+
if (increment == "days") {
|
|
296
|
+
max = numberOfDays(min, max);
|
|
297
|
+
min = 0;
|
|
298
|
+
}
|
|
299
|
+
chartGuidelines.innerHTML = '';
|
|
300
|
+
for (var i = 0; i < guidelines.length; i++) {
|
|
301
|
+
let value = parseFloat(guidelines[i].replace('£', '').replace('%', '').replace(',', ''));
|
|
302
|
+
let { axis } = getValues(value, min, max);
|
|
303
|
+
chartGuidelines.innerHTML += `<div class="guideline" style="--percent:${axis}%;">${yaxis.indexOf(guidelines[i]) != -1 ? `<span>${guidelines[i]}</span>` : ''}</div>`;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
export const createChartYaxis = function (chartElement, chartOuter, chartYaxis) {
|
|
307
|
+
let { min, max, yaxis, increment } = getChartData(chartElement, chartOuter);
|
|
308
|
+
let startDay = min;
|
|
309
|
+
if (increment == "days") {
|
|
310
|
+
max = numberOfDays(min, max);
|
|
311
|
+
min = 0;
|
|
312
|
+
}
|
|
313
|
+
chartYaxis.innerHTML = '';
|
|
314
|
+
for (var i = 0; i < yaxis.length; i++) {
|
|
315
|
+
let value = parseFloat(yaxis[i].replace('£', '').replace('%', ''));
|
|
316
|
+
if (increment == "days") {
|
|
317
|
+
value = numberOfDays(startDay, yaxis[i]);
|
|
318
|
+
}
|
|
319
|
+
let { axis } = getValues(value, min, max);
|
|
320
|
+
chartYaxis.innerHTML += `<div class="axis__point" style="--percent:${axis}%;"><span>${yaxis[i]}</span></div>`;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
export const createXaxis = function (chartElement, chartOuter, xaxis) {
|
|
324
|
+
const chart = chartOuter.querySelector('.chart');
|
|
325
|
+
let chartXaxis = chartOuter.querySelector('.chart__xaxis');
|
|
326
|
+
let { increment, start, end } = getChartData(chartElement, chartOuter);
|
|
327
|
+
if (!chartXaxis) {
|
|
328
|
+
chartXaxis = document.createElement('div');
|
|
329
|
+
chartXaxis.setAttribute('class', 'chart__xaxis');
|
|
330
|
+
}
|
|
331
|
+
if (increment && start && end) {
|
|
332
|
+
chartXaxis.innerHTML = '';
|
|
333
|
+
for (var i = 0; i < xaxis.length; i++) {
|
|
334
|
+
let value = parseFloat(xaxis[i].replace('£', '').replace('%', ''));
|
|
335
|
+
let position = ((value - start) / (end - start)) * 100;
|
|
336
|
+
chartXaxis.innerHTML += `<div class="axis__point" style="--percent:${position}%;"><span>${xaxis[i]}</span></div>`;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
chart.prepend(chartXaxis);
|
|
340
|
+
};
|
|
341
|
+
export const createTooltips = function (chartOuter) {
|
|
342
|
+
const titles = chartOuter.querySelectorAll('thead th[title], tbody th[title]:first-child, tbody td[title]:first-child');
|
|
343
|
+
Array.from(titles).forEach((title) => {
|
|
344
|
+
let tooltipId = `tooltip-${Date.now()}-${Math.floor(Math.random() * 100)}`;
|
|
345
|
+
title.innerHTML = `<button class="tooltip" popovertarget="${tooltipId}" part="tooltip" style="anchor-name: --${tooltipId};">${title.textContent}</button><span id="${tooltipId}" style="position-anchor: --${tooltipId};" popover part="tooltip__content" class="tooltip__content">${title.getAttribute('title')}</span>`;
|
|
346
|
+
//title.removeAttribute('title'); // TODO add a supports query for anchor positioning
|
|
347
|
+
});
|
|
348
|
+
};
|
|
349
|
+
// #endregion
|
|
350
|
+
export default setupChart;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* iamKey v5.7.1-
|
|
2
|
+
* iamKey v5.7.1-beta4
|
|
3
3
|
* Copyright 2022-2024 iamproperty
|
|
4
4
|
*/(function(I){typeof define=="function"&&define.amd?define(I):I()})(function(){"use strict";var I=r=>(r.classList.add("js-enabled"),(navigator.userAgent.indexOf("MSIE")!==-1||navigator.appVersion.indexOf("Trident/")>0)&&r.classList.add("ie"),null),ct=r=>{var t=function(a){var i=document.querySelector('label[for="'.concat(a.replace("#",""),'"]')),c=document.querySelector(a+" summary"),o=document.querySelector("dialog".concat(a)),n=document.querySelector("detail".concat(a));i instanceof HTMLElement?i.click():c instanceof HTMLElement?c.click():o instanceof HTMLElement?o.showModal():n instanceof HTMLElement&&n.addAttribute("open")};return location.hash&&t(location.hash),window.addEventListener("hashchange",function(){t(location.hash)},!1),addEventListener("popstate",e=>{if(e&&e.state&&e.state.type&&e.state.type=="pagination"){var a=document.querySelector("#".concat(e.state.form)),i=document.querySelector("#".concat(e.state.form," [data-pagination]"));i?i.value=e.state.page:a.innerHTML+='<input name="page" type="hidden" data-pagination="true" value="'.concat(e.state.page,'" />'),a.dispatchEvent(new Event("submit"))}}),document.addEventListener("submit",e=>{if(e&&e.target instanceof HTMLElement&&e.target.matches("form")){var a=e.target;Array.from(a.querySelectorAll("[data-password-type]")).forEach((i,c)=>{i.setAttribute("type","password")}),(a.querySelector(":invalid")||a.querySelector('.pwd-checker[data-strength="1"]')||a.querySelector('.pwd-checker[data-strength="2"]'))&&(a.classList.add("was-validated"),e.preventDefault()),a.querySelector("iam-multiselect[data-is-required][data-error]")&&(a.classList.add("was-validated"),e.preventDefault())}}),document.addEventListener("keydown",e=>{e.key==="Escape"&&document.querySelector(".dialog--transactional[open], .dialog--acknowledgement[open]")&&(e.preventDefault(),e.stopPropagation())}),Array.from(document.querySelectorAll("label progress")).forEach((e,a)=>{var i=e.closest("label");i.setAttribute("data-percent",e.getAttribute("value"))}),null},dt=function(t){return typeof t!="string"?!1:!isNaN(t)&&!isNaN(parseFloat(t))},lt=(r,t)=>String(r).padStart(t,"0"),ut=r=>r.charAt(0).toUpperCase()+r.slice(1),C=(r,t,e)=>t.split(/[\.\[\]\'\"]/).filter(a=>a).reduce((a,i)=>a?a[i]:e,r),ht=(r,t,e,a)=>{var i=Math.tan(.375*Math.PI),c=window.innerWidth||document.body.clientWidth,o=Math.max(1,Math.floor(.01*c)),n=e-r,d=a-t,s=Math.abs(n/d),l=Math.abs(d/n);if(Math.abs(n)>o||Math.abs(d)>o){if(l<=i)return n<0?"left":"right";if(s<=i)return d<0?"top":"bottom"}else return"tap"};class ft{constructor(t){document.body.classList.contains("youtubeLoaded")?t.addEventListener("click",function(e){for(var a=e.target;a&&a!=this;a=a.parentNode)if(a.matches("a")){e.preventDefault(),U(a);break}},!1):this.loadScripts(t,this.createEmbed)}loadScripts(t){return new Promise((e,a)=>{var i=new Image;i.onload=function(){var c=document.createElement("script");c.src="https://www.youtube.com/iframe_api";var o=document.getElementsByTagName("script")[0];o.parentNode.insertBefore(c,o),document.body.classList.add("youtubeLoaded"),e(!0),c.onload=()=>{t.addEventListener("click",function(n){console.log("click"),n&&n.target instanceof HTMLElement&&n.target.closest("a")&&(n.preventDefault(),U(n.target.closest("a")))},!1)}},i.onerror=function(){a(!1)},i.src="https://youtube.com/favicon.ico"})}}var U=function(t){typeof window.player<"u"&&typeof window.player.pauseVideo=="function"&&window.player.pauseVideo();var e=t.getAttribute("data-id"),a=t.getAttribute("id");if(typeof a>"u"||a==null){var i=String.fromCharCode(65+Math.floor(Math.random()*26));a=i+Date.now(),t.setAttribute("id",a)}function c(){window.player=new YT.Player(a,{height:"100%",width:"100%",videoId:e,playerVars:{modestbranding:1,playsinline:1,rel:0,showinfo:0},events:{onReady:o,onStateChange:d}})}c();function o(s){s.target.playVideo()}var n=!1;function d(s){if(s.data==YT.PlayerState.PLAYING&&!n){var l=document.getElementById(a);l.classList.add("player-ready"),n=!0}}},bt=r=>(Array.from(r.querySelectorAll("dialog[open]")).forEach((t,e)=>{var a=t.closest(".dialog__wrapper");a||(t.removeAttribute("open"),t.showModal(),t.focus(),X(t))}),r.addEventListener("click",t=>{if(t.target.tagName=="IAM-ACTIONBAR")return!1;if(t&&t.target instanceof HTMLElement&&t.target.closest("[data-modal]")){var e=t.target.closest("[data-modal]"),a=e.hasAttribute("data-modal")?e.getAttribute("data-modal"):e.getAttribute("data-filter"),i=document.querySelector("dialog#".concat(a));X(i),i.showModal(),i.focus();var c=i.offsetWidth;i.setAttribute("style","max-width: ".concat(c,"px;")),Array.from(i.querySelectorAll("[data-duplicate]")).forEach((L,S)=>{var T=L.getAttribute("data-duplicate"),E=document.getElementById(T);if(L.checked!=E.checked){L.checked=E.checked;var M=new Event("change");L.dispatchEvent(M)}}),window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"openModal",id:a})}if(t&&t.target instanceof HTMLElement&&t.target.closest("button.dialog__close")){var o=t.target.closest("dialog[open]");t.preventDefault(),o.close(),Array.from(document.querySelectorAll(".dialog__wrapper > button")).forEach((L,S)=>{L.classList.remove("active")});var n=new CustomEvent("dialog-closed",{bubbles:!0,cancelable:!0,detail:{modalId:o.id}});t.target.dispatchEvent(n),window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"closeModal",id:o.getAttribute("id")})}if(t&&t.target instanceof HTMLElement&&t.target.closest('button[formmethod="dialog"]')){var d=t.target.closest("dialog[open]");Array.from(document.querySelectorAll(".dialog__wrapper > button")).forEach((L,S)=>{L.classList.remove("active")}),window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"closeModal",id:d.getAttribute("id")})}if(t&&t.target instanceof HTMLElement&&t.target.closest("dialog[open]")){var s=t.target.closest("dialog[open]"),l=window.getComputedStyle(s);if(l.display==="contents"&&(s=s.parentNode.closest("dialog[open]")),!s.classList.contains("dialog--transactional")&&!s.classList.contains("dialog--acknowledgement")){var h=s.getBoundingClientRect();(t.clientX<h.left||t.clientX>h.right||t.clientY<h.top||t.clientY>h.bottom)&&(t.target.closest("dialog *")||s.close(),window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"closeModal",id:s.getAttribute("id")}))}}if(t&&t.target instanceof HTMLElement&&t.target.closest(".dialog__wrapper > button")){t.stopPropagation();var b=t.target.closest(".dialog__wrapper > button"),v=b.parentNode,u="openPopover",f=v.querySelector(":scope > dialog");if(document.querySelector("*:not([data-keep-open]) > dialog[open]")&&document.querySelector("*:not([data-keep-open]) > dialog[open]")!=f&&b.closest("dialog[open]")!=document.querySelector("*:not([data-keep-open]) > dialog[open]")&&document.querySelector("*:not([data-keep-open]) > dialog[open]").close(),Array.from(document.querySelectorAll(".dialog__wrapper > button")).forEach((L,S)=>{L.removeAttribute("aria-expanded")}),f.hasAttribute("open"))f.close(),u="closePopover",f.removeAttribute("style"),b.removeAttribute("aria-expanded");else{f.show(),b.setAttribute("aria-expanded",!0);var m=b.getBoundingClientRect(),p=m.top,y=m.left;if(b.closest("iam-table")){var g=b.closest("iam-table").parentNode.getBoundingClientRect();p-=g.top,y-=g.left}f.classList.contains("dialog--fix")&&f.setAttribute("style","position:fixed;top: ".concat(p,"px; left: ").concat(y,"px; margin: 3rem 0 0 0;"))}var A=f.getBoundingClientRect(),q=A.bottom-window.scrollY,x=window.innerHeight-window.scrollY;if(q>x){var k=f.hasAttribute("style")?f.getAttribute("style")+" ":"";f.setAttribute("style",k+"transform: translate(0, calc(-100% - 4rem))"),A=f.getBoundingClientRect();var w=A.top-window.scrollY;w<100&&f.removeAttribute("style")}window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:u,id:b.textContent})}t&&t.target instanceof HTMLElement&&!t.target.closest("dialog[open]")&&!t.target.closest(".dialog__wrapper > button")&&(document.querySelector(".dialog__wrapper:not([data-keep-open]) > dialog[open]")&&document.querySelector(".dialog__wrapper:not([data-keep-open]) > dialog[open]").close(),Array.from(document.querySelectorAll(".dialog__wrapper:not([data-keep-open]) > button")).forEach((L,S)=>{L.removeAttribute("aria-expanded")}))}),null),X=r=>{var t=r.querySelector(".youtube-embed a");if(t&&U(t),r.classList.contains("dialog--multi")&&!r.querySelector(":scope > .steps")&&vt(r),!r.querySelector(":scope .mh-lg")&&!r.classList.contains("dialog--multi")){r.innerHTML='<div class="mh-lg">'.concat(r.innerHTML,"</div>");var e=r.querySelector(".mh-lg"),a=r.querySelector(".mh-lg :is(.h1,.h2,.h3,.h4,.h5,.h6)");if(a){var i=a.previousSibling;e.before(a),i&&a.before(i)}}r.querySelector(":scope > button:first-child")||r.insertAdjacentHTML("afterbegin",'<button class="dialog__close">Close</button>')},vt=r=>{var t="",e=Array.from(r.querySelectorAll("fieldset[data-title]")),a=r.querySelector("form");e.forEach((s,l)=>{t+='<button data-title="'.concat(s.getAttribute("data-title"),'" type="button" class="').concat(l==0?"active":"",'" tabindex="-1">').concat(s.getAttribute("data-title"),"</button>");var h=document.createElement("div");if(h.classList.add("btn--wrapper"),s.appendChild(h),l!=0&&(h.innerHTML+='<button data-title="'.concat(e[l-1].getAttribute("data-title"),'" class="btn btn-secondary mb-0" data-previous type="button">Previous</button>')),l!=e.length-1&&(h.innerHTML+='<button data-title="'.concat(e[l+1].getAttribute("data-title"),'" class="btn btn-primary mb-0" data-next type="button">Next</button>')),l==e.length-1)if(a&&a.querySelector(':scope > button[type="submit"]')){var b=a.querySelector(':scope > button[type="submit"]');b.classList.add("mb-0"),h.insertAdjacentElement("beforeend",b)}else h.innerHTML+='<button data-title="'.concat(e[l].getAttribute("data-title"),'" class="btn btn-primary mb-0" data-next type="submit">Submit</button>')}),r.insertAdjacentHTML("afterbegin",'<div class="steps bg-primary">'.concat(t,"</div>"));for(var i=Array.from(r.querySelectorAll("fieldset.was-validated")),c=0;c<i.length;c++){var o=i[c],n=o.getAttribute("data-title");if(o.querySelector(".is-invalid")){Array.from(r.querySelectorAll('[data-title="'.concat(n,'"]'))).forEach((s,l)=>{s.classList.add("active")});break}else Array.from(r.querySelectorAll('[data-title="'.concat(n,'"]'))).forEach((s,l)=>{s.classList.add("valid")})}r.addEventListener("invalid",function(){return function(s){s.preventDefault()}}(),!0);function d(s){var l=r.querySelector("fieldset.active")?r.querySelector("fieldset.active"):r.querySelector("fieldset[data-title]"),h=l.getAttribute("data-title"),b=!0;if(l.classList.add("was-validated"),Array.from(l.querySelectorAll("input")).forEach((p,y)=>{p.checkValidity()||(b=!1)}),b?Array.from(r.querySelectorAll('[data-title="'.concat(h,'"]'))).forEach((p,y)=>{p.classList.add("valid")}):Array.from(r.querySelectorAll('[data-title="'.concat(h,'"]'))).forEach((p,y)=>{p.classList.remove("valid")}),b||!s.hasAttribute("data-next")){var v=r.querySelector('fieldset[data-title="'.concat(s.getAttribute("data-title"),'"]')),u=r.querySelector('.steps button[data-title="'.concat(s.getAttribute("data-title"),'"]'));Array.from(r.querySelectorAll("button")).forEach((p,y)=>{p.classList.remove("active")}),Array.from(r.querySelectorAll("fieldset")).forEach((p,y)=>{p.classList.remove("active")}),u.classList.add("active"),v.classList.add("active")}var f=Array.from(r.querySelectorAll("fieldset")).length,m=Array.from(r.querySelectorAll("fieldset.valid")).length;r.style.setProperty("--progress","".concat(m/(f-1)*100,"%"))}r.addEventListener("keydown",s=>{if(s&&s.target instanceof HTMLElement&&s.target.closest("button")){var l=s.target.closest("button");s.keyCode==13&&l.getAttribute("type")!="submit"&&(s.preventDefault(),d(l))}if(s&&s.target instanceof HTMLElement&&s.target.closest("input")){var h=s.target.closest("input");h.classList.remove("is-invalid"),s.keyCode==13&&s.preventDefault()}}),r.addEventListener("click",s=>{if(s&&s.target instanceof HTMLElement&&s.target.closest('button[type="submit"]')){var l=s.target.closest("form");l.classList.add("was-validated")}else if(s&&s.target instanceof HTMLElement&&s.target.closest("button[data-title]")){var h=s.target.closest("button[data-title]");d(h)}return null})};function mt(){window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"Pageview",pageTitle:document.title}),document.addEventListener("click",r=>{var t=r.target.closest("[open] summary");if(t)window.dataLayer.push({event:"closeDetails",detailsTitle:t.textContent||""});else{var e=r.target.closest("summary"),a=r.target.closest("a"),i=r.target.closest("button");e&&window.dataLayer.push({event:"openDetails",detailsTitle:e.textContent||""}),a&&window.dataLayer.push({event:"linkClicked",linkText:a.hasAttribute("title")?a.getAttribute("title")||"":a.textContent||"",class:a.hasAttribute("class")&&a.getAttribute("class")||"",href:a.getAttribute("href")||""}),i&&window.dataLayer.push({event:"buttonClicked",buttonText:i.textContent||"",class:i.hasAttribute("class")&&i.getAttribute("class")||""})}})}function pt(r){var t=new TextEncoder("utf-8").encode(r);return crypto.subtle.digest("SHA-1",t).then(function(e){for(var a=[],i=new DataView(e),c=0;c<i.byteLength;c+=4){var o=i.getUint32(c),n=o.toString(16),d="00000000",s=(d+n).slice(-d.length);a.push(s)}return a.join("")})}var gt=(r,t)=>{pt(r).then(function(e){var a=new XMLHttpRequest;a.addEventListener("load",function(){var i=this.responseText.split(`
|
|
5
5
|
`),c=e.slice(5).toUpperCase(),o=!1;for(var n in i)if(i[n].substring(0,35)==c){o=!0;break}var d=new CustomEvent("hibpCheck",{detail:o});t.dispatchEvent(d)}),a.open("GET","https://api.pwnedpasswords.com/range/"+e.substr(0,5)),a.send()})},yt=r=>{function t(){if(Array.from(document.querySelectorAll("input[maxlength],textarea[maxlength]")).forEach((a,i)=>{a.parentElement,At(a)}),Array.from(document.querySelectorAll("label input")).forEach((a,i)=>{!a.closest("label").querySelector(".optional-text")&&!a.hasAttribute("required")&&(a.parentNode.tagName.toLowerCase()=="span"?a.parentElement.insertAdjacentHTML("beforebegin",'<span class="optional-text"></span>'):a.insertAdjacentHTML("beforebegin",'<span class="optional-text"></span>'))}),document.querySelector('input[type="date"]')){let a=function(i){var c=i.getFullYear(),o=String(i.getMonth()+1).padStart(2,"0"),n=String(i.getDate()).padStart(2,"0");return"".concat(c,"-").concat(o,"-").concat(n)};var e=new Date;Array.from(document.querySelectorAll('input[type="date"]')).forEach((i,c)=>{var o=e;if(i.hasAttribute("data-start")&&(o.setDate(o.getDate()+parseInt(i.getAttribute("data-start"))),i.setAttribute("min",a(o))),i.hasAttribute("data-period")){var n=parseInt(i.getAttribute("data-period")),d=new Date;d.setDate(o.getDate()+n),i.setAttribute("max",a(d))}if(i.hasAttribute("data-allowed-days")){var s=JSON.parse("[".concat(i.getAttribute("data-allowed-days"),"]"));i.addEventListener("input",function(l){var h=new Date(this.value).getUTCDay();s.includes(h)?i.setCustomValidity(""):i.setCustomValidity("That day of the week is not allowed")})}})}}document.readyState==="complete"&&t(),document.onreadystatechange=()=>{document.readyState==="complete"&&t()},r.addEventListener("input",e=>{if(e&&e.target instanceof HTMLElement&&e.target.closest("input,textarea,select")){var a=e.target.closest("input,textarea,select");a.parentElement,a.hasAttribute("type")&&a.getAttribute("type")=="color"&&(a.nextElementSibling.value=a.value),a.hasAttribute("maxlength")&&a.nextElementSibling&&a.nextElementSibling.setAttribute("data-count",a.value.length),a.hasAttribute("data-strength-checker")&&wt(a)}}),r.addEventListener("change",e=>{if(e&&e.target instanceof HTMLElement&&e.target.closest("select")){var a=e.target.closest("select");if(a.hasAttribute("data-change-type")&&a.hasAttribute("data-input")){var i=document.getElementById(a.getAttribute("data-input")),c=a.value;J(i,c)}}if(e&&e.target instanceof HTMLElement&&e.target.closest('dialog [type="radio"]')){var o=e.target.closest("dialog");e.target.closest('dialog [type="radio"]'),Array.from(o.querySelectorAll('[type="radio"][autofocus]')).forEach((n,d)=>{n.removeAttribute("autofocus")}),Array.from(o.querySelectorAll('[type="radio"]:checked')).forEach((n,d)=>{n.setAttribute("autofocus",!0)})}}),r.addEventListener("click",e=>{if(e&&e.target instanceof HTMLElement&&e.target.closest("[data-change-type][data-input]:not(select)")){var a=e.target.closest("[data-change-type]"),i=document.getElementById(a.getAttribute("data-input")),c=a.getAttribute("data-change-type");if(a.setAttribute("data-change-type",i.getAttribute("type")),J(i,c),a.hasAttribute("data-alt-class")){var o=a.getAttribute("data-alt-class");a.setAttribute("data-alt-class",a.getAttribute("class")),a.setAttribute("class",o)}}})},At=r=>{var t=r.parentElement,e=r.getAttribute("maxlength");t.style.setProperty("--maxlength",e);var a=r.nextElementSibling;(!a||a&&a.classList.contains("invalid-feedback"))&&(a=document.createElement("span"),t.insertBefore(a,r.nextSibling)),a.setAttribute("data-count",r.value.length)},J=(r,t)=>{r.hasAttribute("type")&&r.getAttribute("type")=="password"&&r.setAttribute("data-password-type",!0),r.setAttribute("type",t)},wt=function r(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"no",a=document.getElementById(t.getAttribute("data-strength-checker")),i=t.value,c=t.hasAttribute("minlength")?t.getAttribute("minlength"):12,o=1,n=["Very weak","Weak","Average","Strong","Very strong"],d="";if(i.match(/(?=.*[0-9])/)&&(o+=1),i.match(/(?=.*[!,%,&,#,$,^,*,?,_,~,<,>,])/)&&(o+=1),i.match(/(?=.*[a-z])/)&&(o+=1),i.match(/(?=.*[A-Z])/)&&(o+=1),i.length<c&&(o=1,d="(must be at least ".concat(c," characters.)")),o>=3&&e=="no"){let s=function(l,h){l.detail?r(h,"danger"):r(h,"success"),h.removeEventListener("hibpCheck",s)};gt(i,t),t.addEventListener("hibpCheck",function(l){s(l,t)})}else o>=3&&e=="danger"&&(o=3,d="(this password is very common)");a&&(o<=3?a.classList.add("invalid-feedback"):a.classList.remove("invalid-feedback"),a.setAttribute("data-strength",o),a.innerHTML="Password strength: ".concat(n[o-1]," ").concat(d))},Lt=r=>{if(Array.from(r.querySelectorAll("details")).forEach((e,a)=>{e.addEventListener("mouseenter",function(i){window.matchMedia("(min-width: 62em)").matches&&e.setAttribute("open","true")},!1),e.addEventListener("mouseleave",function(i){window.matchMedia("(min-width: 62em)").matches&&e.removeAttribute("open")},!1)}),"IntersectionObserver"in window){var t=new IntersectionObserver(e=>{var[a]=e;return a.target.classList.toggle("is-stuck",a.intersectionRatio<1)},{threshold:[1]});t.observe(r)}};function St(r){var t,e=r.querySelector(".testimonial__images"),a=e.querySelectorAll("img").length;if(a==1)return!1;r.classList.add("testimonial--multi");var i=function(o){var n=r.querySelector(".btn-next"),d=r.querySelector(".btn-prev");n.setAttribute("data-go",o+1),d.setAttribute("data-go",o-1),n.removeAttribute("disabled"),d.removeAttribute("disabled"),o==1?d.setAttribute("disabled",!0):o==a&&n.setAttribute("disabled",!0)};e.addEventListener("scroll",function(c){clearTimeout(t),t=setTimeout(function(){var o=e.scrollWidth,n=e.scrollHeight,d=e.scrollLeft,s=e.scrollTop,l=Math.round(d/o*a)+1;d==0&&s!=0&&(l=Math.round(s/n*a)+1),r.setAttribute("data-show",l),i(l)},300)},!1),r.addEventListener("click",function(c){for(var o=c.target;o&&o!=this;o=o.parentNode)if(o.matches("[data-go]")){var n=parseInt(o.getAttribute("data-go")),d=0,s=0,l=e.scrollWidth,h=e.scrollHeight;l>h?s=Math.floor(l*((n-1)/a)):d=Math.floor(h*((n-1)/a)),e.scroll({top:d,left:s,behavior:"smooth"});break}},!1)}function Et(r,t){var e,a=r.querySelector(".carousel__inner"),i=r.querySelector(".carousel__controls"),c=t.querySelectorAll(":scope > .col").length;a.addEventListener("scroll",function(o){clearTimeout(e),e=setTimeout(function(){var n=a.clientWidth,d=a.scrollWidth,s=a.scrollLeft,l=Math.round(s/d*c)+1,h=t.querySelector(":scope > .col").scrollWidth,b=t.querySelector(":scope > .col:last-child").offsetLeft,v=a.scrollLeft+n+a.getBoundingClientRect().left>=b+60,u=Math.round(n/h),f=Math.ceil(c/u)*u-c;f>0&&v&&(l=Math.floor(c/u)*u+1),Array.from(r.querySelectorAll(".carousel__controls button")).forEach((m,p)=>{m.removeAttribute("aria-current")}),r.querySelector(".control-"+l).setAttribute("aria-current",!0),l==1?r.querySelector(".btn-prev").setAttribute("disabled","disabled"):r.querySelector(".btn-prev").removeAttribute("disabled"),l>c-u?r.querySelector(".btn-next").setAttribute("disabled","disabled"):r.querySelector(".btn-next").removeAttribute("disabled")},100)},!1),i.addEventListener("click",function(o){for(var n=o.target;n&&n!=this;n=n.parentNode)if(typeof n.matches=="function"&&n.matches("button")){o.preventDefault(),Array.from(i.querySelectorAll("button")).forEach((s,l)=>{s.removeAttribute("aria-current")}),n.setAttribute("aria-current",!0);var d=t.querySelector(":scope > *:nth-child(".concat(n.getAttribute("data-slide"),")"));a.scroll({top:0,left:d.offsetLeft-a.getBoundingClientRect().left,behavior:"smooth"});break}},!1),r.addEventListener("click",function(o){var n=a.clientWidth;a.scrollWidth;for(var d=t.querySelector(":scope > .col").scrollWidth,s=Math.round(n/d),l=t.querySelector(":scope > .col:last-child").offsetLeft,h=a.scrollLeft+n+a.getBoundingClientRect().left>=l+60,b=Math.ceil(c/s)*s-c,v=s-b,u=h&&b>0?v*d:a.clientWidth,f=o.target;f&&f!=this;f=f.parentNode)if(typeof f.matches=="function"&&f.matches(".btn-next, .btn-prev")){o.preventDefault();var m=f.classList.contains("btn-prev")?a.scrollLeft-u:a.scrollLeft+a.clientWidth;a.scroll({top:0,left:m,behavior:"smooth"});break}},!1)}function qt(r){r.addEventListener("change",function(t){var e=parseInt(r.querySelector("[data-min] select,[data-min] input").value),a=parseInt(r.querySelector("[data-max] select,[data-max] input").value);Array.from(r.querySelectorAll("[data-min] input")).forEach((i,c)=>{i.setAttribute("max",a)}),Array.from(r.querySelectorAll("[data-max] input")).forEach((i,c)=>{i.setAttribute("min",e)}),Array.from(r.querySelectorAll("[data-min] select option")).forEach((i,c)=>{parseInt(i.getAttribute("value"))>a?i.classList.add("d-none"):i.classList.remove("d-none")}),Array.from(r.querySelectorAll("[data-max] select option")).forEach((i,c)=>{parseInt(i.getAttribute("value"))<e?i.classList.add("d-none"):i.classList.remove("d-none")})},!1)}function xt(r){r.addEventListener("change",function(t){if(r.matches("[data-value-if]")){var e=r.getAttribute("data-redirect"),a=r.getAttribute("data-value-if");r.value==a&&(document.location.href=e)}else typeof r.value<"u"&&(document.location.href=r.value)},!1)}function kt(r){var t=r.querySelector(".row"),e=t.cloneNode(!0),a=r.querySelector("[data-add]");r.addEventListener("click",function(i){for(var c=i.target;c&&c!=this;c=c.parentNode){if(c.matches("[data-add]")){var o=e.cloneNode(!0);r.insertBefore(o,c),a.matches("[data-maxfiles]")&&Array.from(r.querySelectorAll(":scope > .row")).length>=a.dataset.maxfiles&&a.setAttribute("disabled","disabled");break}if(c.matches("[data-delete]")){var n=c.closest(".row");n.remove(),a.matches("[data-maxfiles]")&&Array.from(r.querySelectorAll(":scope > .row")).length<a.dataset.maxfiles&&a.removeAttribute("disabled");break}}},!1)}function Tt(r){Array.from(r.querySelectorAll("[data-input-range]")).forEach((t,e)=>{qt(t)}),Array.from(r.querySelectorAll("[data-redirect]")).forEach((t,e)=>{xt(t)}),Array.from(r.querySelectorAll(".multiple-file-uploads")).forEach((t,e)=>{kt(t)}),r.addEventListener("change",function(t){for(var e=t.target;e&&e!=this;e=e.parentNode)if(e.matches('[type="file"][data-filesize]')&&e.files&&e.files[0]){var a=e.dataset.filesize;e.files[0].size>a&&(e.value="",alert("File too large"));break}},!1),r.addEventListener("change",function(t){Array.from(r.querySelectorAll("select[data-activeif][data-equals],input[data-activeif][data-equals]")).forEach((e,a)=>{var i=e.closest("[data-group]")?e.closest("[data-group]"):r,c=e.dataset.activeif,o=e.dataset.equals,n=i.querySelector('select[data-id="'.concat(c,'"],input[data-id="').concat(c,'"]'));n.value==o?e.removeAttribute("disabled"):(e.setAttribute("disabled","disabled"),e.value="")}),Array.from(r.querySelectorAll(".form-control__wrapper[data-displayif][data-equals]")).forEach((e,a)=>{var i=e.closest("[data-group]")?e.closest("[data-group]"):r,c=e.dataset.activeif,o=e.dataset.equals,n=i.querySelector('select[data-id="'.concat(c,'"],input[data-id="').concat(c,'"]'));n.value==o?e.classList.remove("d-none"):e.classList.add("d-none")})},!1)}window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"customElementRegistered",element:"header"});class Ct extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"});var t=document.body.hasAttribute("data-assets-location")?document.body.getAttribute("data-assets-location"):"/assets",e=document.body.hasAttribute("data-core-css")?document.body.getAttribute("data-core-css"):"".concat(t,"/css/core.min.css"),a='@import "'.concat(t,'/css/components/header.css";'),i=document.createElement("template");i.innerHTML=`
|