@iamproperty/components 7.2.2--beta3 → 7.4.0

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 (247) 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/actionbar.global.css +1 -1
  4. package/assets/css/components/actionbar.global.css.map +1 -1
  5. package/assets/css/components/barchart.component.css +1 -1
  6. package/assets/css/components/barchart.component.css.map +1 -1
  7. package/assets/css/components/bento-grid.global.css.map +1 -1
  8. package/assets/css/components/calendar.component.css +1 -0
  9. package/assets/css/components/calendar.component.css.map +1 -0
  10. package/assets/css/components/calendar.config.css +1 -0
  11. package/assets/css/components/calendar.config.css.map +1 -0
  12. package/assets/css/components/card.component.css +1 -1
  13. package/assets/css/components/card.component.css.map +1 -1
  14. package/assets/css/components/carousel.component.css +1 -1
  15. package/assets/css/components/carousel.component.css.map +1 -1
  16. package/assets/css/components/charts.module.css.map +1 -1
  17. package/assets/css/components/collapsible-side.css +1 -1
  18. package/assets/css/components/collapsible-side.css.map +1 -1
  19. package/assets/css/components/content.component.css +1 -0
  20. package/assets/css/components/content.component.css.map +1 -0
  21. package/assets/css/components/doughnutchart.component.css +1 -1
  22. package/assets/css/components/doughnutchart.component.css.map +1 -1
  23. package/assets/css/components/fileupload.css.map +1 -1
  24. package/assets/css/components/inline-edit.css +1 -1
  25. package/assets/css/components/inline-edit.css.map +1 -1
  26. package/assets/css/components/marketing.component.css +1 -0
  27. package/assets/css/components/marketing.component.css.map +1 -0
  28. package/assets/css/components/menu.component.css +1 -1
  29. package/assets/css/components/menu.component.css.map +1 -1
  30. package/assets/css/components/menu.css +1 -1
  31. package/assets/css/components/menu.css.map +1 -1
  32. package/assets/css/components/milestone.css +1 -0
  33. package/assets/css/components/milestone.css.map +1 -0
  34. package/assets/css/components/multiselect.css +1 -1
  35. package/assets/css/components/multiselect.css.map +1 -1
  36. package/assets/css/components/nav.component.css +1 -1
  37. package/assets/css/components/nav.component.css.map +1 -1
  38. package/assets/css/components/nav.global.css +1 -1
  39. package/assets/css/components/nav.global.css.map +1 -1
  40. package/assets/css/components/pagination.css.map +1 -1
  41. package/assets/css/components/rank.component.css +1 -1
  42. package/assets/css/components/rank.component.css.map +1 -1
  43. package/assets/css/components/rankings.component.css +1 -1
  44. package/assets/css/components/rankings.component.css.map +1 -1
  45. package/assets/css/components/rankings.global.css +1 -1
  46. package/assets/css/components/rankings.global.css.map +1 -1
  47. package/assets/css/components/slider.css.map +1 -1
  48. package/assets/css/components/split-button.component.css +1 -0
  49. package/assets/css/components/split-button.component.css.map +1 -0
  50. package/assets/css/components/table-basic.global.css.map +1 -1
  51. package/assets/css/components/table.global.css.map +1 -1
  52. package/assets/css/core.min.css +1 -1
  53. package/assets/css/core.min.css.map +1 -1
  54. package/assets/css/mobile-core.min.css +1 -1
  55. package/assets/css/mobile-core.min.css.map +1 -1
  56. package/assets/css/mobile.min.css +1 -1
  57. package/assets/css/mobile.min.css.map +1 -1
  58. package/assets/css/style.min.css +1 -1
  59. package/assets/css/style.min.css.map +1 -1
  60. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  61. package/assets/js/components/actionbar/actionbar.component.js +51 -31
  62. package/assets/js/components/actionbar/actionbar.component.min.js +17 -17
  63. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  64. package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
  65. package/assets/js/components/advanced-select/advanced-select.component.js +63 -0
  66. package/assets/js/components/advanced-select/advanced-select.component.min.js +23 -0
  67. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -0
  68. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  69. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  70. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  71. package/assets/js/components/calendar/calendar.component.js +1083 -0
  72. package/assets/js/components/calendar/calendar.component.min.js +170 -0
  73. package/assets/js/components/calendar/calendar.component.min.js.map +1 -0
  74. package/assets/js/components/card/card.component.js +20 -8
  75. package/assets/js/components/card/card.component.min.js +10 -10
  76. package/assets/js/components/card/card.component.min.js.map +1 -1
  77. package/assets/js/components/carousel/carousel.component.min.js +2 -2
  78. package/assets/js/components/collapsible-side/collapsible-side.component.js +47 -12
  79. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +6 -5
  80. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  81. package/assets/js/components/content/content.component.js +66 -0
  82. package/assets/js/components/content/content.component.min.js +15 -0
  83. package/assets/js/components/content/content.component.min.js.map +1 -0
  84. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
  85. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  86. package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
  87. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  88. package/assets/js/components/header/header.component.min.js +1 -1
  89. package/assets/js/components/inline-edit/inline-edit.component.min.js +5 -5
  90. package/assets/js/components/marketing/marketing.component.js +1 -1
  91. package/assets/js/components/marketing/marketing.component.min.js +2 -2
  92. package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
  93. package/assets/js/components/menu/menu.component.js +148 -161
  94. package/assets/js/components/menu/menu.component.min.js +4 -69
  95. package/assets/js/components/menu/menu.component.min.js.map +1 -1
  96. package/assets/js/components/milestone/milestone.component.js +38 -0
  97. package/assets/js/components/milestone/milestone.component.min.js +15 -0
  98. package/assets/js/components/milestone/milestone.component.min.js.map +1 -0
  99. package/assets/js/components/milestone-group/milestone-group.component.js +35 -0
  100. package/assets/js/components/milestone-group/milestone-group.component.min.js +13 -0
  101. package/assets/js/components/milestone-group/milestone-group.component.min.js.map +1 -0
  102. package/assets/js/components/multi-step/multi-step.component.min.js +1 -1
  103. package/assets/js/components/multiselect/multiselect.component.js +54 -2
  104. package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
  105. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  106. package/assets/js/components/nav/nav.component.js +19 -0
  107. package/assets/js/components/nav/nav.component.min.js +6 -6
  108. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  109. package/assets/js/components/notification/notification.component.js +17 -11
  110. package/assets/js/components/notification/notification.component.min.js +4 -4
  111. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  112. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  113. package/assets/js/components/rank/rank.component.js +346 -210
  114. package/assets/js/components/rank/rank.component.min.js +346 -211
  115. package/assets/js/components/rank/rank.component.min.js.map +1 -1
  116. package/assets/js/components/rankings/rankings.component.js +17 -8
  117. package/assets/js/components/rankings/rankings.component.min.js +14 -8
  118. package/assets/js/components/rankings/rankings.component.min.js.map +1 -1
  119. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  120. package/assets/js/components/search/search.component.js +5 -3
  121. package/assets/js/components/search/search.component.min.js +6 -6
  122. package/assets/js/components/search/search.component.min.js.map +1 -1
  123. package/assets/js/components/slider/slider.component.min.js +1 -1
  124. package/assets/js/components/split-button/split-button.component.js +60 -0
  125. package/assets/js/components/split-button/split-button.component.min.js +34 -0
  126. package/assets/js/components/split-button/split-button.component.min.js.map +1 -0
  127. package/assets/js/components/table/table.component.js +12 -0
  128. package/assets/js/components/table/table.component.min.js +3 -3
  129. package/assets/js/components/table/table.component.min.js.map +1 -1
  130. package/assets/js/components/table-ajax/table-ajax.component.js +12 -0
  131. package/assets/js/components/table-ajax/table-ajax.component.min.js +3 -3
  132. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
  133. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  134. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
  135. package/assets/js/components/table-no-submit/table-no-submit.component.js +12 -0
  136. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +3 -3
  137. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
  138. package/assets/js/components/table-submit/table-submit.component.js +12 -0
  139. package/assets/js/components/table-submit/table-submit.component.min.js +3 -3
  140. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
  141. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  142. package/assets/js/components/video-card/video-card.component.min.js +1 -1
  143. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  144. package/assets/js/components.js +58 -0
  145. package/assets/js/modules/advanced-select.js +106 -0
  146. package/assets/js/modules/dialogs.js +53 -51
  147. package/assets/js/modules/dynamicEvents.js +7 -0
  148. package/assets/js/modules/milestone-group.js +30 -0
  149. package/assets/js/modules/milestone.js +89 -0
  150. package/assets/js/modules/table.js +11 -1
  151. package/assets/js/modules/videos.js +1 -1
  152. package/assets/js/scripts.bundle.js +3 -3
  153. package/assets/js/scripts.bundle.js.map +1 -1
  154. package/assets/js/scripts.bundle.min.js +2 -2
  155. package/assets/js/scripts.bundle.min.js.map +1 -1
  156. package/assets/js/scripts.js +4 -0
  157. package/assets/sass/_components.scss +11 -0
  158. package/assets/sass/_functions/utility-mixins.scss +41 -0
  159. package/assets/sass/_functions/variables.scss +11 -8
  160. package/assets/sass/components/actionbar.component.scss +3 -4
  161. package/assets/sass/components/actionbar.global.scss +4 -4
  162. package/assets/sass/components/bento-grid.global.scss +0 -1
  163. package/assets/sass/components/calendar.component.scss +1380 -0
  164. package/assets/sass/components/calendar.config.scss +476 -0
  165. package/assets/sass/components/card.component.scss +4 -34
  166. package/assets/sass/components/carousel.component.scss +5 -0
  167. package/assets/sass/components/charts.module.scss +0 -2
  168. package/assets/sass/components/collapsible-side.scss +91 -95
  169. package/assets/sass/components/content.component.scss +18 -0
  170. package/assets/sass/components/inline-edit.scss +2 -0
  171. package/assets/sass/components/{marketing.scss → marketing.component.scss} +2 -6
  172. package/assets/sass/components/menu.component.scss +118 -31
  173. package/assets/sass/components/menu.scss +68 -7
  174. package/assets/sass/components/milestone.scss +207 -0
  175. package/assets/sass/components/multiselect.scss +3 -0
  176. package/assets/sass/components/nav.component.scss +1 -0
  177. package/assets/sass/components/nav.global.scss +30 -0
  178. package/assets/sass/components/rank.component.scss +197 -33
  179. package/assets/sass/components/rankings.component.scss +39 -35
  180. package/assets/sass/components/rankings.global.scss +66 -10
  181. package/assets/sass/components/split-button.component.scss +77 -0
  182. package/assets/sass/components/table-basic.global.scss +2 -4
  183. package/assets/sass/components/table.global.scss +4 -4
  184. package/assets/sass/elements/badge-tag.scss +5 -1
  185. package/assets/sass/elements/buttons--compact.scss +4 -0
  186. package/assets/sass/elements/buttons--global.scss +1 -1
  187. package/assets/sass/elements/details.scss +0 -1
  188. package/assets/sass/elements/dialog.scss +1 -3
  189. package/assets/sass/elements/forms.scss +148 -22
  190. package/assets/sass/elements/links.scss +132 -4
  191. package/assets/sass/elements/lists.scss +61 -0
  192. package/assets/sass/elements/popover.scss +64 -10
  193. package/assets/sass/elements/toggle-button.scss +7 -8
  194. package/assets/sass/elements/type.scss +7 -10
  195. package/assets/sass/foundations/reboot.scss +3 -3
  196. package/assets/sass/templates/form.scss +0 -2
  197. package/assets/ts/components/actionbar/actionbar.component.ts +49 -23
  198. package/assets/ts/components/advanced-select/advanced-select.component.ts +74 -0
  199. package/assets/ts/components/calendar/calendar.component.ts +1460 -0
  200. package/assets/ts/components/card/card.component.ts +22 -14
  201. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +53 -12
  202. package/assets/ts/components/content/content.component.ts +78 -0
  203. package/assets/ts/components/marketing/marketing.component.ts +1 -1
  204. package/assets/ts/components/menu/menu.component.ts +162 -173
  205. package/assets/ts/components/milestone/milestone.component.ts +45 -0
  206. package/assets/ts/components/milestone-group/milestone-group.component.ts +41 -0
  207. package/assets/ts/components/multiselect/multiselect.component.ts +69 -3
  208. package/assets/ts/components/nav/nav.component.ts +25 -0
  209. package/assets/ts/components/notification/notification.component.ts +34 -11
  210. package/assets/ts/components/rank/rank.component.ts +345 -214
  211. package/assets/ts/components/rankings/rankings.component.ts +28 -15
  212. package/assets/ts/components/search/search.component.ts +6 -4
  213. package/assets/ts/components/split-button/split-button.component.ts +69 -0
  214. package/assets/ts/components/table/table.component.ts +14 -0
  215. package/assets/ts/components/table-ajax/table-ajax.component.ts +14 -0
  216. package/assets/ts/components/table-no-submit/table-no-submit.component.ts +14 -0
  217. package/assets/ts/components/table-submit/table-submit.component.ts +14 -0
  218. package/assets/ts/components/video-card/video-card.component.ts +2 -3
  219. package/assets/ts/components.ts +63 -0
  220. package/assets/ts/modules/advanced-select.ts +125 -0
  221. package/assets/ts/modules/dialogs.ts +64 -61
  222. package/assets/ts/modules/dynamicEvents.ts +12 -1
  223. package/assets/ts/modules/milestone-group.ts +42 -0
  224. package/assets/ts/modules/milestone.ts +122 -0
  225. package/assets/ts/modules/table.ts +15 -1
  226. package/assets/ts/modules/videos.ts +19 -37
  227. package/assets/ts/scripts.ts +5 -3
  228. package/dist/components.es.js +41 -1923
  229. package/dist/components.umd.js +127 -171
  230. package/package.json +1 -1
  231. package/src/components/AdvancedSelect/AdvancedSelect.vue +23 -0
  232. package/src/components/Calendar/Calendar.vue +26 -0
  233. package/src/components/Card/Card.vue +1 -1
  234. package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +7 -13
  235. package/src/components/Content/Content.vue +23 -0
  236. package/src/components/Milestones/Milestone.vue +27 -0
  237. package/src/components/Milestones/MilestoneGroup.vue +27 -0
  238. package/src/components/Rank/Rank.vue +1 -2
  239. package/src/components/Rankings/Rankings.vue +9 -10
  240. package/src/components/SplitButton/README.md +19 -0
  241. package/src/components/SplitButton/SplitButton.vue +26 -0
  242. package/src/index.js +44 -41
  243. package/assets/css/components/marketing.css +0 -1
  244. package/assets/css/components/marketing.css.map +0 -1
  245. package/assets/css/components/nav.old.css +0 -1
  246. package/assets/css/components/nav.old.css.map +0 -1
  247. package/assets/sass/components/nav.old.scss +0 -891
@@ -32,6 +32,20 @@ class iamCard extends HTMLElement {
32
32
  const cardComponent = this;
33
33
  const cardBody = cardComponent.shadowRoot.querySelector('.card__body');
34
34
 
35
+ const assetLocation = document.body.hasAttribute('data-assets-location')
36
+ ? document.body.getAttribute('data-assets-location')
37
+ : '/assets';
38
+
39
+ if (!window.customElements.get(`iam-menu`)) {
40
+ import(/* @vite-ignore */ `${assetLocation}/js/components/menu/menu.component.js`)
41
+ .then((module) => {
42
+ window.customElements.define(`iam-menu`, module.default);
43
+ })
44
+ .catch((err) => {
45
+ console.log(err.message);
46
+ });
47
+ }
48
+
35
49
  setupCard(cardComponent);
36
50
 
37
51
  // Add Illustration HTML
@@ -51,22 +65,19 @@ class iamCard extends HTMLElement {
51
65
 
52
66
  // Add the dialog wrapper HTML
53
67
  if (cardComponent.querySelector('[slot="btns"]')) {
54
- cardComponent.shadowRoot.innerHTML += `<div class="dialog__wrapper">
55
- <button class="btn btn-secondary btn-compact fa-ellipsis-vertical" popovertarget="actions" title="Further actions" type="button">Open further actions</button>
56
- <div class="dialog--fix dialog--list" id="actions" popover>
68
+ cardComponent.shadowRoot.innerHTML += `<div class="menu__wrapper">
69
+ <button class="btn btn-secondary btn-compact fa-ellipsis-vertical m-0" popovertarget="actions" style="anchor-name: --anchor-el;" title="Further actions" type="button">Open further actions</button>
70
+ <iam-menu class="dialog--fix dialog--list" id="actions" style="position-anchor: --anchor-el;" popover>
57
71
  <slot name="btns"></slot>
58
- </div>
72
+ </iam-menu>
59
73
  </div>`;
60
74
 
61
75
  // safari and firefox anchor fix for cards
62
76
  if (!CSS.supports('top', 'anchor(top)')) {
63
-
64
-
65
77
  const actionButton = this.shadowRoot?.querySelector('[popovertarget="actions"]');
66
78
  const actionPopover = this.shadowRoot?.querySelector('[popover]');
67
79
 
68
80
  actionButton?.addEventListener('click', (event) => {
69
-
70
81
  this.style.setProperty('overflow', 'visible');
71
82
  this.style.setProperty('z-index', '999999');
72
83
 
@@ -76,18 +87,15 @@ class iamCard extends HTMLElement {
76
87
 
77
88
  actionPopover.style.setProperty('display', 'block');
78
89
  actionPopover.style.setProperty('top', top + 'px');
79
- actionPopover.style.setProperty('left', (left - 100) + 'px');
90
+ actionPopover.style.setProperty('left', left - 100 + 'px');
80
91
  });
81
92
 
82
- document.addEventListener("scroll", (event) => {
83
-
93
+ document.addEventListener('scroll', (event) => {
84
94
  actionPopover.style.setProperty('display', 'none');
85
95
  });
86
-
87
96
  }
88
97
  }
89
98
 
90
-
91
99
  // Make sure slotted buttons and links have correct button classes
92
100
  Array.from(cardComponent.querySelectorAll('[slot="btns"]')).forEach((button) => {
93
101
  button.classList.add('btn');
@@ -107,8 +115,8 @@ class iamCard extends HTMLElement {
107
115
  });
108
116
  }
109
117
 
110
- if (cardComponent.shadowRoot.querySelector('.dialog__wrapper')) {
111
- const element = cardComponent.shadowRoot.querySelector('.dialog__wrapper');
118
+ if (cardComponent.shadowRoot.querySelector('.menu__wrapper')) {
119
+ const element = cardComponent.shadowRoot.querySelector('.menu__wrapper');
112
120
 
113
121
  element.addEventListener('mouseenter', () => {
114
122
  cardComponent.classList.add('prevent-hover');
@@ -30,6 +30,7 @@ class iamCollapsibleSideMenu extends HTMLElement {
30
30
 
31
31
  <div class="side-menu" part="side-menu">
32
32
  <button class="btn btn-compact fa-chevron-right btn-secondary btn-sm btn-collapse" part="btn">Open or close Collapsible menu</button>
33
+
33
34
  <div class="side-menu-content closed" part="side-menu-content">
34
35
  <slot name="menu"></slot>
35
36
  </div>
@@ -41,35 +42,55 @@ class iamCollapsibleSideMenu extends HTMLElement {
41
42
 
42
43
  </div>
43
44
  `;
44
- this.shadowRoot.appendChild(template.content.cloneNode(true));
45
+
46
+ if (this.shadowRoot) {
47
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
48
+ }
45
49
  }
46
50
 
47
51
  connectedCallback(): void {
52
+ if (!this.shadowRoot) return;
53
+
54
+ const container = this.shadowRoot.querySelector('.container');
48
55
  const sideMenu = this.shadowRoot.querySelector('.side-menu');
49
56
  const sideMenuContent = this.shadowRoot.querySelector('.side-menu-content');
50
57
  const mainContent = this.shadowRoot.querySelector('.main-content');
51
58
  const button = this.shadowRoot.querySelector('.side-menu > .btn');
52
59
 
60
+ if (!sideMenu || !sideMenuContent || !mainContent || !button) return;
61
+
53
62
  // Load external CSS if needed
54
- if (this.hasAttribute('data-css'))
55
- this.shadowRoot
56
- .querySelector('.styles')
57
- .insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
63
+ if (this.hasAttribute('data-css')) {
64
+ const styles = this.shadowRoot.querySelector('.styles') as HTMLStyleElement;
65
+ if (styles) {
66
+ styles.insertAdjacentHTML('beforeend', `@import "${this.getAttribute('data-css')}";`);
67
+ }
68
+ }
58
69
 
59
- // Set sde nav title
60
- if (!this.hasAttribute('data-title')) this.setAttribute('data-title', 'configuration');
70
+ // Set side nav title
71
+ if (!this.hasAttribute('data-title')) {
72
+ this.setAttribute('data-title', 'configuration');
73
+ }
61
74
 
62
75
  sideMenuContent.insertAdjacentHTML('afterbegin', `<span class="h3">${this.getAttribute('data-title')}</span>`);
63
76
  mainContent.insertAdjacentHTML('afterbegin', `<span class="h3">${this.getAttribute('data-title')}</span>`);
64
77
 
65
- if (this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)')) {
66
- this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)').classList.add('h4');
67
- this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)').classList.add('main-content__title');
78
+ const titleElement = this.querySelector(':scope > :is(h1,h2,h3,h4,h5,h6)') as HTMLElement;
79
+ if (titleElement) {
80
+ titleElement.classList.add('h4', 'main-content__title');
68
81
  }
69
82
 
70
83
  if (this.hasAttribute('open') && window.innerWidth > 992) {
71
84
  sideMenu.classList.add('open');
72
- button.setAttribute('aria-expanded', true);
85
+ button.setAttribute('aria-expanded', 'true');
86
+ }
87
+
88
+ if (this.hasAttribute('inline')) {
89
+ container.classList.add('inline');
90
+ }
91
+
92
+ if (this.hasAttribute('menu-right')) {
93
+ sideMenu.classList.add('menu-right');
73
94
  }
74
95
 
75
96
  // Open the menu
@@ -79,7 +100,7 @@ class iamCollapsibleSideMenu extends HTMLElement {
79
100
 
80
101
  setTimeout(function () {
81
102
  sideMenu.classList.add('open');
82
- button.setAttribute('aria-expanded', true);
103
+ button.setAttribute('aria-expanded', 'true');
83
104
  }, 100);
84
105
  } else {
85
106
  sideMenu.classList.remove('open');
@@ -122,6 +143,26 @@ class iamCollapsibleSideMenu extends HTMLElement {
122
143
  }, 1000); // Delay until its close so the animation is broken
123
144
  }
124
145
  });
146
+
147
+ const sideMenuParentGroups = this.querySelectorAll('.parent');
148
+ const sideMenuParentGroupsTopLinks = this.querySelectorAll('.parent > li:first-of-type');
149
+
150
+ sideMenuParentGroupsTopLinks?.forEach((parentLink) => {
151
+ parentLink.addEventListener('click', () => {
152
+ if (!parentLink || !parentLink.parentElement) return false; // make sure elements exist
153
+
154
+ if (parentLink.parentElement.classList.contains('reveal')) {
155
+ parentLink.parentElement.classList.remove('reveal'); // remove if clicking a revealed parent
156
+ } else {
157
+ // remove other reveals and add reveal to this one
158
+ sideMenuParentGroups?.forEach((parentGroup) => {
159
+ parentGroup.classList.remove('reveal');
160
+ });
161
+
162
+ parentLink.parentElement.classList.add('reveal');
163
+ }
164
+ });
165
+ });
125
166
  }
126
167
  }
127
168
 
@@ -0,0 +1,78 @@
1
+ class iamContent extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ const assetLocation = document.body.hasAttribute('data-assets-location')
6
+ ? document.body.getAttribute('data-assets-location')
7
+ : '/assets';
8
+
9
+ const loadCSS = `@import "${assetLocation}/css/components/content.component.css";`;
10
+
11
+ const template = document.createElement('template');
12
+ template.innerHTML = `
13
+ <style>
14
+ ${loadCSS}
15
+
16
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
17
+ </style>
18
+ <div class="content__container">
19
+ <slot></slot>
20
+ </div>
21
+ `;
22
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
23
+ }
24
+
25
+ connectedCallback(): void {
26
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
27
+ const component = this;
28
+ const url = this.getAttribute('data-url');
29
+
30
+ const registerComponents = (contentComponent): void => {
31
+ const components = ['card', 'marketing', 'notification'];
32
+
33
+ const assetLocation = document.body.hasAttribute('data-assets-location')
34
+ ? document.body.getAttribute('data-assets-location')
35
+ : '/assets';
36
+
37
+ // Load components - Each component will load once the first of its type has been loaded
38
+ components.forEach((component) => {
39
+ if (component == 'notification') {
40
+ document.querySelectorAll('[data-notification]').forEach((element) => {
41
+ element.outerHTML = element.outerHTML
42
+ .replace(/<div/g, '<iam-notification')
43
+ .replace(/<\/div>/g, '</iam-notification>');
44
+ });
45
+ }
46
+
47
+ if (contentComponent.getElementsByTagName(`iam-${component}`).length === 0) return;
48
+
49
+ import(/* @vite-ignore */ `${assetLocation}/js/components/${component}/${component}.component.js`)
50
+ .then((module) => {
51
+ if (!window.customElements.get(`iam-${component}`))
52
+ window.customElements.define(`iam-${component}`, module.default);
53
+ })
54
+ .catch((err) => {
55
+ console.log(err.message);
56
+ });
57
+ });
58
+ };
59
+
60
+ if (url) {
61
+ const newXHRRequest = new XMLHttpRequest();
62
+ newXHRRequest.open('GET', url, true);
63
+
64
+ newXHRRequest.onload = function (): void {
65
+ if (this.status === 200) {
66
+ const response = JSON.parse(this.responseText);
67
+ component.innerHTML = `${response.content.rendered}`;
68
+
69
+ registerComponents(component);
70
+ }
71
+ };
72
+
73
+ newXHRRequest.send();
74
+ }
75
+ }
76
+ }
77
+
78
+ export default iamContent;
@@ -16,7 +16,7 @@ class iamMarketing extends HTMLElement {
16
16
  const coreCSS = document.body.hasAttribute('data-core-css')
17
17
  ? document.body.getAttribute('data-core-css')
18
18
  : `${assetLocation}/css/core.min.css`;
19
- const loadCSS = `@import "${assetLocation}/css/components/marketing.css";`;
19
+ const loadCSS = `@import "${assetLocation}/css/components/marketing.component.css";`;
20
20
 
21
21
  const template = document.createElement('template');
22
22
  template.innerHTML = `
@@ -24,9 +24,14 @@ class iamMenu extends HTMLElement {
24
24
  const menuID = this.hasAttribute('id') ? this.getAttribute('id') : false;
25
25
  const menuButton = document.querySelector(`[popovertarget="${menuID}"]`);
26
26
 
27
- const menuInner = this.shadowRoot.querySelector('.menu--inner');
28
- const topLevelmenuItems = this.querySelectorAll(':scope > a, :scope > button, :scope > details > summary');
29
- const menuItems = this.querySelectorAll('a, button');
27
+ let topLevelmenuItems = this.querySelectorAll(':scope > a, :scope > button, :scope > details > summary');
28
+ let menuItems = this.querySelectorAll('a, button');
29
+
30
+ if (this.closest('.menu__wrapper')) {
31
+ menuItems = this.shadowRoot.querySelector('slot').assignedElements({ flatten: true });
32
+ topLevelmenuItems = menuItems;
33
+ }
34
+
30
35
  const subMenus = this.querySelectorAll('details');
31
36
 
32
37
  let subNextIndex;
@@ -34,188 +39,172 @@ class iamMenu extends HTMLElement {
34
39
 
35
40
  // Set the needed CSS styles to connect the ID attribute to the anchor name
36
41
  if (menuID && menuButton) {
37
- menuInner?.setAttribute('role', 'menu');
42
+ this.setAttribute('role', 'menu');
38
43
  this.style['position-anchor'] = `--${menuID}`;
39
44
 
40
45
  menuButton?.setAttribute('aria-haspopup', 'true');
41
46
  menuButton?.style['anchor-name'] = `--${menuID}`;
42
47
  menuButton?.setAttribute('aria-controls', menuID);
48
+ }
43
49
 
44
- subMenus.forEach((item, index) => {
45
- item.setAttribute('role', 'menu');
46
- });
47
-
48
- menuItems.forEach((item, index) => {
49
- item.setAttribute('role', 'menuitem');
50
- item.setAttribute('tabindex', '0');
51
-
52
- if (index == 0) {
53
- item.setAttribute('autofocus', true);
54
- }
55
- });
56
-
57
- this.addEventListener('keydown', (event) => {
58
- if (event && event.target instanceof HTMLElement && event.target.closest('a, button, summary')) {
59
- const activeItem = document.activeElement;
60
- const prevIndex = Array.from(topLevelmenuItems).indexOf(activeItem) - 1;
61
- const nextIndex = Array.from(topLevelmenuItems).indexOf(activeItem) + 1;
62
-
63
- switch (
64
- event.keyCode // change to event.key to key to use the above variable
65
- ) {
66
- case 27: // Esc
67
- if (activeItem.closest('details')) {
68
- event.stopPropagation();
69
- event.preventDefault();
70
- activeItem.closest('details').removeAttribute('open');
71
- activeItem.closest('details').querySelector(':scope summary').focus();
72
- } else {
73
- event.stopPropagation();
74
- menuButton.focus();
75
- }
76
-
77
- break;
78
- case 32: // Space
79
- case 13: // Enter
80
- if (activeItem.matches('summary') && !activeItem.parentElement.matches('details[open]')) {
81
- activeItem.parentElement.setAttribute('open', true);
82
- const subMenuItems = activeItem
83
- .closest('details')
84
- .querySelectorAll('a, button, :scope details > summary');
85
- Array.from(subMenuItems)[0].focus();
86
- }
87
-
88
- break;
89
- case 35: // end
90
- event.stopPropagation();
91
- event.preventDefault();
92
-
93
- this.querySelector('details[open]').removeAttribute('open');
94
- Array.from(menuItems)[menuItems.length - 1].focus();
95
-
96
- break;
97
- case 36: // home
98
- event.stopPropagation();
99
- event.preventDefault();
100
-
101
- this.querySelector('details[open]').removeAttribute('open');
102
- Array.from(menuItems)[0].focus();
103
-
104
- break;
105
- case 38: // up
50
+ menuItems.forEach((item, index) => {
51
+ item.setAttribute('role', 'menuitem');
52
+ item.setAttribute('tabindex', '0');
53
+
54
+ if (index == 0) {
55
+ item.setAttribute('autofocus', true);
56
+ }
57
+ });
58
+
59
+ this.addEventListener('keydown', (event) => {
60
+ if (event && event.target instanceof HTMLElement && event.target.closest('a, button, summary')) {
61
+ const activeItem = document.activeElement;
62
+ const prevIndex = Array.from(topLevelmenuItems).indexOf(activeItem) - 1;
63
+ const nextIndex = Array.from(topLevelmenuItems).indexOf(activeItem) + 1;
64
+
65
+ switch (
66
+ event.keyCode // change to event.key to key to use the above variable
67
+ ) {
68
+ case 27: // Esc
69
+ if (activeItem.closest('details')) {
106
70
  event.stopPropagation();
107
71
  event.preventDefault();
108
-
109
- if (Array.from(topLevelmenuItems).indexOf(activeItem) > -1) {
110
- if (Array.from(topLevelmenuItems)[prevIndex] != undefined)
111
- Array.from(topLevelmenuItems)[prevIndex].focus();
112
- else Array.from(topLevelmenuItems)[topLevelmenuItems.length - 1].focus();
113
- } else if (activeItem.closest('details')) {
114
- const subMenuItems = activeItem
115
- .closest('details')
116
- .querySelectorAll('a, button, :scope details > summary');
117
- subPrevIndex = Array.from(subMenuItems).indexOf(activeItem) - 1;
118
-
119
- if (Array.from(subMenuItems)[subPrevIndex] != undefined) Array.from(subMenuItems)[subPrevIndex].focus();
120
- else Array.from(subMenuItems)[subMenuItems.length - 1].focus();
121
- }
122
-
123
- break;
124
- case 40: // down
72
+ activeItem.closest('details').removeAttribute('open');
73
+ activeItem.closest('details').querySelector(':scope summary').focus();
74
+ } else {
125
75
  event.stopPropagation();
126
- event.preventDefault();
127
-
128
- if (Array.from(topLevelmenuItems).indexOf(activeItem) > -1) {
129
- if (Array.from(topLevelmenuItems)[nextIndex] != undefined)
130
- Array.from(topLevelmenuItems)[nextIndex].focus();
131
- else Array.from(topLevelmenuItems)[0].focus();
132
- } else if (activeItem.closest('details')) {
133
- const subMenuItems = activeItem
134
- .closest('details')
135
- .querySelectorAll('a, button, :scope details > summary');
136
- subNextIndex = Array.from(subMenuItems).indexOf(activeItem) + 1;
137
-
138
- if (Array.from(subMenuItems)[subNextIndex] != undefined) Array.from(subMenuItems)[subNextIndex].focus();
139
- else Array.from(subMenuItems)[0].focus();
140
- }
141
-
142
- break;
143
- }
76
+ menuButton.focus();
77
+ }
78
+
79
+ break;
80
+ case 32: // Space
81
+ case 13: // Enter
82
+ break;
83
+ case 35: // end
84
+ event.stopPropagation();
85
+ event.preventDefault();
86
+
87
+ this.querySelector('details[open]').removeAttribute('open');
88
+ Array.from(menuItems)[menuItems.length - 1].focus();
89
+
90
+ break;
91
+ case 36: // home
92
+ event.stopPropagation();
93
+ event.preventDefault();
94
+
95
+ this.querySelector('details[open]').removeAttribute('open');
96
+ Array.from(menuItems)[0].focus();
97
+
98
+ break;
99
+ case 38: // up
100
+ event.stopPropagation();
101
+ event.preventDefault();
102
+
103
+ if (Array.from(topLevelmenuItems).indexOf(activeItem) > -1) {
104
+ if (Array.from(topLevelmenuItems)[prevIndex] != undefined)
105
+ Array.from(topLevelmenuItems)[prevIndex].focus();
106
+ else Array.from(topLevelmenuItems)[topLevelmenuItems.length - 1].focus();
107
+ } else if (activeItem.closest('details')) {
108
+ const subMenuItems = activeItem
109
+ .closest('details')
110
+ .querySelectorAll('a, button, :scope details > summary');
111
+ subPrevIndex = Array.from(subMenuItems).indexOf(activeItem) - 1;
112
+
113
+ if (Array.from(subMenuItems)[subPrevIndex] != undefined) Array.from(subMenuItems)[subPrevIndex].focus();
114
+ else Array.from(subMenuItems)[subMenuItems.length - 1].focus();
115
+ }
116
+
117
+ break;
118
+ case 40: // down
119
+ event.stopPropagation();
120
+ event.preventDefault();
121
+
122
+ if (Array.from(topLevelmenuItems).indexOf(activeItem) > -1) {
123
+ if (Array.from(topLevelmenuItems)[nextIndex] != undefined)
124
+ Array.from(topLevelmenuItems)[nextIndex].focus();
125
+ else Array.from(topLevelmenuItems)[0].focus();
126
+ } else if (activeItem.closest('details')) {
127
+ const subMenuItems = activeItem
128
+ .closest('details')
129
+ .querySelectorAll('a, button, :scope details > summary');
130
+ subNextIndex = Array.from(subMenuItems).indexOf(activeItem) + 1;
131
+
132
+ if (Array.from(subMenuItems)[subNextIndex] != undefined) Array.from(subMenuItems)[subNextIndex].focus();
133
+ else Array.from(subMenuItems)[0].focus();
134
+ }
135
+
136
+ break;
137
+ }
138
+ }
139
+ });
140
+
141
+ this.addEventListener('toggle', (e) => {
142
+ const updateEvent = new CustomEvent(e.newState, { detail: { id: this.getAttribute('id'), target: e.target } });
143
+ this.dispatchEvent(updateEvent);
144
+
145
+ // Fix the focus
146
+ if (this.closest('.menu__wrapper')) {
147
+ menuItems[0].focus();
148
+ }
149
+
150
+ if (this.hasAttribute('popover-open')) {
151
+ e.preventDefault();
152
+ this.removeAttribute('popover-open');
153
+ this.hidePopover();
154
+ }
155
+
156
+ if (this.matches(':popover-open') && document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)) {
157
+ document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.setAttribute('aria-pressed', 'true');
158
+ document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.add('active');
159
+ } else {
160
+ document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.removeAttribute('aria-pressed');
161
+ document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.remove('active');
162
+ }
163
+ });
164
+
165
+ this.addEventListener('click', (event) => {
166
+ if (
167
+ event &&
168
+ event.target instanceof HTMLElement &&
169
+ event.target.closest('button:has(+ iam-menu:not([popover]))')
170
+ ) {
171
+ const button = event.target.closest('button:has(+ iam-menu)');
172
+
173
+ button?.classList.toggle('open');
174
+ } else if (event && event.target instanceof HTMLElement && event.target.closest('button.selectable')) {
175
+ const button = event.target.closest('button.selectable');
176
+ if (this.hasAttribute('multiple')) {
177
+ button.classList.toggle('selected');
178
+ } else if (button?.classList.contains('selected')) {
179
+ this.querySelectorAll('.selected').forEach((item) => {
180
+ item.classList.remove('selected');
181
+ });
182
+ } else {
183
+ this.querySelectorAll('.selected').forEach((item) => {
184
+ item.classList.remove('selected');
185
+ });
186
+ button.classList.add('selected');
187
+ }
188
+ }
189
+ });
190
+
191
+ // safari and firefox anchor fix for cards
192
+ if (!CSS.supports('top', 'anchor(top)')) {
193
+ document.addEventListener('click', (event) => {
194
+ if (event.originalTarget && event.originalTarget.matches('[popovertarget]')) {
195
+ const button = event.originalTarget;
196
+ const popoverID = button.getAttribute('popovertarget');
197
+ const popover = document.getElementById(popoverID);
198
+
199
+ const viewportOffset = button.getBoundingClientRect();
200
+ const top = viewportOffset.top;
201
+ const left = viewportOffset.left;
202
+
203
+ popover.style.setProperty('top', top + 'px');
204
+ popover.style.setProperty('left', left + button.clientWidth + 'px');
144
205
  }
145
206
  });
146
207
  }
147
-
148
- // insert extra CSS to help style inline details and summary items to allow collapsible sub menus
149
- if (this.querySelector('details') && !document.getElementById('menuGlobalStyles'))
150
- document.head.insertAdjacentHTML(
151
- 'beforeend',
152
- `<style id="menuGlobalStyles">
153
- iam-menu details > * {
154
- background: unset !important;
155
- border: unset !important;
156
- color: inherit!important;
157
- font-weight: inherit!important;
158
- font-family: inherit!important;
159
- font-size: 1rem!important;
160
- display: block!important;
161
- margin: var(--menu-item-margin, 0 0 0.25rem 0)!important;
162
- padding: var(--menu-item-padding, 0)!important;
163
- width: var(--menu-item-width, 100%)!important;
164
- text-align: var(--menu-item-text-align, left)!important;
165
- cursor: var(--menu-item-cursor, pointer)!important;
166
- }
167
- iam-menu details > *:after,
168
- iam-menu details > *:not(summary):before {
169
- display: none!important;
170
- }
171
- iam-menu details :is(button,a) {
172
- padding-inline-start: var(--menu-dialog-offset,1rem)!important;
173
- }
174
- iam-menu details :is(button,a):last-child {
175
- margin-block-end: var(--menu-dialog-offset,1rem)!important;
176
- }
177
- iam-menu details summary {
178
- padding: 0 !important;
179
- margin: var(--menu-item-margin, 0 0 0.25rem 0)!important;
180
- }
181
- iam-menu details summary:before {
182
- text-align: center;
183
- display: inline-block!important;
184
- vertical-align: bottom;
185
- float: right;
186
- color: inherit;
187
- height: 1em;
188
- width: 1em;
189
- }
190
-
191
- iam-menu details summary[class*="fa-"]:before {
192
- font-family: var(--fa-font-family, "Font Awesome 6 Pro");
193
- }
194
-
195
- iam-menu details summary:not([class*="fa-"]:before {
196
- --icon-arrow: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22'%3e%3cpath d='M6.5,2l9,9-9,9' style='fill:none;stroke:%23000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:3px'/%3e%3c/svg%3e");
197
-
198
- content: ""!important;
199
- height: 1.2rem;
200
- width: 1.2rem;
201
- background: var(--colour-primary-theme);
202
- mask-image: var(--icon, var(--icon-arrow));
203
- mask-size: 50%;
204
- mask-repeat: no-repeat;
205
- mask-position: 50% 50%;
206
- -webkit-mask-image: var(--icon, var(--icon-arrow));
207
- -webkit-mask-size: 50%;
208
- -webkit-mask-repeat: no-repeat;
209
- -webkit-mask-position: 50% 50%;
210
- z-index: 2;
211
- display: inline-block;
212
- vertical-align: bottom;
213
- float: right;
214
- rotate: 90deg;
215
- color: inherit;
216
- }
217
- </style>`
218
- );
219
208
  }
220
209
  }
221
210