@iamproperty/components 7.3.0 → 7.5.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 (327) hide show
  1. package/README.md +1 -1
  2. package/assets/css/components/actionbar.component.css +1 -1
  3. package/assets/css/components/actionbar.component.css.map +1 -1
  4. package/assets/css/components/actionbar.global.css +1 -1
  5. package/assets/css/components/actionbar.global.css.map +1 -1
  6. package/assets/css/components/address-lookup.component.css +1 -0
  7. package/assets/css/components/address-lookup.component.css.map +1 -0
  8. package/assets/css/components/barchart.component.css +1 -1
  9. package/assets/css/components/barchart.component.css.map +1 -1
  10. package/assets/css/components/calendar.component.css +1 -0
  11. package/assets/css/components/calendar.component.css.map +1 -0
  12. package/assets/css/components/calendar.config.css +1 -0
  13. package/assets/css/components/calendar.config.css.map +1 -0
  14. package/assets/css/components/card.component.css +1 -1
  15. package/assets/css/components/card.component.css.map +1 -1
  16. package/assets/css/components/carousel.component.css +1 -1
  17. package/assets/css/components/carousel.component.css.map +1 -1
  18. package/assets/css/components/charts.css +1 -1
  19. package/assets/css/components/charts.css.map +1 -1
  20. package/assets/css/components/collapsible-side.css +1 -1
  21. package/assets/css/components/collapsible-side.css.map +1 -1
  22. package/assets/css/components/content.component.css +1 -0
  23. package/assets/css/components/content.component.css.map +1 -0
  24. package/assets/css/components/darkmode.component.css +1 -0
  25. package/assets/css/components/darkmode.component.css.map +1 -0
  26. package/assets/css/components/doughnutchart.component.css +1 -1
  27. package/assets/css/components/doughnutchart.component.css.map +1 -1
  28. package/assets/css/components/fileupload.css.map +1 -1
  29. package/assets/css/components/inline-edit.css +1 -1
  30. package/assets/css/components/inline-edit.css.map +1 -1
  31. package/assets/css/components/marketing.component.css +1 -0
  32. package/assets/css/components/marketing.component.css.map +1 -0
  33. package/assets/css/components/menu.component.css.map +1 -1
  34. package/assets/css/components/{menu.css → menu.global.css} +1 -1
  35. package/assets/css/components/menu.global.css.map +1 -0
  36. package/assets/css/components/milestone.css +1 -0
  37. package/assets/css/components/milestone.css.map +1 -0
  38. package/assets/css/components/multi-step.component.css +1 -1
  39. package/assets/css/components/multi-step.component.css.map +1 -1
  40. package/assets/css/components/multiselect.css +1 -1
  41. package/assets/css/components/multiselect.css.map +1 -1
  42. package/assets/css/components/multiselect.preload.css +1 -1
  43. package/assets/css/components/multiselect.preload.css.map +1 -1
  44. package/assets/css/components/nav.component.css +1 -1
  45. package/assets/css/components/nav.component.css.map +1 -1
  46. package/assets/css/components/nav.global.css +1 -1
  47. package/assets/css/components/nav.global.css.map +1 -1
  48. package/assets/css/components/notification.css +1 -1
  49. package/assets/css/components/notification.css.map +1 -1
  50. package/assets/css/components/pagination.css.map +1 -1
  51. package/assets/css/components/property-searchbar.css +1 -1
  52. package/assets/css/components/property-searchbar.css.map +1 -1
  53. package/assets/css/components/rank.component.css +1 -1
  54. package/assets/css/components/rank.component.css.map +1 -1
  55. package/assets/css/components/rankings.component.css +1 -1
  56. package/assets/css/components/rankings.component.css.map +1 -1
  57. package/assets/css/components/rankings.global.css +1 -1
  58. package/assets/css/components/rankings.global.css.map +1 -1
  59. package/assets/css/components/slider.css.map +1 -1
  60. package/assets/css/components/split-button.component.css +1 -0
  61. package/assets/css/components/split-button.component.css.map +1 -0
  62. package/assets/css/components/word-count.component.css +1 -0
  63. package/assets/css/components/word-count.component.css.map +1 -0
  64. package/assets/css/core.min.css +1 -1
  65. package/assets/css/core.min.css.map +1 -1
  66. package/assets/css/mobile-core.min.css +1 -1
  67. package/assets/css/mobile-core.min.css.map +1 -1
  68. package/assets/css/mobile.min.css +1 -1
  69. package/assets/css/mobile.min.css.map +1 -1
  70. package/assets/css/style.min.css +1 -1
  71. package/assets/css/style.min.css.map +1 -1
  72. package/assets/js/components/accordion/accordion.component.js +40 -19
  73. package/assets/js/components/accordion/accordion.component.min.js +15 -15
  74. package/assets/js/components/accordion/accordion.component.min.js.map +1 -1
  75. package/assets/js/components/actionbar/actionbar.component.js +59 -31
  76. package/assets/js/components/actionbar/actionbar.component.min.js +18 -17
  77. package/assets/js/components/actionbar/actionbar.component.min.js.map +1 -1
  78. package/assets/js/components/address-lookup/address-lookup.component.js +6 -8
  79. package/assets/js/components/address-lookup/address-lookup.component.min.js +10 -12
  80. package/assets/js/components/address-lookup/address-lookup.component.min.js.map +1 -1
  81. package/assets/js/components/advanced-select/advanced-select.component.js +63 -0
  82. package/assets/js/components/advanced-select/advanced-select.component.min.js +23 -0
  83. package/assets/js/components/advanced-select/advanced-select.component.min.js.map +1 -0
  84. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  85. package/assets/js/components/applied-filters/applied-filters.component.min.js.map +1 -1
  86. package/assets/js/components/barchart/barchart.component.min.js +2 -2
  87. package/assets/js/components/barchart/barchart.component.min.js.map +1 -1
  88. package/assets/js/components/bento-grid/bento-grid.component.min.js +1 -1
  89. package/assets/js/components/bento-grid/bento-grid.component.min.js.map +1 -1
  90. package/assets/js/components/calendar/calendar.component.js +1100 -0
  91. package/assets/js/components/calendar/calendar.component.min.js +170 -0
  92. package/assets/js/components/calendar/calendar.component.min.js.map +1 -0
  93. package/assets/js/components/card/card.component.js +14 -8
  94. package/assets/js/components/card/card.component.min.js +16 -10
  95. package/assets/js/components/card/card.component.min.js.map +1 -1
  96. package/assets/js/components/carousel/carousel.component.js +17 -19
  97. package/assets/js/components/carousel/carousel.component.min.js +17 -19
  98. package/assets/js/components/carousel/carousel.component.min.js.map +1 -1
  99. package/assets/js/components/collapsible-side/collapsible-side.component.js +47 -12
  100. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +6 -5
  101. package/assets/js/components/collapsible-side/collapsible-side.component.min.js.map +1 -1
  102. package/assets/js/components/content/content.component.js +66 -0
  103. package/assets/js/components/content/content.component.min.js +15 -0
  104. package/assets/js/components/content/content.component.min.js.map +1 -0
  105. package/assets/js/components/darkmode/darkmode.component.js +70 -0
  106. package/assets/js/components/darkmode/darkmode.component.min.js +10 -0
  107. package/assets/js/components/darkmode/darkmode.component.min.js.map +1 -0
  108. package/assets/js/components/doughnutchart/doughnutchart.component.min.js +2 -2
  109. package/assets/js/components/doughnutchart/doughnutchart.component.min.js.map +1 -1
  110. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  111. package/assets/js/components/fileupload/fileupload.component.min.js.map +1 -1
  112. package/assets/js/components/filter-card/filter-card.component.min.js +1 -1
  113. package/assets/js/components/filter-card/filter-card.component.min.js.map +1 -1
  114. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  115. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
  116. package/assets/js/components/header/header.component.min.js +1 -1
  117. package/assets/js/components/header/header.component.min.js.map +1 -1
  118. package/assets/js/components/inline-edit/inline-edit.component.min.js +5 -5
  119. package/assets/js/components/inline-edit/inline-edit.component.min.js.map +1 -1
  120. package/assets/js/components/marketing/marketing.component.js +1 -1
  121. package/assets/js/components/marketing/marketing.component.min.js +2 -2
  122. package/assets/js/components/marketing/marketing.component.min.js.map +1 -1
  123. package/assets/js/components/menu/menu.component.js +12 -4
  124. package/assets/js/components/menu/menu.component.min.js +4 -5
  125. package/assets/js/components/menu/menu.component.min.js.map +1 -1
  126. package/assets/js/components/milestone/milestone.component.js +36 -0
  127. package/assets/js/components/milestone/milestone.component.min.js +15 -0
  128. package/assets/js/components/milestone/milestone.component.min.js.map +1 -0
  129. package/assets/js/components/milestone-group/milestone-group.component.js +33 -0
  130. package/assets/js/components/milestone-group/milestone-group.component.min.js +13 -0
  131. package/assets/js/components/milestone-group/milestone-group.component.min.js.map +1 -0
  132. package/assets/js/components/multi-step/multi-step.component.min.js +3 -3
  133. package/assets/js/components/multi-step/multi-step.component.min.js.map +1 -1
  134. package/assets/js/components/multiselect/multiselect.component.js +54 -2
  135. package/assets/js/components/multiselect/multiselect.component.min.js +5 -5
  136. package/assets/js/components/multiselect/multiselect.component.min.js.map +1 -1
  137. package/assets/js/components/nav/nav.component.js +18 -0
  138. package/assets/js/components/nav/nav.component.min.js +6 -6
  139. package/assets/js/components/nav/nav.component.min.js.map +1 -1
  140. package/assets/js/components/notification/notification.component.js +15 -11
  141. package/assets/js/components/notification/notification.component.min.js +4 -4
  142. package/assets/js/components/notification/notification.component.min.js.map +1 -1
  143. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  144. package/assets/js/components/pagination/pagination.component.min.js.map +1 -1
  145. package/assets/js/components/rank/rank.component.js +346 -210
  146. package/assets/js/components/rank/rank.component.min.js +346 -211
  147. package/assets/js/components/rank/rank.component.min.js.map +1 -1
  148. package/assets/js/components/rankings/rankings.component.js +17 -8
  149. package/assets/js/components/rankings/rankings.component.min.js +14 -8
  150. package/assets/js/components/rankings/rankings.component.min.js.map +1 -1
  151. package/assets/js/components/record-card/record-card.component.min.js +1 -1
  152. package/assets/js/components/record-card/record-card.component.min.js.map +1 -1
  153. package/assets/js/components/search/search.component.js +5 -3
  154. package/assets/js/components/search/search.component.min.js +6 -6
  155. package/assets/js/components/search/search.component.min.js.map +1 -1
  156. package/assets/js/components/slider/slider.component.min.js +1 -1
  157. package/assets/js/components/slider/slider.component.min.js.map +1 -1
  158. package/assets/js/components/split-button/split-button.component.js +58 -0
  159. package/assets/js/components/split-button/split-button.component.min.js +31 -0
  160. package/assets/js/components/split-button/split-button.component.min.js.map +1 -0
  161. package/assets/js/components/table/table.component.js +12 -0
  162. package/assets/js/components/table/table.component.min.js +3 -3
  163. package/assets/js/components/table/table.component.min.js.map +1 -1
  164. package/assets/js/components/table-ajax/table-ajax.component.js +12 -0
  165. package/assets/js/components/table-ajax/table-ajax.component.min.js +3 -3
  166. package/assets/js/components/table-ajax/table-ajax.component.min.js.map +1 -1
  167. package/assets/js/components/table-basic/table-basic.component.min.js +1 -1
  168. package/assets/js/components/table-basic/table-basic.component.min.js.map +1 -1
  169. package/assets/js/components/table-no-submit/table-no-submit.component.js +12 -0
  170. package/assets/js/components/table-no-submit/table-no-submit.component.min.js +3 -3
  171. package/assets/js/components/table-no-submit/table-no-submit.component.min.js.map +1 -1
  172. package/assets/js/components/table-submit/table-submit.component.js +12 -0
  173. package/assets/js/components/table-submit/table-submit.component.min.js +3 -3
  174. package/assets/js/components/table-submit/table-submit.component.min.js.map +1 -1
  175. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  176. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  177. package/assets/js/components/video-card/video-card.component.min.js +1 -1
  178. package/assets/js/components/video-card/video-card.component.min.js.map +1 -1
  179. package/assets/js/components/word-count/word-count.component.js +81 -0
  180. package/assets/js/components/word-count/word-count.component.min.js +12 -0
  181. package/assets/js/components/word-count/word-count.component.min.js.map +1 -0
  182. package/assets/js/components.js +59 -0
  183. package/assets/js/modules/advanced-select.js +106 -0
  184. package/assets/js/modules/dialogs.js +53 -51
  185. package/assets/js/modules/dynamicEvents.js +7 -0
  186. package/assets/js/modules/inputs.js +0 -18
  187. package/assets/js/modules/milestone-group.js +30 -0
  188. package/assets/js/modules/milestone.js +89 -0
  189. package/assets/js/modules/table.js +11 -1
  190. package/assets/js/modules/videos.js +1 -1
  191. package/assets/js/scripts.bundle.js +3 -3
  192. package/assets/js/scripts.bundle.js.map +1 -1
  193. package/assets/js/scripts.bundle.min.js +2 -2
  194. package/assets/js/scripts.bundle.min.js.map +1 -1
  195. package/assets/js/scripts.js +5 -0
  196. package/assets/sass/_components.scss +15 -4
  197. package/assets/sass/_example.scss +1 -1
  198. package/assets/sass/_functions/utility-mixins.scss +40 -0
  199. package/assets/sass/_functions/variables.scss +11 -5
  200. package/assets/sass/components/actionbar.component.scss +23 -1
  201. package/assets/sass/components/actionbar.global.scss +5 -5
  202. package/assets/sass/components/{address-lookup.scss → address-lookup.component.scss} +10 -0
  203. package/assets/sass/components/calendar.component.scss +1272 -0
  204. package/assets/sass/components/calendar.config.scss +423 -0
  205. package/assets/sass/components/card.component.scss +4 -34
  206. package/assets/sass/components/carousel.component.scss +5 -0
  207. package/assets/sass/components/collapsible-side.scss +91 -95
  208. package/assets/sass/components/content.component.scss +18 -0
  209. package/assets/sass/components/darkmode.component.scss +22 -0
  210. package/assets/sass/components/inline-edit.scss +2 -0
  211. package/assets/sass/components/{marketing.scss → marketing.component.scss} +2 -6
  212. package/assets/sass/components/menu.component.scss +3 -8
  213. package/assets/sass/components/milestone.scss +216 -0
  214. package/assets/sass/components/multi-step.component.scss +1 -1
  215. package/assets/sass/components/multiselect.preload.scss +1 -1
  216. package/assets/sass/components/multiselect.scss +2 -0
  217. package/assets/sass/components/nav.component.scss +17 -6
  218. package/assets/sass/components/nav.global.scss +29 -3
  219. package/assets/sass/components/notification.scss +32 -13
  220. package/assets/sass/components/rank.component.scss +197 -24
  221. package/assets/sass/components/rankings.component.scss +38 -28
  222. package/assets/sass/components/rankings.global.scss +64 -2
  223. package/assets/sass/components/split-button.component.scss +79 -0
  224. package/assets/sass/components/table-basic.global.scss +32 -32
  225. package/assets/sass/components/word-count.component.scss +26 -0
  226. package/assets/sass/elements/admin-panel.scss +1 -1
  227. package/assets/sass/elements/badge-tag.scss +5 -1
  228. package/assets/sass/elements/buttons--compact.scss +4 -0
  229. package/assets/sass/elements/details.scss +33 -7
  230. package/assets/sass/elements/forms.scss +135 -28
  231. package/assets/sass/elements/links.scss +132 -4
  232. package/assets/sass/elements/lists.scss +62 -1
  233. package/assets/sass/elements/popover.scss +64 -10
  234. package/assets/sass/elements/toggle-button.scss +8 -8
  235. package/assets/sass/elements/type.scss +7 -10
  236. package/assets/sass/foundations/colours.scss +0 -0
  237. package/assets/sass/foundations/reboot.scss +8 -1
  238. package/assets/sass/foundations/root.scss +41 -51
  239. package/assets/sass/templates/form.scss +0 -2
  240. package/assets/ts/components/accordion/accordion.component.ts +47 -26
  241. package/assets/ts/components/actionbar/actionbar.component.ts +58 -22
  242. package/assets/ts/components/address-lookup/address-lookup.component.ts +6 -8
  243. package/assets/ts/components/advanced-select/advanced-select.component.ts +74 -0
  244. package/assets/ts/components/calendar/calendar.component.ts +1330 -0
  245. package/assets/ts/components/card/card.component.ts +15 -14
  246. package/assets/ts/components/carousel/carousel.component.ts +17 -19
  247. package/assets/ts/components/collapsible-side/collapsible-side.component.ts +53 -12
  248. package/assets/ts/components/content/content.component.ts +78 -0
  249. package/assets/ts/components/darkmode/darkmode.component.ts +85 -0
  250. package/assets/ts/components/marketing/marketing.component.ts +1 -1
  251. package/assets/ts/components/menu/menu.component.ts +18 -10
  252. package/assets/ts/components/milestone/milestone.component.ts +43 -0
  253. package/assets/ts/components/milestone-group/milestone-group.component.ts +39 -0
  254. package/assets/ts/components/multiselect/multiselect.component.ts +60 -3
  255. package/assets/ts/components/nav/nav.component.ts +18 -0
  256. package/assets/ts/components/notification/notification.component.ts +30 -11
  257. package/assets/ts/components/rank/rank.component.ts +345 -209
  258. package/assets/ts/components/rankings/rankings.component.ts +27 -8
  259. package/assets/ts/components/search/search.component.ts +6 -4
  260. package/assets/ts/components/split-button/split-button.component.ts +67 -0
  261. package/assets/ts/components/table/table.component.ts +14 -0
  262. package/assets/ts/components/table-ajax/table-ajax.component.ts +14 -0
  263. package/assets/ts/components/table-no-submit/table-no-submit.component.ts +14 -0
  264. package/assets/ts/components/table-submit/table-submit.component.ts +14 -0
  265. package/assets/ts/components/video-card/video-card.component.ts +2 -3
  266. package/assets/ts/components/word-count/word-count.component.ts +91 -0
  267. package/assets/ts/components.ts +64 -0
  268. package/assets/ts/modules/advanced-select.ts +120 -0
  269. package/assets/ts/modules/data-layer.md +0 -5
  270. package/assets/ts/modules/dialogs.ts +64 -61
  271. package/assets/ts/modules/dynamicEvents.ts +10 -0
  272. package/assets/ts/modules/inputs.ts +0 -25
  273. package/assets/ts/modules/milestone-group.ts +39 -0
  274. package/assets/ts/modules/milestone.ts +119 -0
  275. package/assets/ts/modules/table.ts +15 -1
  276. package/assets/ts/modules/videos.ts +19 -37
  277. package/assets/ts/scripts.ts +6 -3
  278. package/dist/components.es.js +849 -1079
  279. package/dist/components.umd.js +1052 -220
  280. package/package.json +6 -6
  281. package/src/components/Accordion/Accordion.vue +14 -23
  282. package/src/components/Accordion/AccordionItem.vue +27 -43
  283. package/src/components/Actionbar/Actionbar.vue +17 -19
  284. package/src/components/AddressLookup/AddressLookup.vue +17 -18
  285. package/src/components/AdvancedSelect/AdvancedSelect.vue +22 -0
  286. package/src/components/AppliedFilters/AppliedFilters.vue +16 -18
  287. package/src/components/Banner/Banner.vue +18 -21
  288. package/src/components/BarChart/BarChart.vue +17 -18
  289. package/src/components/Calendar/Calendar.vue +20 -0
  290. package/src/components/Card/Card.vue +17 -17
  291. package/src/components/Carousel/Carousel.vue +17 -20
  292. package/src/components/CollapsibleSideMenu/CollapsibleSideMenu.vue +7 -13
  293. package/src/components/Content/Content.vue +22 -0
  294. package/src/components/DarkMode/DarkMode.vue +19 -0
  295. package/src/components/DoughnutChart/DoughnutChart.vue +17 -18
  296. package/src/components/FileUpload/FileUpload.vue +22 -28
  297. package/src/components/FilterCard/FilterCard.vue +17 -18
  298. package/src/components/Filterlist/Filterlist.vue +17 -0
  299. package/src/components/Header/Header.vue +28 -29
  300. package/src/components/InlineEdit/InlineEdit.vue +11 -19
  301. package/src/components/Menu/Menu.vue +17 -17
  302. package/src/components/Milestones/Milestone.vue +22 -0
  303. package/src/components/Milestones/MilestoneGroup.vue +24 -0
  304. package/src/components/Multiselect/Multiselect.vue +17 -18
  305. package/src/components/Nav/Nav.vue +17 -19
  306. package/src/components/Notification/Notification.vue +17 -15
  307. package/src/components/Pagination/Pagination.vue +16 -16
  308. package/src/components/Rank/Rank.vue +17 -18
  309. package/src/components/Rankings/Rankings.vue +17 -27
  310. package/src/components/RecordCard/RecordCard.vue +17 -18
  311. package/src/components/Search/Search.vue +17 -17
  312. package/src/components/Slider/Slider.vue +17 -17
  313. package/src/components/SplitButton/README.md +19 -0
  314. package/src/components/SplitButton/SplitButton.vue +23 -0
  315. package/src/components/Tabs/Tabs.vue +17 -17
  316. package/src/components/VideoCard/VideoCard.vue +17 -18
  317. package/src/components/WordCount/WordCount.vue +22 -0
  318. package/src/index.js +2 -0
  319. package/assets/css/components/address-lookup.css +0 -1
  320. package/assets/css/components/address-lookup.css.map +0 -1
  321. package/assets/css/components/marketing.css +0 -1
  322. package/assets/css/components/marketing.css.map +0 -1
  323. package/assets/css/components/menu.css.map +0 -1
  324. package/assets/css/components/nav.old.css +0 -1
  325. package/assets/css/components/nav.old.css.map +0 -1
  326. package/assets/sass/components/nav.old.scss +0 -891
  327. /package/assets/sass/components/{menu.scss → menu.global.scss} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { trackComponent, trackComponentRegistered } from '../_global';
2
2
  import { cardHTML, setupCard } from '../../modules/card.module';
3
+ import iamMenu from '../menu/menu.component';
3
4
 
4
5
  trackComponentRegistered('iam-card');
5
6
 
@@ -32,6 +33,12 @@ class iamCard extends HTMLElement {
32
33
  const cardComponent = this;
33
34
  const cardBody = cardComponent.shadowRoot.querySelector('.card__body');
34
35
 
36
+ const assetLocation = document.body.hasAttribute('data-assets-location')
37
+ ? document.body.getAttribute('data-assets-location')
38
+ : '/assets';
39
+
40
+ if (!window.customElements.get(`iam-menu`)) window.customElements.define(`iam-menu`, iamMenu);
41
+
35
42
  setupCard(cardComponent);
36
43
 
37
44
  // Add Illustration HTML
@@ -51,22 +58,19 @@ class iamCard extends HTMLElement {
51
58
 
52
59
  // Add the dialog wrapper HTML
53
60
  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>
61
+ cardComponent.shadowRoot.innerHTML += `<div class="menu__wrapper">
62
+ <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>
63
+ <iam-menu class="dialog--fix dialog--list" id="actions" style="position-anchor: --anchor-el;" popover>
57
64
  <slot name="btns"></slot>
58
- </div>
65
+ </iam-menu>
59
66
  </div>`;
60
67
 
61
68
  // safari and firefox anchor fix for cards
62
69
  if (!CSS.supports('top', 'anchor(top)')) {
63
-
64
-
65
70
  const actionButton = this.shadowRoot?.querySelector('[popovertarget="actions"]');
66
71
  const actionPopover = this.shadowRoot?.querySelector('[popover]');
67
72
 
68
73
  actionButton?.addEventListener('click', (event) => {
69
-
70
74
  this.style.setProperty('overflow', 'visible');
71
75
  this.style.setProperty('z-index', '999999');
72
76
 
@@ -76,18 +80,15 @@ class iamCard extends HTMLElement {
76
80
 
77
81
  actionPopover.style.setProperty('display', 'block');
78
82
  actionPopover.style.setProperty('top', top + 'px');
79
- actionPopover.style.setProperty('left', (left - 100) + 'px');
83
+ actionPopover.style.setProperty('left', left - 100 + 'px');
80
84
  });
81
85
 
82
- document.addEventListener("scroll", (event) => {
83
-
86
+ document.addEventListener('scroll', (event) => {
84
87
  actionPopover.style.setProperty('display', 'none');
85
88
  });
86
-
87
89
  }
88
90
  }
89
91
 
90
-
91
92
  // Make sure slotted buttons and links have correct button classes
92
93
  Array.from(cardComponent.querySelectorAll('[slot="btns"]')).forEach((button) => {
93
94
  button.classList.add('btn');
@@ -107,8 +108,8 @@ class iamCard extends HTMLElement {
107
108
  });
108
109
  }
109
110
 
110
- if (cardComponent.shadowRoot.querySelector('.dialog__wrapper')) {
111
- const element = cardComponent.shadowRoot.querySelector('.dialog__wrapper');
111
+ if (cardComponent.shadowRoot.querySelector('.menu__wrapper')) {
112
+ const element = cardComponent.shadowRoot.querySelector('.menu__wrapper');
112
113
 
113
114
  element.addEventListener('mouseenter', () => {
114
115
  cardComponent.classList.add('prevent-hover');
@@ -15,34 +15,32 @@ class iamCarousel extends HTMLElement {
15
15
  const loadCSS = `@import "${assetLocation}/css/components/carousel.component.css";`;
16
16
 
17
17
  const template = document.createElement('template');
18
- template.innerHTML = `
19
- <style>
20
- ${loadCSS}
21
- ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
22
- </style>
23
- <div class="carousel" part="carousel">
24
- <div class="carousel__wrapper">
25
- <div class="carousel__inner">
26
- <div class="carousel__content" part="content">
27
- <slot></slot>
18
+ template.innerHTML = /* HTML */ `
19
+ <style>
20
+ ${loadCSS}
21
+ ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
22
+ </style>
23
+ <div class="carousel" part="carousel">
24
+ <div class="carousel__wrapper">
25
+ <div class="carousel__inner">
26
+ <div class="carousel__content" part="content">
27
+ <slot></slot>
28
+ </div>
28
29
  </div>
29
30
  </div>
30
-
31
- </div>
32
31
  <div class="carousel__btns" part="btns">
33
- <button class="btn btn-secondary btn-compact fa-plus-large btn-prev" data-go="0" disabled part="prev">Prev</button>
32
+ <button class="btn btn-secondary btn-compact fa-plus-large btn-prev" data-go="0" disabled part="prev">
33
+ Prev
34
+ </button>
34
35
  <button class="btn btn-secondary btn-compact fa-plus-large btn-next" data-go="2" part="next">Next</button>
35
36
  </div>
36
37
 
37
- <div class="carousel__controls" part="controls">
38
-
39
- </div>
38
+ <div class="carousel__controls" part="controls"></div>
40
39
 
41
40
  <div class="carousel__progress" part="progress">
42
- <input type="range" min="0" max="100" value="1" step="1">
41
+ <input type="range" min="0" max="100" value="1" step="1" />
43
42
  </div>
44
-
45
- </div>
43
+ </div>
46
44
  `;
47
45
  this.shadowRoot.appendChild(template.content.cloneNode(true));
48
46
  }
@@ -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;
@@ -0,0 +1,85 @@
1
+ // Data layer Web component created
2
+ declare global {
3
+ interface Window {
4
+ dataLayer: Array<object>;
5
+ }
6
+ }
7
+ window.dataLayer = window.dataLayer || [];
8
+ window.dataLayer.push({
9
+ event: 'customElementRegistered',
10
+ element: 'Dark mode button',
11
+ });
12
+
13
+ class iamDarkMode extends HTMLElement {
14
+ constructor() {
15
+ super();
16
+ this.attachShadow({ mode: 'open' });
17
+
18
+ const assetLocation = document.body.hasAttribute('data-assets-location')
19
+ ? document.body.getAttribute('data-assets-location')
20
+ : '/assets';
21
+ const loadCSS = `@import "${assetLocation}/css/components/darkmode.component.css";`;
22
+
23
+ const template = document.createElement('template');
24
+ template.innerHTML = `
25
+ <style>${loadCSS}
26
+ </style>
27
+ <slot></slot>
28
+ `;
29
+ this.shadowRoot?.appendChild(template.content.cloneNode(true));
30
+ }
31
+
32
+ connectedCallback(): void {
33
+ const label = this.querySelector('label');
34
+
35
+ const storedTheme = localStorage.getItem('user-theme');
36
+
37
+ // Work from local storage first then look at the media preferences
38
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" /> Light mode`;
39
+ if (storedTheme == 'dark-theme') {
40
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" checked="checked" /> Dark mode`;
41
+ label?.classList.add('dark-theme');
42
+ } else if (storedTheme == 'light-theme') {
43
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" /> Light mode`;
44
+ label?.classList.remove('dark-theme');
45
+ }
46
+
47
+ const hasDarkPreference = window.matchMedia('(prefers-color-scheme: dark)').matches;
48
+ if (hasDarkPreference) {
49
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" checked="checked" /> Dark mode`;
50
+ label?.classList.remove('dark-theme');
51
+ }
52
+
53
+ this.addEventListener('click', (event) => {
54
+ console.log(label?.querySelector('input:checked'));
55
+
56
+ if (label?.querySelector('input:checked')) {
57
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" checked="checked" /> Dark mode`;
58
+ localStorage.setItem('user-theme', 'dark-theme');
59
+ document.documentElement.className = 'dark-theme';
60
+ label?.classList.add('dark-theme');
61
+ } else {
62
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" /> Light mode`;
63
+ localStorage.setItem('user-theme', 'light-theme');
64
+ document.documentElement.className = 'light-theme';
65
+ label?.classList.remove('dark-theme');
66
+ }
67
+ });
68
+
69
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', ({ matches }) => {
70
+ if (matches) {
71
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" checked="checked" /> Dark mode`;
72
+ label?.classList.add('dark-theme');
73
+ }
74
+ });
75
+
76
+ window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', ({ matches }) => {
77
+ if (matches) {
78
+ label?.innerHTML = `<input type="checkbox" name="dark-mode" /> Light mode`;
79
+ label?.classList.remove('dark-theme');
80
+ }
81
+ });
82
+ }
83
+ }
84
+
85
+ export default iamDarkMode;
@@ -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 = `
@@ -6,13 +6,13 @@ class iamMenu extends HTMLElement {
6
6
  const assetLocation = document.body.hasAttribute('data-assets-location')
7
7
  ? document.body.getAttribute('data-assets-location')
8
8
  : '/assets';
9
- const loadCSS = `@import "${assetLocation}/css/components/menu.component.css";`;
9
+ const menuCSS = `@import "${assetLocation}/css/components/menu.component.css";`;
10
10
 
11
11
  const template = document.createElement('template');
12
12
 
13
13
  template.innerHTML = `
14
14
  <style>
15
- ${loadCSS}
15
+ ${menuCSS}
16
16
  </style>
17
17
  <div class="menu--inner" part="inner">
18
18
  <slot></slot>
@@ -24,8 +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 topLevelmenuItems = this.querySelectorAll(':scope > a, :scope > button, :scope > details > summary');
28
- 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
+
29
35
  const subMenus = this.querySelectorAll('details');
30
36
 
31
37
  let subNextIndex;
@@ -136,19 +142,21 @@ class iamMenu extends HTMLElement {
136
142
  const updateEvent = new CustomEvent(e.newState, { detail: { id: this.getAttribute('id'), target: e.target } });
137
143
  this.dispatchEvent(updateEvent);
138
144
 
145
+ // Fix the focus
146
+ if (this.closest('.menu__wrapper')) {
147
+ menuItems[0].focus();
148
+ }
149
+
139
150
  if (this.hasAttribute('popover-open')) {
140
151
  e.preventDefault();
141
152
  this.removeAttribute('popover-open');
142
153
  this.hidePopover();
143
154
  }
144
155
 
145
- if(this.matches(':popover-open') && document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)){
146
-
147
- document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.setAttribute('aria-pressed','true');
156
+ if (this.matches(':popover-open') && document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)) {
157
+ document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.setAttribute('aria-pressed', 'true');
148
158
  document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.add('active');
149
- }
150
- else {
151
-
159
+ } else {
152
160
  document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.removeAttribute('aria-pressed');
153
161
  document.querySelector(`[popovertarget="${this.getAttribute('id')}"]`)?.classList.remove('active');
154
162
  }
@@ -0,0 +1,43 @@
1
+ import { trackComponent, trackComponentRegistered } from '../_global';
2
+ import milestone from '../../modules/milestone';
3
+
4
+ trackComponentRegistered('iam-milestone');
5
+
6
+ class iamMilestone extends HTMLElement {
7
+ constructor() {
8
+ super();
9
+ this.attachShadow({ mode: 'open' });
10
+
11
+ const assetLocation = document.body.hasAttribute('data-assets-location')
12
+ ? document.body.getAttribute('data-assets-location')
13
+ : '/assets';
14
+ const coreCSS = document.body.hasAttribute('data-core-css')
15
+ ? document.body.getAttribute('data-core-css')
16
+ : `${assetLocation}/css/core.min.css`;
17
+
18
+ const template = document.createElement('template');
19
+ template.innerHTML = `
20
+ <style>
21
+ @import "${coreCSS}";
22
+ </style>
23
+ <div class="milestone-wrap" part="milestone-wrap">
24
+ <slot name="milestone-intro" class="milestone-intro" part="milestone-intro"></slot>
25
+ <slot>
26
+ <div class="task-wrap" part="milestone-task-wrap"></div>
27
+ </slot>
28
+ </div>
29
+ `;
30
+ this.shadowRoot?.appendChild(template.content.cloneNode(true));
31
+ }
32
+
33
+ connectedCallback(): void {
34
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
35
+ const milestoneComponent = this;
36
+
37
+ trackComponent(milestoneComponent, 'iam-milestone', ['milestone-item-closed', 'milestone-item-opened']);
38
+
39
+ milestone(this);
40
+ }
41
+ }
42
+
43
+ export default iamMilestone;
@@ -0,0 +1,39 @@
1
+ import { trackComponent, trackComponentRegistered } from '../_global';
2
+ import milestoneGroup from '../../modules/milestone-group';
3
+
4
+ trackComponentRegistered('iam-milestone-group');
5
+
6
+ class iamMilestoneGroup extends HTMLElement {
7
+ constructor() {
8
+ super();
9
+ const assetLocation = document.body.hasAttribute('data-assets-location')
10
+ ? document.body.getAttribute('data-assets-location')
11
+ : '/assets';
12
+ const coreCSS = document.body.hasAttribute('data-core-css')
13
+ ? document.body.getAttribute('data-core-css')
14
+ : `${assetLocation}/css/core.min.css`;
15
+
16
+ const template = document.createElement('template');
17
+ template.innerHTML = `
18
+ <style>
19
+ @import "${coreCSS}";
20
+ </style>
21
+ <div class="milestone-group" part="milestone-group">
22
+ <slot>
23
+ </slot>
24
+ </div>
25
+ `;
26
+ this.shadowRoot?.appendChild(template.content.cloneNode(true));
27
+ }
28
+
29
+ connectedCallback(): void {
30
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
31
+ const milestoneGroupComponent = this;
32
+
33
+ trackComponent(milestoneGroupComponent, 'iam-milestone-group', ['hide-future-items', 'show-future-items']);
34
+
35
+ milestoneGroup(this);
36
+ }
37
+ }
38
+
39
+ export default iamMilestoneGroup;
@@ -67,8 +67,6 @@ class iamMultiselect extends HTMLElement {
67
67
  mutations.forEach(function (mutationRecord) {
68
68
  const targetElement = mutationRecord.target as HTMLElement;
69
69
 
70
- console.log(targetElement);
71
-
72
70
  if (targetElement.classList.contains('was-validated')) {
73
71
  wrapper.classList.add('was-validated');
74
72
  } else {
@@ -149,7 +147,23 @@ class iamMultiselect extends HTMLElement {
149
147
  clearTimeout(hoverTimeout);
150
148
  });
151
149
 
152
- search.addEventListener('blur', () => {
150
+ search.addEventListener('blur', (event) => {
151
+ setTimeout(function () {
152
+ const activeElement = document.activeElement;
153
+
154
+ if (activeElement.getAttribute('type') != 'checkbox') {
155
+ if (multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`)) {
156
+ multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`).checked = true;
157
+ setItem(multiselect.querySelector(`input[type="checkbox"][value="${search.value}" i]`));
158
+ }
159
+ search.value = '';
160
+
161
+ Array.from(multiselect.querySelectorAll(`label input[type="checkbox"]`)).forEach((checkbox) => {
162
+ setItem(checkbox);
163
+ });
164
+ }
165
+ }, 200);
166
+
153
167
  clearTimeout(hoverTimeout);
154
168
  hoverTimeout = setTimeout(function () {
155
169
  multiselect.classList.remove('hover');
@@ -163,6 +177,7 @@ class iamMultiselect extends HTMLElement {
163
177
 
164
178
  setItem(checkbox);
165
179
 
180
+ search.value = '';
166
181
  search.focus();
167
182
  clearTimeout(hoverTimeout);
168
183
  multiselect.classList.add('hover');
@@ -190,6 +205,41 @@ class iamMultiselect extends HTMLElement {
190
205
  switch (
191
206
  event.key // change to event.key to key to use the above variable
192
207
  ) {
208
+ case 'ArrowLeft':
209
+ // Up pressed
210
+ event.preventDefault();
211
+
212
+ if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
213
+ const arrCheckboxes = multiselect.querySelectorAll(`label[slot="checked"][slot="checked"]`);
214
+
215
+ const activeIndex = Array.from(arrCheckboxes).indexOf(activeElement.closest('label'));
216
+ const prevCheckbox = Array.from(arrCheckboxes)[activeIndex - 1];
217
+
218
+ if (prevCheckbox) prevCheckbox.focus();
219
+ else search.focus();
220
+ } else if (activeElement == multiselect) {
221
+ const options = Array.from(multiselect.querySelectorAll('label[slot="checked"]')).sort(function (a, b) {
222
+ return +a.dataset.order - +b.dataset.order;
223
+ });
224
+
225
+ options.pop().focus();
226
+ }
227
+
228
+ break;
229
+ case 'ArrowRight':
230
+ // Up pressed
231
+ event.preventDefault();
232
+
233
+ if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
234
+ const arrCheckboxes = multiselect.querySelectorAll(`label[slot="checked"][slot="checked"]`);
235
+
236
+ const activeIndex = Array.from(arrCheckboxes).indexOf(activeElement.closest('label'));
237
+ const nextCheckbox = Array.from(arrCheckboxes)[activeIndex + 1];
238
+
239
+ if (nextCheckbox) nextCheckbox.focus();
240
+ else search.focus();
241
+ }
242
+ break;
193
243
  case 'ArrowUp':
194
244
  // Up pressed
195
245
  event.preventDefault();
@@ -234,6 +284,13 @@ class iamMultiselect extends HTMLElement {
234
284
  setItem(activeElement);
235
285
  search.focus();
236
286
 
287
+ break;
288
+ case 'Backspace':
289
+ if (activeElement.hasAttribute('type') && activeElement.getAttribute('type') == 'checkbox') {
290
+ activeElement.checked = false;
291
+ setItem(activeElement);
292
+ search.focus();
293
+ }
237
294
  break;
238
295
  }
239
296
  });