@duetds/components 4.33.2 → 4.34.3

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 (295) hide show
  1. package/hydrate/index.js +427 -90
  2. package/lib/cjs/{dom-c850c8d7.js → dom-52a4f07a.js} +1 -1
  3. package/lib/cjs/duet-alert.cjs.entry.js +1 -1
  4. package/lib/cjs/duet-badge.cjs.entry.js +1 -1
  5. package/lib/cjs/duet-button_2.cjs.entry.js +4 -3
  6. package/lib/cjs/duet-caption_4.cjs.entry.js +3 -3
  7. package/lib/cjs/duet-card.cjs.entry.js +2 -2
  8. package/lib/cjs/duet-checkbox.cjs.entry.js +1 -1
  9. package/lib/cjs/duet-choice_2.cjs.entry.js +2 -2
  10. package/lib/cjs/duet-collapsible.cjs.entry.js +2 -2
  11. package/lib/cjs/duet-cookie-consent.cjs.entry.js +1 -1
  12. package/lib/cjs/duet-date-picker.cjs.entry.js +2 -2
  13. package/lib/cjs/duet-divider_2.cjs.entry.js +1 -1
  14. package/lib/cjs/duet-editable-table-button.cjs.entry.js +14 -7
  15. package/lib/cjs/duet-editable-table_4.cjs.entry.js +95 -11
  16. package/lib/cjs/duet-empty-state.cjs.entry.js +1 -1
  17. package/lib/cjs/duet-fieldset.cjs.entry.js +1 -1
  18. package/lib/cjs/duet-footer.cjs.entry.js +2 -2
  19. package/lib/cjs/duet-grid_2.cjs.entry.js +9 -3
  20. package/lib/cjs/duet-header_2.cjs.entry.js +220 -47
  21. package/lib/cjs/duet-hero.cjs.entry.js +1 -1
  22. package/lib/cjs/duet-icon.cjs.entry.js +7 -5
  23. package/lib/cjs/duet-input_2.cjs.entry.js +3 -4
  24. package/lib/cjs/duet-layout.cjs.entry.js +1 -1
  25. package/lib/cjs/duet-list_2.cjs.entry.js +2 -2
  26. package/lib/cjs/duet-modal.cjs.entry.js +2 -2
  27. package/lib/cjs/duet-notification_2.cjs.entry.js +2 -2
  28. package/lib/cjs/duet-number-input.cjs.entry.js +1 -1
  29. package/lib/cjs/duet-progress.cjs.entry.js +1 -1
  30. package/lib/cjs/duet-radio_2.cjs.entry.js +1 -1
  31. package/lib/cjs/duet-range-slider.cjs.entry.js +1 -1
  32. package/lib/cjs/duet-select.cjs.entry.js +1 -1
  33. package/lib/cjs/duet-step_2.cjs.entry.js +1 -1
  34. package/lib/cjs/duet-tab_2.cjs.entry.js +1 -1
  35. package/lib/cjs/duet-textarea.cjs.entry.js +1 -1
  36. package/lib/cjs/duet-toggle.cjs.entry.js +1 -1
  37. package/lib/cjs/duet-tooltip.cjs.entry.js +1 -1
  38. package/lib/cjs/duet-tray.cjs.entry.js +1 -1
  39. package/lib/cjs/duet-upload-aria-status.cjs.entry.js +1 -1
  40. package/lib/cjs/duet-visually-hidden.cjs.entry.js +1 -1
  41. package/lib/cjs/duet.cjs.js +4 -4
  42. package/lib/cjs/{focus-utils-27c696bb.js → focus-utils-3d73245e.js} +1 -1
  43. package/lib/cjs/form-search-d61b2843.js +8 -0
  44. package/lib/cjs/{index-18b0f43a.js → index-b8c8ebe4.js} +2 -2
  45. package/lib/cjs/loader.cjs.js +3 -3
  46. package/lib/cjs/{shadow-css-e3edeed1.js → shadow-css-e1b62a99.js} +1 -1
  47. package/lib/cjs/token-utils-05bd23b4.js +77 -0
  48. package/lib/collection/collection-manifest.json +2 -2
  49. package/lib/collection/components/duet-button/duet-button.css +21 -4
  50. package/lib/collection/components/duet-button/duet-button.js +5 -1
  51. package/lib/collection/components/duet-collapsible/duet-collapsible.js +4 -1
  52. package/lib/collection/components/duet-editable-table/duet-editable-table-button.js +13 -6
  53. package/lib/collection/components/duet-editable-table/duet-editable-table-item.js +25 -3
  54. package/lib/collection/components/duet-editable-table/duet-editable-table-tabledata.js +3 -3
  55. package/lib/collection/components/duet-editable-table/duet-editable-table.js +58 -2
  56. package/lib/collection/components/duet-footer/duet-footer.css +2 -0
  57. package/lib/collection/components/duet-grid/duet-grid.js +8 -2
  58. package/lib/collection/components/duet-header/duet-header-dropdown.js +27 -0
  59. package/lib/collection/components/duet-header/duet-header-hamburger.js +9 -0
  60. package/lib/collection/components/duet-header/duet-header-icon.js +9 -0
  61. package/lib/collection/components/duet-header/duet-header.css +272 -39
  62. package/lib/collection/components/duet-header/duet-header.js +316 -122
  63. package/lib/collection/components/duet-icon/duet-icon.js +5 -3
  64. package/lib/collection/components/duet-link/duet-link.js +4 -1
  65. package/lib/collection/components/duet-list-item/duet-list-item.css +1 -1
  66. package/lib/collection/components/duet-notification-drawer/duet-notification-drawer.css +4 -3
  67. package/lib/collection/components/duet-table/duet-table.css +42 -17
  68. package/lib/collection/components/duet-table/duet-table.js +2 -2
  69. package/lib/collection/components/duet-upload/duet-upload.js +51 -4
  70. package/lib/collection/utils/template-utils.js +33 -0
  71. package/lib/collection/utils/token-utils.js +67 -14
  72. package/lib/custom-elements-bundle/index.js +411 -93
  73. package/lib/duet/duet.esm.js +1 -1
  74. package/lib/duet/duet.js +1 -1
  75. package/lib/duet/{p-637df820.entry.js → p-01927eb0.entry.js} +1 -1
  76. package/lib/duet/{p-ba6214be.entry.js → p-032607e4.entry.js} +1 -1
  77. package/lib/duet/{p-68635a1c.entry.js → p-04597b37.entry.js} +1 -1
  78. package/lib/duet/{p-5b9621e2.entry.js → p-061d59b3.entry.js} +1 -1
  79. package/lib/duet/{p-33538e90.system.entry.js → p-08a34bd4.system.entry.js} +1 -1
  80. package/lib/duet/{p-be349a3d.system.entry.js → p-0b64cf3d.system.entry.js} +1 -1
  81. package/lib/duet/{p-50b796eb.entry.js → p-117e0339.entry.js} +1 -1
  82. package/lib/duet/{p-9125ed25.entry.js → p-11f389cd.entry.js} +1 -1
  83. package/lib/duet/{p-2d8e0faa.system.entry.js → p-129bc252.system.entry.js} +1 -1
  84. package/lib/duet/{p-b1ad7a52.system.entry.js → p-13058dc6.system.entry.js} +1 -1
  85. package/lib/duet/p-16de4b21.entry.js +4 -0
  86. package/lib/duet/{p-35a3794e.js → p-183726f7.js} +0 -0
  87. package/lib/duet/{p-d0fb19f7.system.entry.js → p-1e3ec7dc.system.entry.js} +1 -1
  88. package/lib/duet/{p-dd9b8fcb.system.entry.js → p-25aa7ac3.system.entry.js} +1 -1
  89. package/lib/duet/{p-0435b54a.system.entry.js → p-279aa668.system.entry.js} +1 -1
  90. package/lib/duet/p-2ce50cc6.system.entry.js +4 -0
  91. package/lib/duet/{p-5727cd82.system.entry.js → p-3211cb0d.system.entry.js} +1 -1
  92. package/lib/duet/{p-7f8cce41.system.entry.js → p-349c6990.system.entry.js} +1 -1
  93. package/lib/duet/{p-3a7e519e.entry.js → p-3839858e.entry.js} +1 -1
  94. package/lib/duet/{p-cd21755b.entry.js → p-3c173e89.entry.js} +1 -1
  95. package/lib/duet/p-3dc1e5c7.entry.js +4 -0
  96. package/lib/duet/{p-350cea4e.system.entry.js → p-414a29ba.system.entry.js} +2 -2
  97. package/lib/duet/p-4bb35e6f.entry.js +4 -0
  98. package/lib/duet/{p-042ec8b1.entry.js → p-4eca4ef3.entry.js} +1 -1
  99. package/lib/duet/p-50b4fb2c.js +4 -0
  100. package/lib/duet/{p-60ef3d05.entry.js → p-5152f1e4.entry.js} +1 -1
  101. package/lib/duet/{p-987edcd0.js → p-52621211.js} +0 -0
  102. package/lib/duet/p-53fb919f.entry.js +4 -0
  103. package/lib/duet/{p-15fae689.entry.js → p-59d4e6b8.entry.js} +1 -1
  104. package/lib/duet/p-5a6e464a.system.entry.js +4 -0
  105. package/lib/duet/{p-4e17a6cb.system.entry.js → p-5d2ec61d.system.entry.js} +1 -1
  106. package/lib/duet/{p-3cad13af.system.entry.js → p-5e6e0547.system.entry.js} +1 -1
  107. package/lib/duet/{p-04b3e682.entry.js → p-61a0e3f7.entry.js} +1 -1
  108. package/lib/duet/{p-c506017d.entry.js → p-62b3e73e.entry.js} +1 -1
  109. package/lib/duet/{p-8c2f14d8.system.entry.js → p-64f8c8e0.system.entry.js} +1 -1
  110. package/lib/duet/{p-cff461b6.entry.js → p-6aaf4be0.entry.js} +1 -1
  111. package/lib/duet/{p-c18a599e.system.js → p-6e4fd6ba.system.js} +0 -0
  112. package/lib/duet/{p-f37ffb6f.system.entry.js → p-6f288b44.system.entry.js} +1 -1
  113. package/lib/duet/{p-7ab0bad8.entry.js → p-6f35218d.entry.js} +1 -1
  114. package/lib/duet/{p-408e8cdb.system.js → p-715eb86e.system.js} +1 -1
  115. package/lib/duet/{p-0ac2e60d.system.entry.js → p-7232506d.system.entry.js} +1 -1
  116. package/lib/duet/{p-9a09ac2b.system.entry.js → p-7241b006.system.entry.js} +1 -1
  117. package/lib/duet/{p-c74cecf2.system.entry.js → p-75c48ba1.system.entry.js} +1 -1
  118. package/lib/duet/{p-9584411c.entry.js → p-77434f16.entry.js} +1 -1
  119. package/lib/duet/{p-66fdebc5.js → p-79cc24ee.js} +1 -1
  120. package/lib/duet/{p-61fc3872.system.js → p-7b4d646d.system.js} +1 -1
  121. package/lib/duet/{p-d4e706ac.system.entry.js → p-7cdfbafd.system.entry.js} +1 -1
  122. package/lib/duet/{p-f8744611.entry.js → p-7dadfd66.entry.js} +1 -1
  123. package/lib/duet/{p-de43620d.system.entry.js → p-8402709a.system.entry.js} +1 -1
  124. package/lib/duet/{p-659d6cb7.entry.js → p-8e70de92.entry.js} +1 -1
  125. package/lib/duet/p-8f477bd6.system.js +4 -0
  126. package/lib/duet/p-8fda2b95.entry.js +4 -0
  127. package/lib/duet/{p-1cf8dbc7.system.js → p-942856d9.system.js} +1 -1
  128. package/lib/duet/p-9d8421d4.entry.js +4 -0
  129. package/lib/duet/{p-c3c95a34.system.entry.js → p-a01664b5.system.entry.js} +1 -1
  130. package/lib/duet/p-a16a58c1.system.js +4 -0
  131. package/lib/duet/{p-7ceaf4ef.system.entry.js → p-a2373348.system.entry.js} +2 -2
  132. package/lib/duet/{p-1ecddc1d.entry.js → p-a35f849e.entry.js} +1 -1
  133. package/lib/duet/{p-582f3a2c.entry.js → p-a43ed343.entry.js} +1 -1
  134. package/lib/duet/{p-3bcf2054.system.entry.js → p-a76ae6e9.system.entry.js} +1 -1
  135. package/lib/duet/p-accaacf9.entry.js +4 -0
  136. package/lib/duet/{p-1c7d7cdd.system.entry.js → p-aefca63e.system.entry.js} +1 -1
  137. package/lib/duet/{p-720a36f2.entry.js → p-b2e9e246.entry.js} +1 -1
  138. package/lib/duet/p-bf246e5d.system.entry.js +4 -0
  139. package/lib/duet/{p-65451003.entry.js → p-c414a7d0.entry.js} +1 -1
  140. package/lib/duet/{p-2b4bd1b2.system.entry.js → p-c75bf5dd.system.entry.js} +1 -1
  141. package/lib/duet/{p-3364cfd2.entry.js → p-c90c17c7.entry.js} +1 -1
  142. package/lib/duet/p-c95b0a0e.system.entry.js +4 -0
  143. package/lib/duet/{p-b5dc29b8.system.entry.js → p-cb7921b9.system.entry.js} +1 -1
  144. package/lib/duet/{p-c0f3f60f.system.entry.js → p-cd795dee.system.entry.js} +1 -1
  145. package/lib/duet/p-d004da5f.js +4 -0
  146. package/lib/duet/p-d30c3f2c.system.entry.js +4 -0
  147. package/lib/duet/{p-d1dfa30e.entry.js → p-d855249b.entry.js} +1 -1
  148. package/lib/duet/{p-8c730326.entry.js → p-d8ac3d77.entry.js} +1 -1
  149. package/lib/duet/p-d992e2b5.entry.js +4 -0
  150. package/lib/duet/{p-6402041d.system.entry.js → p-daeb205a.system.entry.js} +1 -1
  151. package/lib/duet/{p-c9a11360.entry.js → p-db33afbe.entry.js} +1 -1
  152. package/lib/duet/{p-5f79eff8.system.entry.js → p-dd1bc83c.system.entry.js} +1 -1
  153. package/lib/duet/{p-a2b2fa13.system.entry.js → p-de658899.system.entry.js} +1 -1
  154. package/lib/duet/{p-d5e2bb48.system.entry.js → p-e1a40bab.system.entry.js} +1 -1
  155. package/lib/duet/{p-0d22396e.system.js → p-e5c1751e.system.js} +0 -0
  156. package/lib/duet/{p-4a14da52.entry.js → p-e9b95f7c.entry.js} +1 -1
  157. package/lib/duet/{p-1dcbd837.system.entry.js → p-ed57e786.system.entry.js} +1 -1
  158. package/lib/duet/{p-75e5d4d1.system.entry.js → p-f137fdb6.system.entry.js} +1 -1
  159. package/lib/duet/{p-fd00b025.entry.js → p-f96efcb6.entry.js} +1 -1
  160. package/lib/duet/{p-39e9d638.entry.js → p-fae44e29.entry.js} +1 -1
  161. package/lib/duet/{p-ebc4e334.js → p-fceb0df8.js} +1 -1
  162. package/lib/duet/p-fdc358b8.entry.js +4 -0
  163. package/lib/duet/{p-933c2774.system.entry.js → p-fefe12f8.system.entry.js} +1 -1
  164. package/lib/esm/{dom-58cd15f6.js → dom-5d060ace.js} +1 -1
  165. package/lib/esm/duet-alert.entry.js +1 -1
  166. package/lib/esm/duet-badge.entry.js +1 -1
  167. package/lib/esm/duet-button_2.entry.js +4 -3
  168. package/lib/esm/duet-caption_4.entry.js +3 -3
  169. package/lib/esm/duet-card.entry.js +2 -2
  170. package/lib/esm/duet-checkbox.entry.js +1 -1
  171. package/lib/esm/duet-choice_2.entry.js +2 -2
  172. package/lib/esm/duet-collapsible.entry.js +2 -2
  173. package/lib/esm/duet-cookie-consent.entry.js +1 -1
  174. package/lib/esm/duet-date-picker.entry.js +2 -2
  175. package/lib/esm/duet-divider_2.entry.js +1 -1
  176. package/lib/esm/duet-editable-table-button.entry.js +14 -7
  177. package/lib/esm/duet-editable-table_4.entry.js +95 -11
  178. package/lib/esm/duet-empty-state.entry.js +1 -1
  179. package/lib/esm/duet-fieldset.entry.js +1 -1
  180. package/lib/esm/duet-footer.entry.js +2 -2
  181. package/lib/esm/duet-grid_2.entry.js +9 -3
  182. package/lib/esm/duet-header_2.entry.js +220 -47
  183. package/lib/esm/duet-hero.entry.js +1 -1
  184. package/lib/esm/duet-icon.entry.js +7 -5
  185. package/lib/esm/duet-input_2.entry.js +2 -3
  186. package/lib/esm/duet-layout.entry.js +1 -1
  187. package/lib/esm/duet-list_2.entry.js +2 -2
  188. package/lib/esm/duet-modal.entry.js +2 -2
  189. package/lib/esm/duet-notification_2.entry.js +2 -2
  190. package/lib/esm/duet-number-input.entry.js +1 -1
  191. package/lib/esm/duet-progress.entry.js +1 -1
  192. package/lib/esm/duet-radio_2.entry.js +1 -1
  193. package/lib/esm/duet-range-slider.entry.js +1 -1
  194. package/lib/esm/duet-select.entry.js +1 -1
  195. package/lib/esm/duet-step_2.entry.js +1 -1
  196. package/lib/esm/duet-tab_2.entry.js +1 -1
  197. package/lib/esm/duet-textarea.entry.js +1 -1
  198. package/lib/esm/duet-toggle.entry.js +1 -1
  199. package/lib/esm/duet-tooltip.entry.js +1 -1
  200. package/lib/esm/duet-tray.entry.js +1 -1
  201. package/lib/esm/duet-upload-aria-status.entry.js +1 -1
  202. package/lib/esm/duet-visually-hidden.entry.js +1 -1
  203. package/lib/esm/duet.js +4 -4
  204. package/lib/esm/{focus-utils-c1fa24c4.js → focus-utils-6989cada.js} +1 -1
  205. package/lib/esm/form-search-ea8e19ae.js +6 -0
  206. package/lib/esm/{index-05e43a37.js → index-ddb14345.js} +2 -2
  207. package/lib/esm/loader.js +3 -3
  208. package/lib/esm/{shadow-css-7c726abb.js → shadow-css-13d024f4.js} +1 -1
  209. package/lib/esm/token-utils-75f78ca4.js +75 -0
  210. package/lib/esm-es5/{dom-58cd15f6.js → dom-5d060ace.js} +0 -0
  211. package/lib/esm-es5/duet-alert.entry.js +1 -1
  212. package/lib/esm-es5/duet-badge.entry.js +1 -1
  213. package/lib/esm-es5/duet-button_2.entry.js +1 -1
  214. package/lib/esm-es5/duet-caption_4.entry.js +1 -1
  215. package/lib/esm-es5/duet-card.entry.js +1 -1
  216. package/lib/esm-es5/duet-checkbox.entry.js +1 -1
  217. package/lib/esm-es5/duet-choice_2.entry.js +1 -1
  218. package/lib/esm-es5/duet-collapsible.entry.js +2 -2
  219. package/lib/esm-es5/duet-cookie-consent.entry.js +1 -1
  220. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  221. package/lib/esm-es5/duet-divider_2.entry.js +1 -1
  222. package/lib/esm-es5/duet-editable-table-button.entry.js +1 -1
  223. package/lib/esm-es5/duet-editable-table_4.entry.js +2 -2
  224. package/lib/esm-es5/duet-empty-state.entry.js +1 -1
  225. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  226. package/lib/esm-es5/duet-footer.entry.js +1 -1
  227. package/lib/esm-es5/duet-grid_2.entry.js +1 -1
  228. package/lib/esm-es5/duet-header_2.entry.js +2 -2
  229. package/lib/esm-es5/duet-hero.entry.js +1 -1
  230. package/lib/esm-es5/duet-icon.entry.js +1 -1
  231. package/lib/esm-es5/duet-input_2.entry.js +1 -1
  232. package/lib/esm-es5/duet-layout.entry.js +1 -1
  233. package/lib/esm-es5/duet-list_2.entry.js +1 -1
  234. package/lib/esm-es5/duet-modal.entry.js +1 -1
  235. package/lib/esm-es5/duet-notification_2.entry.js +1 -1
  236. package/lib/esm-es5/duet-number-input.entry.js +1 -1
  237. package/lib/esm-es5/duet-progress.entry.js +1 -1
  238. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  239. package/lib/esm-es5/duet-range-slider.entry.js +1 -1
  240. package/lib/esm-es5/duet-select.entry.js +1 -1
  241. package/lib/esm-es5/duet-step_2.entry.js +1 -1
  242. package/lib/esm-es5/duet-tab_2.entry.js +1 -1
  243. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  244. package/lib/esm-es5/duet-toggle.entry.js +1 -1
  245. package/lib/esm-es5/duet-tooltip.entry.js +1 -1
  246. package/lib/esm-es5/duet-tray.entry.js +1 -1
  247. package/lib/esm-es5/duet-upload-aria-status.entry.js +1 -1
  248. package/lib/esm-es5/duet-visually-hidden.entry.js +1 -1
  249. package/lib/esm-es5/duet.js +1 -1
  250. package/lib/esm-es5/focus-utils-6989cada.js +4 -0
  251. package/lib/esm-es5/form-search-ea8e19ae.js +4 -0
  252. package/lib/esm-es5/{index-05e43a37.js → index-ddb14345.js} +1 -1
  253. package/lib/esm-es5/loader.js +1 -1
  254. package/lib/esm-es5/{shadow-css-7c726abb.js → shadow-css-13d024f4.js} +0 -0
  255. package/lib/esm-es5/token-utils-75f78ca4.js +4 -0
  256. package/lib/html.html-data.json +36 -11
  257. package/lib/types/common-types.d.ts +0 -1
  258. package/lib/types/components/duet-button/duet-button.d.ts +2 -1
  259. package/lib/types/components/duet-collapsible/duet-collapsible.d.ts +3 -0
  260. package/lib/types/components/duet-editable-table/duet-editable-table-button.d.ts +1 -0
  261. package/lib/types/components/duet-editable-table/duet-editable-table-item.d.ts +5 -1
  262. package/lib/types/components/duet-editable-table/duet-editable-table-tabledata.d.ts +1 -0
  263. package/lib/types/components/duet-editable-table/duet-editable-table.d.ts +10 -0
  264. package/lib/types/components/duet-header/duet-header-dropdown.d.ts +16 -0
  265. package/lib/types/components/duet-header/duet-header-hamburger.d.ts +2 -0
  266. package/lib/types/components/duet-header/duet-header-icon.d.ts +8 -0
  267. package/lib/types/components/duet-header/duet-header.d.ts +41 -4
  268. package/lib/types/components/duet-link/duet-link.d.ts +3 -0
  269. package/lib/types/components/duet-table/duet-table.d.ts +1 -1
  270. package/lib/types/components/duet-upload/duet-upload.d.ts +10 -0
  271. package/lib/types/components.d.ts +52 -10
  272. package/lib/types/stencil-public-runtime.d.ts +6 -4
  273. package/lib/types/utils/template-utils.d.ts +13 -0
  274. package/lib/types/utils/token-utils.d.ts +8 -2
  275. package/package.json +13 -13
  276. package/lib/cjs/token-utils-63a9c8dc.js +0 -30
  277. package/lib/duet/p-1082d9f2.system.entry.js +0 -4
  278. package/lib/duet/p-12fc4849.system.entry.js +0 -4
  279. package/lib/duet/p-1ad58142.entry.js +0 -4
  280. package/lib/duet/p-3c1971d8.js +0 -4
  281. package/lib/duet/p-60e721aa.system.entry.js +0 -4
  282. package/lib/duet/p-64c0aa2a.entry.js +0 -4
  283. package/lib/duet/p-6708db8a.entry.js +0 -4
  284. package/lib/duet/p-6e363557.system.js +0 -4
  285. package/lib/duet/p-72629304.entry.js +0 -4
  286. package/lib/duet/p-75a104e3.entry.js +0 -4
  287. package/lib/duet/p-7fed7f57.entry.js +0 -4
  288. package/lib/duet/p-9930e52e.entry.js +0 -4
  289. package/lib/duet/p-a09ddd8f.entry.js +0 -4
  290. package/lib/duet/p-cd597d62.system.entry.js +0 -4
  291. package/lib/duet/p-dd79932a.entry.js +0 -4
  292. package/lib/duet/p-e038da47.system.entry.js +0 -4
  293. package/lib/esm/token-utils-590d9413.js +0 -28
  294. package/lib/esm-es5/focus-utils-c1fa24c4.js +0 -4
  295. package/lib/esm-es5/token-utils-590d9413.js +0 -4
@@ -1,31 +1,43 @@
1
1
  /*!
2
2
  * Built with Duet Design System
3
3
  */
4
- import arrowDownIcon from "@duetds/icons/lib/assets/action-arrow-down-small";
4
+ import searchIcon from "@duetds/icons/lib/assets/form-search";
5
5
  import contactDropdownIcon from "@duetds/icons/lib/assets/navigation-contact-dropdown";
6
6
  import languageIcon from "@duetds/icons/lib/assets/navigation-language";
7
7
  import loginIcon from "@duetds/icons/lib/assets/navigation-login";
8
8
  import logoutIcon from "@duetds/icons/lib/assets/navigation-logout";
9
9
  import userIcon from "@duetds/icons/lib/assets/navigation-user";
10
- import { Build, Component, Element, Event, Fragment, h, Listen, Method, Prop, State, Watch, } from "@stencil/core";
10
+ import { media_query_large } from "@duetds/tokens/lib/tokens.json";
11
+ import { Build, Component, Element, Event, Fragment, h, Host, Listen, Method, Prop, State, Watch, } from "@stencil/core";
11
12
  import { disableBodyScroll, enableBodyScroll } from "body-scroll-lock/lib/bodyScrollLock.es6.js";
12
13
  import { DuetStringsExternalDefaults } from "../../common-strings";
13
14
  import { isArrowDownKey, isArrowLeftKey, isArrowRightKey, isArrowUpKey, isEscapeKey, isSpaceKey, } from "../../utils/keyboard-utils";
14
15
  import { getLanguage, getLocaleString } from "../../utils/language-utils";
15
16
  import { parsePossibleJSON } from "../../utils/string-utils";
16
17
  import { inheritGlobalTheme } from "../../utils/themeable-component";
18
+ import { DuetHeaderDropdown } from "./duet-header-dropdown";
19
+ import { DuetHeaderHamburger } from "./duet-header-hamburger";
20
+ import { DuetHeaderIcon } from "./duet-header-icon";
17
21
  const createEvent = (ev, data) => ({
18
22
  component: "duet-header",
19
23
  data,
20
24
  originalEvent: ev,
21
25
  });
22
26
  /**
23
- * @slot utility - A slot for utilities, such as a notification drawer
24
- * @slot logo-utility - A slot to place elements alongside the logo. This takes precedence over the **region** prop.
27
+ * @slot utility - A slot for utilities, such as a notification drawer or shopping basket.
28
+ * @slot logo-utility - A slot to place elements alongside the logo. This takes precedence over the **region** prop. Note: not available in desktop multilevel header.
25
29
  */
26
30
  export class DuetHeader {
27
31
  constructor() {
32
+ var _a;
33
+ /**
34
+ * Own Properties
35
+ */
36
+ this.subMenuItemRefs = {};
37
+ this.subMenuButtonRefs = {};
28
38
  this.hasLanguageChanged = false;
39
+ this.mql = [window.matchMedia(media_query_large.replace(/'/g, ""))];
40
+ this.boundMqlFunctions = [];
29
41
  /**
30
42
  * State() variables
31
43
  * Inlined decorator, alphabetical order.
@@ -33,12 +45,17 @@ export class DuetHeader {
33
45
  this.isContactOpen = false;
34
46
  this.isLanguageOpen = false;
35
47
  this.isSlideOutOpen = false;
48
+ this.isSegmentOpen = false;
49
+ this.openMenu = null;
50
+ this.closedActives = null;
36
51
  this.processedItems = null;
37
52
  this.processedLanguageItems = null;
38
53
  this.processedContactItems = null;
39
54
  this.processedSession = null;
55
+ this.processedSearch = null;
40
56
  this.processedUser = null;
41
57
  this.processedBack = null;
58
+ this.renderDesktopNav = (_a = this.mql[0]) === null || _a === void 0 ? void 0 : _a.matches;
42
59
  /**
43
60
  * Theme of the header.
44
61
  */
@@ -144,6 +161,7 @@ export class DuetHeader {
144
161
  this.logoHref = "/";
145
162
  /**
146
163
  * The href of the current page item that is shown as “active”.
164
+ * Note: not available in multilevel headers.
147
165
  */
148
166
  this.currentHref = "/";
149
167
  /**
@@ -153,10 +171,12 @@ export class DuetHeader {
153
171
  this.skipToId = "";
154
172
  /**
155
173
  * Region that is shown next to the logo. If empty, region will be hidden.
174
+ * Note: not available in desktop multilevel header.
156
175
  */
157
176
  this.region = "";
158
177
  /**
159
178
  * Label of the contact menu. If empty, contact menu will be hidden.
179
+ * Note: not available in multilevel headers.
160
180
  */
161
181
  this.contact = "";
162
182
  this.handleClick = (event) => {
@@ -175,6 +195,11 @@ export class DuetHeader {
175
195
  this.handleClick(e);
176
196
  this.duetSessionClick.emit(e);
177
197
  };
198
+ this.handleSearchClick = (ev) => {
199
+ const e = createEvent(ev, this.processedSearch);
200
+ this.handleClick(e);
201
+ this.duetSearchClick.emit(e);
202
+ };
178
203
  this.handleUserClick = (ev) => {
179
204
  const e = createEvent(ev, this.processedUser);
180
205
  this.handleClick(e);
@@ -197,40 +222,55 @@ export class DuetHeader {
197
222
  this.duetLogoClick.emit(e);
198
223
  };
199
224
  this.handleArrowKeys = ev => {
200
- if (this.isContactOpen || this.isLanguageOpen) {
201
- let button;
202
- if (isArrowLeftKey(ev) || isArrowUpKey(ev)) {
203
- button = ev.target.previousElementSibling;
204
- }
205
- else if (isArrowRightKey(ev) || isArrowDownKey(ev)) {
206
- button = ev.target.nextElementSibling;
207
- }
208
- if (button) {
209
- ev.preventDefault();
210
- button.focus();
211
- }
225
+ let button;
226
+ if (isArrowLeftKey(ev) || isArrowUpKey(ev)) {
227
+ button = ev.target.previousElementSibling;
228
+ }
229
+ else if (isArrowRightKey(ev) || isArrowDownKey(ev)) {
230
+ button = ev.target.nextElementSibling;
231
+ }
232
+ if (button) {
233
+ ev.preventDefault();
234
+ button.focus();
212
235
  }
213
236
  };
214
- this.toggleMenu = (ev, type) => {
237
+ this.toggleMenu = (ev, type, id, active) => {
215
238
  let el;
216
239
  ev.preventDefault();
217
240
  ev.stopPropagation();
241
+ if (active === true && !this.openMenu) {
242
+ const closedActives = this.closedActives ? [...this.closedActives] : [];
243
+ const index = closedActives.findIndex(i => i === id);
244
+ if (index > -1) {
245
+ closedActives.splice(index, 1);
246
+ this.closedActives = [...closedActives];
247
+ }
248
+ else {
249
+ this.closedActives = [...closedActives, id];
250
+ }
251
+ }
252
+ else {
253
+ this.openMenu = this.openMenu === id ? null : id;
254
+ }
218
255
  // For language menu
219
256
  if (type === "language") {
220
257
  this.isContactOpen = false;
221
258
  this.isLanguageOpen = !this.isLanguageOpen;
259
+ this.isSegmentOpen = false;
222
260
  el = this.languageItemsEl;
223
261
  }
224
262
  // For contact menu
225
263
  else if (type === "contact") {
226
264
  this.isLanguageOpen = false;
227
265
  this.isContactOpen = !this.isContactOpen;
266
+ this.isSegmentOpen = false;
228
267
  el = this.contactItemsEl;
229
268
  }
230
269
  // For mobile menu
231
270
  else if (type === "mobile") {
232
271
  this.isContactOpen = false;
233
272
  this.isLanguageOpen = false;
273
+ this.isSegmentOpen = false;
234
274
  el = this.navigationEl;
235
275
  this.isSlideOutOpen = !this.isSlideOutOpen;
236
276
  if (this.isSlideOutOpen) {
@@ -240,7 +280,19 @@ export class DuetHeader {
240
280
  enableBodyScroll(this.navigationEl);
241
281
  }
242
282
  }
243
- if (this.isSlideOutOpen || this.isLanguageOpen || this.isContactOpen) {
283
+ else if (type === "sub") {
284
+ this.isContactOpen = false;
285
+ this.isLanguageOpen = false;
286
+ this.isSegmentOpen = false;
287
+ el = this.subMenuItemRefs[id];
288
+ }
289
+ else if (type === "segment") {
290
+ this.isContactOpen = false;
291
+ this.isLanguageOpen = false;
292
+ this.isSegmentOpen = !this.isSegmentOpen;
293
+ el = this.segmentItemsEl;
294
+ }
295
+ if (this.isSlideOutOpen || this.isLanguageOpen || this.isContactOpen || this.isSegmentOpen || this.openMenu) {
244
296
  const drawer = this.element.querySelector("duet-notification-drawer");
245
297
  if (drawer) {
246
298
  drawer.close(false);
@@ -259,10 +311,27 @@ export class DuetHeader {
259
311
  inheritGlobalTheme(this);
260
312
  this.refresh();
261
313
  }
314
+ connectedCallback() {
315
+ for (let i = 0; i < this.mql.length; i++) {
316
+ // addEventListener is not available in Stencil hydrate
317
+ if (this.mql[i].addEventListener) {
318
+ const bound = this.refresh.bind(this);
319
+ this.mql[i].addEventListener("change", bound);
320
+ this.boundMqlFunctions[i] = bound;
321
+ }
322
+ }
323
+ }
262
324
  disconnectedCallback() {
263
325
  if (this.navigationEl) {
264
326
  enableBodyScroll(this.navigationEl);
265
327
  }
328
+ for (let i = 0; i < this.mql.length; i++) {
329
+ // addEventListener is not available in Stencil hydrate
330
+ if (this.mql[i].removeEventListener) {
331
+ this.mql[i].removeEventListener("change", this.boundMqlFunctions[i]);
332
+ }
333
+ }
334
+ this.boundMqlFunctions = [];
266
335
  }
267
336
  /**
268
337
  * Component event handling.
@@ -275,7 +344,7 @@ export class DuetHeader {
275
344
  }
276
345
  }
277
346
  handleKeyDown(ev) {
278
- if (this.isContactOpen || this.isLanguageOpen) {
347
+ if (this.isContactOpen || this.isLanguageOpen || this.isSegmentOpen) {
279
348
  const activeElement = this.element.shadowRoot.activeElement;
280
349
  // When Space is pressed
281
350
  if (isSpaceKey(ev) && activeElement) {
@@ -287,6 +356,12 @@ export class DuetHeader {
287
356
  else if (this.isLanguageOpen) {
288
357
  this.closeMenus(true);
289
358
  }
359
+ else if (this.isSegmentOpen) {
360
+ this.closeMenus();
361
+ }
362
+ else if (this.openMenu) {
363
+ this.closeMenus();
364
+ }
290
365
  activeElement.click();
291
366
  }
292
367
  }
@@ -316,10 +391,15 @@ export class DuetHeader {
316
391
  * Local methods.
317
392
  */
318
393
  async refresh() {
394
+ if (this.renderDesktopNav !== this.mql[0].matches) {
395
+ this.renderDesktopNav = this.mql[0].matches;
396
+ this.openMenu = null;
397
+ }
319
398
  this.processedItems = parsePossibleJSON(this.items);
320
399
  this.processedLanguageItems = parsePossibleJSON(this.languageItems);
321
400
  this.processedContactItems = parsePossibleJSON(this.contactItems);
322
401
  this.processedSession = parsePossibleJSON(this.session);
402
+ this.processedSearch = parsePossibleJSON(this.search);
323
403
  this.processedUser = parsePossibleJSON(this.user);
324
404
  this.processedBack = parsePossibleJSON(this.back);
325
405
  }
@@ -336,7 +416,7 @@ export class DuetHeader {
336
416
  * Closes all dropdown menus in header when called.
337
417
  */
338
418
  async closeMenus(moveFocusToButton = false) {
339
- if (this.isContactOpen || this.isLanguageOpen) {
419
+ if (this.isContactOpen || this.isLanguageOpen || this.isSegmentOpen || this.openMenu) {
340
420
  if (this.isContactOpen && moveFocusToButton) {
341
421
  this.contactItemsButtonEl.focus({
342
422
  preventScroll: true,
@@ -347,8 +427,20 @@ export class DuetHeader {
347
427
  preventScroll: true,
348
428
  });
349
429
  }
430
+ if (this.isSegmentOpen && moveFocusToButton) {
431
+ this.segmentItemsButtonEl.focus({
432
+ preventScroll: true,
433
+ });
434
+ }
435
+ if (this.openMenu && moveFocusToButton) {
436
+ this.subMenuButtonRefs[this.openMenu].focus({
437
+ preventScroll: true,
438
+ });
439
+ }
350
440
  this.isContactOpen = false;
351
441
  this.isLanguageOpen = false;
442
+ this.isSegmentOpen = false;
443
+ this.openMenu = null;
352
444
  }
353
445
  }
354
446
  /**
@@ -364,105 +456,166 @@ export class DuetHeader {
364
456
  */
365
457
  render() {
366
458
  const { skipLabel, changeLanguage, activeLanguage } = this.accessibleI18nLabels;
367
- return (h("div", { class: {
368
- "duet-header-reserved-space": true,
369
- "duet-with-links": !!this.processedItems,
370
- "duet-without-links": !this.processedItems,
459
+ const skipToLabel = this.skipToId ? (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)) : null;
460
+ const logo = (h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
461
+ const largeLogo = (h("duet-logo", { href: this.logoHref, size: "large", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
462
+ const contactDropdown = this.contact && this.processedContactItems ? (h(DuetHeaderDropdown, { id: "duet-header-contact", label: this.contact, icon: contactDropdownIcon.svg, active: this.isContactOpen, isOpen: this.isContactOpen, badge: false, toggleRef: el => (this.contactItemsButtonEl = el), itemsRef: el => (this.contactItemsEl = el), onToggle: event => this.toggleMenu(event, "contact") }, this.processedContactItems.map(item => (h("a", { role: "menuitem", href: item.href || "#", id: item.id, onClick: event => this.handleContactClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev), target: item.external ? "_blank" : "_self" },
463
+ item.label,
464
+ Build.isBrowser && item.external && (h(Fragment, null,
465
+ h("duet-visually-hidden", null,
466
+ ", ",
467
+ this.accessibleLabelExternal),
468
+ h("span", { class: "duet-header-link-external" },
469
+ h("duet-icon", { name: "action-new-window-small", size: "xx-small", margin: "none", color: this.theme === "turva" ? "primary-turva" : "primary" }))))))))) : null;
470
+ const languageDropdown = this.language && this.processedLanguageItems ? (h(DuetHeaderDropdown, { id: "duet-header-language", label: this.language, icon: languageIcon.svg, accessibleText: `${changeLanguage}${this.hasLanguageChanged ? `, ${activeLanguage}` : ""}`, active: this.isLanguageOpen, isOpen: this.isLanguageOpen, badge: false, toggleRef: el => (this.languageItemsButtonEl = el), itemsRef: el => (this.languageItemsEl = el), onToggle: event => this.toggleMenu(event, "language") }, this.processedLanguageItems.map(item => (h("a", { class: { active: this.language === item.country }, "aria-selected": this.language === item.country, role: "menuitem", id: item.id, lang: item.country, href: item.href || "#", onClick: event => this.handleLanguageClick(event, item), onKeyDown: this.handleArrowKeys }, item.label))))) : null;
471
+ const processedUserWithLink = this.processedUser && this.processedUser.href ? (h("a", { href: this.processedUser.href || "#", id: this.processedUser.id, class: "duet-header-user duet-header-button", onClick: this.handleUserClick },
472
+ h(DuetHeaderIcon, { icon: userIcon.svg }),
473
+ h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
474
+ const processedUserWithoutLink = this.processedUser && !this.processedUser.href ? (h("span", { id: this.processedUser.id, class: "duet-header-user duet-header-button duet-header-no-action" },
475
+ h(DuetHeaderIcon, { icon: userIcon.svg }),
476
+ h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
477
+ const processedSessionIconSize = this.renderDesktopNav ? "x-small" : "small";
478
+ const processedSession = this.processedSession ? (h("a", { href: this.processedSession.href || "#", id: this.processedSession.id, class: "duet-header-logout duet-header-button", onClick: this.handleSessionClick },
479
+ h(DuetHeaderIcon, { icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: processedSessionIconSize }),
480
+ h("span", { class: "duet-header-button-label" }, this.processedSession.label))) : null;
481
+ const processedSearch = this.processedSearch ? (h("a", { href: this.processedSearch.href || "#", id: this.processedSearch.id, class: "duet-header-search duet-header-button", onClick: this.handleSearchClick },
482
+ h(DuetHeaderIcon, { icon: searchIcon.svg }),
483
+ h("span", { class: "duet-header-button-label" }, this.processedSearch.label))) : null;
484
+ // Back variation
485
+ if (this.processedBack) {
486
+ return (h(Host, { class: "duet-header-back-variation" },
487
+ h("div", { class: "duet-header-reserved-space" },
488
+ h("header", { class: {
489
+ "duet-header": true,
490
+ "duet-theme-turva": this.theme === "turva",
491
+ "duet-header-back": true,
492
+ "duet-header-inactive": true,
493
+ } },
494
+ h("div", { class: "duet-header-top" },
495
+ skipToLabel,
496
+ h("duet-button", { url: this.processedBack.href, id: this.processedBack.id, theme: this.theme, variation: "plain", color: this.theme === "turva" ? "secondary-turva" : "secondary", icon: "navigation-arrow-left", iconSize: "large", onClick: this.handleBackClick }, this.processedBack.label),
497
+ logo,
498
+ h("slot", { name: "logo-utility" }))))));
499
+ }
500
+ // multi level desktop variation
501
+ const itemsHaveSubItems = this.processedItems && this.processedItems.some(item => item.items && item.items.length > 0);
502
+ if (this.renderDesktopNav && itemsHaveSubItems) {
503
+ const activeSegment = this.processedItems.find(item => item.active);
504
+ const isThirdLevelActive = this.processedItems &&
505
+ this.processedItems.some(item => item.items &&
506
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
507
+ const segmentId = "duet-header-segment";
508
+ return (h(Host, { class: "duet-header-multi-level-desktop-variation" },
509
+ h("div", { class: {
510
+ "duet-header-multi-level-desktop": true,
511
+ "duet-header-multi-level-desktop-third-level-is-open": isThirdLevelActive,
512
+ } },
513
+ h("header", { class: {
514
+ "duet-header": true,
515
+ "duet-theme-turva": this.theme === "turva",
516
+ "duet-header-inactive": !this.processedItems,
517
+ } },
518
+ h("div", { class: "duet-header-top" },
519
+ skipToLabel,
520
+ h("div", { class: "logo-and-segment" },
521
+ largeLogo,
522
+ this.processedItems && (h(DuetHeaderDropdown, { id: segmentId, label: activeSegment.label, active: this.isSegmentOpen, isOpen: this.isSegmentOpen, badge: false, toggleRef: el => (this.segmentItemsButtonEl = el), itemsRef: el => (this.segmentItemsEl = el), onToggle: event => this.toggleMenu(event, "segment") }, this.processedItems.map(item => (h("a", { class: { active: activeSegment === item }, role: "menuitem", href: item.href || "#", id: item.id, onClick: event => this.handleItemClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev), target: item.external ? "_blank" : "_self" },
523
+ item.icon && (h("div", { class: "duet-header-icon" },
524
+ h("duet-icon", { margin: "none", size: "x-small", name: item.icon, color: "currentColor" }))),
525
+ h("span", null, item.label),
526
+ item.badge && h("div", { class: "duet-header-badge" }))))))),
527
+ h("nav", { class: "duet-header-multi-level-desktop-nav" }, activeSegment.items &&
528
+ activeSegment.items
529
+ .filter(secondLevelItem => secondLevelItem.items && secondLevelItem.items.length > 0)
530
+ .map((secondLevelItem, secondLevelItemIndex) => {
531
+ const id = secondLevelItem.id || `segment-item-${secondLevelItemIndex}`;
532
+ return (h(DuetHeaderDropdown, { id: id, label: secondLevelItem.label, active: (!this.openMenu && secondLevelItem.active === true) || this.openMenu === id, isOpen: this.openMenu === id, badge: secondLevelItem.badge, toggleRef: el => (this.subMenuButtonRefs[id] = el), itemsRef: el => (this.subMenuItemRefs[id] = el), onToggle: event => this.toggleMenu(event, "sub", id) }, secondLevelItem.items &&
533
+ secondLevelItem.items.map(thirdLevelItem => (h("a", { class: { active: thirdLevelItem.active }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, thirdLevelItem), onKeyDown: ev => this.handleArrowKeys(ev), target: thirdLevelItem.external ? "_blank" : "_self" },
534
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
535
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
536
+ h("span", null, thirdLevelItem.label),
537
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" }))))));
538
+ })),
539
+ h("div", { class: "duet-header-multi-level-desktop-utils" },
540
+ processedSearch,
541
+ languageDropdown,
542
+ processedSession),
543
+ h("slot", { name: "utility" }))))));
544
+ }
545
+ // Default variation
546
+ const isThirdLevelActive = this.processedItems &&
547
+ this.processedItems.some(item => item.items &&
548
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
549
+ return (h(Host, { class: {
550
+ "duet-header-default-variation": true,
371
551
  } },
372
- h("header", { class: {
373
- "duet-header": true,
374
- "duet-theme-turva": this.theme === "turva",
375
- "duet-header-back": !!this.processedBack,
376
- "duet-header-inactive": !this.processedItems,
552
+ h("div", { class: {
553
+ "duet-header-reserved-space": true,
554
+ "duet-with-links": !!this.processedItems,
555
+ "duet-header-third-level-active": isThirdLevelActive,
377
556
  } },
378
- h("div", { class: "duet-header-top" },
379
- this.skipToId && (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)),
380
- this.processedBack && (h("duet-button", { url: this.processedBack.href, id: this.processedBack.id, theme: this.theme, variation: "plain", color: this.theme === "turva" ? "secondary-turva" : "secondary", icon: "navigation-arrow-left", iconSize: "large", onClick: this.handleBackClick }, this.processedBack.label)),
381
- h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }),
382
- h("slot", { name: "logo-utility" }, this.region && !this.processedBack && h("div", { class: "duet-header-region" }, this.region)),
383
- (this.processedItems ||
384
- this.processedLanguageItems ||
385
- this.processedContactItems ||
386
- this.processedSession ||
387
- this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
388
- h("duet-visually-hidden", null, this.accessibleLabel),
389
- h("div", { class: "duet-header-hamburger" },
390
- h("span", { class: "duet-header-bar" }),
391
- h("span", { class: "duet-header-bar" }),
392
- h("span", { class: "duet-header-bar" }),
393
- h("span", { class: "duet-header-bar" }))))),
394
- !this.processedBack && (h("div", { ref: el => (this.navigationEl = el), class: {
395
- "duet-header-bottom": true,
396
- active: this.isSlideOutOpen,
397
- inactive: !this.processedItems,
557
+ h("header", { class: {
558
+ "duet-header": true,
559
+ "duet-theme-turva": this.theme === "turva",
560
+ "duet-header-inactive": !this.processedItems,
398
561
  } },
399
- h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
400
- this.processedItems.map(item => (h("a", { class: { active: this.currentHref === item.href }, href: item.href || "#", id: item.id, onClick: event => this.handleItemClick(event, item) },
401
- item.label,
402
- item.badge && h("div", { class: "duet-header-badge" }))))),
403
- h("div", { class: "duet-header-bottom-utils" },
404
- h("slot", { name: "utility" })),
405
- h("div", { class: "duet-header-utils" },
406
- this.contact && this.processedContactItems && (h("div", { class: "duet-header-dropdown" },
407
- h("button", { ref: el => (this.contactItemsButtonEl = el), class: {
408
- "duet-header-contact": true,
409
- "duet-header-dropdown-toggle": true,
410
- "duet-header-button": true,
411
- active: this.isContactOpen,
412
- }, type: "button", "aria-haspopup": "listbox", "aria-controls": "duet-header-contact", "aria-expanded": this.isContactOpen ? "true" : "false", id: "duet-header-contact-button", onClick: event => this.toggleMenu(event, "contact") },
413
- h("div", { class: "duet-header-icon" },
414
- h("duet-icon", { margin: "none", size: "x-small", icon: contactDropdownIcon.svg, color: "currentColor" })),
415
- h("span", { id: "duet-header-contact-label" }, this.contact),
416
- h("div", { class: "duet-header-caret" },
417
- h("duet-icon", { margin: "none", size: "auto", icon: arrowDownIcon.svg, color: "currentColor" }))),
418
- h("div", { ref: el => (this.contactItemsEl = el), tabindex: "-1", role: "menu", id: "duet-header-contact", "aria-labelledby": "duet-header-contact-button", class: {
419
- "duet-header-dropdown-content": true,
420
- "duet-header-contact-items": true,
421
- active: this.isContactOpen,
422
- } }, this.processedContactItems &&
423
- this.processedContactItems.map(item => (h("a", { role: "menuitem", href: item.href || "#", id: item.id, onClick: event => this.handleContactClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev), target: item.external ? "_blank" : "_self" },
562
+ h("div", { class: "duet-header-top" },
563
+ skipToLabel,
564
+ logo,
565
+ h("slot", { name: "logo-utility" }, this.region && h("div", { class: "duet-header-region" }, this.region)),
566
+ (this.processedItems ||
567
+ languageDropdown ||
568
+ contactDropdown ||
569
+ this.processedSession ||
570
+ this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
571
+ h("duet-visually-hidden", null, this.accessibleLabel),
572
+ h(DuetHeaderHamburger, null)))),
573
+ h("div", { ref: el => (this.navigationEl = el), class: {
574
+ "duet-header-bottom": true,
575
+ active: this.isSlideOutOpen,
576
+ inactive: !this.processedItems,
577
+ } },
578
+ h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
579
+ this.processedItems.map((item, itemIndex) => (h("div", { class: "duet-header-item-container" },
580
+ h("a", { class: {
581
+ "duet-header-first-level": true,
582
+ "duet-header-item": true,
583
+ active: (!itemsHaveSubItems && this.currentHref === item.href) || item.active === true,
584
+ }, href: item.href || "#", id: item.id || `header-item-${itemIndex}`, onClick: event => this.handleItemClick(event, item) },
424
585
  item.label,
425
- Build.isBrowser && item.external && (h(Fragment, null,
426
- h("duet-visually-hidden", null,
427
- ", ",
428
- this.accessibleLabelExternal),
429
- h("span", { class: "duet-header-link-external" },
430
- h("duet-icon", { name: "action-new-window-small", size: "xx-small", margin: "none", color: this.theme === "turva" ? "primary-turva" : "primary" })))))))))),
431
- this.language && this.processedLanguageItems && (h("div", { class: "duet-header-dropdown" },
432
- h("button", { ref: el => (this.languageItemsButtonEl = el), "aria-haspopup": "listbox", "aria-controls": "duet-header-language", "aria-expanded": this.isLanguageOpen ? "true" : "false", id: "duet-header-language-button", type: "button", class: {
433
- "duet-header-language": true,
434
- "duet-header-dropdown-toggle": true,
435
- "duet-header-button": true,
436
- active: this.isLanguageOpen,
437
- }, onClick: event => this.toggleMenu(event, "language") },
438
- h("div", { class: "duet-header-icon" },
439
- h("duet-icon", { margin: "none", size: "x-small", icon: languageIcon.svg, color: "currentColor" })),
440
- h("span", { "aria-hidden": "true" }, this.language),
441
- h("div", { class: "duet-header-caret" },
442
- h("duet-icon", { margin: "none", size: "auto", icon: arrowDownIcon.svg, color: "currentColor" })),
443
- h("duet-visually-hidden", null,
444
- changeLanguage,
445
- this.hasLanguageChanged && h("span", null,
446
- ", ",
447
- activeLanguage))),
448
- h("div", { ref: el => (this.languageItemsEl = el), tabindex: "-1", role: "menu", id: "duet-header-language", "aria-labelledby": "duet-header-language-button", class: {
449
- "duet-header-dropdown-content": true,
450
- "duet-header-language-items": true,
451
- active: this.isLanguageOpen,
452
- } }, this.processedLanguageItems &&
453
- this.processedLanguageItems.map(item => (h("a", { class: { active: this.language === item.country }, "aria-selected": this.language === item.country, role: "menuitem", id: item.id, lang: item.country, href: item.href || "#", onClick: event => this.handleLanguageClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev) }, item.label)))))),
454
- this.processedUser && this.processedUser.href && (h("a", { href: this.processedUser.href || "#", id: this.processedUser.id, class: "duet-header-user duet-header-button", onClick: this.handleUserClick },
455
- h("span", { class: "duet-header-icon" },
456
- h("duet-icon", { margin: "none", size: "x-small", icon: userIcon.svg, color: "currentColor" })),
457
- h("span", { class: "duet-header-user-label" }, this.processedUser.label))),
458
- this.processedUser && !this.processedUser.href && (h("span", { id: this.processedUser.id, class: "duet-header-user duet-header-button duet-header-no-action" },
459
- h("span", { class: "duet-header-icon" },
460
- h("duet-icon", { margin: "none", size: "x-small", icon: userIcon.svg, color: "currentColor" })),
461
- h("span", { class: "duet-header-user-label" }, this.processedUser.label))),
462
- this.processedSession && (h("a", { href: this.processedSession.href || "#", id: this.processedSession.id, class: "duet-header-logout duet-header-button", onClick: this.handleSessionClick },
463
- h("span", { class: "duet-header-icon" },
464
- h("duet-icon", { margin: "none", size: "x-small", icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, color: "currentColor" })),
465
- this.processedSession.label))))))));
586
+ item.badge && h("div", { class: "duet-header-badge" })),
587
+ item.items &&
588
+ item.items
589
+ .filter(secondLevelitem => secondLevelitem.items && secondLevelitem.items.length > 0)
590
+ .map((secondLevelItem, secondLevelItemIndex) => {
591
+ const id = secondLevelItem.id || `header-item-${itemIndex}-${secondLevelItemIndex}`;
592
+ return (h(DuetHeaderDropdown, { id: id, className: "duet-header-second-level", label: secondLevelItem.label, icon: `${secondLevelItem.icon}.svg`, active: (!this.openMenu &&
593
+ secondLevelItem.active === true &&
594
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
595
+ this.openMenu === id, isOpen: (!this.openMenu &&
596
+ secondLevelItem.active === true &&
597
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
598
+ this.openMenu === id, badge: secondLevelItem.badge, toggleRef: el => (this.subMenuButtonRefs[id] = el), itemsRef: el => (this.subMenuItemRefs[id] = el), onToggle: event => this.toggleMenu(event, "sub", id, secondLevelItem.active === true) },
599
+ h("div", { class: "duet-header-third-level" }, secondLevelItem.items &&
600
+ secondLevelItem.items.map(thirdLevelItem => (h("a", { class: {
601
+ "duet-header-item": true,
602
+ active: thirdLevelItem.active === true,
603
+ }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev), target: thirdLevelItem.external ? "_blank" : "_self" },
604
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
605
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
606
+ h("span", null, thirdLevelItem.label),
607
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" })))))));
608
+ }))))),
609
+ h("div", { class: "duet-header-bottom-utils" },
610
+ h("slot", { name: "utility" })),
611
+ h("div", { class: "duet-header-utils" },
612
+ !itemsHaveSubItems && contactDropdown,
613
+ languageDropdown,
614
+ !itemsHaveSubItems && (h(Fragment, null,
615
+ processedUserWithLink,
616
+ processedUserWithoutLink)),
617
+ processedSearch,
618
+ processedSession))))));
466
619
  }
467
620
  static get is() { return "duet-header"; }
468
621
  static get encapsulation() { return "shadow"; }
@@ -683,7 +836,7 @@ export class DuetHeader {
683
836
  "optional": false,
684
837
  "docs": {
685
838
  "tags": [],
686
- "text": "An object that includes mandatory \"label\" and \"href\" fields for the user\nprofile link. Additionally, you can pass an \"id\" that is added as an HTML\nidentifier for the element. If nothing is passed, user won\u2019t be shown."
839
+ "text": "An object that includes mandatory \"label\" and \"href\" fields for the user\nprofile link. Additionally, you can pass an \"id\" that is added as an HTML\nidentifier for the element. If nothing is passed, user won\u2019t be shown.\nNote: not available in multilevel headers."
687
840
  },
688
841
  "attribute": "user",
689
842
  "reflect": false
@@ -718,7 +871,7 @@ export class DuetHeader {
718
871
  "optional": false,
719
872
  "docs": {
720
873
  "tags": [],
721
- "text": "The href of the current page item that is shown as \u201Cactive\u201D."
874
+ "text": "The href of the current page item that is shown as \u201Cactive\u201D.\nNote: not available in multilevel headers."
722
875
  },
723
876
  "attribute": "current-href",
724
877
  "reflect": false,
@@ -754,7 +907,7 @@ export class DuetHeader {
754
907
  "optional": false,
755
908
  "docs": {
756
909
  "tags": [],
757
- "text": "An array of items for the main navigation. Items have to include mandatory\n\"label\" and \"href\" fields to work. Additionally, you can pass an \"id\" that is\nadded as an HTML identifier for the element."
910
+ "text": "An array of items for the main navigation. Items have to include mandatory\n\"label\" and \"href\" fields to work. Additionally, you can pass an \"id\" that is\nadded as an HTML identifier for the element, \"active\" boolean that makes item active,\n\"badge\" boolean to add notification badge next to the item and\n\"items\" array consisting of sub items that are allowed up to three levels."
758
911
  },
759
912
  "attribute": "items",
760
913
  "reflect": false
@@ -771,7 +924,7 @@ export class DuetHeader {
771
924
  "optional": false,
772
925
  "docs": {
773
926
  "tags": [],
774
- "text": "Region that is shown next to the logo. If empty, region will be hidden."
927
+ "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in desktop multilevel header."
775
928
  },
776
929
  "attribute": "region",
777
930
  "reflect": false,
@@ -789,11 +942,28 @@ export class DuetHeader {
789
942
  "optional": false,
790
943
  "docs": {
791
944
  "tags": [],
792
- "text": "An object that includes mandatory \"label\", \"href\" and \"type\" fields for the\nsession login/logout link. Additionally, you can pass an \"id\" that is added\nas an HTML identifier for the element. If nothing is passed, this link won\u2019t\nbe shown."
945
+ "text": "An object that includes mandatory \"label\", \"href\" and \"type\" fields for the\nsession login/logout link. Additionally, you can pass an \"id\" that is added\nas an HTML identifier for the element.\nIf nothing is passed, this link won\u2019t be shown."
793
946
  },
794
947
  "attribute": "session",
795
948
  "reflect": false
796
949
  },
950
+ "search": {
951
+ "type": "any",
952
+ "mutable": false,
953
+ "complexType": {
954
+ "original": "any",
955
+ "resolved": "any",
956
+ "references": {}
957
+ },
958
+ "required": false,
959
+ "optional": false,
960
+ "docs": {
961
+ "tags": [],
962
+ "text": "An object that includes mandatory \"label\" and \"href\" fields for the\nsearch link. Additionally, you can pass an \"id\" that is added\nas an HTML identifier for the element. If nothing is passed, this link won\u2019t\nbe shown."
963
+ },
964
+ "attribute": "search",
965
+ "reflect": false
966
+ },
797
967
  "back": {
798
968
  "type": "any",
799
969
  "mutable": false,
@@ -823,7 +993,7 @@ export class DuetHeader {
823
993
  "optional": false,
824
994
  "docs": {
825
995
  "tags": [],
826
- "text": "Label of the contact menu. If empty, contact menu will be hidden."
996
+ "text": "Label of the contact menu. If empty, contact menu will be hidden.\nNote: not available in multilevel headers."
827
997
  },
828
998
  "attribute": "contact",
829
999
  "reflect": false,
@@ -868,12 +1038,17 @@ export class DuetHeader {
868
1038
  "isContactOpen": {},
869
1039
  "isLanguageOpen": {},
870
1040
  "isSlideOutOpen": {},
1041
+ "isSegmentOpen": {},
1042
+ "openMenu": {},
1043
+ "closedActives": {},
871
1044
  "processedItems": {},
872
1045
  "processedLanguageItems": {},
873
1046
  "processedContactItems": {},
874
1047
  "processedSession": {},
1048
+ "processedSearch": {},
875
1049
  "processedUser": {},
876
- "processedBack": {}
1050
+ "processedBack": {},
1051
+ "renderDesktopNav": {}
877
1052
  }; }
878
1053
  static get events() { return [{
879
1054
  "method": "duetChange",
@@ -916,6 +1091,25 @@ export class DuetHeader {
916
1091
  }
917
1092
  }
918
1093
  }
1094
+ }, {
1095
+ "method": "duetSearchClick",
1096
+ "name": "duetSearchClick",
1097
+ "bubbles": true,
1098
+ "cancelable": true,
1099
+ "composed": true,
1100
+ "docs": {
1101
+ "tags": [],
1102
+ "text": "Event for when a user has clicked the search link. You can prevent the\ndefault browser functionality by calling **event.detail.originalEvent.preventDefault()**\ninside your listener. Additionally, the passed data is available via **event.detail.data**."
1103
+ },
1104
+ "complexType": {
1105
+ "original": "DuetHeaderChangeEvent",
1106
+ "resolved": "{ originalEvent: Event; data: DuetHeaderItem | DuetHeaderLanguageItem | DuetHeaderSession; component: \"duet-header\"; }",
1107
+ "references": {
1108
+ "DuetHeaderChangeEvent": {
1109
+ "location": "local"
1110
+ }
1111
+ }
1112
+ }
919
1113
  }, {
920
1114
  "method": "duetUserClick",
921
1115
  "name": "duetUserClick",