@duetds/components 4.33.2 → 4.34.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 (289) hide show
  1. package/hydrate/index.js +401 -87
  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 +2 -2
  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 +86 -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 +1 -1
  20. package/lib/cjs/duet-header_2.cjs.entry.js +214 -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-480ea4e0.js} +1 -1
  43. package/lib/cjs/form-search-d61b2843.js +8 -0
  44. package/lib/cjs/{index-18b0f43a.js → index-6966a494.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-collapsible/duet-collapsible.js +4 -1
  50. package/lib/collection/components/duet-editable-table/duet-editable-table-button.js +13 -6
  51. package/lib/collection/components/duet-editable-table/duet-editable-table-item.js +25 -3
  52. package/lib/collection/components/duet-editable-table/duet-editable-table-tabledata.js +3 -3
  53. package/lib/collection/components/duet-editable-table/duet-editable-table.js +58 -2
  54. package/lib/collection/components/duet-footer/duet-footer.css +1 -0
  55. package/lib/collection/components/duet-header/duet-header-dropdown.js +27 -0
  56. package/lib/collection/components/duet-header/duet-header-hamburger.js +9 -0
  57. package/lib/collection/components/duet-header/duet-header-icon.js +9 -0
  58. package/lib/collection/components/duet-header/duet-header.css +272 -39
  59. package/lib/collection/components/duet-header/duet-header.js +310 -122
  60. package/lib/collection/components/duet-icon/duet-icon.js +5 -3
  61. package/lib/collection/components/duet-link/duet-link.js +4 -1
  62. package/lib/collection/components/duet-list-item/duet-list-item.css +1 -1
  63. package/lib/collection/components/duet-notification-drawer/duet-notification-drawer.css +4 -3
  64. package/lib/collection/components/duet-table/duet-table.css +42 -17
  65. package/lib/collection/components/duet-table/duet-table.js +2 -2
  66. package/lib/collection/components/duet-upload/duet-upload.js +26 -4
  67. package/lib/collection/utils/template-utils.js +33 -0
  68. package/lib/collection/utils/token-utils.js +67 -14
  69. package/lib/custom-elements-bundle/index.js +386 -90
  70. package/lib/duet/duet.esm.js +1 -1
  71. package/lib/duet/duet.js +1 -1
  72. package/lib/duet/{p-b5dc29b8.system.entry.js → p-07f43530.system.entry.js} +1 -1
  73. package/lib/duet/{p-0435b54a.system.entry.js → p-093bca2f.system.entry.js} +1 -1
  74. package/lib/duet/{p-60ef3d05.entry.js → p-0aaf86ba.entry.js} +1 -1
  75. package/lib/duet/{p-4e17a6cb.system.entry.js → p-0b0a05ed.system.entry.js} +1 -1
  76. package/lib/duet/{p-6402041d.system.entry.js → p-0be1c660.system.entry.js} +1 -1
  77. package/lib/duet/{p-de43620d.system.entry.js → p-0d66e11b.system.entry.js} +1 -1
  78. package/lib/duet/{p-3cad13af.system.entry.js → p-0de430e1.system.entry.js} +1 -1
  79. package/lib/duet/{p-1ecddc1d.entry.js → p-0ef8d711.entry.js} +1 -1
  80. package/lib/duet/{p-68635a1c.entry.js → p-12a08d77.entry.js} +1 -1
  81. package/lib/duet/{p-ba6214be.entry.js → p-15c9a17c.entry.js} +1 -1
  82. package/lib/duet/{p-35a3794e.js → p-183726f7.js} +0 -0
  83. package/lib/duet/{p-5b9621e2.entry.js → p-18c3eb54.entry.js} +1 -1
  84. package/lib/duet/{p-50b796eb.entry.js → p-1b591fa4.entry.js} +1 -1
  85. package/lib/duet/{p-d5e2bb48.system.entry.js → p-1bd0f4eb.system.entry.js} +1 -1
  86. package/lib/duet/{p-dd9b8fcb.system.entry.js → p-27bd8744.system.entry.js} +1 -1
  87. package/lib/duet/p-289a31cb.entry.js +4 -0
  88. package/lib/duet/{p-c0f3f60f.system.entry.js → p-29b352db.system.entry.js} +1 -1
  89. package/lib/duet/p-2a00f231.system.entry.js +4 -0
  90. package/lib/duet/{p-9a09ac2b.system.entry.js → p-3215e07e.system.entry.js} +1 -1
  91. package/lib/duet/{p-1c7d7cdd.system.entry.js → p-338b9955.system.entry.js} +1 -1
  92. package/lib/duet/{p-65451003.entry.js → p-33de1029.entry.js} +1 -1
  93. package/lib/duet/p-34ebff3b.entry.js +4 -0
  94. package/lib/duet/{p-5727cd82.system.entry.js → p-379d416f.system.entry.js} +1 -1
  95. package/lib/duet/{p-9584411c.entry.js → p-39a12eb9.entry.js} +1 -1
  96. package/lib/duet/{p-be349a3d.system.entry.js → p-39fd8b43.system.entry.js} +1 -1
  97. package/lib/duet/{p-8c730326.entry.js → p-3bafdf7c.entry.js} +1 -1
  98. package/lib/duet/{p-d4e706ac.system.entry.js → p-3c1ce7e2.system.entry.js} +1 -1
  99. package/lib/duet/p-3da6b84e.entry.js +4 -0
  100. package/lib/duet/{p-39e9d638.entry.js → p-43c49a72.entry.js} +1 -1
  101. package/lib/duet/{p-582f3a2c.entry.js → p-44f4b8ff.entry.js} +1 -1
  102. package/lib/duet/{p-a2b2fa13.system.entry.js → p-4c5ac0c2.system.entry.js} +1 -1
  103. package/lib/duet/p-50b4fb2c.js +4 -0
  104. package/lib/duet/{p-cff461b6.entry.js → p-51f7ae72.entry.js} +1 -1
  105. package/lib/duet/{p-987edcd0.js → p-52621211.js} +0 -0
  106. package/lib/duet/{p-7ceaf4ef.system.entry.js → p-5443c9ca.system.entry.js} +1 -1
  107. package/lib/duet/{p-b1ad7a52.system.entry.js → p-5610db77.system.entry.js} +1 -1
  108. package/lib/duet/{p-d0fb19f7.system.entry.js → p-5b409bfb.system.entry.js} +1 -1
  109. package/lib/duet/{p-04b3e682.entry.js → p-6353407f.entry.js} +1 -1
  110. package/lib/duet/{p-66fdebc5.js → p-64bf94ee.js} +1 -1
  111. package/lib/duet/{p-c506017d.entry.js → p-64e915ae.entry.js} +1 -1
  112. package/lib/duet/{p-933c2774.system.entry.js → p-6c237f21.system.entry.js} +1 -1
  113. package/lib/duet/p-6c8521f6.system.entry.js +4 -0
  114. package/lib/duet/{p-c18a599e.system.js → p-6e4fd6ba.system.js} +0 -0
  115. package/lib/duet/{p-15fae689.entry.js → p-7347f4ac.entry.js} +1 -1
  116. package/lib/duet/{p-d1dfa30e.entry.js → p-781bd6db.entry.js} +1 -1
  117. package/lib/duet/{p-f37ffb6f.system.entry.js → p-78e8a689.system.entry.js} +1 -1
  118. package/lib/duet/{p-408e8cdb.system.js → p-81e855e4.system.js} +1 -1
  119. package/lib/duet/{p-637df820.entry.js → p-8224d768.entry.js} +1 -1
  120. package/lib/duet/{p-33538e90.system.entry.js → p-848bb1c2.system.entry.js} +1 -1
  121. package/lib/duet/{p-042ec8b1.entry.js → p-880a4afe.entry.js} +1 -1
  122. package/lib/duet/{p-4a14da52.entry.js → p-8c375429.entry.js} +1 -1
  123. package/lib/duet/p-8cb71174.system.entry.js +4 -0
  124. package/lib/duet/{p-cd21755b.entry.js → p-8d7b68c4.entry.js} +1 -1
  125. package/lib/duet/p-8f477bd6.system.js +4 -0
  126. package/lib/duet/{p-0ac2e60d.system.entry.js → p-969c6395.system.entry.js} +1 -1
  127. package/lib/duet/{p-2d8e0faa.system.entry.js → p-9c234242.system.entry.js} +1 -1
  128. package/lib/duet/{p-3a7e519e.entry.js → p-9d7b9084.entry.js} +1 -1
  129. package/lib/duet/{p-c3c95a34.system.entry.js → p-a0544097.system.entry.js} +1 -1
  130. package/lib/duet/p-a16a58c1.system.js +4 -0
  131. package/lib/duet/{p-5f79eff8.system.entry.js → p-a4a16d03.system.entry.js} +1 -1
  132. package/lib/duet/p-a4e3b44b.entry.js +4 -0
  133. package/lib/duet/{p-659d6cb7.entry.js → p-a91673cf.entry.js} +1 -1
  134. package/lib/duet/{p-c9a11360.entry.js → p-a926944f.entry.js} +1 -1
  135. package/lib/duet/p-b08bce4c.entry.js +4 -0
  136. package/lib/duet/{p-7fed7f57.entry.js → p-b48a5f80.entry.js} +1 -1
  137. package/lib/duet/p-bb3e3777.entry.js +4 -0
  138. package/lib/duet/{p-3364cfd2.entry.js → p-bbe33d02.entry.js} +1 -1
  139. package/lib/duet/{p-2b4bd1b2.system.entry.js → p-be8e1c48.system.entry.js} +1 -1
  140. package/lib/duet/{p-3bcf2054.system.entry.js → p-c56c73ee.system.entry.js} +1 -1
  141. package/lib/duet/p-c63bdc6a.system.entry.js +4 -0
  142. package/lib/duet/{p-1cf8dbc7.system.js → p-c83685a6.system.js} +1 -1
  143. package/lib/duet/{p-c74cecf2.system.entry.js → p-c8dfc958.system.entry.js} +1 -1
  144. package/lib/duet/{p-7f8cce41.system.entry.js → p-c92f601f.system.entry.js} +1 -1
  145. package/lib/duet/p-d004da5f.js +4 -0
  146. package/lib/duet/p-d49416f8.entry.js +4 -0
  147. package/lib/duet/{p-720a36f2.entry.js → p-d581d82d.entry.js} +1 -1
  148. package/lib/duet/{p-f8744611.entry.js → p-d6bb4301.entry.js} +1 -1
  149. package/lib/duet/p-d9aadc15.entry.js +4 -0
  150. package/lib/duet/{p-7ab0bad8.entry.js → p-dde63979.entry.js} +1 -1
  151. package/lib/duet/{p-1dcbd837.system.entry.js → p-e15ccddc.system.entry.js} +1 -1
  152. package/lib/duet/{p-9125ed25.entry.js → p-e1be37a6.entry.js} +1 -1
  153. package/lib/duet/{p-0d22396e.system.js → p-e5c1751e.system.js} +0 -0
  154. package/lib/duet/{p-fd00b025.entry.js → p-e9209e9f.entry.js} +1 -1
  155. package/lib/duet/{p-61fc3872.system.js → p-ee1ba0d4.system.js} +1 -1
  156. package/lib/duet/{p-350cea4e.system.entry.js → p-f4a29a8a.system.entry.js} +2 -2
  157. package/lib/duet/{p-8c2f14d8.system.entry.js → p-f8a0bd32.system.entry.js} +1 -1
  158. package/lib/duet/p-f9599dd9.system.entry.js +4 -0
  159. package/lib/duet/{p-ebc4e334.js → p-fd7018e9.js} +1 -1
  160. package/lib/duet/{p-75e5d4d1.system.entry.js → p-fe0cca67.system.entry.js} +1 -1
  161. package/lib/esm/{dom-58cd15f6.js → dom-5d060ace.js} +1 -1
  162. package/lib/esm/duet-alert.entry.js +1 -1
  163. package/lib/esm/duet-badge.entry.js +1 -1
  164. package/lib/esm/duet-button_2.entry.js +2 -2
  165. package/lib/esm/duet-caption_4.entry.js +3 -3
  166. package/lib/esm/duet-card.entry.js +2 -2
  167. package/lib/esm/duet-checkbox.entry.js +1 -1
  168. package/lib/esm/duet-choice_2.entry.js +2 -2
  169. package/lib/esm/duet-collapsible.entry.js +2 -2
  170. package/lib/esm/duet-cookie-consent.entry.js +1 -1
  171. package/lib/esm/duet-date-picker.entry.js +2 -2
  172. package/lib/esm/duet-divider_2.entry.js +1 -1
  173. package/lib/esm/duet-editable-table-button.entry.js +14 -7
  174. package/lib/esm/duet-editable-table_4.entry.js +86 -11
  175. package/lib/esm/duet-empty-state.entry.js +1 -1
  176. package/lib/esm/duet-fieldset.entry.js +1 -1
  177. package/lib/esm/duet-footer.entry.js +2 -2
  178. package/lib/esm/duet-grid_2.entry.js +1 -1
  179. package/lib/esm/duet-header_2.entry.js +214 -47
  180. package/lib/esm/duet-hero.entry.js +1 -1
  181. package/lib/esm/duet-icon.entry.js +7 -5
  182. package/lib/esm/duet-input_2.entry.js +2 -3
  183. package/lib/esm/duet-layout.entry.js +1 -1
  184. package/lib/esm/duet-list_2.entry.js +2 -2
  185. package/lib/esm/duet-modal.entry.js +2 -2
  186. package/lib/esm/duet-notification_2.entry.js +2 -2
  187. package/lib/esm/duet-number-input.entry.js +1 -1
  188. package/lib/esm/duet-progress.entry.js +1 -1
  189. package/lib/esm/duet-radio_2.entry.js +1 -1
  190. package/lib/esm/duet-range-slider.entry.js +1 -1
  191. package/lib/esm/duet-select.entry.js +1 -1
  192. package/lib/esm/duet-step_2.entry.js +1 -1
  193. package/lib/esm/duet-tab_2.entry.js +1 -1
  194. package/lib/esm/duet-textarea.entry.js +1 -1
  195. package/lib/esm/duet-toggle.entry.js +1 -1
  196. package/lib/esm/duet-tooltip.entry.js +1 -1
  197. package/lib/esm/duet-tray.entry.js +1 -1
  198. package/lib/esm/duet-upload-aria-status.entry.js +1 -1
  199. package/lib/esm/duet-visually-hidden.entry.js +1 -1
  200. package/lib/esm/duet.js +4 -4
  201. package/lib/esm/{focus-utils-c1fa24c4.js → focus-utils-48837cfa.js} +1 -1
  202. package/lib/esm/form-search-ea8e19ae.js +6 -0
  203. package/lib/esm/{index-05e43a37.js → index-80be4170.js} +2 -2
  204. package/lib/esm/loader.js +3 -3
  205. package/lib/esm/{shadow-css-7c726abb.js → shadow-css-13d024f4.js} +1 -1
  206. package/lib/esm/token-utils-75f78ca4.js +75 -0
  207. package/lib/esm-es5/{dom-58cd15f6.js → dom-5d060ace.js} +0 -0
  208. package/lib/esm-es5/duet-alert.entry.js +1 -1
  209. package/lib/esm-es5/duet-badge.entry.js +1 -1
  210. package/lib/esm-es5/duet-button_2.entry.js +1 -1
  211. package/lib/esm-es5/duet-caption_4.entry.js +1 -1
  212. package/lib/esm-es5/duet-card.entry.js +1 -1
  213. package/lib/esm-es5/duet-checkbox.entry.js +1 -1
  214. package/lib/esm-es5/duet-choice_2.entry.js +2 -2
  215. package/lib/esm-es5/duet-collapsible.entry.js +2 -2
  216. package/lib/esm-es5/duet-cookie-consent.entry.js +1 -1
  217. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  218. package/lib/esm-es5/duet-divider_2.entry.js +1 -1
  219. package/lib/esm-es5/duet-editable-table-button.entry.js +1 -1
  220. package/lib/esm-es5/duet-editable-table_4.entry.js +2 -2
  221. package/lib/esm-es5/duet-empty-state.entry.js +1 -1
  222. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  223. package/lib/esm-es5/duet-footer.entry.js +1 -1
  224. package/lib/esm-es5/duet-grid_2.entry.js +1 -1
  225. package/lib/esm-es5/duet-header_2.entry.js +2 -2
  226. package/lib/esm-es5/duet-hero.entry.js +1 -1
  227. package/lib/esm-es5/duet-icon.entry.js +1 -1
  228. package/lib/esm-es5/duet-input_2.entry.js +1 -1
  229. package/lib/esm-es5/duet-layout.entry.js +1 -1
  230. package/lib/esm-es5/duet-list_2.entry.js +1 -1
  231. package/lib/esm-es5/duet-modal.entry.js +1 -1
  232. package/lib/esm-es5/duet-notification_2.entry.js +1 -1
  233. package/lib/esm-es5/duet-number-input.entry.js +1 -1
  234. package/lib/esm-es5/duet-progress.entry.js +1 -1
  235. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  236. package/lib/esm-es5/duet-range-slider.entry.js +1 -1
  237. package/lib/esm-es5/duet-select.entry.js +1 -1
  238. package/lib/esm-es5/duet-step_2.entry.js +1 -1
  239. package/lib/esm-es5/duet-tab_2.entry.js +1 -1
  240. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  241. package/lib/esm-es5/duet-toggle.entry.js +1 -1
  242. package/lib/esm-es5/duet-tooltip.entry.js +1 -1
  243. package/lib/esm-es5/duet-tray.entry.js +1 -1
  244. package/lib/esm-es5/duet-upload-aria-status.entry.js +1 -1
  245. package/lib/esm-es5/duet-visually-hidden.entry.js +1 -1
  246. package/lib/esm-es5/duet.js +1 -1
  247. package/lib/esm-es5/{focus-utils-c1fa24c4.js → focus-utils-48837cfa.js} +1 -1
  248. package/lib/esm-es5/form-search-ea8e19ae.js +4 -0
  249. package/lib/esm-es5/{index-05e43a37.js → index-80be4170.js} +1 -1
  250. package/lib/esm-es5/loader.js +1 -1
  251. package/lib/esm-es5/{shadow-css-7c726abb.js → shadow-css-13d024f4.js} +0 -0
  252. package/lib/esm-es5/token-utils-75f78ca4.js +4 -0
  253. package/lib/types/common-types.d.ts +0 -1
  254. package/lib/types/components/duet-collapsible/duet-collapsible.d.ts +3 -0
  255. package/lib/types/components/duet-editable-table/duet-editable-table-button.d.ts +1 -0
  256. package/lib/types/components/duet-editable-table/duet-editable-table-item.d.ts +5 -1
  257. package/lib/types/components/duet-editable-table/duet-editable-table-tabledata.d.ts +1 -0
  258. package/lib/types/components/duet-editable-table/duet-editable-table.d.ts +10 -0
  259. package/lib/types/components/duet-header/duet-header-dropdown.d.ts +16 -0
  260. package/lib/types/components/duet-header/duet-header-hamburger.d.ts +2 -0
  261. package/lib/types/components/duet-header/duet-header-icon.d.ts +8 -0
  262. package/lib/types/components/duet-header/duet-header.d.ts +41 -4
  263. package/lib/types/components/duet-link/duet-link.d.ts +3 -0
  264. package/lib/types/components/duet-table/duet-table.d.ts +1 -1
  265. package/lib/types/components/duet-upload/duet-upload.d.ts +4 -0
  266. package/lib/types/components.d.ts +46 -10
  267. package/lib/types/stencil-public-runtime.d.ts +6 -4
  268. package/lib/types/utils/template-utils.d.ts +13 -0
  269. package/lib/types/utils/token-utils.d.ts +8 -2
  270. package/package.json +13 -13
  271. package/lib/cjs/token-utils-63a9c8dc.js +0 -30
  272. package/lib/duet/p-1082d9f2.system.entry.js +0 -4
  273. package/lib/duet/p-12fc4849.system.entry.js +0 -4
  274. package/lib/duet/p-1ad58142.entry.js +0 -4
  275. package/lib/duet/p-3c1971d8.js +0 -4
  276. package/lib/duet/p-60e721aa.system.entry.js +0 -4
  277. package/lib/duet/p-64c0aa2a.entry.js +0 -4
  278. package/lib/duet/p-6708db8a.entry.js +0 -4
  279. package/lib/duet/p-6e363557.system.js +0 -4
  280. package/lib/duet/p-72629304.entry.js +0 -4
  281. package/lib/duet/p-75a104e3.entry.js +0 -4
  282. package/lib/duet/p-9930e52e.entry.js +0 -4
  283. package/lib/duet/p-a09ddd8f.entry.js +0 -4
  284. package/lib/duet/p-cd597d62.system.entry.js +0 -4
  285. package/lib/duet/p-dd79932a.entry.js +0 -4
  286. package/lib/duet/p-e038da47.system.entry.js +0 -4
  287. package/lib/esm/token-utils-590d9413.js +0 -28
  288. package/lib/esm-es5/token-utils-590d9413.js +0 -4
  289. package/lib/html.html-data.json +0 -4906
@@ -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,21 @@ 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
+ const bound = this.refresh.bind(this);
317
+ this.mql[i].addEventListener("change", bound);
318
+ this.boundMqlFunctions[i] = bound;
319
+ }
320
+ }
262
321
  disconnectedCallback() {
263
322
  if (this.navigationEl) {
264
323
  enableBodyScroll(this.navigationEl);
265
324
  }
325
+ for (let i = 0; i < this.mql.length; i++) {
326
+ this.mql[i].removeEventListener("change", this.boundMqlFunctions[i]);
327
+ }
328
+ this.boundMqlFunctions = [];
266
329
  }
267
330
  /**
268
331
  * Component event handling.
@@ -275,7 +338,7 @@ export class DuetHeader {
275
338
  }
276
339
  }
277
340
  handleKeyDown(ev) {
278
- if (this.isContactOpen || this.isLanguageOpen) {
341
+ if (this.isContactOpen || this.isLanguageOpen || this.isSegmentOpen) {
279
342
  const activeElement = this.element.shadowRoot.activeElement;
280
343
  // When Space is pressed
281
344
  if (isSpaceKey(ev) && activeElement) {
@@ -287,6 +350,12 @@ export class DuetHeader {
287
350
  else if (this.isLanguageOpen) {
288
351
  this.closeMenus(true);
289
352
  }
353
+ else if (this.isSegmentOpen) {
354
+ this.closeMenus();
355
+ }
356
+ else if (this.openMenu) {
357
+ this.closeMenus();
358
+ }
290
359
  activeElement.click();
291
360
  }
292
361
  }
@@ -316,10 +385,15 @@ export class DuetHeader {
316
385
  * Local methods.
317
386
  */
318
387
  async refresh() {
388
+ if (this.renderDesktopNav !== this.mql[0].matches) {
389
+ this.renderDesktopNav = this.mql[0].matches;
390
+ this.openMenu = null;
391
+ }
319
392
  this.processedItems = parsePossibleJSON(this.items);
320
393
  this.processedLanguageItems = parsePossibleJSON(this.languageItems);
321
394
  this.processedContactItems = parsePossibleJSON(this.contactItems);
322
395
  this.processedSession = parsePossibleJSON(this.session);
396
+ this.processedSearch = parsePossibleJSON(this.search);
323
397
  this.processedUser = parsePossibleJSON(this.user);
324
398
  this.processedBack = parsePossibleJSON(this.back);
325
399
  }
@@ -336,7 +410,7 @@ export class DuetHeader {
336
410
  * Closes all dropdown menus in header when called.
337
411
  */
338
412
  async closeMenus(moveFocusToButton = false) {
339
- if (this.isContactOpen || this.isLanguageOpen) {
413
+ if (this.isContactOpen || this.isLanguageOpen || this.isSegmentOpen || this.openMenu) {
340
414
  if (this.isContactOpen && moveFocusToButton) {
341
415
  this.contactItemsButtonEl.focus({
342
416
  preventScroll: true,
@@ -347,8 +421,20 @@ export class DuetHeader {
347
421
  preventScroll: true,
348
422
  });
349
423
  }
424
+ if (this.isSegmentOpen && moveFocusToButton) {
425
+ this.segmentItemsButtonEl.focus({
426
+ preventScroll: true,
427
+ });
428
+ }
429
+ if (this.openMenu && moveFocusToButton) {
430
+ this.subMenuButtonRefs[this.openMenu].focus({
431
+ preventScroll: true,
432
+ });
433
+ }
350
434
  this.isContactOpen = false;
351
435
  this.isLanguageOpen = false;
436
+ this.isSegmentOpen = false;
437
+ this.openMenu = null;
352
438
  }
353
439
  }
354
440
  /**
@@ -364,105 +450,166 @@ export class DuetHeader {
364
450
  */
365
451
  render() {
366
452
  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,
453
+ const skipToLabel = this.skipToId ? (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)) : null;
454
+ const logo = (h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
455
+ const largeLogo = (h("duet-logo", { href: this.logoHref, size: "large", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
456
+ 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" },
457
+ item.label,
458
+ Build.isBrowser && item.external && (h(Fragment, null,
459
+ h("duet-visually-hidden", null,
460
+ ", ",
461
+ this.accessibleLabelExternal),
462
+ h("span", { class: "duet-header-link-external" },
463
+ h("duet-icon", { name: "action-new-window-small", size: "xx-small", margin: "none", color: this.theme === "turva" ? "primary-turva" : "primary" }))))))))) : null;
464
+ 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;
465
+ 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 },
466
+ h(DuetHeaderIcon, { icon: userIcon.svg }),
467
+ h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
468
+ const processedUserWithoutLink = this.processedUser && !this.processedUser.href ? (h("span", { id: this.processedUser.id, class: "duet-header-user duet-header-button duet-header-no-action" },
469
+ h(DuetHeaderIcon, { icon: userIcon.svg }),
470
+ h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
471
+ const processedSessionIconSize = this.renderDesktopNav ? "x-small" : "small";
472
+ const processedSession = this.processedSession ? (h("a", { href: this.processedSession.href || "#", id: this.processedSession.id, class: "duet-header-logout duet-header-button", onClick: this.handleSessionClick },
473
+ h(DuetHeaderIcon, { icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: processedSessionIconSize }),
474
+ h("span", { class: "duet-header-button-label" }, this.processedSession.label))) : null;
475
+ const processedSearch = this.processedSearch ? (h("a", { href: this.processedSearch.href || "#", id: this.processedSearch.id, class: "duet-header-search duet-header-button", onClick: this.handleSearchClick },
476
+ h(DuetHeaderIcon, { icon: searchIcon.svg }),
477
+ h("span", { class: "duet-header-button-label" }, this.processedSearch.label))) : null;
478
+ // Back variation
479
+ if (this.processedBack) {
480
+ return (h(Host, { class: "duet-header-back-variation" },
481
+ h("div", { class: "duet-header-reserved-space" },
482
+ h("header", { class: {
483
+ "duet-header": true,
484
+ "duet-theme-turva": this.theme === "turva",
485
+ "duet-header-back": true,
486
+ "duet-header-inactive": true,
487
+ } },
488
+ h("div", { class: "duet-header-top" },
489
+ skipToLabel,
490
+ 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),
491
+ logo,
492
+ h("slot", { name: "logo-utility" }))))));
493
+ }
494
+ // multi level desktop variation
495
+ const itemsHaveSubItems = this.processedItems && this.processedItems.some(item => item.items && item.items.length > 0);
496
+ if (this.renderDesktopNav && itemsHaveSubItems) {
497
+ const activeSegment = this.processedItems.find(item => item.active);
498
+ const isThirdLevelActive = this.processedItems &&
499
+ this.processedItems.some(item => item.items &&
500
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
501
+ const segmentId = "duet-header-segment";
502
+ return (h(Host, { class: "duet-header-multi-level-desktop-variation" },
503
+ h("div", { class: {
504
+ "duet-header-multi-level-desktop": true,
505
+ "duet-header-multi-level-desktop-third-level-is-open": isThirdLevelActive,
506
+ } },
507
+ h("header", { class: {
508
+ "duet-header": true,
509
+ "duet-theme-turva": this.theme === "turva",
510
+ "duet-header-inactive": !this.processedItems,
511
+ } },
512
+ h("div", { class: "duet-header-top" },
513
+ skipToLabel,
514
+ h("div", { class: "logo-and-segment" },
515
+ largeLogo,
516
+ 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" },
517
+ item.icon && (h("div", { class: "duet-header-icon" },
518
+ h("duet-icon", { margin: "none", size: "x-small", name: item.icon, color: "currentColor" }))),
519
+ h("span", null, item.label),
520
+ item.badge && h("div", { class: "duet-header-badge" }))))))),
521
+ h("nav", { class: "duet-header-multi-level-desktop-nav" }, activeSegment.items &&
522
+ activeSegment.items
523
+ .filter(secondLevelItem => secondLevelItem.items && secondLevelItem.items.length > 0)
524
+ .map((secondLevelItem, secondLevelItemIndex) => {
525
+ const id = secondLevelItem.id || `segment-item-${secondLevelItemIndex}`;
526
+ 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 &&
527
+ 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" },
528
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
529
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
530
+ h("span", null, thirdLevelItem.label),
531
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" }))))));
532
+ })),
533
+ h("div", { class: "duet-header-multi-level-desktop-utils" },
534
+ processedSearch,
535
+ languageDropdown,
536
+ processedSession),
537
+ h("slot", { name: "utility" }))))));
538
+ }
539
+ // Default variation
540
+ const isThirdLevelActive = this.processedItems &&
541
+ this.processedItems.some(item => item.items &&
542
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
543
+ return (h(Host, { class: {
544
+ "duet-header-default-variation": true,
371
545
  } },
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,
546
+ h("div", { class: {
547
+ "duet-header-reserved-space": true,
548
+ "duet-with-links": !!this.processedItems,
549
+ "duet-header-third-level-active": isThirdLevelActive,
377
550
  } },
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,
551
+ h("header", { class: {
552
+ "duet-header": true,
553
+ "duet-theme-turva": this.theme === "turva",
554
+ "duet-header-inactive": !this.processedItems,
398
555
  } },
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" },
556
+ h("div", { class: "duet-header-top" },
557
+ skipToLabel,
558
+ logo,
559
+ h("slot", { name: "logo-utility" }, this.region && h("div", { class: "duet-header-region" }, this.region)),
560
+ (this.processedItems ||
561
+ languageDropdown ||
562
+ contactDropdown ||
563
+ this.processedSession ||
564
+ this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
565
+ h("duet-visually-hidden", null, this.accessibleLabel),
566
+ h(DuetHeaderHamburger, null)))),
567
+ h("div", { ref: el => (this.navigationEl = el), class: {
568
+ "duet-header-bottom": true,
569
+ active: this.isSlideOutOpen,
570
+ inactive: !this.processedItems,
571
+ } },
572
+ h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
573
+ this.processedItems.map((item, itemIndex) => (h("div", { class: "duet-header-item-container" },
574
+ h("a", { class: {
575
+ "duet-header-first-level": true,
576
+ "duet-header-item": true,
577
+ active: (!itemsHaveSubItems && this.currentHref === item.href) || item.active === true,
578
+ }, href: item.href || "#", id: item.id || `header-item-${itemIndex}`, onClick: event => this.handleItemClick(event, item) },
424
579
  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))))))));
580
+ item.badge && h("div", { class: "duet-header-badge" })),
581
+ item.items &&
582
+ item.items
583
+ .filter(secondLevelitem => secondLevelitem.items && secondLevelitem.items.length > 0)
584
+ .map((secondLevelItem, secondLevelItemIndex) => {
585
+ const id = secondLevelItem.id || `header-item-${itemIndex}-${secondLevelItemIndex}`;
586
+ return (h(DuetHeaderDropdown, { id: id, className: "duet-header-second-level", label: secondLevelItem.label, icon: `${secondLevelItem.icon}.svg`, active: (!this.openMenu &&
587
+ secondLevelItem.active === true &&
588
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
589
+ this.openMenu === id, isOpen: (!this.openMenu &&
590
+ secondLevelItem.active === true &&
591
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
592
+ 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) },
593
+ h("div", { class: "duet-header-third-level" }, secondLevelItem.items &&
594
+ secondLevelItem.items.map(thirdLevelItem => (h("a", { class: {
595
+ "duet-header-item": true,
596
+ active: thirdLevelItem.active === true,
597
+ }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, item), onKeyDown: ev => this.handleArrowKeys(ev), target: thirdLevelItem.external ? "_blank" : "_self" },
598
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
599
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
600
+ h("span", null, thirdLevelItem.label),
601
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" })))))));
602
+ }))))),
603
+ h("div", { class: "duet-header-bottom-utils" },
604
+ h("slot", { name: "utility" })),
605
+ h("div", { class: "duet-header-utils" },
606
+ !itemsHaveSubItems && contactDropdown,
607
+ languageDropdown,
608
+ !itemsHaveSubItems && (h(Fragment, null,
609
+ processedUserWithLink,
610
+ processedUserWithoutLink)),
611
+ processedSearch,
612
+ processedSession))))));
466
613
  }
467
614
  static get is() { return "duet-header"; }
468
615
  static get encapsulation() { return "shadow"; }
@@ -683,7 +830,7 @@ export class DuetHeader {
683
830
  "optional": false,
684
831
  "docs": {
685
832
  "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."
833
+ "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
834
  },
688
835
  "attribute": "user",
689
836
  "reflect": false
@@ -718,7 +865,7 @@ export class DuetHeader {
718
865
  "optional": false,
719
866
  "docs": {
720
867
  "tags": [],
721
- "text": "The href of the current page item that is shown as \u201Cactive\u201D."
868
+ "text": "The href of the current page item that is shown as \u201Cactive\u201D.\nNote: not available in multilevel headers."
722
869
  },
723
870
  "attribute": "current-href",
724
871
  "reflect": false,
@@ -754,7 +901,7 @@ export class DuetHeader {
754
901
  "optional": false,
755
902
  "docs": {
756
903
  "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."
904
+ "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
905
  },
759
906
  "attribute": "items",
760
907
  "reflect": false
@@ -771,7 +918,7 @@ export class DuetHeader {
771
918
  "optional": false,
772
919
  "docs": {
773
920
  "tags": [],
774
- "text": "Region that is shown next to the logo. If empty, region will be hidden."
921
+ "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in desktop multilevel header."
775
922
  },
776
923
  "attribute": "region",
777
924
  "reflect": false,
@@ -789,11 +936,28 @@ export class DuetHeader {
789
936
  "optional": false,
790
937
  "docs": {
791
938
  "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."
939
+ "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
940
  },
794
941
  "attribute": "session",
795
942
  "reflect": false
796
943
  },
944
+ "search": {
945
+ "type": "any",
946
+ "mutable": false,
947
+ "complexType": {
948
+ "original": "any",
949
+ "resolved": "any",
950
+ "references": {}
951
+ },
952
+ "required": false,
953
+ "optional": false,
954
+ "docs": {
955
+ "tags": [],
956
+ "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."
957
+ },
958
+ "attribute": "search",
959
+ "reflect": false
960
+ },
797
961
  "back": {
798
962
  "type": "any",
799
963
  "mutable": false,
@@ -823,7 +987,7 @@ export class DuetHeader {
823
987
  "optional": false,
824
988
  "docs": {
825
989
  "tags": [],
826
- "text": "Label of the contact menu. If empty, contact menu will be hidden."
990
+ "text": "Label of the contact menu. If empty, contact menu will be hidden.\nNote: not available in multilevel headers."
827
991
  },
828
992
  "attribute": "contact",
829
993
  "reflect": false,
@@ -868,12 +1032,17 @@ export class DuetHeader {
868
1032
  "isContactOpen": {},
869
1033
  "isLanguageOpen": {},
870
1034
  "isSlideOutOpen": {},
1035
+ "isSegmentOpen": {},
1036
+ "openMenu": {},
1037
+ "closedActives": {},
871
1038
  "processedItems": {},
872
1039
  "processedLanguageItems": {},
873
1040
  "processedContactItems": {},
874
1041
  "processedSession": {},
1042
+ "processedSearch": {},
875
1043
  "processedUser": {},
876
- "processedBack": {}
1044
+ "processedBack": {},
1045
+ "renderDesktopNav": {}
877
1046
  }; }
878
1047
  static get events() { return [{
879
1048
  "method": "duetChange",
@@ -916,6 +1085,25 @@ export class DuetHeader {
916
1085
  }
917
1086
  }
918
1087
  }
1088
+ }, {
1089
+ "method": "duetSearchClick",
1090
+ "name": "duetSearchClick",
1091
+ "bubbles": true,
1092
+ "cancelable": true,
1093
+ "composed": true,
1094
+ "docs": {
1095
+ "tags": [],
1096
+ "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**."
1097
+ },
1098
+ "complexType": {
1099
+ "original": "DuetHeaderChangeEvent",
1100
+ "resolved": "{ originalEvent: Event; data: DuetHeaderItem | DuetHeaderLanguageItem | DuetHeaderSession; component: \"duet-header\"; }",
1101
+ "references": {
1102
+ "DuetHeaderChangeEvent": {
1103
+ "location": "local"
1104
+ }
1105
+ }
1106
+ }
919
1107
  }, {
920
1108
  "method": "duetUserClick",
921
1109
  "name": "duetUserClick",