@duetds/components 5.4.0 → 6.0.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 (264) hide show
  1. package/hydrate/index.js +113 -92
  2. package/lib/cjs/duet-action-button.cjs.entry.js +2 -2
  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-breadcrumb.cjs.entry.js +1 -1
  6. package/lib/cjs/duet-breadcrumbs.cjs.entry.js +1 -1
  7. package/lib/cjs/duet-button_2.cjs.entry.js +1 -1
  8. package/lib/cjs/duet-caption_4.cjs.entry.js +4 -3
  9. package/lib/cjs/duet-card.cjs.entry.js +1 -1
  10. package/lib/cjs/duet-checkbox.cjs.entry.js +1 -1
  11. package/lib/cjs/duet-choice_2.cjs.entry.js +2 -2
  12. package/lib/cjs/duet-collapsible.cjs.entry.js +1 -1
  13. package/lib/cjs/duet-combobox.cjs.entry.js +2 -2
  14. package/lib/cjs/duet-cookie-consent.cjs.entry.js +1 -1
  15. package/lib/cjs/duet-date-picker.cjs.entry.js +2 -2
  16. package/lib/cjs/duet-divider_2.cjs.entry.js +1 -1
  17. package/lib/cjs/duet-editable-table_3.cjs.entry.js +18 -13
  18. package/lib/cjs/duet-empty-state.cjs.entry.js +1 -1
  19. package/lib/cjs/duet-fieldset.cjs.entry.js +1 -1
  20. package/lib/cjs/duet-footer.cjs.entry.js +10 -2
  21. package/lib/cjs/duet-grid_2.cjs.entry.js +1 -1
  22. package/lib/cjs/duet-header_2.cjs.entry.js +61 -51
  23. package/lib/cjs/duet-hero.cjs.entry.js +5 -3
  24. package/lib/cjs/duet-icon.cjs.entry.js +1 -1
  25. package/lib/cjs/duet-input_2.cjs.entry.js +1 -1
  26. package/lib/cjs/duet-layout.cjs.entry.js +1 -1
  27. package/lib/cjs/duet-list_2.cjs.entry.js +1 -1
  28. package/lib/cjs/duet-modal.cjs.entry.js +2 -2
  29. package/lib/cjs/duet-notification_2.cjs.entry.js +1 -1
  30. package/lib/cjs/duet-number-input.cjs.entry.js +1 -1
  31. package/lib/cjs/duet-pagination_2.cjs.entry.js +2 -2
  32. package/lib/cjs/duet-progress.cjs.entry.js +1 -1
  33. package/lib/cjs/duet-radio_2.cjs.entry.js +1 -1
  34. package/lib/cjs/duet-range-slider.cjs.entry.js +1 -1
  35. package/lib/cjs/duet-scrollable_3.cjs.entry.js +1 -1
  36. package/lib/cjs/duet-select.cjs.entry.js +1 -1
  37. package/lib/cjs/duet-step_2.cjs.entry.js +1 -1
  38. package/lib/cjs/duet-textarea.cjs.entry.js +1 -1
  39. package/lib/cjs/duet-toggle.cjs.entry.js +1 -1
  40. package/lib/cjs/duet-tooltip.cjs.entry.js +1 -1
  41. package/lib/cjs/duet-tray.cjs.entry.js +1 -1
  42. package/lib/cjs/duet-upload-aria-status.cjs.entry.js +1 -1
  43. package/lib/cjs/duet-visually-hidden.cjs.entry.js +1 -1
  44. package/lib/cjs/duet.cjs.js +1 -1
  45. package/lib/cjs/{focus-utils-7c1832b2.js → focus-utils-fed98b6a.js} +1 -1
  46. package/lib/cjs/{index-63f324e3.js → index-b5a163e2.js} +8 -1
  47. package/lib/cjs/{js-utils-be1d29ae.js → js-utils-134e0318.js} +11 -0
  48. package/lib/cjs/loader.cjs.js +1 -1
  49. package/lib/collection/components/duet-choice-group/duet-choice-group.js +7 -1
  50. package/lib/collection/components/duet-footer/duet-footer.js +28 -2
  51. package/lib/collection/components/duet-header/duet-header-icon.js +1 -1
  52. package/lib/collection/components/duet-header/duet-header.css +69 -43
  53. package/lib/collection/components/duet-header/duet-header.js +145 -116
  54. package/lib/collection/components/duet-heading/duet-heading.css +4 -0
  55. package/lib/collection/components/duet-heading/duet-heading.js +4 -3
  56. package/lib/collection/components/duet-hero/duet-hero.js +16 -6
  57. package/lib/collection/components/duet-upload/duet-upload.js +11 -11
  58. package/lib/collection/components/duet-upload/upload-validators.js +6 -1
  59. package/lib/collection/utils/js-utils.js +11 -0
  60. package/lib/custom-elements-bundle/index.js +110 -67
  61. package/lib/duet/duet.esm.js +1 -1
  62. package/lib/duet/duet.js +1 -1
  63. package/lib/duet/{p-f63f1511.entry.js → p-043ca8c2.entry.js} +1 -1
  64. package/lib/duet/{p-6aece7e2.entry.js → p-092249a4.entry.js} +1 -1
  65. package/lib/duet/{p-30153133.system.entry.js → p-09c538d2.system.entry.js} +1 -1
  66. package/lib/duet/{p-dbb4a588.js → p-0b3f675e.js} +0 -0
  67. package/lib/duet/{p-ec96f020.system.entry.js → p-0d51a865.system.entry.js} +1 -1
  68. package/lib/duet/{p-3bdc0b4e.entry.js → p-106412f9.entry.js} +1 -1
  69. package/lib/duet/{p-0b3f7f25.entry.js → p-106d0e6c.entry.js} +1 -1
  70. package/lib/duet/{p-0f6e4db9.system.js → p-109762c2.system.js} +1 -1
  71. package/lib/duet/{p-426854f8.system.entry.js → p-17abdfb4.system.entry.js} +2 -2
  72. package/lib/duet/{p-ea4e6d02.system.entry.js → p-1922b678.system.entry.js} +1 -1
  73. package/lib/duet/{p-da9aa2cc.system.entry.js → p-195a7974.system.entry.js} +1 -1
  74. package/lib/duet/{p-da62b929.system.entry.js → p-1a14638c.system.entry.js} +1 -1
  75. package/lib/duet/{p-c2fe4072.system.entry.js → p-1d5bd920.system.entry.js} +1 -1
  76. package/lib/duet/{p-a93fca8b.entry.js → p-1d795d20.entry.js} +1 -1
  77. package/lib/duet/{p-87738b6e.entry.js → p-21bb7a14.entry.js} +1 -1
  78. package/lib/duet/{p-671453a4.entry.js → p-233768f0.entry.js} +1 -1
  79. package/lib/duet/{p-f3e72c0f.system.entry.js → p-23c58827.system.entry.js} +1 -1
  80. package/lib/duet/{p-d243054f.entry.js → p-256578d4.entry.js} +1 -1
  81. package/lib/duet/{p-e15ae3b1.system.entry.js → p-2a124811.system.entry.js} +1 -1
  82. package/lib/duet/{p-ec34f321.system.entry.js → p-2f25b72e.system.entry.js} +1 -1
  83. package/lib/duet/{p-92639d0b.system.js → p-34ea0849.system.js} +0 -0
  84. package/lib/duet/{p-0416a99f.entry.js → p-3573ed90.entry.js} +1 -1
  85. package/lib/duet/{p-b34d417d.system.entry.js → p-3a02d67d.system.entry.js} +1 -1
  86. package/lib/duet/{p-7ad2c618.system.entry.js → p-3a143c07.system.entry.js} +1 -1
  87. package/lib/duet/{p-c83e1e74.entry.js → p-3e354012.entry.js} +1 -1
  88. package/lib/duet/{p-ce8ddf05.entry.js → p-421888a7.entry.js} +1 -1
  89. package/lib/duet/{p-19cac237.system.entry.js → p-43db1cad.system.entry.js} +1 -1
  90. package/lib/duet/{p-768141d2.system.entry.js → p-4978446c.system.entry.js} +2 -2
  91. package/lib/duet/{p-a903df4e.entry.js → p-49e26895.entry.js} +1 -1
  92. package/lib/duet/{p-da59200a.system.entry.js → p-4c0fbc6b.system.entry.js} +1 -1
  93. package/lib/duet/{p-4b50c47b.entry.js → p-504eb2f5.entry.js} +1 -1
  94. package/lib/duet/{p-bdbb5c7d.system.entry.js → p-50e695ce.system.entry.js} +1 -1
  95. package/lib/duet/p-53ebaffb.js +4 -0
  96. package/lib/duet/{p-86575e21.entry.js → p-597286df.entry.js} +1 -1
  97. package/lib/duet/{p-f86937f0.system.js → p-5a8745fb.system.js} +3 -3
  98. package/lib/duet/{p-cd8b61fd.entry.js → p-5cff11a9.entry.js} +1 -1
  99. package/lib/duet/{p-5fea867d.entry.js → p-5eb3e636.entry.js} +1 -1
  100. package/lib/duet/p-63d2755a.entry.js +4 -0
  101. package/lib/duet/{p-909b6b44.system.entry.js → p-70fe3594.system.entry.js} +1 -1
  102. package/lib/duet/{p-347a4bb8.system.entry.js → p-778cd181.system.entry.js} +1 -1
  103. package/lib/duet/{p-efcc198f.system.entry.js → p-79598c60.system.entry.js} +1 -1
  104. package/lib/duet/p-7a6bb638.entry.js +4 -0
  105. package/lib/duet/{p-128ee483.system.entry.js → p-7b84c937.system.entry.js} +1 -1
  106. package/lib/duet/{p-8fb5f933.entry.js → p-7ca14550.entry.js} +1 -1
  107. package/lib/duet/{p-cbd51090.system.entry.js → p-7da9836a.system.entry.js} +1 -1
  108. package/lib/duet/{p-1dec0f2c.entry.js → p-875bd47c.entry.js} +1 -1
  109. package/lib/duet/{p-723b036a.system.entry.js → p-875c8319.system.entry.js} +1 -1
  110. package/lib/duet/{p-0f69bf5d.entry.js → p-88e55b15.entry.js} +1 -1
  111. package/lib/duet/{p-0d8f88c8.entry.js → p-8a5ff071.entry.js} +1 -1
  112. package/lib/duet/{p-7df06bf2.entry.js → p-8be00ca5.entry.js} +1 -1
  113. package/lib/duet/p-8f397d81.entry.js +4 -0
  114. package/lib/duet/{p-2522f85c.system.entry.js → p-9195b70c.system.entry.js} +1 -1
  115. package/lib/duet/p-93fba18a.system.entry.js +4 -0
  116. package/lib/duet/{p-767767ad.system.entry.js → p-94760006.system.entry.js} +1 -1
  117. package/lib/duet/{p-a2b29846.entry.js → p-9589ebe4.entry.js} +1 -1
  118. package/lib/duet/{p-ed9cc88f.entry.js → p-975e2007.entry.js} +1 -1
  119. package/lib/duet/{p-967eb38f.system.entry.js → p-97f307cd.system.entry.js} +1 -1
  120. package/lib/duet/{p-3b06dacd.entry.js → p-993a34d1.entry.js} +1 -1
  121. package/lib/duet/{p-909a229b.system.entry.js → p-9a9b4340.system.entry.js} +1 -1
  122. package/lib/duet/{p-67cbfa71.system.js → p-a20a9164.system.js} +1 -1
  123. package/lib/duet/{p-e2628b7c.system.entry.js → p-a399d48f.system.entry.js} +1 -1
  124. package/lib/duet/{p-6944e2d1.system.entry.js → p-a5e6dfcb.system.entry.js} +1 -1
  125. package/lib/duet/{p-f2aeef65.entry.js → p-a61cf42c.entry.js} +1 -1
  126. package/lib/duet/{p-c90ab5d7.entry.js → p-ad876c3d.entry.js} +1 -1
  127. package/lib/duet/{p-23a1875c.entry.js → p-ade00e73.entry.js} +1 -1
  128. package/lib/duet/{p-568fe563.system.entry.js → p-b13d93c1.system.entry.js} +1 -1
  129. package/lib/duet/{p-77b7fbcd.entry.js → p-b3a0c0f1.entry.js} +1 -1
  130. package/lib/duet/{p-14acc501.entry.js → p-b98f485a.entry.js} +1 -1
  131. package/lib/duet/{p-6f073ee3.system.entry.js → p-c570ce3f.system.entry.js} +2 -2
  132. package/lib/duet/{p-5d5c0181.system.entry.js → p-c7fbbd1f.system.entry.js} +1 -1
  133. package/lib/duet/{p-b263653d.system.entry.js → p-c8eb26ba.system.entry.js} +1 -1
  134. package/lib/duet/p-c8fedd4c.entry.js +4 -0
  135. package/lib/duet/{p-b5fc4eee.entry.js → p-cb471360.entry.js} +1 -1
  136. package/lib/duet/{p-c9453dc6.system.entry.js → p-cb9d3224.system.entry.js} +1 -1
  137. package/lib/duet/p-cbddc309.entry.js +4 -0
  138. package/lib/duet/{p-86ed3c73.system.entry.js → p-cc5f2e90.system.entry.js} +1 -1
  139. package/lib/duet/{p-62352bbe.system.entry.js → p-cd3a4678.system.entry.js} +1 -1
  140. package/lib/duet/{p-03957a48.js → p-cddb4ef2.js} +2 -2
  141. package/lib/duet/p-ce47e5bc.entry.js +4 -0
  142. package/lib/duet/{p-bf0efbe9.system.entry.js → p-cec7594d.system.entry.js} +1 -1
  143. package/lib/duet/{p-46f6dea4.system.entry.js → p-d67546f5.system.entry.js} +1 -1
  144. package/lib/duet/{p-355fd4fc.system.entry.js → p-d6fe977f.system.entry.js} +1 -1
  145. package/lib/duet/{p-fd7f32f7.entry.js → p-d856ba7e.entry.js} +1 -1
  146. package/lib/duet/{p-c993f95a.entry.js → p-dd922800.entry.js} +1 -1
  147. package/lib/duet/{p-c5bd7c30.entry.js → p-dfbcbdd7.entry.js} +1 -1
  148. package/lib/duet/{p-70886ae8.system.entry.js → p-e3ab2e26.system.entry.js} +1 -1
  149. package/lib/duet/{p-b2680be5.entry.js → p-e8fcf8bf.entry.js} +1 -1
  150. package/lib/duet/{p-cb64979e.system.entry.js → p-ee412ace.system.entry.js} +1 -1
  151. package/lib/duet/{p-538ca1e8.system.entry.js → p-efa828e5.system.entry.js} +1 -1
  152. package/lib/duet/{p-e74db103.entry.js → p-efd9868c.entry.js} +1 -1
  153. package/lib/duet/{p-8d175e68.entry.js → p-f8ae0ada.entry.js} +1 -1
  154. package/lib/esm/duet-action-button.entry.js +2 -2
  155. package/lib/esm/duet-alert.entry.js +1 -1
  156. package/lib/esm/duet-badge.entry.js +1 -1
  157. package/lib/esm/duet-breadcrumb.entry.js +1 -1
  158. package/lib/esm/duet-breadcrumbs.entry.js +1 -1
  159. package/lib/esm/duet-button_2.entry.js +1 -1
  160. package/lib/esm/duet-caption_4.entry.js +4 -3
  161. package/lib/esm/duet-card.entry.js +1 -1
  162. package/lib/esm/duet-checkbox.entry.js +1 -1
  163. package/lib/esm/duet-choice_2.entry.js +2 -2
  164. package/lib/esm/duet-collapsible.entry.js +1 -1
  165. package/lib/esm/duet-combobox.entry.js +2 -2
  166. package/lib/esm/duet-cookie-consent.entry.js +1 -1
  167. package/lib/esm/duet-date-picker.entry.js +2 -2
  168. package/lib/esm/duet-divider_2.entry.js +1 -1
  169. package/lib/esm/duet-editable-table_3.entry.js +18 -13
  170. package/lib/esm/duet-empty-state.entry.js +1 -1
  171. package/lib/esm/duet-fieldset.entry.js +1 -1
  172. package/lib/esm/duet-footer.entry.js +10 -2
  173. package/lib/esm/duet-grid_2.entry.js +1 -1
  174. package/lib/esm/duet-header_2.entry.js +61 -51
  175. package/lib/esm/duet-hero.entry.js +5 -3
  176. package/lib/esm/duet-icon.entry.js +1 -1
  177. package/lib/esm/duet-input_2.entry.js +1 -1
  178. package/lib/esm/duet-layout.entry.js +1 -1
  179. package/lib/esm/duet-list_2.entry.js +1 -1
  180. package/lib/esm/duet-modal.entry.js +2 -2
  181. package/lib/esm/duet-notification_2.entry.js +1 -1
  182. package/lib/esm/duet-number-input.entry.js +1 -1
  183. package/lib/esm/duet-pagination_2.entry.js +2 -2
  184. package/lib/esm/duet-progress.entry.js +1 -1
  185. package/lib/esm/duet-radio_2.entry.js +1 -1
  186. package/lib/esm/duet-range-slider.entry.js +1 -1
  187. package/lib/esm/duet-scrollable_3.entry.js +1 -1
  188. package/lib/esm/duet-select.entry.js +1 -1
  189. package/lib/esm/duet-step_2.entry.js +1 -1
  190. package/lib/esm/duet-textarea.entry.js +1 -1
  191. package/lib/esm/duet-toggle.entry.js +1 -1
  192. package/lib/esm/duet-tooltip.entry.js +1 -1
  193. package/lib/esm/duet-tray.entry.js +1 -1
  194. package/lib/esm/duet-upload-aria-status.entry.js +1 -1
  195. package/lib/esm/duet-visually-hidden.entry.js +1 -1
  196. package/lib/esm/duet.js +1 -1
  197. package/lib/esm/{focus-utils-4ca66786.js → focus-utils-4accac91.js} +1 -1
  198. package/lib/esm/{index-d5956898.js → index-3846de98.js} +8 -2
  199. package/lib/esm/{js-utils-52e0944c.js → js-utils-fa98b8cd.js} +11 -0
  200. package/lib/esm/loader.js +1 -1
  201. package/lib/esm-es5/duet-action-button.entry.js +1 -1
  202. package/lib/esm-es5/duet-alert.entry.js +1 -1
  203. package/lib/esm-es5/duet-badge.entry.js +1 -1
  204. package/lib/esm-es5/duet-breadcrumb.entry.js +1 -1
  205. package/lib/esm-es5/duet-breadcrumbs.entry.js +1 -1
  206. package/lib/esm-es5/duet-button_2.entry.js +1 -1
  207. package/lib/esm-es5/duet-caption_4.entry.js +1 -1
  208. package/lib/esm-es5/duet-card.entry.js +1 -1
  209. package/lib/esm-es5/duet-checkbox.entry.js +1 -1
  210. package/lib/esm-es5/duet-choice_2.entry.js +1 -1
  211. package/lib/esm-es5/duet-collapsible.entry.js +1 -1
  212. package/lib/esm-es5/duet-combobox.entry.js +1 -1
  213. package/lib/esm-es5/duet-cookie-consent.entry.js +1 -1
  214. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  215. package/lib/esm-es5/duet-divider_2.entry.js +1 -1
  216. package/lib/esm-es5/duet-editable-table_3.entry.js +1 -1
  217. package/lib/esm-es5/duet-empty-state.entry.js +1 -1
  218. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  219. package/lib/esm-es5/duet-footer.entry.js +1 -1
  220. package/lib/esm-es5/duet-grid_2.entry.js +1 -1
  221. package/lib/esm-es5/duet-header_2.entry.js +2 -2
  222. package/lib/esm-es5/duet-hero.entry.js +1 -1
  223. package/lib/esm-es5/duet-icon.entry.js +1 -1
  224. package/lib/esm-es5/duet-input_2.entry.js +1 -1
  225. package/lib/esm-es5/duet-layout.entry.js +1 -1
  226. package/lib/esm-es5/duet-list_2.entry.js +1 -1
  227. package/lib/esm-es5/duet-modal.entry.js +1 -1
  228. package/lib/esm-es5/duet-notification_2.entry.js +1 -1
  229. package/lib/esm-es5/duet-number-input.entry.js +1 -1
  230. package/lib/esm-es5/duet-pagination_2.entry.js +1 -1
  231. package/lib/esm-es5/duet-progress.entry.js +1 -1
  232. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  233. package/lib/esm-es5/duet-range-slider.entry.js +1 -1
  234. package/lib/esm-es5/duet-scrollable_3.entry.js +1 -1
  235. package/lib/esm-es5/duet-select.entry.js +1 -1
  236. package/lib/esm-es5/duet-step_2.entry.js +1 -1
  237. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  238. package/lib/esm-es5/duet-toggle.entry.js +1 -1
  239. package/lib/esm-es5/duet-tooltip.entry.js +1 -1
  240. package/lib/esm-es5/duet-tray.entry.js +1 -1
  241. package/lib/esm-es5/duet-upload-aria-status.entry.js +1 -1
  242. package/lib/esm-es5/duet-visually-hidden.entry.js +1 -1
  243. package/lib/esm-es5/duet.js +1 -1
  244. package/lib/esm-es5/focus-utils-4accac91.js +4 -0
  245. package/lib/esm-es5/{index-d5956898.js → index-3846de98.js} +3 -3
  246. package/lib/esm-es5/{js-utils-52e0944c.js → js-utils-fa98b8cd.js} +0 -0
  247. package/lib/esm-es5/loader.js +1 -1
  248. package/lib/types/components/duet-footer/duet-footer.d.ts +11 -0
  249. package/lib/types/components/duet-header/duet-header-icon.d.ts +1 -0
  250. package/lib/types/components/duet-header/duet-header.d.ts +13 -2
  251. package/lib/types/components/duet-heading/duet-heading.d.ts +2 -2
  252. package/lib/types/components/duet-hero/duet-hero.d.ts +6 -0
  253. package/lib/types/components.d.ts +14 -6
  254. package/lib/types/utils/js-utils.d.ts +11 -0
  255. package/package.json +6 -6
  256. package/lib/duet/p-21d74fec.entry.js +0 -4
  257. package/lib/duet/p-282ee56b.entry.js +0 -4
  258. package/lib/duet/p-40d4bc49.entry.js +0 -4
  259. package/lib/duet/p-413df442.js +0 -4
  260. package/lib/duet/p-56081d74.entry.js +0 -4
  261. package/lib/duet/p-8717227c.entry.js +0 -4
  262. package/lib/duet/p-9062ca61.entry.js +0 -4
  263. package/lib/duet/p-b98bb109.system.entry.js +0 -4
  264. package/lib/esm-es5/focus-utils-4ca66786.js +0 -4
@@ -25,7 +25,7 @@ const createEvent = (ev, data) => ({
25
25
  });
26
26
  /**
27
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.
28
+ * @slot logo-utility - A slot to place elements alongside the logo. This takes precedence over the **region** prop. Note: not available in multilevel header.
29
29
  * @part header - piercing selector for styling the header element.
30
30
  */
31
31
  export class DuetHeader {
@@ -57,7 +57,7 @@ export class DuetHeader {
57
57
  this.processedSearch = null;
58
58
  this.processedUser = null;
59
59
  this.processedBack = null;
60
- this.renderDesktopNav = (_a = this.mql[0]) === null || _a === void 0 ? void 0 : _a.matches;
60
+ this.renderDesktopNav = Build.isServer ? true : (_a = this.mql[0]) === null || _a === void 0 ? void 0 : _a.matches;
61
61
  /**
62
62
  * Theme of the header.
63
63
  */
@@ -173,7 +173,7 @@ export class DuetHeader {
173
173
  this.skipToId = "";
174
174
  /**
175
175
  * Region that is shown next to the logo. If empty, region will be hidden.
176
- * Note: not available in desktop multilevel header.
176
+ * Note: not available in multilevel header.
177
177
  */
178
178
  this.region = "";
179
179
  /**
@@ -330,6 +330,13 @@ export class DuetHeader {
330
330
  }, 300);
331
331
  }
332
332
  };
333
+ this.emitDuetEvent = (ev, data) => {
334
+ this.duetEvent.emit({
335
+ component: "duet-header",
336
+ data,
337
+ originalEvent: ev,
338
+ });
339
+ };
333
340
  }
334
341
  /**
335
342
  * Component lifecycle events.
@@ -418,8 +425,9 @@ export class DuetHeader {
418
425
  * Local methods.
419
426
  */
420
427
  async refresh() {
421
- if (this.renderDesktopNav !== this.mql[0].matches) {
422
- this.renderDesktopNav = this.mql[0].matches;
428
+ var _a, _b;
429
+ if (this.renderDesktopNav !== Build.isServer ? true : (_a = this.mql[0]) === null || _a === void 0 ? void 0 : _a.matches) {
430
+ this.renderDesktopNav = Build.isServer ? true : (_b = this.mql[0]) === null || _b === void 0 ? void 0 : _b.matches;
423
431
  this.openMenu = null;
424
432
  if (this.isSlideOutOpen) {
425
433
  this.toggleMenu(document.createEvent("UIEvents"), "mobile");
@@ -492,10 +500,10 @@ export class DuetHeader {
492
500
  */
493
501
  render() {
494
502
  const { skipLabel, changeLanguage, activeLanguage } = this.accessibleI18nLabels;
495
- const skipToLabel = this.skipToId ? (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)) : null;
496
- const logo = (h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
497
- const largeLogo = (h("duet-logo", { href: this.logoHref, size: "large", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
498
- 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" },
503
+ const skipToLabel = () => this.skipToId ? (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)) : null;
504
+ const logo = () => (h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
505
+ const largeLogo = () => (h("duet-logo", { href: this.logoHref, size: "large", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
506
+ 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" },
499
507
  item.label,
500
508
  Build.isBrowser && item.external && (h(Fragment, null,
501
509
  h("duet-visually-hidden", null,
@@ -503,25 +511,25 @@ export class DuetHeader {
503
511
  this.accessibleLabelExternal),
504
512
  h("span", { class: "duet-header-link-external" },
505
513
  h("duet-icon", { name: "action-new-window-small", size: "xx-small", margin: "none", color: this.theme === "turva" ? "primary-turva" : "primary" }))))))))) : null;
506
- 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;
507
- 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 },
514
+ 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;
515
+ 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 },
508
516
  h(DuetHeaderIcon, { icon: userIcon.svg }),
509
517
  h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
510
- const processedUserWithoutLink = this.processedUser && !this.processedUser.href ? (h("span", { id: this.processedUser.id, class: "duet-header-user duet-header-button duet-header-no-action" },
518
+ const processedUserWithoutLink = () => this.processedUser && !this.processedUser.href ? (h("span", { id: this.processedUser.id, class: "duet-header-user duet-header-button duet-header-no-action" },
511
519
  h(DuetHeaderIcon, { icon: userIcon.svg }),
512
520
  h("span", { class: "duet-header-user-label" }, this.processedUser.label))) : null;
513
- const processedSessionIconSize = this.renderDesktopNav ? "x-small" : "small";
514
- const processedSession = this.processedSession ? (h("a", { href: this.processedSession.href || "#", id: this.processedSession.id, class: "duet-header-logout duet-header-button", onClick: this.handleSessionClick },
515
- h(DuetHeaderIcon, { icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: processedSessionIconSize }),
521
+ const processedSession = () => this.processedSession ? (h("a", { href: this.processedSession.href || "#", id: this.processedSession.id, class: "duet-header-logout duet-header-button", onClick: this.handleSessionClick },
522
+ h(DuetHeaderIcon, { class: "desktop", icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: "x-small" }),
523
+ h(DuetHeaderIcon, { class: "mobile", icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: "small" }),
516
524
  h("span", { class: "duet-header-button-label" }, this.processedSession.label))) : null;
517
- const processedSessionDropdown = this.processedSession && this.processedSession.sessionItems ? (h(DuetHeaderDropdown, { className: "duet-header-session", id: "duet-header-session", label: this.processedSession.label, icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, active: this.isSessionOpen, isOpen: this.isSessionOpen, badge: false, toggleRef: el => (this.sessionItemsButtonEl = el), itemsRef: el => (this.sessionItemsEl = el), onToggle: event => this.toggleMenu(event, "session") }, this.processedSession.sessionItems.map((sessionItem, index) => (h(Fragment, null,
525
+ const processedSessionDropdown = () => this.processedSession && this.processedSession.sessionItems ? (h(DuetHeaderDropdown, { className: "duet-header-session", id: "duet-header-session", label: this.processedSession.label, icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, active: this.isSessionOpen, isOpen: this.isSessionOpen, badge: false, toggleRef: el => (this.sessionItemsButtonEl = el), itemsRef: el => (this.sessionItemsEl = el), onToggle: event => this.toggleMenu(event, "session") }, this.processedSession.sessionItems.map((sessionItem, index) => (h(Fragment, null,
518
526
  sessionItem.label && h("span", { class: "duet-header-session-label" }, sessionItem.label),
519
527
  h("duet-spacer", { size: "small", "aria-hidden": "true" }),
520
528
  sessionItem.items.map(item => (h("a", { role: "menuitem", "aria-label": sessionItem.label ? `${sessionItem.label} ${item.label}` : item.label, id: item.id, href: item.href || "#", onClick: event => this.handleSessionItemClick(event, item), onKeyDown: this.handleArrowKeys }, item.label))),
521
529
  index !== this.processedSession.sessionItems.length - 1 && (h(Fragment, null,
522
530
  h("duet-spacer", { size: "x-small", "aria-hidden": "true" }),
523
531
  h("duet-divider", { margin: "none", "aria-hidden": "true" })))))))) : null;
524
- const processedSearch = this.processedSearch ? (h("a", { href: this.processedSearch.href || "#", id: this.processedSearch.id, class: "duet-header-search duet-header-button", onClick: this.handleSearchClick },
532
+ const processedSearch = () => this.processedSearch ? (h("a", { href: this.processedSearch.href || "#", id: this.processedSearch.id, class: "duet-header-search duet-header-button", onClick: this.handleSearchClick },
525
533
  h(DuetHeaderIcon, { icon: searchIcon.svg }),
526
534
  h("span", { class: "duet-header-button-label" }, this.processedSearch.label))) : null;
527
535
  // Back variation
@@ -535,23 +543,104 @@ export class DuetHeader {
535
543
  "duet-header-inactive": true,
536
544
  }, part: "header" },
537
545
  h("div", { class: "duet-header-top" },
538
- skipToLabel,
546
+ skipToLabel(),
539
547
  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),
540
- logo,
548
+ logo(),
541
549
  h("slot", { name: "logo-utility" }))))));
542
550
  }
543
- // multi level desktop variation
544
551
  const itemsHaveSubItems = this.processedItems && this.processedItems.some(item => item.items && item.items.length > 0);
545
- if (this.renderDesktopNav && itemsHaveSubItems) {
552
+ const isSecondLevelActive = this.processedItems &&
553
+ this.processedItems.some(item => item.items && item.items.some(secondLevelItem => secondLevelItem.active === true));
554
+ const isThirdLevelActive = this.processedItems &&
555
+ this.processedItems.some(item => item.items &&
556
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
557
+ const defaultVariationContent = (h("div", { class: {
558
+ "duet-header-reserved-space": true,
559
+ "duet-with-links": !!this.processedItems,
560
+ "duet-header-second-level-active": isSecondLevelActive,
561
+ "duet-header-third-level-active": isThirdLevelActive,
562
+ "duet-header-items-have-sub-items": itemsHaveSubItems,
563
+ } },
564
+ h("header", { class: {
565
+ "duet-header": true,
566
+ "duet-theme-turva": this.theme === "turva",
567
+ "duet-header-inactive": !this.processedItems,
568
+ }, part: "header" },
569
+ h("div", { class: "duet-header-top" },
570
+ skipToLabel(),
571
+ logo(),
572
+ h("slot", { name: "logo-utility" }, this.region && h("div", { class: "duet-header-region" }, this.region)),
573
+ (this.processedItems ||
574
+ languageDropdown() ||
575
+ contactDropdown() ||
576
+ this.processedSession ||
577
+ this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
578
+ h("duet-visually-hidden", null, this.accessibleLabel),
579
+ h(DuetHeaderHamburger, null)))),
580
+ h("div", { ref: el => (this.navigationEl = el), class: {
581
+ "duet-header-bottom": true,
582
+ active: this.isSlideOutOpen,
583
+ inactive: !this.processedItems,
584
+ } },
585
+ h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
586
+ this.processedItems.map((item, itemIndex) => (h("div", { class: "duet-header-item-container" },
587
+ h("a", { class: {
588
+ "duet-header-first-level": true,
589
+ "duet-header-item": true,
590
+ active: (!itemsHaveSubItems && this.currentHref === item.href) ||
591
+ (item.active === true &&
592
+ !this.openMenu &&
593
+ this.closedActives &&
594
+ this.closedActives.length === 1) ||
595
+ (item.active === true &&
596
+ !this.openMenu &&
597
+ item.items &&
598
+ !item.items.some(s => s.active === true)),
599
+ }, href: item.href || "#", id: item.id || `header-item-${itemIndex}`, onClick: event => this.handleItemClick(event, item), onMouseEnter: event => this.emitDuetEvent(event, item), onTouchStart: event => this.emitDuetEvent(event, item) },
600
+ item.label,
601
+ item.badge && h("div", { class: "duet-header-badge" })),
602
+ item.items &&
603
+ item.items
604
+ .filter(secondLevelitem => secondLevelitem.items && secondLevelitem.items.length > 0)
605
+ .map((secondLevelItem, secondLevelItemIndex) => {
606
+ const id = secondLevelItem.id || `header-item-${itemIndex}-${secondLevelItemIndex}`;
607
+ const active = (!this.openMenu &&
608
+ secondLevelItem.active === true &&
609
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
610
+ this.openMenu === id;
611
+ const activeBar = active && !(secondLevelItem.items && secondLevelItem.items.some(s => s.active === true));
612
+ return (h(DuetHeaderDropdown, { id: id, className: "duet-header-second-level", label: secondLevelItem.label, icon: `${secondLevelItem.icon}.svg`, active: activeBar, isOpen: active, 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) },
613
+ h("div", { class: "duet-header-third-level" }, secondLevelItem.items &&
614
+ secondLevelItem.items.map(thirdLevelItem => (h("a", { class: {
615
+ "duet-header-item": true,
616
+ active: thirdLevelItem.active === true,
617
+ }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, thirdLevelItem), onKeyDown: ev => this.handleArrowKeys(ev), onMouseEnter: event => this.emitDuetEvent(event, thirdLevelItem), onTouchStart: event => this.emitDuetEvent(event, thirdLevelItem), target: thirdLevelItem.external ? "_blank" : "_self" },
618
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
619
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
620
+ h("span", null, thirdLevelItem.label),
621
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" })))))));
622
+ }))))),
623
+ h("div", { class: "duet-header-bottom-utils" },
624
+ h("slot", { name: "utility" })),
625
+ h("div", { class: "duet-header-utils" },
626
+ !itemsHaveSubItems && contactDropdown(),
627
+ languageDropdown(),
628
+ !itemsHaveSubItems && (h(Fragment, null,
629
+ processedUserWithLink(),
630
+ processedUserWithoutLink())),
631
+ processedSearch(),
632
+ processedSession())))));
633
+ // multi level variation
634
+ if (itemsHaveSubItems) {
546
635
  const activeSegment = this.processedItems.find(item => item.active);
547
636
  const isThirdLevelActive = this.processedItems &&
548
637
  this.processedItems.some(item => item.items &&
549
638
  item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
550
639
  const segmentId = "duet-header-segment";
551
- return (h(Host, { class: "duet-header-multi-level-desktop-variation" },
640
+ return (h(Host, { class: "duet-header-multi-level-variation" },
552
641
  h("div", { class: {
553
- "duet-header-multi-level-desktop": true,
554
- "duet-header-multi-level-desktop-third-level-is-open": isThirdLevelActive,
642
+ "duet-header-multi-level": true,
643
+ "duet-header-multi-level-third-level-is-open": isThirdLevelActive,
555
644
  } },
556
645
  h("header", { class: {
557
646
  "duet-header": true,
@@ -559,116 +648,37 @@ export class DuetHeader {
559
648
  "duet-header-inactive": !this.processedItems,
560
649
  }, part: "header" },
561
650
  h("div", { class: "duet-header-top" },
562
- skipToLabel,
651
+ skipToLabel(),
563
652
  h("div", { class: "logo-and-segment" },
564
- h("div", null, largeLogo),
565
- 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" },
653
+ h("div", null, largeLogo()),
654
+ 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), onMouseEnter: event => this.emitDuetEvent(event, item), onTouchStart: event => this.emitDuetEvent(event, item), target: item.external ? "_blank" : "_self" },
566
655
  item.icon && (h("div", { class: "duet-header-icon" },
567
656
  h("duet-icon", { margin: "none", size: "x-small", name: item.icon, color: "currentColor" }))),
568
657
  h("span", null, item.label),
569
658
  item.badge && h("div", { class: "duet-header-badge" }))))))),
570
- h("nav", { class: "duet-header-multi-level-desktop-nav" }, activeSegment.items &&
659
+ h("nav", { class: "duet-header-multi-level-nav" }, activeSegment.items &&
571
660
  activeSegment.items
572
661
  .filter(secondLevelItem => secondLevelItem.items && secondLevelItem.items.length > 0)
573
662
  .map((secondLevelItem, secondLevelItemIndex) => {
574
663
  const id = secondLevelItem.id || `segment-item-${secondLevelItemIndex}`;
575
664
  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 &&
576
- 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" },
665
+ 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), onMouseEnter: event => this.emitDuetEvent(event, thirdLevelItem), onTouchStart: event => this.emitDuetEvent(event, thirdLevelItem), target: thirdLevelItem.external ? "_blank" : "_self" },
577
666
  thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
578
667
  h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
579
668
  h("span", null, thirdLevelItem.label),
580
669
  thirdLevelItem.badge && h("div", { class: "duet-header-badge" }))))));
581
670
  })),
582
- h("div", { class: "duet-header-multi-level-desktop-utils" },
583
- processedSearch,
584
- languageDropdown,
585
- processedSessionDropdown != null ? processedSessionDropdown : processedSession),
586
- h("slot", { name: "utility" }))))));
671
+ h("div", { class: "duet-header-multi-level-utils" },
672
+ processedSearch(),
673
+ languageDropdown(),
674
+ processedSessionDropdown() != null ? processedSessionDropdown() : processedSession()),
675
+ h("slot", { name: "utility" })))),
676
+ defaultVariationContent));
587
677
  }
588
678
  // Default variation
589
- const isSecondLevelActive = this.processedItems &&
590
- this.processedItems.some(item => item.items && item.items.some(secondLevelItem => secondLevelItem.active === true));
591
- const isThirdLevelActive = this.processedItems &&
592
- this.processedItems.some(item => item.items &&
593
- item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
594
679
  return (h(Host, { class: {
595
680
  "duet-header-default-variation": true,
596
- } },
597
- h("div", { class: {
598
- "duet-header-reserved-space": true,
599
- "duet-with-links": !!this.processedItems,
600
- "duet-header-second-level-active": isSecondLevelActive,
601
- "duet-header-third-level-active": isThirdLevelActive,
602
- } },
603
- h("header", { class: {
604
- "duet-header": true,
605
- "duet-theme-turva": this.theme === "turva",
606
- "duet-header-inactive": !this.processedItems,
607
- }, part: "header" },
608
- h("div", { class: "duet-header-top" },
609
- skipToLabel,
610
- logo,
611
- h("slot", { name: "logo-utility" }, this.region && h("div", { class: "duet-header-region" }, this.region)),
612
- (this.processedItems ||
613
- languageDropdown ||
614
- contactDropdown ||
615
- this.processedSession ||
616
- this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
617
- h("duet-visually-hidden", null, this.accessibleLabel),
618
- h(DuetHeaderHamburger, null)))),
619
- h("div", { ref: el => (this.navigationEl = el), class: {
620
- "duet-header-bottom": true,
621
- active: this.isSlideOutOpen,
622
- inactive: !this.processedItems,
623
- } },
624
- h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
625
- this.processedItems.map((item, itemIndex) => (h("div", { class: "duet-header-item-container" },
626
- h("a", { class: {
627
- "duet-header-first-level": true,
628
- "duet-header-item": true,
629
- active: (!itemsHaveSubItems && this.currentHref === item.href) ||
630
- (item.active === true &&
631
- !this.openMenu &&
632
- this.closedActives &&
633
- this.closedActives.length === 1) ||
634
- (item.active === true &&
635
- !this.openMenu &&
636
- item.items &&
637
- !item.items.some(s => s.active === true)),
638
- }, href: item.href || "#", id: item.id || `header-item-${itemIndex}`, onClick: event => this.handleItemClick(event, item) },
639
- item.label,
640
- item.badge && h("div", { class: "duet-header-badge" })),
641
- item.items &&
642
- item.items
643
- .filter(secondLevelitem => secondLevelitem.items && secondLevelitem.items.length > 0)
644
- .map((secondLevelItem, secondLevelItemIndex) => {
645
- const id = secondLevelItem.id || `header-item-${itemIndex}-${secondLevelItemIndex}`;
646
- const active = (!this.openMenu &&
647
- secondLevelItem.active === true &&
648
- !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
649
- this.openMenu === id;
650
- const activeBar = active && !(secondLevelItem.items && secondLevelItem.items.some(s => s.active === true));
651
- return (h(DuetHeaderDropdown, { id: id, className: "duet-header-second-level", label: secondLevelItem.label, icon: `${secondLevelItem.icon}.svg`, active: activeBar, isOpen: active, 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) },
652
- h("div", { class: "duet-header-third-level" }, secondLevelItem.items &&
653
- secondLevelItem.items.map(thirdLevelItem => (h("a", { class: {
654
- "duet-header-item": true,
655
- active: thirdLevelItem.active === true,
656
- }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, thirdLevelItem), onKeyDown: ev => this.handleArrowKeys(ev), target: thirdLevelItem.external ? "_blank" : "_self" },
657
- thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
658
- h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
659
- h("span", null, thirdLevelItem.label),
660
- thirdLevelItem.badge && h("div", { class: "duet-header-badge" })))))));
661
- }))))),
662
- h("div", { class: "duet-header-bottom-utils" },
663
- h("slot", { name: "utility" })),
664
- h("div", { class: "duet-header-utils" },
665
- !itemsHaveSubItems && contactDropdown,
666
- languageDropdown,
667
- !itemsHaveSubItems && (h(Fragment, null,
668
- processedUserWithLink,
669
- processedUserWithoutLink)),
670
- processedSearch,
671
- processedSession))))));
681
+ } }, defaultVariationContent));
672
682
  }
673
683
  static get is() { return "duet-header"; }
674
684
  static get encapsulation() { return "shadow"; }
@@ -977,7 +987,7 @@ export class DuetHeader {
977
987
  "optional": false,
978
988
  "docs": {
979
989
  "tags": [],
980
- "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in desktop multilevel header."
990
+ "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in multilevel header."
981
991
  },
982
992
  "attribute": "region",
983
993
  "reflect": false,
@@ -1335,6 +1345,25 @@ export class DuetHeader {
1335
1345
  }
1336
1346
  }
1337
1347
  }
1348
+ }, {
1349
+ "method": "duetEvent",
1350
+ "name": "duetEvent",
1351
+ "bubbles": true,
1352
+ "cancelable": true,
1353
+ "composed": true,
1354
+ "docs": {
1355
+ "tags": [],
1356
+ "text": "General event stream for the following events:\nitem: onMouseEnter, onTouchDown;\nmenuItem: onMouseEnter, onTouchDown;.\nYou can prevent\nthe default browser functionality by calling **event.detail.originalEvent.preventDefault()**\ninside your listener. Additionally, the passed data is available via\n**event.detail.data**."
1357
+ },
1358
+ "complexType": {
1359
+ "original": "DuetHeaderChangeEvent",
1360
+ "resolved": "{ originalEvent: Event; data: DuetHeaderItem | DuetHeaderLanguageItem | DuetHeaderSession; component: \"duet-header\"; }",
1361
+ "references": {
1362
+ "DuetHeaderChangeEvent": {
1363
+ "location": "local"
1364
+ }
1365
+ }
1366
+ }
1338
1367
  }]; }
1339
1368
  static get methods() { return {
1340
1369
  "closeMenus": {
@@ -237,6 +237,10 @@
237
237
  .duet-heading.h6.duet-heading-border {
238
238
  padding-bottom: 16px;
239
239
  }
240
+ .duet-heading.duet-normal, .duet-heading.duet-theme-turva.duet-normal {
241
+ font-style: normal !important;
242
+ font-weight: 400 !important;
243
+ }
240
244
  .duet-heading.duet-semibold, .duet-heading.duet-theme-turva.duet-semibold {
241
245
  font-style: normal !important;
242
246
  font-weight: 600 !important;
@@ -20,7 +20,7 @@ export class DuetHeading {
20
20
  */
21
21
  this.border = false;
22
22
  /**
23
- * This property allows you to set semibold font weight for all sizes
23
+ * This property allows you to set normal or semibold font weight for all sizes
24
24
  * when needed.
25
25
  */
26
26
  this.weight = "auto";
@@ -55,6 +55,7 @@ export class DuetHeading {
55
55
  "duet-heading": true,
56
56
  "duet-heading-border": this.border !== false,
57
57
  "duet-heading-border-solid": this.border === "solid",
58
+ "duet-normal": this.weight === "normal",
58
59
  "duet-semibold": this.weight === "semibold",
59
60
  "duet-heading-hyphenate": this.hyphenate,
60
61
  "duet-m-0": this.margin === "none",
@@ -163,7 +164,7 @@ export class DuetHeading {
163
164
  "mutable": false,
164
165
  "complexType": {
165
166
  "original": "DuetHeadingWeight",
166
- "resolved": "\"auto\" | \"semibold\"",
167
+ "resolved": "\"auto\" | \"normal\" | \"semibold\"",
167
168
  "references": {
168
169
  "DuetHeadingWeight": {
169
170
  "location": "local"
@@ -174,7 +175,7 @@ export class DuetHeading {
174
175
  "optional": false,
175
176
  "docs": {
176
177
  "tags": [],
177
- "text": "This property allows you to set semibold font weight for all sizes\nwhen needed."
178
+ "text": "This property allows you to set normal or semibold font weight for all sizes\nwhen needed."
178
179
  },
179
180
  "attribute": "weight",
180
181
  "reflect": false,
@@ -8,8 +8,12 @@ import { inheritGlobalTheme } from "../../common/themeable-component";
8
8
  import { getLanguage, getLocaleString } from "../../utils/language-utils";
9
9
  import { parsePossibleJSON } from "../../utils/string-utils";
10
10
  /**
11
+ * @part duet-hero - piercing selector for styling the hero container
12
+ * @part duet-hero-text - piercing selector for styling the hero text container
11
13
  * @slot default - This is an unamed slot for a text or extra button that is placed after any buttons (or list item)
12
14
  * @slot badge - This is a slot for a status badge that sits next to pre-heading inside the hero component.
15
+ * @slot bottom - This is a slot for content under the main hero content.
16
+ * @slot heading - This is a slot for heading content inside the hero component.
13
17
  */
14
18
  export class DuetHero {
15
19
  constructor() {
@@ -25,6 +29,7 @@ export class DuetHero {
25
29
  */
26
30
  this.theme = "";
27
31
  /**
32
+ * @deprecated please use heading slot instead.
28
33
  * The heading of the hero area, rendered in an H1 tag. P.S. you can control
29
34
  * the level of the HTML heading by using “level” prop. If empty, heading
30
35
  * will be hidden.
@@ -132,6 +137,7 @@ export class DuetHero {
132
137
  */
133
138
  componentWillLoad() {
134
139
  inheritGlobalTheme(this);
140
+ this.hasHeadingSlot = !!this.element.querySelector('[slot="heading"]');
135
141
  this.refresh();
136
142
  }
137
143
  /**
@@ -196,7 +202,7 @@ export class DuetHero {
196
202
  "duet-hero-gray-with-back": !!this.processedBack,
197
203
  "duet-hero-text-center": this.textCenter && !this.leftAlign,
198
204
  "duet-hero-left-align": this.leftAlign,
199
- } },
205
+ }, part: "duet-hero" },
200
206
  h("div", { class: "duet-hero-wrapper" },
201
207
  this.image && this.variation === "image" && (h("div", { class: "duet-hero-image-mask" },
202
208
  h("div", { class: "duet-hero-image-wrapper" },
@@ -210,10 +216,10 @@ export class DuetHero {
210
216
  analyticsId: this.processedBack.analyticsId,
211
217
  }) }, this.processedBack.label))),
212
218
  (this.variation === "gray" || this.variation === "minimal") && this.categoryIcon && (h("duet-icon", { class: { "duet-hero-icon": true, "duet-hero-icon-has-heading": this.preHeading !== "" }, size: "x-large", background: this.categoryIconColor, name: this.categoryIcon })),
213
- h("div", { class: "duet-hero-text" },
219
+ h("div", { class: "duet-hero-text", part: "duet-hero-text" },
214
220
  this.preHeading && (h("duet-paragraph", { margin: "none", class: "duet-hero-pre" }, this.preHeading)),
215
221
  h("slot", { name: "badge" }),
216
- h("duet-heading", { theme: this.theme, level: this.level, class: { "duet-hero-heading": true, "duet-hero-heading-has-pre": this.preHeading !== "" }, color: this.variation === "default" ? "gray-lightest" : "", visualLevel: this.variation === "gray" || this.variation === "minimal" ? "h2" : "h1" }, this.heading),
222
+ (this.heading || this.hasHeadingSlot) && (h("duet-heading", { theme: this.theme, level: this.level, class: { "duet-hero-heading": true, "duet-hero-heading-has-pre": this.preHeading !== "" }, color: this.variation === "default" ? "gray-lightest" : "", visualLevel: this.variation === "gray" || this.variation === "minimal" ? "h2" : "h1" }, this.heading ? this.heading : h("slot", { name: "heading" }))),
217
223
  this.description && (h("duet-paragraph", { theme: this.theme, color: textColor, variation: "intro" }, this.description)),
218
224
  (this.variation === "gray" || this.variation === "minimal") && this.processedListItems && (h("duet-list", { theme: this.theme, "label-width": "30", breakpoint: "large", mobile: this.leftAlign ? undefined : "center" }, this.processedListItems.map(item => (h("duet-list-item", null,
219
225
  h("span", { slot: "label" }, item.label),
@@ -230,7 +236,8 @@ export class DuetHero {
230
236
  this.accessibleLabelExternal),
231
237
  item.external && (h("div", { class: "duet-hero-action-arrow" },
232
238
  h("duet-icon", { icon: newWindowIcon.svg, size: "xx-small", margin: "none", color: "currentColor" })))))))),
233
- this.image && this.variation !== "image" && h("div", { class: "duet-hero-image", style: styles }))));
239
+ this.image && this.variation !== "image" && h("div", { class: "duet-hero-image", style: styles }),
240
+ h("slot", { name: "bottom" }))));
234
241
  }
235
242
  static get is() { return "duet-hero"; }
236
243
  static get encapsulation() { return "shadow"; }
@@ -275,8 +282,11 @@ export class DuetHero {
275
282
  "required": false,
276
283
  "optional": false,
277
284
  "docs": {
278
- "tags": [],
279
- "text": "The heading of the hero area, rendered in an H1 tag. P.S. you can control\nthe level of the HTML heading by using \u201Clevel\u201D prop. If empty, heading\nwill be hidden."
285
+ "tags": [{
286
+ "name": "deprecated",
287
+ "text": "please use heading slot instead.\nThe heading of the hero area, rendered in an H1 tag. P.S. you can control\nthe level of the HTML heading by using \u201Clevel\u201D prop. If empty, heading\nwill be hidden."
288
+ }],
289
+ "text": ""
280
290
  },
281
291
  "attribute": "heading",
282
292
  "reflect": false,
@@ -323,14 +323,6 @@ export class DuetUpload {
323
323
  * @example [{ id: "success", label: {fi: "Onnistunut", en: "Success", sv: "Alt klart", }}]
324
324
  */
325
325
  this.groups = [
326
- {
327
- id: this.DefaultGroups.inprogress,
328
- label: {
329
- fi: "Kesken olevat tiedostot",
330
- sv: "Filer inprogress",
331
- en: "Files inprogress",
332
- },
333
- },
334
326
  {
335
327
  id: this.DefaultGroups.pending,
336
328
  label: {
@@ -355,6 +347,14 @@ export class DuetUpload {
355
347
  en: "Files with errors",
356
348
  },
357
349
  },
350
+ {
351
+ id: this.DefaultGroups.inprogress,
352
+ label: {
353
+ fi: "Kesken olevat tiedostot",
354
+ sv: "Filer inprogress",
355
+ en: "Files inprogress",
356
+ },
357
+ },
358
358
  ];
359
359
  this.kick = debounce(() => {
360
360
  this.tick = Date.now();
@@ -736,17 +736,17 @@ export class DuetUpload {
736
736
  }
737
737
  });
738
738
  return {
739
- inprogress,
740
739
  pending,
741
740
  failure,
742
741
  success,
742
+ inprogress,
743
743
  };
744
744
  };
745
745
  this.getColumns = (group) => {
746
746
  return [
747
747
  {
748
748
  sort_order: 1,
749
- direction: 1,
749
+ direction: -1,
750
750
  index: 0,
751
751
  key: group.id,
752
752
  label: group.label,
@@ -1894,7 +1894,7 @@ export class DuetUpload {
1894
1894
  }],
1895
1895
  "text": "Array of group names that you want the editable table to use to display files"
1896
1896
  },
1897
- "defaultValue": "[\n {\n id: this.DefaultGroups.inprogress,\n label: {\n fi: \"Kesken olevat tiedostot\",\n sv: \"Filer inprogress\",\n en: \"Files inprogress\",\n },\n },\n {\n id: this.DefaultGroups.pending,\n label: {\n en: \"Files to upload\",\n sv: \"Filer att ladda\",\n fi: \"Ladattavat tiedostot\",\n },\n },\n {\n id: this.DefaultGroups.success,\n label: {\n fi: \"Valmiit tiedostot\",\n sv: \"Files success\",\n en: \"Files success\",\n },\n },\n {\n id: this.DefaultGroups.failure,\n label: {\n fi: \"Tiedostot, joissa on virheit\u00E4\",\n sv: \"Filer med fel\",\n en: \"Files with errors\",\n },\n },\n ]"
1897
+ "defaultValue": "[\n {\n id: this.DefaultGroups.pending,\n label: {\n en: \"Files to upload\",\n sv: \"Filer att ladda\",\n fi: \"Ladattavat tiedostot\",\n },\n },\n {\n id: this.DefaultGroups.success,\n label: {\n fi: \"Valmiit tiedostot\",\n sv: \"Files success\",\n en: \"Files success\",\n },\n },\n {\n id: this.DefaultGroups.failure,\n label: {\n fi: \"Tiedostot, joissa on virheit\u00E4\",\n sv: \"Filer med fel\",\n en: \"Files with errors\",\n },\n },\n {\n id: this.DefaultGroups.inprogress,\n label: {\n fi: \"Kesken olevat tiedostot\",\n sv: \"Filer inprogress\",\n en: \"Files inprogress\",\n },\n },\n ]"
1898
1898
  }
1899
1899
  }; }
1900
1900
  static get states() { return {
@@ -40,7 +40,12 @@ export const validateFile = (item, validators, errorCodes) => {
40
40
  if (item) {
41
41
  const { name, type, size } = item;
42
42
  const mime = validateFileMime(type, allowedMimetypes);
43
- const ext = validateFileExtension(name.toLowerCase(), allowedExtensions);
43
+ const ext = allowedExtensions === "all" ||
44
+ allowedExtensions === "" ||
45
+ allowedExtensions === " " ||
46
+ allowedExtensions === undefined
47
+ ? true
48
+ : validateFileExtension(name.toLowerCase(), allowedExtensions);
44
49
  const bytes = validateFileSize(size, maxBytes);
45
50
  if (!mime) {
46
51
  errorMessage = getError("duet-upload-101", errorCodes);
@@ -10,6 +10,17 @@ export const debounce = (func, timeout = 250) => {
10
10
  }, timeout);
11
11
  };
12
12
  };
13
+ /**
14
+ * The fieldSorter function is a helper function that takes an array of objects and returns
15
+ * a function that can be used to sort those objects. The returned sorting function takes two
16
+ * parameters, which are compared using the field values in the object. If one object's field value is greater than another's, then 1 is returned; if they're equal, 0 is returned; and if one object's field value is less than another's, - 1 will be returned. This allows for easy sorting by multiple fields in any order desired (e.g., first by name ascending and then by age descending).
17
+ *
18
+ *
19
+ * @param fields Sort the table
20
+ *
21
+ * @return A function that takes two objects and returns an integer
22
+ *
23
+ */
13
24
  export function fieldSorter(fields) {
14
25
  return function (a, b) {
15
26
  return fields