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

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 (141) 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/calendar.component.css +1 -1
  4. package/assets/css/components/calendar.component.css.map +1 -1
  5. package/assets/css/components/card.component.css +1 -1
  6. package/assets/css/components/card.component.css.map +1 -1
  7. package/assets/css/components/carousel.config.css +1 -1
  8. package/assets/css/components/carousel.config.css.map +1 -1
  9. package/assets/css/components/modal.component.css +1 -1
  10. package/assets/css/components/modal.component.css.map +1 -1
  11. package/assets/css/components/multi-step-modal.component.css +1 -1
  12. package/assets/css/components/multi-step-modal.component.css.map +1 -1
  13. package/assets/css/components/nav.component.css +1 -1
  14. package/assets/css/components/nav.component.css.map +1 -1
  15. package/assets/css/components/nav.global.css +1 -1
  16. package/assets/css/components/nav.global.css.map +1 -1
  17. package/assets/css/components/notification.global.css +1 -1
  18. package/assets/css/components/notification.global.css.map +1 -1
  19. package/assets/css/components/std-nav-standalone.component.css +1 -1
  20. package/assets/css/components/std-nav-standalone.component.css.map +1 -1
  21. package/assets/css/components/video-card.component.css +1 -1
  22. package/assets/css/components/video-card.component.css.map +1 -1
  23. package/assets/css/components/video-modal.component.css +1 -1
  24. package/assets/css/components/video-modal.component.css.map +1 -1
  25. package/assets/css/core.min.css +1 -1
  26. package/assets/css/core.min.css.map +1 -1
  27. package/assets/css/elements/dialog.css +1 -1
  28. package/assets/css/elements/dialog.css.map +1 -1
  29. package/assets/css/style.min.css +1 -1
  30. package/assets/css/style.min.css.map +1 -1
  31. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  32. package/assets/js/components/actionbar/actionbar.component.min.js +3 -3
  33. package/assets/js/components/address-lookup/address-lookup.component.min.js +2 -2
  34. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  35. package/assets/js/components/advanced-select/advanced-select.component.min.js +1 -1
  36. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  37. package/assets/js/components/banner/banner.component.min.js +1 -1
  38. package/assets/js/components/barchart/barchart.component.min.js +1 -1
  39. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  40. package/assets/js/components/bone/bone.component.min.js +1 -1
  41. package/assets/js/components/button/button.component.min.js +1 -1
  42. package/assets/js/components/calendar/calendar.component.min.js +2 -2
  43. package/assets/js/components/card/card.component.min.js +6 -6
  44. package/assets/js/components/card/card.component.min.js.map +1 -1
  45. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  46. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  47. package/assets/js/components/config/config.component.min.js +2 -2
  48. package/assets/js/components/config/config.component.min.js.map +1 -1
  49. package/assets/js/components/content/content.component.min.js +1 -1
  50. package/assets/js/components/darkmode/darkmode.component.min.js +1 -1
  51. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +1 -1
  52. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  53. package/assets/js/components/filter-card/filter-card.component.min.js +2 -2
  54. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  55. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  56. package/assets/js/components/form/form.component.js +42 -151
  57. package/assets/js/components/form/form.component.min.js +3 -3
  58. package/assets/js/components/form/form.component.min.js.map +1 -1
  59. package/assets/js/components/header/header.component.min.js +1 -1
  60. package/assets/js/components/inline-edit/inline-edit.component.min.js +2 -2
  61. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  62. package/assets/js/components/input/input.component.min.js +1 -1
  63. package/assets/js/components/input-range/input-range.component.min.js +1 -1
  64. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  65. package/assets/js/components/menu/menu.component.min.js +1 -1
  66. package/assets/js/components/milestone/milestone.component.min.js +1 -1
  67. package/assets/js/components/milestone-group/milestone-group.component.min.js +1 -1
  68. package/assets/js/components/modal/modal.component.js +16 -11
  69. package/assets/js/components/modal/modal.component.min.js +7 -7
  70. package/assets/js/components/modal/modal.component.min.js.map +1 -1
  71. package/assets/js/components/multi-step/multi-step.component.min.js +2 -2
  72. package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -1
  73. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js +4 -4
  74. package/assets/js/components/multi-step-modal/multi-step-modal.component.min.js.map +1 -1
  75. package/assets/js/components/multiselect/multiselect.component.min.js +2 -2
  76. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  77. package/assets/js/components/nav/nav.component.js +88 -79
  78. package/assets/js/components/nav/nav.component.min.js +8 -8
  79. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  80. package/assets/js/components/notification/notification.component.min.js +2 -2
  81. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  82. package/assets/js/components/password/password.component.min.js +1 -1
  83. package/assets/js/components/popover/popover.component.min.js +1 -1
  84. package/assets/js/components/rank/rank.component.min.js +1 -1
  85. package/assets/js/components/rankings/rankings.component.min.js +1 -1
  86. package/assets/js/components/rating/rating.component.min.js +1 -1
  87. package/assets/js/components/record-card/record-card.component.min.js +2 -2
  88. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  89. package/assets/js/components/search/search.component.js +2 -1
  90. package/assets/js/components/search/search.component.min.js +3 -3
  91. package/assets/js/components/search/search.component.min.js.map +1 -1
  92. package/assets/js/components/skeleton/skeleton.component.min.js +1 -1
  93. package/assets/js/components/slider/slider.component.min.js +1 -1
  94. package/assets/js/components/split-button/split-button.component.min.js +1 -1
  95. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js +3 -3
  96. package/assets/js/components/std-address-lookup/std-address-lookup.component.min.js.map +1 -1
  97. package/assets/js/components/std-nav/std-nav.component.js +2 -0
  98. package/assets/js/components/std-nav/std-nav.component.min.js +12 -12
  99. package/assets/js/components/std-nav/std-nav.component.min.js.map +1 -1
  100. package/assets/js/components/std-nav-standalone/std-nav-standalone.component.min.js +2 -2
  101. package/assets/js/components/table/table.component.min.js +1 -1
  102. package/assets/js/components/table-ajax/table-ajax.component.min.js +1 -1
  103. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  104. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +1 -1
  105. package/assets/js/components/table-submit/table-submit.component.min.js +1 -1
  106. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  107. package/assets/js/components/tag/tag.component.min.js +2 -2
  108. package/assets/js/components/tag/tag.component.min.js.map +1 -1
  109. package/assets/js/components/tooltip/tooltip.component.min.js +1 -1
  110. package/assets/js/components/video/video.component.min.js +1 -1
  111. package/assets/js/components/video-card/video-card.component.min.js +6 -6
  112. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  113. package/assets/js/components/video-modal/video-modal.component.min.js +5 -5
  114. package/assets/js/components/word-count/word-count.component.min.js +1 -1
  115. package/assets/js/modules/card.module.js +1 -1
  116. package/assets/js/modules/form.js +129 -0
  117. package/assets/js/modules/form.test.js +132 -0
  118. package/assets/js/modules/test-dom.js +5 -0
  119. package/assets/js/scripts.bundle.js +1 -1
  120. package/assets/js/scripts.bundle.min.js +1 -1
  121. package/assets/sass/_utilities.scss +1 -0
  122. package/assets/sass/components/carousel.config.scss +5 -0
  123. package/assets/sass/components/modal.component.scss +5 -1
  124. package/assets/sass/components/nav.global.scss +0 -10
  125. package/assets/sass/components/notification.global.scss +8 -0
  126. package/assets/sass/elements/dialog.scss +43 -0
  127. package/assets/sass/foundations/colours.scss +15 -24
  128. package/assets/sass/foundations/reboot.scss +4 -0
  129. package/assets/sass/utilities/wordpress.css +7 -0
  130. package/assets/ts/components/form/form.component.ts +54 -213
  131. package/assets/ts/components/modal/modal.component.ts +27 -19
  132. package/assets/ts/components/nav/nav.component.ts +107 -95
  133. package/assets/ts/components/search/search.component.ts +5 -1
  134. package/assets/ts/components/std-nav/std-nav.component.ts +3 -1
  135. package/assets/ts/modules/card.module.ts +1 -1
  136. package/assets/ts/modules/form.test.ts +183 -0
  137. package/assets/ts/modules/form.ts +210 -0
  138. package/assets/ts/modules/test-dom.ts +5 -0
  139. package/dist/components.es.js +2662 -1246
  140. package/dist/components.umd.js +372 -372
  141. package/package.json +5 -5
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * iamKey v7.8.2--beta4
2
+ * iamKey v7.8.2--beta6
3
3
  * Copyright 2022-2026 iamproperty
4
4
  */(function(w){typeof define=="function"&&define.amd?define(w):w()})((function(){"use strict";var w=a=>{a.classList.add("js-enabled"),(navigator.userAgent.indexOf("MSIE")!==-1||navigator.appVersion.indexOf("Trident/")>0)&&a.classList.add("ie")},N=a=>{var e=function(s){var r=document.querySelector('label[for="'.concat(s.replace("#",""),'"]')),n=document.querySelector(s+" summary"),u=document.querySelector("dialog".concat(s)),i=document.querySelector("detail".concat(s));r instanceof HTMLElement?r.click():n instanceof HTMLElement?n.click():u instanceof HTMLElement?u.showModal():i instanceof HTMLElement&&i.addAttribute("open")};location.hash&&e(location.hash),window.addEventListener("hashchange",function(){e(location.hash)},!1),addEventListener("popstate",o=>{if(o&&o.state&&o.state.type&&o.state.type=="pagination"){var s=document.querySelector("#".concat(o.state.form)),r=document.querySelector("#".concat(o.state.form," [data-pagination]"));r?r.value=o.state.page:s.innerHTML+='<input name="page" type="hidden" data-pagination="true" value="'.concat(o.state.page,'" />'),s.dispatchEvent(new Event("submit"))}}),Array.from(document.querySelectorAll("form")).forEach(o=>{o?.closest("iam-form")||o.addEventListener("submit",s=>{var r;o.querySelector(":invalid")&&(o.classList.add("was-validated"),(r=o?.querySelector("input:invalid"))===null||r===void 0||r.scrollIntoView(),s.preventDefault())})}),document.addEventListener("click",o=>{var s;if(o&&o.target instanceof HTMLElement&&o.target.matches("form button:not([type=button])")){var r=o.target.closest("form");r?.closest("iam-form")||(Array.from(r.querySelectorAll("[data-password-type]")).forEach(n=>{n.setAttribute("type","password")}),(r.querySelector(":invalid")||r.querySelector('.pwd-checker[data-strength="1"]')||r.querySelector('.pwd-checker[data-strength="2"]'))&&(r.classList.add("was-validated"),(s=r?.querySelector("input:invalid"))===null||s===void 0||s.scrollIntoView(),o.preventDefault()),r.querySelector("iam-multiselect[data-is-required][data-error]")&&(r.classList.add("was-validated"),o.preventDefault()))}}),document.addEventListener("keydown",o=>{o.key==="Escape"&&document.querySelector(".dialog--transactional[open], .dialog--acknowledgement[open]")&&(o.preventDefault(),o.stopPropagation())}),Array.from(document.querySelectorAll("label progress")).forEach(o=>{var s=o.closest("label");s.setAttribute("data-percent",o.getAttribute("value"))})},f=window;function M(){f.dataLayer=f.dataLayer||[],f.dataLayer.push({event:"Pageview",pageTitle:document.title}),document.addEventListener("click",a=>{var e=a.target.closest("[open] summary");if(e)f.dataLayer.push({event:"closeDetails",detailsTitle:e.textContent||""});else{var o=a.target.closest("summary"),s=a.target.closest("a"),r=a.target.closest("button");o&&f.dataLayer.push({event:"openDetails",detailsTitle:o.textContent||""}),s&&f.dataLayer.push({event:"linkClicked",linkText:s.hasAttribute("title")?s.getAttribute("title")||"":s.textContent||"",class:s.hasAttribute("class")&&s.getAttribute("class")||"",href:s.getAttribute("href")||""}),r&&f.dataLayer.push({event:"buttonClicked",buttonText:r.textContent||"",class:r.hasAttribute("class")&&r.getAttribute("class")||""})}})}window.triggerDynamicEvent=function(a){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"change";console.log("event"),a.hasAttribute("data-change-events")&&e=="change"&&T(a,a.getAttribute("data-change-events")),a.hasAttribute("data-click-events")&&e=="click"&&T(a,a.getAttribute("data-click-events"))};var C=()=>{document.addEventListener("change",a=>{a&&a.target instanceof HTMLElement&&a.target.closest("[data-change-events]")&&T(a.target,a.target.closest("[data-change-events]").getAttribute("data-change-events"))}),document.addEventListener("keyup",a=>{a&&a.target instanceof HTMLElement&&a.target.closest("[data-change-events]")&&T(a.target,a.target.closest("[data-change-events]").getAttribute("data-change-events"))}),document.addEventListener("click",a=>{a&&a.target instanceof HTMLElement&&a.target.closest("[data-click-events]")&&T(a.target,a.target.closest("[data-click-events]").getAttribute("data-click-events"))})},T=(a,e)=>{if(e||(e=a.parentNode.getAttribute("data-change-events")),!e)return!1;Array.from(JSON.parse(e)).forEach(o=>{D(a,o)})},D=(a,e)=>{if("matches"in e)return e.matches=="any"||a.value==e.matches?m(a,e,"if"):m(a,e,"else"),!1;if("in-list"in e){var o=document.querySelector("".concat(e["in-list"],' option[value="').concat(a.value,'"]'));return document.querySelector("".concat(e["in-list"],' option[value="').concat(a.value,'"]'))?m(o,e,"if"):m(o,e,"else"),!1}else"event"in e&&m(a,e,"event")},m=(a,e,o)=>{if(!(o in e))return!1;switch(e[o]){case"hide":if(document.querySelector(e.target)){var s=document.querySelector(e.target);s.classList.add("js-hide"),Array.from(s.querySelectorAll("[data-required]")).forEach(i=>{i.removeAttribute("required")})}break;case"show":if(document.querySelector(e.target)){var r=document.querySelector(e.target);r.classList.remove("js-hide"),Array.from(r.querySelectorAll("[data-required]")).forEach(i=>{i.closest(".js-hide")||i.setAttribute("required","true")})}break;case"populate-form":I(a,e);break;case"dispatchEvent":var n=new Event(e.value);document.querySelector("".concat(e.target)).dispatchEvent(n);break;case"setAttribute":Array.from(document.querySelectorAll("".concat(e.target))).forEach(function(i){i.setAttribute(e.attribute,e.value)});break;case"focus":document.querySelector("".concat(e.target)).focus();break;case"removeAttribute":Array.from(document.querySelectorAll("".concat(e.target))).forEach(function(i){i.removeAttribute(e.attribute)});break;case"updateValue":document.querySelector("".concat(e.target)).value=e.value?e.value:"";var u=new Event("change");document.querySelector("".concat(e.target)).dispatchEvent(u);break;case"submitForm":document.querySelector("".concat(e.target)).submit();break;case"openLink":document.querySelector("".concat(e.target)).value&&(window.location.href=document.querySelector("".concat(e.target)).value);break}},I=function(e,o){var s=JSON.parse(e.getAttribute("data-values")),r=document.querySelector(o.target);if(!s)return!1;Object.keys(s).forEach(n=>{document.getElementById(n)&&document.getElementById(n).tagName=="SPAN"&&(document.getElementById(n).innerHTML=s[n]),r.querySelector('select[name="'.concat(n,'"] [value="').concat(s[n],'"]'))?(r.querySelector('select[name="'.concat(n,'"]')).value=s[n],e.hasAttribute("data-lock-fields")&&(r.querySelector('select[name="'.concat(n,'"]')).disabled=!0)):r.querySelector('input[name="'.concat(n,'"][type="radio"][value="').concat(s[n],'"]'))?(Array.from(r.querySelectorAll('input[name="'.concat(n,'"][type="radio"]'))).forEach(function(u){u.disabled=!0}),r.querySelector('input[name="'.concat(n,'"][type="radio"][value="').concat(s[n],'"]')).checked=!0,r.querySelector('input[name="'.concat(n,'"][type="radio"][value="').concat(s[n],'"]')).disabled=!1):r.querySelector('input[name="'.concat(n,'"]'))&&(r.querySelector('input[name="'.concat(n,'"]')).value=s[n],e.hasAttribute("data-lock-fields")&&r.querySelector('input[name="'.concat(n,'"]')).setAttribute("readonly","true"))})},z=()=>{var a=[],e={},o="These tests run against mark-up and content meant to test how a component or element has been integrated. Making sure that guidance setout in the design system is being followed.";window.integrationTestsIntro=o,console.log("%cVirgin Money Framework Tests","color: #E10A0A; font-size: 24px; font-weight: bold; margin-top: 20px; margin-bottom: 10px;"),console.log("%c"+o,"font-size: 14px; margin-bottom: 20px;"),console.log("%cKey","font-size: 16px;font-weight:bold;"),console.log("%c %cSuccessfully implemented","background-color: green; margin-right: 10px","background-color: transparent"),console.log("%c %cNOT implemented correctly","background-color: red; margin-right: 10px","background-color: transparent"),console.log("%c %cN/A","background-color: grey; margin-right: 10px","background-color: transparent"),console.log("%c %cWarning - No action needed","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("%c ? %cWarning - Action needed","background-color: orange; margin-right: 10px","background-color: transparent"),e={Test:"Each card with in a card deck has a footer with some CTA text via a button link",Total:0,Passes:0,Fails:0},Array.from(document.querySelectorAll(".card-deck .card")).forEach((t,c)=>{if(t.closest(".navbar")==null){var l=t.querySelector(".btn-link");l!=null&&l.textContent.length?e.Passes++:e.Fails++}}),e.Total=e.Passes+e.Fails,a.push(e),e={Test:"Article Decks need to have a background colour applied",Total:0,Passes:0,Fails:0},Array.from(document.querySelectorAll(".article-deck")).forEach((t,c)=>{var l=t.closest(".container");l!=null&&l.matches('[class*="bg-"]')?e.Passes++:e.Fails++}),e.Total=e.Passes+e.Fails,a.push(e),e={Test:"Tabs Carousel has a h2 title with a display-4 class. It should always have a strapline next to it also.",Total:0,Passes:0,Fails:0,Notes:"The site nav contains cards without a footer by design."},Array.from(document.querySelectorAll(".tabs__container--carousel")).forEach((t,c)=>{var l=t.querySelector("h2.display-4:first-child"),d=t.querySelector("h2.display-4:first-child + .strapline");l!=null&&d!=null?e.Passes++:e.Fails++}),e.Total=e.Passes+e.Fails,a.push(e),e={Test:"Split Containers can only have multiple of two columns. So either 2, 4, 6 and so on.",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--split")).forEach((t,c)=>{t.querySelectorAll(':scope > .row > [class*="col"]').length%2===0?e.Passes++:e.Fails++}),e.Total=e.Passes+e.Fails,a.push(e),e={Test:"Statement Containers with only one paragraph or text element should have the class of .h6",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--statement")).forEach((t,c)=>{t.querySelectorAll(":scope > *").length==1&&t.querySelectorAll(":scope > .h6:first-child").length==1?e.Passes++:t.querySelectorAll(":scope > *").length==1&&e.Fails++}),e.Total=e.Passes+e.Fails,a.push(e),e={Test:"CTA Containers title should always have the class of .h1",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--cta")).forEach((t,c)=>{t.querySelectorAll("h2.h1:first-child").length==1?e.Passes++:e.Fails++}),e.Total=e.Passes+e.Fails,a.push(e),console.log("%cImplementation Tests","font-size: 16px;font-weight:bold; margin-top: 20px;"),a.forEach(function(t){var c="green";t.Total===0?c="grey":t.Fails!=0&&(c="red"),t.Type=="warning"&&(c="orange"),console.groupCollapsed("%c %c"+t.Test,"background-color: "+c+"; margin-right: 10px","background-color: transparent"),console.table({Passed:{value:t.Passes},Failed:{value:t.Fails},Total:{value:t.Total}}),t.Notes!=""&&console.log(t.Notes),console.groupEnd()}),window.integrationTests=a;var s=[];e={Test:"There are XX padding classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="p-"],[class*="pt-"],[class*="pb-"],[class*="pl-"],[class*="pr-"],[class*="px-"],[class*="py-"]')).forEach((t,c)=>{e.Total++}),e.Test=e.Test.replace("XX",e.Total),s.push(e),e={Test:"There are XX margin classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="m-"],[class*="mt-"],[class*="mb-"],[class*="ml-"],[class*="mr-"],[class*="mx-"],[class*="my-"]')).forEach((t,c)=>{e.Total++}),e.Test=e.Test.replace("XX",e.Total),s.push(e),e={Test:"There are XX text modifier classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="text-"]')).forEach((t,c)=>{e.Total++}),e.Test=e.Test.replace("XX",e.Total),s.push(e),console.log("%cUtility classes","font-size: 16px;font-weight:bold;"),console.log("The use of certain utility classes is necessary at times but the over use of these classes will lead to design/layout inconsistencies."),s.forEach(function(t){var c="green";t.Total===0?c="grey":t.Fails!=0&&(c="red"),t.Type=="warning"&&(c="orange"),console.groupCollapsed("%c %c"+t.Test,"background-color: "+c+"; margin-right: 10px","background-color: transparent"),console.table({Total:{value:t.Total}}),t.Notes!=""&&console.log(t.Notes),console.groupEnd()}),console.log("%cAccessibility and Best practice Tests","font-size: 16px;font-weight:bold;");var r="green",n=1,u={};Array.from(document.querySelectorAll("h1,h2,h3,h4,h5,h6")).forEach((t,c)=>{var l=1,d=t.textContent;t.matches("h2")?l=2:t.matches("h3")?l=3:t.matches("h4")?l=4:t.matches("h5")?l=5:t.matches("h6")&&(l=6);var h=l-n<=1;c==0&&l!=1&&(h=!1);var p={"Heading Level":l,"In order":h};h?n=l:r="red",u[d]=p}),console.groupCollapsed("%c %cHeadings are in the correct order","background-color: "+r+"; margin-right: 10px","background-color: transparent"),console.table(u),console.groupEnd(),console.groupCollapsed("%c ? %cDo all of the headings make sense out of context and do they introduce the content that follows?","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("You should be able to read the below table and get an understanding of what the page content consists of. The titles should make sense when read in order and child titles should be relevant to the parent title."),console.table(u),console.groupEnd();var i={};Array.from(document.querySelectorAll("a")).forEach((t,c)=>{var l=t.getAttribute("href"),d=t.textContent,h=t.getAttribute("title"),p={Text:d,Title:h};i[l]=p}),console.groupCollapsed("%c ? %cDo all of the links make sense out of context and do they describe the page/section that it links to?","background-color: orange; margin-right: 10px","background-color: transparent"),console.table(i),console.groupEnd();var k={},y={};Array.from(document.querySelectorAll("img[alt]")).forEach((t,c)=>{var l=t.getAttribute("src"),d=t.getAttribute("alt");if(d!=""){var h={Alt:d};k[l]=h}else{var l=t.getAttribute("src"),p={};y[l]=p}}),console.groupCollapsed("%c ? %cDo all of the images with an alt tag make sense out of context and describes the image appropriately?","background-color: orange; margin-right: 10px","background-color: transparent"),console.table(k),console.log("%cImages with an empty alt tag:","font-weight: bold;"),console.table(y),console.groupEnd(),console.groupCollapsed("%c ? %cCan you navigation the page links by tabbing through the page?","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("Are all of the links, input fields and buttons accessible through using the keyboard only?"),console.groupEnd(),console.log("%cLighthouse","font-size: 16px;font-weight:bold;"),console.groupCollapsed("%c ? %cHave you ran a lighthouse report on this page","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("If you are in a modern version of chrome you can a lighthouse report by opening the lighthouse window within the devtools. This should appear as a tab link above."),console.log("This report will give you more detail about the above the tests aswell as extra tests. "),console.groupEnd(),console.log("%cImage sizes","font-size: 16px;font-weight:bold;"),console.log("The below tests work from the current screen size, so if you have your screen at a mobile viewport the scaling and sizes of images will reflect that. It is worth running the image tests in both mobile and desktop views. Simply change the screen size and refresh the page."),Array.from(document.querySelectorAll("img")).forEach((t,c)=>{if(!t.matches("[src*='http']")&&!t.matches("[src$='.svg']")){var l=t.getAttribute("src"),d=new XMLHttpRequest;d.open("HEAD",l,!0),d.onreadystatechange=function(){if(d.readyState==4)if(d.status==200){var h=d.getResponseHeader("Content-Length");if(h>1024){var p=t.naturalWidth,H=t.naturalHeight,E=t.clientWidth,B=t.clientHeight,q=(E/p).toFixed(2)=="0.00"?"Hidden":(E/p).toFixed(2),V=Math.floor(h/1024),L=(h/(p*H)).toFixed(2),v="green",F="green",x="green",S="",A="";L>.5?(v="red",F="red",S="The image has a VERY large 'Bytes per pixel' score, trying optimising the image using https://tinypng.com/."):L>.2&&(v="orange",F="orange",S="The image has a large 'Bytes per pixel' score, trying optimising the image using https://tinypng.com/."),q>1.2?(v="red",x="red",A="The image size is smaller than the size shown on screen this may cause the image to appear blurry and low quality."):q<.5?(v="red",x="red",A="The image size is VERY large compared to the size shown on screen, this means unnecessary kb's are being downloaded. Try resizing the image in photoshop or other image editing software."):q<.8&&(v="orange",x="orange",A="The image size is large compared to the size shown on screen, this means unnecessary kb's are being downloaded. Try resizing the image in photoshop or other image editing software."),console.log("%c %c "+t.src,"background: url("+t.src+"); border: 3px solid "+v+"; line-height: 30px; width: 30px; background-size: cover;","background-color: transparent"),S!=""&&console.log("%c %c"+S,"background-color: "+F+"; margin-right: 10px","background-color: transparent"),A!=""&&console.log("%c %c"+A,"background-color: "+x+"; margin-right: 10px","background-color: transparent"),console.table({Image:{Dimensions:p+"x"+H,"Scaled to":E+"x"+B,Scale:q,Filesize:V+"Kb","Bytes per pixel":L}}),console.groupEnd()}}else console.log("%c %c"+t.src+" not loaded","background-color: red; margin-right: 10px","background-color: transparent")},d.send(null)}});var g=[];if(typeof window.integrationTests<"u"&&window.integrationTests.forEach(function(t){t.Total!=0&&t.Type!="warning"&&g.push(t.Test)}),g.length!=0){var b=document.querySelector("#vmtests-display");if(b!=null){b.innerHTML=`<div class="container">
5
5
  <h2>Integration notes</h2>
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * iamKey v7.8.2--beta4
2
+ * iamKey v7.8.2--beta6
3
3
  * Copyright 2022-2026 iamproperty
4
4
  */
5
5
  !function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";var e=window;window.triggerDynamicEvent=function(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"change";console.log("event"),e.hasAttribute("data-change-events")&&"change"==a&&t(e,e.getAttribute("data-change-events")),e.hasAttribute("data-click-events")&&"click"==a&&t(e,e.getAttribute("data-click-events"))};var t=(e,t)=>{if(t||(t=e.parentNode.getAttribute("data-change-events")),!t)return!1;Array.from(JSON.parse(t)).forEach(t=>{a(e,t)})},a=(e,t)=>{if("matches"in t)return"any"==t.matches||e.value==t.matches?o(e,t,"if"):o(e,t,"else"),!1;if("in-list"in t){var a=document.querySelector("".concat(t["in-list"],' option[value="').concat(e.value,'"]'));return document.querySelector("".concat(t["in-list"],' option[value="').concat(e.value,'"]'))?o(a,t,"if"):o(a,t,"else"),!1}"event"in t&&o(e,t,"event")},o=(e,t,a)=>{if(!(a in t))return!1;switch(t[a]){case"hide":if(document.querySelector(t.target)){var o=document.querySelector(t.target);o.classList.add("js-hide"),Array.from(o.querySelectorAll("[data-required]")).forEach(e=>{e.removeAttribute("required")})}break;case"show":if(document.querySelector(t.target)){var n=document.querySelector(t.target);n.classList.remove("js-hide"),Array.from(n.querySelectorAll("[data-required]")).forEach(e=>{e.closest(".js-hide")||e.setAttribute("required","true")})}break;case"populate-form":r(e,t);break;case"dispatchEvent":var s=new Event(t.value);document.querySelector("".concat(t.target)).dispatchEvent(s);break;case"setAttribute":Array.from(document.querySelectorAll("".concat(t.target))).forEach(function(e){e.setAttribute(t.attribute,t.value)});break;case"focus":document.querySelector("".concat(t.target)).focus();break;case"removeAttribute":Array.from(document.querySelectorAll("".concat(t.target))).forEach(function(e){e.removeAttribute(t.attribute)});break;case"updateValue":document.querySelector("".concat(t.target)).value=t.value?t.value:"";var l=new Event("change");document.querySelector("".concat(t.target)).dispatchEvent(l);break;case"submitForm":document.querySelector("".concat(t.target)).submit();break;case"openLink":document.querySelector("".concat(t.target)).value&&(window.location.href=document.querySelector("".concat(t.target)).value)}},r=function(e,t){var a=JSON.parse(e.getAttribute("data-values")),o=document.querySelector(t.target);if(!a)return!1;Object.keys(a).forEach(t=>{document.getElementById(t)&&"SPAN"==document.getElementById(t).tagName&&(document.getElementById(t).innerHTML=a[t]),o.querySelector('select[name="'.concat(t,'"] [value="').concat(a[t],'"]'))?(o.querySelector('select[name="'.concat(t,'"]')).value=a[t],e.hasAttribute("data-lock-fields")&&(o.querySelector('select[name="'.concat(t,'"]')).disabled=!0)):o.querySelector('input[name="'.concat(t,'"][type="radio"][value="').concat(a[t],'"]'))?(Array.from(o.querySelectorAll('input[name="'.concat(t,'"][type="radio"]'))).forEach(function(e){e.disabled=!0}),o.querySelector('input[name="'.concat(t,'"][type="radio"][value="').concat(a[t],'"]')).checked=!0,o.querySelector('input[name="'.concat(t,'"][type="radio"][value="').concat(a[t],'"]')).disabled=!1):o.querySelector('input[name="'.concat(t,'"]'))&&(o.querySelector('input[name="'.concat(t,'"]')).value=a[t],e.hasAttribute("data-lock-fields")&&o.querySelector('input[name="'.concat(t,'"]')).setAttribute("readonly","true"))})},n=()=>{var e=[],t={},a="These tests run against mark-up and content meant to test how a component or element has been integrated. Making sure that guidance setout in the design system is being followed.";window.integrationTestsIntro=a,console.log("%cVirgin Money Framework Tests","color: #E10A0A; font-size: 24px; font-weight: bold; margin-top: 20px; margin-bottom: 10px;"),console.log("%c"+a,"font-size: 14px; margin-bottom: 20px;"),console.log("%cKey","font-size: 16px;font-weight:bold;"),console.log("%c %cSuccessfully implemented","background-color: green; margin-right: 10px","background-color: transparent"),console.log("%c %cNOT implemented correctly","background-color: red; margin-right: 10px","background-color: transparent"),console.log("%c %cN/A","background-color: grey; margin-right: 10px","background-color: transparent"),console.log("%c %cWarning - No action needed","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("%c ? %cWarning - Action needed","background-color: orange; margin-right: 10px","background-color: transparent"),t={Test:"Each card with in a card deck has a footer with some CTA text via a button link",Total:0,Passes:0,Fails:0},Array.from(document.querySelectorAll(".card-deck .card")).forEach((e,a)=>{if(null==e.closest(".navbar")){var o=e.querySelector(".btn-link");null!=o&&o.textContent.length?t.Passes++:t.Fails++}}),t.Total=t.Passes+t.Fails,e.push(t),t={Test:"Article Decks need to have a background colour applied",Total:0,Passes:0,Fails:0},Array.from(document.querySelectorAll(".article-deck")).forEach((e,a)=>{var o=e.closest(".container");null!=o&&o.matches('[class*="bg-"]')?t.Passes++:t.Fails++}),t.Total=t.Passes+t.Fails,e.push(t),t={Test:"Tabs Carousel has a h2 title with a display-4 class. It should always have a strapline next to it also.",Total:0,Passes:0,Fails:0,Notes:"The site nav contains cards without a footer by design."},Array.from(document.querySelectorAll(".tabs__container--carousel")).forEach((e,a)=>{var o=e.querySelector("h2.display-4:first-child"),r=e.querySelector("h2.display-4:first-child + .strapline");null!=o&&null!=r?t.Passes++:t.Fails++}),t.Total=t.Passes+t.Fails,e.push(t),t={Test:"Split Containers can only have multiple of two columns. So either 2, 4, 6 and so on.",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--split")).forEach((e,a)=>{e.querySelectorAll(':scope > .row > [class*="col"]').length%2==0?t.Passes++:t.Fails++}),t.Total=t.Passes+t.Fails,e.push(t),t={Test:"Statement Containers with only one paragraph or text element should have the class of .h6",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--statement")).forEach((e,a)=>{1==e.querySelectorAll(":scope > *").length&&1==e.querySelectorAll(":scope > .h6:first-child").length?t.Passes++:1==e.querySelectorAll(":scope > *").length&&t.Fails++}),t.Total=t.Passes+t.Fails,e.push(t),t={Test:"CTA Containers title should always have the class of .h1",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll(".container.container--cta")).forEach((e,a)=>{1==e.querySelectorAll("h2.h1:first-child").length?t.Passes++:t.Fails++}),t.Total=t.Passes+t.Fails,e.push(t),console.log("%cImplementation Tests","font-size: 16px;font-weight:bold; margin-top: 20px;"),e.forEach(function(e){var t="green";0===e.Total?t="grey":0!=e.Fails&&(t="red"),"warning"==e.Type&&(t="orange"),console.groupCollapsed("%c %c"+e.Test,"background-color: "+t+"; margin-right: 10px","background-color: transparent"),console.table({Passed:{value:e.Passes},Failed:{value:e.Fails},Total:{value:e.Total}}),""!=e.Notes&&console.log(e.Notes),console.groupEnd()}),window.integrationTests=e;var o=[];t={Test:"There are XX padding classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="p-"],[class*="pt-"],[class*="pb-"],[class*="pl-"],[class*="pr-"],[class*="px-"],[class*="py-"]')).forEach((e,a)=>{t.Total++}),t.Test=t.Test.replace("XX",t.Total),o.push(t),t={Test:"There are XX margin classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="m-"],[class*="mt-"],[class*="mb-"],[class*="ml-"],[class*="mr-"],[class*="mx-"],[class*="my-"]')).forEach((e,a)=>{t.Total++}),t.Test=t.Test.replace("XX",t.Total),o.push(t),t={Test:"There are XX text modifier classes being used on this page",Type:"warning",Total:0,Passes:0,Fails:0,Notes:""},Array.from(document.querySelectorAll('[class*="text-"]')).forEach((e,a)=>{t.Total++}),t.Test=t.Test.replace("XX",t.Total),o.push(t),console.log("%cUtility classes","font-size: 16px;font-weight:bold;"),console.log("The use of certain utility classes is necessary at times but the over use of these classes will lead to design/layout inconsistencies."),o.forEach(function(e){var t="green";0===e.Total?t="grey":0!=e.Fails&&(t="red"),"warning"==e.Type&&(t="orange"),console.groupCollapsed("%c %c"+e.Test,"background-color: "+t+"; margin-right: 10px","background-color: transparent"),console.table({Total:{value:e.Total}}),""!=e.Notes&&console.log(e.Notes),console.groupEnd()}),console.log("%cAccessibility and Best practice Tests","font-size: 16px;font-weight:bold;");var r="green",n=1,s={};Array.from(document.querySelectorAll("h1,h2,h3,h4,h5,h6")).forEach((e,t)=>{var a=1,o=e.textContent;e.matches("h2")?a=2:e.matches("h3")?a=3:e.matches("h4")?a=4:e.matches("h5")?a=5:e.matches("h6")&&(a=6);var l=a-n<=1;0==t&&1!=a&&(l=!1);var c={"Heading Level":a,"In order":l};l?n=a:r="red",s[o]=c}),console.groupCollapsed("%c %cHeadings are in the correct order","background-color: "+r+"; margin-right: 10px","background-color: transparent"),console.table(s),console.groupEnd(),console.groupCollapsed("%c ? %cDo all of the headings make sense out of context and do they introduce the content that follows?","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("You should be able to read the below table and get an understanding of what the page content consists of. The titles should make sense when read in order and child titles should be relevant to the parent title."),console.table(s),console.groupEnd();var l={};Array.from(document.querySelectorAll("a")).forEach((e,t)=>{var a=e.getAttribute("href"),o={Text:e.textContent,Title:e.getAttribute("title")};l[a]=o}),console.groupCollapsed("%c ? %cDo all of the links make sense out of context and do they describe the page/section that it links to?","background-color: orange; margin-right: 10px","background-color: transparent"),console.table(l),console.groupEnd();var c={},i={};Array.from(document.querySelectorAll("img[alt]")).forEach((e,t)=>{var a=e.getAttribute("src"),o=e.getAttribute("alt");if(""!=o){var r={Alt:o};c[a]=r}else a=e.getAttribute("src"),i[a]={}}),console.groupCollapsed("%c ? %cDo all of the images with an alt tag make sense out of context and describes the image appropriately?","background-color: orange; margin-right: 10px","background-color: transparent"),console.table(c),console.log("%cImages with an empty alt tag:","font-weight: bold;"),console.table(i),console.groupEnd(),console.groupCollapsed("%c ? %cCan you navigation the page links by tabbing through the page?","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("Are all of the links, input fields and buttons accessible through using the keyboard only?"),console.groupEnd(),console.log("%cLighthouse","font-size: 16px;font-weight:bold;"),console.groupCollapsed("%c ? %cHave you ran a lighthouse report on this page","background-color: orange; margin-right: 10px","background-color: transparent"),console.log("If you are in a modern version of chrome you can a lighthouse report by opening the lighthouse window within the devtools. This should appear as a tab link above."),console.log("This report will give you more detail about the above the tests aswell as extra tests. "),console.groupEnd(),console.log("%cImage sizes","font-size: 16px;font-weight:bold;"),console.log("The below tests work from the current screen size, so if you have your screen at a mobile viewport the scaling and sizes of images will reflect that. It is worth running the image tests in both mobile and desktop views. Simply change the screen size and refresh the page."),Array.from(document.querySelectorAll("img")).forEach((e,t)=>{if(!e.matches("[src*='http']")&&!e.matches("[src$='.svg']")){var a=e.getAttribute("src"),o=new XMLHttpRequest;o.open("HEAD",a,!0),o.onreadystatechange=function(){if(4==o.readyState)if(200==o.status){var t=o.getResponseHeader("Content-Length");if(t>1024){var a=e.naturalWidth,r=e.naturalHeight,n=e.clientWidth,s=e.clientHeight,l="0.00"==(n/a).toFixed(2)?"Hidden":(n/a).toFixed(2),c=Math.floor(t/1024),i=(t/(a*r)).toFixed(2),u="green",d="green",g="green",h="",p="";i>.5?(u="red",d="red",h="The image has a VERY large 'Bytes per pixel' score, trying optimising the image using https://tinypng.com/."):i>.2&&(u="orange",d="orange",h="The image has a large 'Bytes per pixel' score, trying optimising the image using https://tinypng.com/."),l>1.2?(u="red",g="red",p="The image size is smaller than the size shown on screen this may cause the image to appear blurry and low quality."):l<.5?(u="red",g="red",p="The image size is VERY large compared to the size shown on screen, this means unnecessary kb's are being downloaded. Try resizing the image in photoshop or other image editing software."):l<.8&&(u="orange",g="orange",p="The image size is large compared to the size shown on screen, this means unnecessary kb's are being downloaded. Try resizing the image in photoshop or other image editing software."),console.log("%c %c "+e.src,"background: url("+e.src+"); border: 3px solid "+u+"; line-height: 30px; width: 30px; background-size: cover;","background-color: transparent"),""!=h&&console.log("%c %c"+h,"background-color: "+d+"; margin-right: 10px","background-color: transparent"),""!=p&&console.log("%c %c"+p,"background-color: "+g+"; margin-right: 10px","background-color: transparent"),console.table({Image:{Dimensions:a+"x"+r,"Scaled to":n+"x"+s,Scale:l,Filesize:c+"Kb","Bytes per pixel":i}}),console.groupEnd()}}else console.log("%c %c"+e.src+" not loaded","background-color: red; margin-right: 10px","background-color: transparent")},o.send(null)}});var u=[];if(typeof window.integrationTests<"u"&&window.integrationTests.forEach(function(e){0!=e.Total&&"warning"!=e.Type&&u.push(e.Test)}),0!=u.length){var d=document.querySelector("#vmtests-display");if(null!=d){d.innerHTML='<div class="container">\n <h2>Integration notes</h2>\n <ul id="integrationTests"></ul>\n </div>';var g=document.getElementById("integrationTests");null!=g&&u.forEach(function(e){g.innerHTML+="<li>"+e+"</li>"})}}return null},s=Object.freeze({__proto__:null,default:n});["localhost"].includes(window.location.hostname)&&Promise.resolve().then(function(){return s}).then(e=>{window.iamTest=()=>{n()}}).catch(e=>{console.log(e.message)}),document.addEventListener("DOMContentLoaded",()=>{return a=void 0,o=void 0,n=function*(){var a,o;e.dataLayer=e.dataLayer||[],e.dataLayer.push({event:"Pageview",pageTitle:document.title}),document.addEventListener("click",t=>{var a=t.target.closest("[open] summary");if(a)e.dataLayer.push({event:"closeDetails",detailsTitle:a.textContent||""});else{var o=t.target.closest("summary"),r=t.target.closest("a"),n=t.target.closest("button");o&&e.dataLayer.push({event:"openDetails",detailsTitle:o.textContent||""}),r&&e.dataLayer.push({event:"linkClicked",linkText:r.hasAttribute("title")?r.getAttribute("title")||"":r.textContent||"",class:r.hasAttribute("class")&&r.getAttribute("class")||"",href:r.getAttribute("href")||""}),n&&e.dataLayer.push({event:"buttonClicked",buttonText:n.textContent||"",class:n.hasAttribute("class")&&n.getAttribute("class")||""})}}),document.addEventListener("change",e=>{e&&e.target instanceof HTMLElement&&e.target.closest("[data-change-events]")&&t(e.target,e.target.closest("[data-change-events]").getAttribute("data-change-events"))}),document.addEventListener("keyup",e=>{e&&e.target instanceof HTMLElement&&e.target.closest("[data-change-events]")&&t(e.target,e.target.closest("[data-change-events]").getAttribute("data-change-events"))}),document.addEventListener("click",e=>{e&&e.target instanceof HTMLElement&&e.target.closest("[data-click-events]")&&t(e.target,e.target.closest("[data-click-events]").getAttribute("data-click-events"))}),(o=document.body).classList.add("js-enabled"),(-1!==navigator.userAgent.indexOf("MSIE")||navigator.appVersion.indexOf("Trident/")>0)&&o.classList.add("ie"),a=function(e){var t=document.querySelector('label[for="'.concat(e.replace("#",""),'"]')),a=document.querySelector(e+" summary"),o=document.querySelector("dialog".concat(e)),r=document.querySelector("detail".concat(e));t instanceof HTMLElement?t.click():a instanceof HTMLElement?a.click():o instanceof HTMLElement?o.showModal():r instanceof HTMLElement&&r.addAttribute("open")},location.hash&&a(location.hash),window.addEventListener("hashchange",function(){a(location.hash)},!1),addEventListener("popstate",e=>{if(e&&e.state&&e.state.type&&"pagination"==e.state.type){var t=document.querySelector("#".concat(e.state.form)),a=document.querySelector("#".concat(e.state.form," [data-pagination]"));a?a.value=e.state.page:t.innerHTML+='<input name="page" type="hidden" data-pagination="true" value="'.concat(e.state.page,'" />'),t.dispatchEvent(new Event("submit"))}}),Array.from(document.querySelectorAll("form")).forEach(e=>{e?.closest("iam-form")||e.addEventListener("submit",t=>{var a;e.querySelector(":invalid")&&(e.classList.add("was-validated"),null===(a=e?.querySelector("input:invalid"))||void 0===a||a.scrollIntoView(),t.preventDefault())})}),document.addEventListener("click",e=>{var t;if(e&&e.target instanceof HTMLElement&&e.target.matches("form button:not([type=button])")){var a=e.target.closest("form");a?.closest("iam-form")||(Array.from(a.querySelectorAll("[data-password-type]")).forEach(e=>{e.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"),null===(t=a?.querySelector("input:invalid"))||void 0===t||t.scrollIntoView(),e.preventDefault()),a.querySelector("iam-multiselect[data-is-required][data-error]")&&(a.classList.add("was-validated"),e.preventDefault()))}}),document.addEventListener("keydown",e=>{"Escape"===e.key&&document.querySelector(".dialog--transactional[open], .dialog--acknowledgement[open]")&&(e.preventDefault(),e.stopPropagation())}),Array.from(document.querySelectorAll("label progress")).forEach(e=>{e.closest("label").setAttribute("data-percent",e.getAttribute("value"))})},new((r=void 0)||(r=Promise))(function(e,t){function s(e){try{c(n.next(e))}catch(e){t(e)}}function l(e){try{c(n.throw(e))}catch(e){t(e)}}function c(t){t.done?e(t.value):function(e){return e instanceof r?e:new r(function(t){t(e)})}(t.value).then(s,l)}c((n=n.apply(a,o||[])).next())});var a,o,r,n})});
@@ -34,3 +34,4 @@
34
34
  @use './utilities/columns';
35
35
  @use './utilities/shadow';
36
36
  @use './utilities/grid';
37
+ @use './utilities/wordpress';
@@ -573,6 +573,11 @@
573
573
  --card-badges-bottom-padding: 0;
574
574
  --card-right-padding: 0.5rem;
575
575
  --card-left-padding: 0.5rem;
576
+
577
+ iam-card {
578
+
579
+ --card-footer-bottom-padding: 0.5rem;
580
+ }
576
581
  }
577
582
  /* #endregon */
578
583
  }
@@ -7,10 +7,14 @@
7
7
  overscroll-behavior: contain;
8
8
 
9
9
  display: block;
10
- container-type: inline-size;
10
+ container-type: revert;
11
11
 
12
12
  }
13
13
 
14
+ :host(.has-parent-dialog) dialog {
15
+ display: contents!important;
16
+ }
17
+
14
18
  ::slotted(dialog) {
15
19
  display: contents!important;
16
20
  }
@@ -1,19 +1,9 @@
1
1
  @use 'sass:math';
2
2
  @use '../_func' as *;
3
3
 
4
-
5
-
6
4
  /* Default colour */
7
5
  :is(iam-nav,.iam-nav) {
8
6
 
9
- > :not([slot="logo"],[slot="secondary"]) {
10
- color-scheme: light;
11
- }
12
-
13
- > [slot="secondary"] {
14
- color-scheme: light;
15
- }
16
-
17
7
  > .nav--menu {
18
8
  --colour-heading: var(--colour-primary-theme);
19
9
  color-scheme: light;
@@ -1,6 +1,12 @@
1
1
  @use '../_func' as *;
2
2
 
3
3
  .container.notification__holder {
4
+
5
+
6
+ position-anchor: --nav;
7
+
8
+ top: anchor(bottom);
9
+
4
10
  position: fixed;
5
11
  top: var(--nav-height);
6
12
  left: 50%;
@@ -19,6 +25,8 @@
19
25
  align-content: flex-end;
20
26
  align-items: flex-end;
21
27
 
28
+
29
+
22
30
  :is(.iam-notification, iam-notification) {
23
31
  pointer-events: all;
24
32
  margin: 0.5rem 0 0.5rem 0;
@@ -33,10 +33,12 @@
33
33
  padding-bottom: 0;
34
34
  }
35
35
  }
36
+
36
37
  dialog[open]:has(iam-modal) {
37
38
  --modal-inner-dialog-display: contents;
38
39
  place-self: center;
39
40
  }
41
+
40
42
  @media (prefers-color-scheme: light) {
41
43
  dialog[open]:has(iam-modal) {
42
44
 
@@ -47,6 +49,47 @@
47
49
  }
48
50
  }
49
51
 
52
+ /* Size variants */
53
+ /* small */
54
+ @media screen and (min-width: 36em) {
55
+
56
+ *:not(.dialog__wrapper) > dialog[open]:has(.modal--sm) {
57
+
58
+ min-width: 20.9375rem;
59
+ width: 20.9375rem;
60
+ max-width: 20.9375rem;
61
+ }
62
+ }
63
+
64
+ @media screen and (min-width: 62em) {
65
+
66
+ *:not(.dialog__wrapper) > dialog[open]:has(.modal--sm) {
67
+ min-width: 28.375rem;
68
+ width: 28.375rem;
69
+ max-width: 28.375rem;
70
+ }
71
+ }
72
+
73
+ /* large */
74
+ @media screen and (min-width: 36em) {
75
+
76
+ *:not(.dialog__wrapper) > dialog[open]:has(.modal--lg) {
77
+ min-width: 42.875rem;
78
+ width: 42.875rem;
79
+ max-width: 42.875rem;
80
+ }
81
+ }
82
+
83
+ @media screen and (min-width: 62em) {
84
+
85
+ *:not(.dialog__wrapper) > dialog[open]:has(.modal--lg) {
86
+ min-width: 46rem;
87
+ width: 46rem;
88
+ max-width: 46rem;
89
+ }
90
+ }
91
+
92
+
50
93
  dialog::backdrop {
51
94
  background: rgba(0, 0, 0, 0.3);
52
95
  backdrop-filter: blur(4px);
@@ -37,6 +37,21 @@
37
37
  color-scheme: dark;
38
38
  }
39
39
  }
40
+
41
+ @supports not at-rule(@scope) {
42
+ :is(.bg-primary, .bg-danger, .bg-dark, .gradient-primary) {
43
+
44
+ --colour-heading: var(--colour-white);
45
+ --colour-body: var(--colour-white);
46
+ color: var(--colour-white);
47
+ }
48
+
49
+ :is(.bg-primary, .bg-danger, .bg-dark, .gradient-primary) > * {
50
+
51
+ color-scheme: dark;
52
+ }
53
+ }
54
+
40
55
  /* #region When the theme is set to dark via the dark mode component */
41
56
  /* OR when the dark mode is set via the browser or device when no component is present */
42
57
 
@@ -61,30 +76,6 @@
61
76
  color: var(--colour-body);
62
77
  }
63
78
  }
64
-
65
- @media (prefers-color-scheme: dark) {
66
- html:not(.light-theme) :is(.bg-primary, .bg-danger, .bg-dark):not(iam-header) {
67
-
68
- --colour-heading: var(--colour-primary-theme);
69
- --colour-body: var(--colour-primary-theme);
70
- color: var(--colour-primary-theme);
71
-
72
- /* Apply the light colour scheme not on the background element but just its children so that the background colour isn't overwritten */
73
- > * {
74
- color-scheme: light;
75
- }
76
- }
77
-
78
- html:not(.light-theme) .bg-light {
79
-
80
- color-scheme: light;
81
- --colour-body: #595959;
82
-
83
- p {
84
- color: var(--colour-body);
85
- }
86
- }
87
- }
88
79
  /* #endregion */
89
80
 
90
81
  .invert-colours {
@@ -226,6 +226,10 @@ $columns: 12;
226
226
  grid-template-columns: subgrid;
227
227
  }
228
228
 
229
+ nav {
230
+ anchor-name: --nav;
231
+ }
232
+
229
233
  *:not(.row) > main:not(:has(.container:last-child)):not(:has(iam-collapsible-side:last-child)) {
230
234
  padding-bottom: 1rem;
231
235
  }
@@ -0,0 +1,7 @@
1
+ @layer utilities {
2
+
3
+ .has-text-align-center {
4
+ margin-inline: auto;
5
+ text-align: center;
6
+ }
7
+ }
@@ -1,12 +1,23 @@
1
- import { trackComponent, trackComponentRegistered } from '../_global';
2
- import { searchAjax, filterList, setTag } from '../../modules/dropdown';
3
-
4
- trackComponentRegistered('iam-tag');
1
+ import { trackComponentRegistered } from '../_global';
2
+ import {
3
+ isFormValid,
4
+ showIf,
5
+ hideIf,
6
+ disabledIf,
7
+ enabledIf,
8
+ requiredIf,
9
+ readonlyIf,
10
+ writeIf,
11
+ emptyIf,
12
+ limitCheckboxes
13
+ } from '../../modules/form';
14
+
15
+ trackComponentRegistered('iam-form');
5
16
 
6
17
  class iamForm extends HTMLElement {
7
18
  constructor() {
8
19
  super();
9
- this.attachShadow({ mode: 'open' });
20
+ const shadowRoot = this.attachShadow({ mode: 'open' });
10
21
 
11
22
  const template = document.createElement('template');
12
23
  template.innerHTML = `
@@ -15,260 +26,90 @@ class iamForm extends HTMLElement {
15
26
  </div>
16
27
  `;
17
28
 
18
- this.shadowRoot.appendChild(template.content.cloneNode(true));
19
- }
20
-
21
- isFormValid(form):boolean {
22
-
23
- if (form.querySelector(':invalid'))
24
- return false;
25
-
26
- if (form.querySelector('.pwd-checker[data-strength="1"]') || form.querySelector('.pwd-checker[data-strength="2"]'))
27
- return false;
28
-
29
- if (form.querySelector('iam-multiselect[data-is-required][data-error]'))
30
- return false;
31
-
32
- return true;
33
- };
34
-
35
- checkConditions = (conditions):boolean => {
36
-
37
- let meetsCondition = true;
38
-
39
- JSON.parse(conditions).forEach((condition) => {
40
- if(this.querySelector(`#${condition['if']}`).value != condition['equals'])
41
- meetsCondition = false;
42
- });
43
-
44
- return meetsCondition;
45
- }
46
-
47
- showIf = ():void => {
48
-
49
- Array.from(this.querySelectorAll('[data-show-if]')).forEach((element) => {
50
-
51
- if(!this.checkConditions(element.getAttribute('data-show-if')))
52
- element.classList.add('d-none');
53
- else
54
- element.classList.remove('d-none');
55
-
56
- });
57
- }
58
-
59
- hideIf = ():void => {
60
-
61
- Array.from(this.querySelectorAll('[data-hide-if]')).forEach((element) => {
62
-
63
- if(this.checkConditions(element.getAttribute('data-hide-if')))
64
- element.classList.add('d-none');
65
- else
66
- element.classList.remove('d-none');
67
-
68
- });
69
- }
70
-
71
- disabledIf = ():void => {
72
-
73
- Array.from(this.querySelectorAll('[data-disabled-if]')).forEach((element) => {
74
-
75
- if(this.checkConditions(element.getAttribute('data-disabled-if')))
76
- element.setAttribute('disabled','disabled');
77
- else
78
- element.removeAttribute('disabled');
79
-
80
- });
81
- }
82
-
83
- enabledIf = ():void => {
84
-
85
- Array.from(this.querySelectorAll('[data-enabled-if]')).forEach((element) => {
86
-
87
- if(!this.checkConditions(element.getAttribute('data-enabled-if')))
88
- element.setAttribute('disabled','disabled');
89
- else
90
- element.removeAttribute('disabled');
91
-
92
- });
93
- }
94
-
95
- requiredIf = ():void => {
96
-
97
- Array.from(this.querySelectorAll('[data-required-if]')).forEach((element) => {
98
-
99
- if(this.checkConditions(element.getAttribute('data-required-if')))
100
- element.setAttribute('required','required');
101
- else
102
- element.removeAttribute('required');
103
-
104
- });
105
- }
106
-
107
- readonlyIf = ():void => {
108
-
109
- Array.from(this.querySelectorAll('[data-readonly-if]')).forEach((element) => {
110
-
111
- if(this.checkConditions(element.getAttribute('data-readonly-if')))
112
- element.setAttribute('readonly','readonly');
113
- else
114
- element.removeAttribute('readonly');
115
-
116
- });
117
- }
118
-
119
- writeIf = ():void => {
120
-
121
- Array.from(this.querySelectorAll('[data-write-if]')).forEach((element) => {
122
-
123
- if(!this.checkConditions(element.getAttribute('data-write-if')))
124
- element.setAttribute('readonly','readonly');
125
- else
126
- element.removeAttribute('readonly');
127
-
128
- });
129
- }
130
-
131
- emptyIf = ():void => {
132
-
133
- Array.from(this.querySelectorAll('[data-empty-if]')).forEach((element) => {
134
-
135
- if(this.checkConditions(element.getAttribute('data-empty-if')))
136
- element.value = "";
137
-
138
- });
139
- }
140
-
141
- getCheckboxLimit = (element):number => {
142
-
143
- const limit = parseInt(element.getAttribute('data-checkbox-limit') || '10', 10);
144
-
145
- return !isNaN(limit) && limit > 0 ? limit : 10;
146
- }
147
-
148
- limitCheckboxes = (event?:Event):void => {
149
-
150
-
151
-
152
- const target = event?.target instanceof HTMLInputElement ? event.target : null;
153
- const changedCheckbox = target?.matches('input[type="checkbox"]') ? target : null;
154
- const checkboxLimitGroup = changedCheckbox?.closest('[data-checkbox-limit]');
155
- const checkboxLimitGroups = checkboxLimitGroup
156
- ? [checkboxLimitGroup]
157
- : [
158
- ...(this.hasAttribute('data-checkbox-limit') ? [this] : []),
159
- ...Array.from(this.querySelectorAll('[data-checkbox-limit]')),
160
- ];
161
-
162
- checkboxLimitGroups.forEach((group) => {
163
-
164
- const limit = this.getCheckboxLimit(group);
165
- const checked = Array.from(group.querySelectorAll('input[type="checkbox"]:checked'));
166
- const notChecked = Array.from(group.querySelectorAll('input[type="checkbox"]:not(:checked)'));
167
-
168
- notChecked.forEach((checkbox) => {
169
-
170
- checkbox.setAttribute('disabled','disabled');
171
- });
172
-
173
- if(checked.length < limit){
174
- notChecked.forEach((checkbox) => {
175
-
176
- checkbox.removeAttribute('disabled');
177
- });
178
- }
179
-
180
- if(checked.length <= limit)
181
- return;
182
-
183
-
184
- if(changedCheckbox?.checked && group.contains(changedCheckbox)) {
185
- changedCheckbox.checked = false;
186
- return;
187
- }
188
-
189
- checked.slice(limit).forEach((checkbox) => {
190
-
191
- checkbox.checked = false;
192
- });
193
- });
29
+ shadowRoot.appendChild(template.content.cloneNode(true));
194
30
  }
195
31
 
196
32
  connectedCallback(): void {
197
33
 
198
- const form = this.querySelector('form');
34
+ const form = this.querySelector<HTMLFormElement>('form') ?? this;
199
35
 
200
36
  if(!form)
201
- return false;
37
+ return;
202
38
 
203
39
  form.setAttribute('novalidate','true');
204
40
 
205
41
  // Form validation
206
- form.addEventListener('submit', (e) => {
42
+ form.addEventListener('submit', (event) => {
207
43
 
208
44
  form.classList.add('was-validated');
209
45
 
210
- if (!this.isFormValid(form)) {
46
+ if (!isFormValid(form)) {
211
47
 
212
- e.preventDefault();
213
- form?.querySelector('input:invalid')?.scrollIntoView();
48
+ event.preventDefault();
49
+ form.querySelector<HTMLInputElement>('input:invalid')?.scrollIntoView();
214
50
  }
215
51
  });
216
52
 
217
53
  // conditional reveal required fields
218
- Array.from(form.querySelectorAll('.conditional [required]')).forEach((input) => {
54
+ form.querySelectorAll<HTMLElement>('.conditional [required]').forEach((input) => {
219
55
 
220
56
  input.setAttribute('data-conditional-required','true');
221
57
  input.removeAttribute('required');
222
58
  });
223
59
 
224
60
  // conditional reveal required fields (for fields inside of components like the address lookup)
225
- Array.from(form.querySelectorAll('.conditional [data-required]')).forEach((input) => {
61
+ form.querySelectorAll<HTMLElement>('.conditional [data-required]').forEach((input) => {
226
62
 
227
63
  input.setAttribute('data-conditional-data-required','true');
228
64
  input.removeAttribute('data-required');
229
65
  });
230
66
 
231
- this.showIf();
232
- this.hideIf();
233
- this.disabledIf();
234
- this.enabledIf();
235
- this.requiredIf();
236
- this.readonlyIf();
237
- this.writeIf();
238
- this.emptyIf();
239
- this.limitCheckboxes();
240
-
67
+ showIf(this);
68
+ hideIf(this);
69
+ disabledIf(this);
70
+ enabledIf(this);
71
+ requiredIf(this);
72
+ readonlyIf(this);
73
+ writeIf(this);
74
+ emptyIf(this);
75
+ limitCheckboxes(null, this);
241
76
 
242
77
  form.addEventListener('change', (event) => {
243
78
 
244
- this.showIf();
245
- this.hideIf();
246
- this.disabledIf();
247
- this.enabledIf();
248
- this.requiredIf();
249
- this.readonlyIf();
250
- this.writeIf();
251
- this.emptyIf();
252
- this.limitCheckboxes(event);
79
+ showIf(this);
80
+ hideIf(this);
81
+ disabledIf(this);
82
+ enabledIf(this);
83
+ requiredIf(this);
84
+ readonlyIf(this);
85
+ writeIf(this);
86
+ emptyIf(this);
87
+ limitCheckboxes(event, form);
253
88
 
254
- Array.from(form.querySelectorAll('.conditional [data-conditional-required], .conditional [data-conditional-data-required]')).forEach((input) => {
89
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-required], .conditional [data-conditional-data-required]').forEach((input) => {
255
90
 
256
91
  input.removeAttribute('required');
257
92
  input.removeAttribute('data-required');
258
93
  });
259
94
 
260
95
 
261
- Array.from(form.querySelectorAll('.conditional [data-conditional-required]')).forEach((input) => {
96
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-required]').forEach((input) => {
262
97
 
263
- const conditionalStyles = window.getComputedStyle(input.closest('.conditional'));
98
+ const conditionalElement = input.closest<HTMLElement>('.conditional');
99
+ if(!conditionalElement) return;
100
+
101
+ const conditionalStyles = window.getComputedStyle(conditionalElement);
264
102
 
265
103
  if(conditionalStyles.getPropertyValue("display") == 'block')
266
104
  input.setAttribute('required', 'required');
267
105
  });
268
106
 
269
- Array.from(form.querySelectorAll('.conditional [data-conditional-data-required]')).forEach((input) => {
107
+ form.querySelectorAll<HTMLElement>('.conditional [data-conditional-data-required]').forEach((input) => {
108
+
109
+ const conditionalElement = input.closest<HTMLElement>('.conditional');
110
+ if(!conditionalElement) return;
270
111
 
271
- const conditionalStyles = window.getComputedStyle(input.closest('.conditional'));
112
+ const conditionalStyles = window.getComputedStyle(conditionalElement);
272
113
 
273
114
  if(conditionalStyles.getPropertyValue("display") == 'block')
274
115
  input.setAttribute('data-required', 'true');