@duetds/components 5.3.5 → 5.4.2

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 (279) hide show
  1. package/hydrate/index.js +134 -96
  2. package/lib/cjs/duet-action-button.cjs.entry.js +25 -7
  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 +2 -2
  8. package/lib/cjs/duet-caption_4.cjs.entry.js +2 -2
  9. package/lib/cjs/duet-card.cjs.entry.js +2 -2
  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 +2 -2
  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 +1 -1
  21. package/lib/cjs/duet-grid_2.cjs.entry.js +1 -1
  22. package/lib/cjs/duet-header_2.cjs.entry.js +51 -49
  23. package/lib/cjs/duet-hero.cjs.entry.js +4 -3
  24. package/lib/cjs/duet-icon.cjs.entry.js +2 -2
  25. package/lib/cjs/duet-input_2.cjs.entry.js +21 -4
  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 +2 -2
  45. package/lib/cjs/{focus-utils-84c29960.js → focus-utils-9226aef7.js} +1 -1
  46. package/lib/cjs/{index-772cc42f.js → index-60a8ec8a.js} +8 -1
  47. package/lib/cjs/{js-utils-be1d29ae.js → js-utils-134e0318.js} +11 -0
  48. package/lib/cjs/loader.cjs.js +2 -2
  49. package/lib/cjs/{token-utils-50a1f7e2.js → token-utils-fef5b4eb.js} +1 -0
  50. package/lib/collection/components/duet-action-button/duet-action-button.js +44 -8
  51. package/lib/collection/components/duet-choice-group/duet-choice-group.js +7 -1
  52. package/lib/collection/components/duet-collapsible/duet-collapsible.js +1 -1
  53. package/lib/collection/components/duet-header/duet-header-icon.js +1 -1
  54. package/lib/collection/components/duet-header/duet-header.css +69 -43
  55. package/lib/collection/components/duet-header/duet-header.js +117 -114
  56. package/lib/collection/components/duet-hero/duet-hero.js +13 -5
  57. package/lib/collection/components/duet-input/duet-input.js +21 -3
  58. package/lib/collection/components/duet-upload/duet-upload.js +12 -12
  59. package/lib/collection/components/duet-upload/upload-validators.js +6 -1
  60. package/lib/collection/utils/js-utils.js +11 -0
  61. package/lib/collection/utils/token-utils.js +1 -1
  62. package/lib/custom-elements-bundle/index.js +132 -73
  63. package/lib/duet/duet.esm.js +1 -1
  64. package/lib/duet/duet.js +1 -1
  65. package/lib/duet/p-07a2ad03.entry.js +4 -0
  66. package/lib/duet/{p-dbb4a588.js → p-0b3f675e.js} +0 -0
  67. package/lib/duet/{p-0b426a83.system.entry.js → p-0dbd00e1.system.entry.js} +1 -1
  68. package/lib/duet/p-12606a4b.entry.js +4 -0
  69. package/lib/duet/p-21321528.system.entry.js +4 -0
  70. package/lib/duet/{p-8f74030a.entry.js → p-28f87990.entry.js} +1 -1
  71. package/lib/duet/{p-4e8f57dd.entry.js → p-2ac07ac9.entry.js} +1 -1
  72. package/lib/duet/{p-05ff2672.entry.js → p-2b155bd9.entry.js} +1 -1
  73. package/lib/duet/{p-acaedb00.system.js → p-309e3417.system.js} +3 -3
  74. package/lib/duet/p-30fc343d.system.entry.js +4 -0
  75. package/lib/duet/{p-12b8cb2f.system.entry.js → p-322676e3.system.entry.js} +1 -1
  76. package/lib/duet/{p-c0d98307.system.entry.js → p-33a0c070.system.entry.js} +1 -1
  77. package/lib/duet/{p-92639d0b.system.js → p-34ea0849.system.js} +0 -0
  78. package/lib/duet/{p-7dfe1c16.entry.js → p-440e2c47.entry.js} +1 -1
  79. package/lib/duet/{p-e6fdaa31.entry.js → p-451adbf4.entry.js} +1 -1
  80. package/lib/duet/{p-3f50d9bd.system.entry.js → p-46b83696.system.entry.js} +1 -1
  81. package/lib/duet/{p-cdba4c82.entry.js → p-46d9a853.entry.js} +1 -1
  82. package/lib/duet/{p-4260e8b5.system.entry.js → p-48a036c1.system.entry.js} +1 -1
  83. package/lib/duet/{p-8a472df4.system.entry.js → p-4dd79e38.system.entry.js} +1 -1
  84. package/lib/duet/{p-9071d4e1.system.entry.js → p-526e6d8e.system.entry.js} +1 -1
  85. package/lib/duet/{p-e00170a2.system.entry.js → p-56a80c32.system.entry.js} +1 -1
  86. package/lib/duet/{p-dfa92326.entry.js → p-56f17656.entry.js} +1 -1
  87. package/lib/duet/{p-b88b18c3.entry.js → p-590e8508.entry.js} +1 -1
  88. package/lib/duet/{p-43c1dcf5.entry.js → p-5a5117d4.entry.js} +1 -1
  89. package/lib/duet/{p-64a691e3.entry.js → p-5c1646f2.entry.js} +1 -1
  90. package/lib/duet/p-5ea398eb.entry.js +4 -0
  91. package/lib/duet/{p-4903478e.entry.js → p-5f528fa2.entry.js} +1 -1
  92. package/lib/duet/p-6002f3d2.system.js +4 -0
  93. package/lib/duet/{p-e908bfdc.system.entry.js → p-62303524.system.entry.js} +1 -1
  94. package/lib/duet/{p-b972e7b7.system.entry.js → p-6255147e.system.entry.js} +1 -1
  95. package/lib/duet/{p-3f1e781d.system.entry.js → p-63aea0dc.system.entry.js} +1 -1
  96. package/lib/duet/{p-ba0a4b7e.system.entry.js → p-64cbe9b7.system.entry.js} +1 -1
  97. package/lib/duet/p-65821960.entry.js +4 -0
  98. package/lib/duet/p-675d713b.entry.js +4 -0
  99. package/lib/duet/{p-c069f560.entry.js → p-67734fad.entry.js} +1 -1
  100. package/lib/duet/{p-fab89c9d.system.entry.js → p-67ed94fa.system.entry.js} +1 -1
  101. package/lib/duet/{p-16bc9a7e.system.entry.js → p-6ab6ce4f.system.entry.js} +1 -1
  102. package/lib/duet/{p-083e39cc.entry.js → p-6c5d3def.entry.js} +1 -1
  103. package/lib/duet/{p-815f4a10.system.entry.js → p-6e3f764f.system.entry.js} +1 -1
  104. package/lib/duet/{p-bacb27a1.js → p-6e64cd02.js} +2 -2
  105. package/lib/duet/{p-e40b610d.entry.js → p-6f1d6649.entry.js} +1 -1
  106. package/lib/duet/{p-0d188b2d.entry.js → p-70e567e9.entry.js} +1 -1
  107. package/lib/duet/{p-6dd1cf98.entry.js → p-77e3591e.entry.js} +1 -1
  108. package/lib/duet/{p-9027d0a4.system.entry.js → p-79948b47.system.entry.js} +1 -1
  109. package/lib/duet/{p-442f1dd5.entry.js → p-7d0051ea.entry.js} +1 -1
  110. package/lib/duet/p-7dfc475d.entry.js +4 -0
  111. package/lib/duet/{p-b787e777.system.entry.js → p-80d16341.system.entry.js} +1 -1
  112. package/lib/duet/{p-85c68d48.system.entry.js → p-817ef07d.system.entry.js} +1 -1
  113. package/lib/duet/{p-35d6061d.system.entry.js → p-838ef01e.system.entry.js} +1 -1
  114. package/lib/duet/{p-8fa7559b.system.entry.js → p-84310e48.system.entry.js} +1 -1
  115. package/lib/duet/{p-631054f3.system.js → p-89f50fd8.system.js} +1 -1
  116. package/lib/duet/{p-8b7adbf6.system.entry.js → p-8bf92f1e.system.entry.js} +1 -1
  117. package/lib/duet/p-8e1cf2fb.system.entry.js +4 -0
  118. package/lib/duet/{p-20f4d5d2.system.entry.js → p-9205c79a.system.entry.js} +1 -1
  119. package/lib/duet/{p-100b6a91.entry.js → p-97130a4c.entry.js} +1 -1
  120. package/lib/duet/{p-c4b6bf46.entry.js → p-97631cdc.entry.js} +1 -1
  121. package/lib/duet/{p-f9045aab.system.entry.js → p-98ca5a08.system.entry.js} +2 -2
  122. package/lib/duet/p-99bf8545.js +4 -0
  123. package/lib/duet/{p-97bb6fdd.system.entry.js → p-9c9fbda5.system.entry.js} +1 -1
  124. package/lib/duet/{p-8eb6610c.system.entry.js → p-9df52009.system.entry.js} +1 -1
  125. package/lib/duet/{p-634fda0f.entry.js → p-a03485f8.entry.js} +1 -1
  126. package/lib/duet/p-a806d616.entry.js +4 -0
  127. package/lib/duet/{p-56ae348b.entry.js → p-a91bb73d.entry.js} +1 -1
  128. package/lib/duet/{p-e36b95e0.system.entry.js → p-ac86999f.system.entry.js} +1 -1
  129. package/lib/duet/{p-b48811b5.entry.js → p-aefb80e3.entry.js} +1 -1
  130. package/lib/duet/{p-7de54632.entry.js → p-b004cbd3.entry.js} +1 -1
  131. package/lib/duet/{p-3d27e5ed.system.entry.js → p-b28e6872.system.entry.js} +1 -1
  132. package/lib/duet/{p-923b03a6.system.entry.js → p-b2ac632f.system.entry.js} +1 -1
  133. package/lib/duet/{p-1a8dfe6e.system.entry.js → p-b70f2ae2.system.entry.js} +1 -1
  134. package/lib/duet/{p-f301004d.entry.js → p-bc24eeda.entry.js} +1 -1
  135. package/lib/duet/{p-5184e972.system.entry.js → p-bec4d094.system.entry.js} +1 -1
  136. package/lib/duet/{p-c9f704c9.entry.js → p-bf8f3b14.entry.js} +1 -1
  137. package/lib/duet/{p-01ccafd3.system.entry.js → p-c383ceb4.system.entry.js} +2 -2
  138. package/lib/duet/{p-411bec39.system.entry.js → p-c694e7fb.system.entry.js} +1 -1
  139. package/lib/duet/p-c918ce45.system.entry.js +4 -0
  140. package/lib/duet/{p-fdaaa3ad.entry.js → p-c9f244f6.entry.js} +1 -1
  141. package/lib/duet/{p-b74364d3.entry.js → p-d3d6e75d.entry.js} +1 -1
  142. package/lib/duet/p-de3c0f4d.js +4 -0
  143. package/lib/duet/{p-2553a64a.entry.js → p-dfd9a9ff.entry.js} +1 -1
  144. package/lib/duet/{p-36924c8f.entry.js → p-e3017ffc.entry.js} +1 -1
  145. package/lib/duet/{p-4fd4ddda.entry.js → p-e358c599.entry.js} +1 -1
  146. package/lib/duet/{p-d06f9b6c.entry.js → p-e5b22358.entry.js} +1 -1
  147. package/lib/duet/{p-f2dab640.system.entry.js → p-ea12c081.system.entry.js} +1 -1
  148. package/lib/duet/{p-ea806947.entry.js → p-ef2f6881.entry.js} +1 -1
  149. package/lib/duet/{p-4dcbaccf.system.entry.js → p-f2831cda.system.entry.js} +1 -1
  150. package/lib/duet/{p-0f144788.entry.js → p-f2dce86d.entry.js} +1 -1
  151. package/lib/duet/{p-86a47942.entry.js → p-f30eb0fd.entry.js} +1 -1
  152. package/lib/duet/{p-8708f306.system.entry.js → p-f661ebf9.system.entry.js} +1 -1
  153. package/lib/duet/{p-e980faf9.system.entry.js → p-f6f30fb7.system.entry.js} +1 -1
  154. package/lib/duet/{p-ff94713b.entry.js → p-faf6cfe8.entry.js} +1 -1
  155. package/lib/duet/{p-2d58c660.system.entry.js → p-fdb0277c.system.entry.js} +1 -1
  156. package/lib/duet/{p-8c282db8.system.js → p-fe03f359.system.js} +1 -1
  157. package/lib/duet/{p-7382c47e.system.entry.js → p-ffadc9ea.system.entry.js} +1 -1
  158. package/lib/esm/duet-action-button.entry.js +25 -7
  159. package/lib/esm/duet-alert.entry.js +1 -1
  160. package/lib/esm/duet-badge.entry.js +1 -1
  161. package/lib/esm/duet-breadcrumb.entry.js +1 -1
  162. package/lib/esm/duet-breadcrumbs.entry.js +1 -1
  163. package/lib/esm/duet-button_2.entry.js +2 -2
  164. package/lib/esm/duet-caption_4.entry.js +2 -2
  165. package/lib/esm/duet-card.entry.js +2 -2
  166. package/lib/esm/duet-checkbox.entry.js +1 -1
  167. package/lib/esm/duet-choice_2.entry.js +2 -2
  168. package/lib/esm/duet-collapsible.entry.js +2 -2
  169. package/lib/esm/duet-combobox.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_3.entry.js +18 -13
  174. package/lib/esm/duet-empty-state.entry.js +1 -1
  175. package/lib/esm/duet-fieldset.entry.js +1 -1
  176. package/lib/esm/duet-footer.entry.js +1 -1
  177. package/lib/esm/duet-grid_2.entry.js +1 -1
  178. package/lib/esm/duet-header_2.entry.js +51 -49
  179. package/lib/esm/duet-hero.entry.js +4 -3
  180. package/lib/esm/duet-icon.entry.js +2 -2
  181. package/lib/esm/duet-input_2.entry.js +21 -4
  182. package/lib/esm/duet-layout.entry.js +1 -1
  183. package/lib/esm/duet-list_2.entry.js +1 -1
  184. package/lib/esm/duet-modal.entry.js +2 -2
  185. package/lib/esm/duet-notification_2.entry.js +1 -1
  186. package/lib/esm/duet-number-input.entry.js +1 -1
  187. package/lib/esm/duet-pagination_2.entry.js +2 -2
  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-scrollable_3.entry.js +1 -1
  192. package/lib/esm/duet-select.entry.js +1 -1
  193. package/lib/esm/duet-step_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 +2 -2
  201. package/lib/esm/{focus-utils-07c543df.js → focus-utils-8dc04c1c.js} +1 -1
  202. package/lib/esm/{index-bcca1cb8.js → index-e1964887.js} +8 -2
  203. package/lib/esm/{js-utils-52e0944c.js → js-utils-fa98b8cd.js} +11 -0
  204. package/lib/esm/loader.js +2 -2
  205. package/lib/esm/{token-utils-1f9435bc.js → token-utils-df78f4d8.js} +1 -1
  206. package/lib/esm-es5/duet-action-button.entry.js +2 -2
  207. package/lib/esm-es5/duet-alert.entry.js +1 -1
  208. package/lib/esm-es5/duet-badge.entry.js +1 -1
  209. package/lib/esm-es5/duet-breadcrumb.entry.js +1 -1
  210. package/lib/esm-es5/duet-breadcrumbs.entry.js +1 -1
  211. package/lib/esm-es5/duet-button_2.entry.js +1 -1
  212. package/lib/esm-es5/duet-caption_4.entry.js +1 -1
  213. package/lib/esm-es5/duet-card.entry.js +1 -1
  214. package/lib/esm-es5/duet-checkbox.entry.js +1 -1
  215. package/lib/esm-es5/duet-choice_2.entry.js +1 -1
  216. package/lib/esm-es5/duet-collapsible.entry.js +2 -2
  217. package/lib/esm-es5/duet-combobox.entry.js +1 -1
  218. package/lib/esm-es5/duet-cookie-consent.entry.js +1 -1
  219. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  220. package/lib/esm-es5/duet-divider_2.entry.js +1 -1
  221. package/lib/esm-es5/duet-editable-table_3.entry.js +1 -1
  222. package/lib/esm-es5/duet-empty-state.entry.js +1 -1
  223. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  224. package/lib/esm-es5/duet-footer.entry.js +1 -1
  225. package/lib/esm-es5/duet-grid_2.entry.js +1 -1
  226. package/lib/esm-es5/duet-header_2.entry.js +2 -2
  227. package/lib/esm-es5/duet-hero.entry.js +1 -1
  228. package/lib/esm-es5/duet-icon.entry.js +1 -1
  229. package/lib/esm-es5/duet-input_2.entry.js +1 -1
  230. package/lib/esm-es5/duet-layout.entry.js +1 -1
  231. package/lib/esm-es5/duet-list_2.entry.js +1 -1
  232. package/lib/esm-es5/duet-modal.entry.js +1 -1
  233. package/lib/esm-es5/duet-notification_2.entry.js +1 -1
  234. package/lib/esm-es5/duet-number-input.entry.js +1 -1
  235. package/lib/esm-es5/duet-pagination_2.entry.js +1 -1
  236. package/lib/esm-es5/duet-progress.entry.js +1 -1
  237. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  238. package/lib/esm-es5/duet-range-slider.entry.js +1 -1
  239. package/lib/esm-es5/duet-scrollable_3.entry.js +1 -1
  240. package/lib/esm-es5/duet-select.entry.js +1 -1
  241. package/lib/esm-es5/duet-step_2.entry.js +1 -1
  242. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  243. package/lib/esm-es5/duet-toggle.entry.js +1 -1
  244. package/lib/esm-es5/duet-tooltip.entry.js +1 -1
  245. package/lib/esm-es5/duet-tray.entry.js +1 -1
  246. package/lib/esm-es5/duet-upload-aria-status.entry.js +1 -1
  247. package/lib/esm-es5/duet-visually-hidden.entry.js +1 -1
  248. package/lib/esm-es5/duet.js +1 -1
  249. package/lib/esm-es5/focus-utils-8dc04c1c.js +4 -0
  250. package/lib/esm-es5/{index-bcca1cb8.js → index-e1964887.js} +3 -3
  251. package/lib/esm-es5/{js-utils-52e0944c.js → js-utils-fa98b8cd.js} +0 -0
  252. package/lib/esm-es5/loader.js +1 -1
  253. package/lib/esm-es5/token-utils-df78f4d8.js +4 -0
  254. package/lib/types/components/duet-action-button/duet-action-button.d.ts +12 -4
  255. package/lib/types/components/duet-header/duet-header-icon.d.ts +1 -0
  256. package/lib/types/components/duet-header/duet-header.d.ts +2 -2
  257. package/lib/types/components/duet-hero/duet-hero.d.ts +4 -0
  258. package/lib/types/components/duet-input/duet-input.d.ts +2 -1
  259. package/lib/types/components/duet-upload/duet-upload.d.ts +1 -2
  260. package/lib/types/components.d.ts +17 -9
  261. package/lib/types/utils/js-utils.d.ts +11 -0
  262. package/lib/types/utils/token-utils.d.ts +1 -0
  263. package/package.json +5 -5
  264. package/lib/duet/p-1717ed62.entry.js +0 -4
  265. package/lib/duet/p-32dd246d.entry.js +0 -4
  266. package/lib/duet/p-35159c88.system.entry.js +0 -4
  267. package/lib/duet/p-61507bc8.entry.js +0 -4
  268. package/lib/duet/p-6190e2d6.system.js +0 -4
  269. package/lib/duet/p-661f842b.entry.js +0 -4
  270. package/lib/duet/p-89f53f18.system.entry.js +0 -4
  271. package/lib/duet/p-909aaac4.entry.js +0 -4
  272. package/lib/duet/p-9cca0bb4.js +0 -4
  273. package/lib/duet/p-9df4bfa0.system.entry.js +0 -4
  274. package/lib/duet/p-a818e289.entry.js +0 -4
  275. package/lib/duet/p-c60f00e7.system.entry.js +0 -4
  276. package/lib/duet/p-ce276fc8.js +0 -4
  277. package/lib/duet/p-dbb2579c.entry.js +0 -4
  278. package/lib/esm-es5/focus-utils-07c543df.js +0 -4
  279. package/lib/esm-es5/token-utils-1f9435bc.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
  /**
@@ -418,8 +418,9 @@ export class DuetHeader {
418
418
  * Local methods.
419
419
  */
420
420
  async refresh() {
421
- if (this.renderDesktopNav !== this.mql[0].matches) {
422
- this.renderDesktopNav = this.mql[0].matches;
421
+ var _a, _b;
422
+ if (this.renderDesktopNav !== Build.isServer ? true : (_a = this.mql[0]) === null || _a === void 0 ? void 0 : _a.matches) {
423
+ this.renderDesktopNav = Build.isServer ? true : (_b = this.mql[0]) === null || _b === void 0 ? void 0 : _b.matches;
423
424
  this.openMenu = null;
424
425
  if (this.isSlideOutOpen) {
425
426
  this.toggleMenu(document.createEvent("UIEvents"), "mobile");
@@ -492,10 +493,10 @@ export class DuetHeader {
492
493
  */
493
494
  render() {
494
495
  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" },
496
+ const skipToLabel = () => this.skipToId ? (h("a", { href: this.skipToId, class: "duet-header-skip", onClick: this.handleSkipClick }, skipLabel)) : null;
497
+ const logo = () => (h("duet-logo", { href: this.logoHref, size: "medium", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
498
+ const largeLogo = () => (h("duet-logo", { href: this.logoHref, size: "large", ref: el => (this.logoEl = el), language: this.language, theme: this.theme, onClick: this.handleLogoClick }));
499
+ 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
500
  item.label,
500
501
  Build.isBrowser && item.external && (h(Fragment, null,
501
502
  h("duet-visually-hidden", null,
@@ -503,25 +504,25 @@ export class DuetHeader {
503
504
  this.accessibleLabelExternal),
504
505
  h("span", { class: "duet-header-link-external" },
505
506
  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 },
507
+ 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;
508
+ 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
509
  h(DuetHeaderIcon, { icon: userIcon.svg }),
509
510
  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" },
511
+ 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
512
  h(DuetHeaderIcon, { icon: userIcon.svg }),
512
513
  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 }),
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, { class: "desktop", icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: "x-small" }),
516
+ h(DuetHeaderIcon, { class: "mobile", icon: this.processedSession.type === "logout" ? logoutIcon.svg : loginIcon.svg, iconSize: "small" }),
516
517
  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,
518
+ 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
519
  sessionItem.label && h("span", { class: "duet-header-session-label" }, sessionItem.label),
519
520
  h("duet-spacer", { size: "small", "aria-hidden": "true" }),
520
521
  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
522
  index !== this.processedSession.sessionItems.length - 1 && (h(Fragment, null,
522
523
  h("duet-spacer", { size: "x-small", "aria-hidden": "true" }),
523
524
  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 },
525
+ 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
526
  h(DuetHeaderIcon, { icon: searchIcon.svg }),
526
527
  h("span", { class: "duet-header-button-label" }, this.processedSearch.label))) : null;
527
528
  // Back variation
@@ -535,23 +536,104 @@ export class DuetHeader {
535
536
  "duet-header-inactive": true,
536
537
  }, part: "header" },
537
538
  h("div", { class: "duet-header-top" },
538
- skipToLabel,
539
+ skipToLabel(),
539
540
  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,
541
+ logo(),
541
542
  h("slot", { name: "logo-utility" }))))));
542
543
  }
543
- // multi level desktop variation
544
544
  const itemsHaveSubItems = this.processedItems && this.processedItems.some(item => item.items && item.items.length > 0);
545
- if (this.renderDesktopNav && itemsHaveSubItems) {
545
+ const isSecondLevelActive = this.processedItems &&
546
+ this.processedItems.some(item => item.items && item.items.some(secondLevelItem => secondLevelItem.active === true));
547
+ const isThirdLevelActive = this.processedItems &&
548
+ this.processedItems.some(item => item.items &&
549
+ item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
550
+ const defaultVariationContent = (h("div", { class: {
551
+ "duet-header-reserved-space": true,
552
+ "duet-with-links": !!this.processedItems,
553
+ "duet-header-second-level-active": isSecondLevelActive,
554
+ "duet-header-third-level-active": isThirdLevelActive,
555
+ "duet-header-items-have-sub-items": itemsHaveSubItems,
556
+ } },
557
+ h("header", { class: {
558
+ "duet-header": true,
559
+ "duet-theme-turva": this.theme === "turva",
560
+ "duet-header-inactive": !this.processedItems,
561
+ }, part: "header" },
562
+ h("div", { class: "duet-header-top" },
563
+ skipToLabel(),
564
+ logo(),
565
+ h("slot", { name: "logo-utility" }, this.region && h("div", { class: "duet-header-region" }, this.region)),
566
+ (this.processedItems ||
567
+ languageDropdown() ||
568
+ contactDropdown() ||
569
+ this.processedSession ||
570
+ this.processedUser) && (h("button", { class: { "duet-header-toggle": true, active: this.isSlideOutOpen }, onClick: event => this.toggleMenu(event, "mobile"), type: "button" },
571
+ h("duet-visually-hidden", null, this.accessibleLabel),
572
+ h(DuetHeaderHamburger, null)))),
573
+ h("div", { ref: el => (this.navigationEl = el), class: {
574
+ "duet-header-bottom": true,
575
+ active: this.isSlideOutOpen,
576
+ inactive: !this.processedItems,
577
+ } },
578
+ h("nav", { class: "duet-header-items", role: "navigation" }, this.processedItems &&
579
+ this.processedItems.map((item, itemIndex) => (h("div", { class: "duet-header-item-container" },
580
+ h("a", { class: {
581
+ "duet-header-first-level": true,
582
+ "duet-header-item": true,
583
+ active: (!itemsHaveSubItems && this.currentHref === item.href) ||
584
+ (item.active === true &&
585
+ !this.openMenu &&
586
+ this.closedActives &&
587
+ this.closedActives.length === 1) ||
588
+ (item.active === true &&
589
+ !this.openMenu &&
590
+ item.items &&
591
+ !item.items.some(s => s.active === true)),
592
+ }, href: item.href || "#", id: item.id || `header-item-${itemIndex}`, onClick: event => this.handleItemClick(event, item) },
593
+ item.label,
594
+ item.badge && h("div", { class: "duet-header-badge" })),
595
+ item.items &&
596
+ item.items
597
+ .filter(secondLevelitem => secondLevelitem.items && secondLevelitem.items.length > 0)
598
+ .map((secondLevelItem, secondLevelItemIndex) => {
599
+ const id = secondLevelItem.id || `header-item-${itemIndex}-${secondLevelItemIndex}`;
600
+ const active = (!this.openMenu &&
601
+ secondLevelItem.active === true &&
602
+ !(this.closedActives && !!this.closedActives.find(i => i === id))) ||
603
+ this.openMenu === id;
604
+ const activeBar = active && !(secondLevelItem.items && secondLevelItem.items.some(s => s.active === true));
605
+ 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) },
606
+ h("div", { class: "duet-header-third-level" }, secondLevelItem.items &&
607
+ secondLevelItem.items.map(thirdLevelItem => (h("a", { class: {
608
+ "duet-header-item": true,
609
+ active: thirdLevelItem.active === true,
610
+ }, role: "menuitem", href: thirdLevelItem.href || "#", id: thirdLevelItem.id, onClick: event => this.handleItemClick(event, thirdLevelItem), onKeyDown: ev => this.handleArrowKeys(ev), target: thirdLevelItem.external ? "_blank" : "_self" },
611
+ thirdLevelItem.icon && (h("div", { class: "duet-header-icon" },
612
+ h("duet-icon", { margin: "none", size: "medium", name: thirdLevelItem.icon, color: "currentColor" }))),
613
+ h("span", null, thirdLevelItem.label),
614
+ thirdLevelItem.badge && h("div", { class: "duet-header-badge" })))))));
615
+ }))))),
616
+ h("div", { class: "duet-header-bottom-utils" },
617
+ h("slot", { name: "utility" })),
618
+ h("div", { class: "duet-header-utils" },
619
+ !itemsHaveSubItems && contactDropdown(),
620
+ languageDropdown(),
621
+ !itemsHaveSubItems && (h(Fragment, null,
622
+ processedUserWithLink(),
623
+ processedUserWithoutLink())),
624
+ processedSearch(),
625
+ processedSession())))));
626
+ // multi level variation
627
+ if (itemsHaveSubItems) {
546
628
  const activeSegment = this.processedItems.find(item => item.active);
547
629
  const isThirdLevelActive = this.processedItems &&
548
630
  this.processedItems.some(item => item.items &&
549
631
  item.items.some(secondLevelItem => secondLevelItem.items && secondLevelItem.items.some(thirdLevelItem => thirdLevelItem.active === true)));
550
632
  const segmentId = "duet-header-segment";
551
- return (h(Host, { class: "duet-header-multi-level-desktop-variation" },
633
+ return (h(Host, { class: "duet-header-multi-level-variation" },
552
634
  h("div", { class: {
553
- "duet-header-multi-level-desktop": true,
554
- "duet-header-multi-level-desktop-third-level-is-open": isThirdLevelActive,
635
+ "duet-header-multi-level": true,
636
+ "duet-header-multi-level-third-level-is-open": isThirdLevelActive,
555
637
  } },
556
638
  h("header", { class: {
557
639
  "duet-header": true,
@@ -559,15 +641,15 @@ export class DuetHeader {
559
641
  "duet-header-inactive": !this.processedItems,
560
642
  }, part: "header" },
561
643
  h("div", { class: "duet-header-top" },
562
- skipToLabel,
644
+ skipToLabel(),
563
645
  h("div", { class: "logo-and-segment" },
564
- h("div", null, largeLogo),
646
+ h("div", null, largeLogo()),
565
647
  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" },
566
648
  item.icon && (h("div", { class: "duet-header-icon" },
567
649
  h("duet-icon", { margin: "none", size: "x-small", name: item.icon, color: "currentColor" }))),
568
650
  h("span", null, item.label),
569
651
  item.badge && h("div", { class: "duet-header-badge" }))))))),
570
- h("nav", { class: "duet-header-multi-level-desktop-nav" }, activeSegment.items &&
652
+ h("nav", { class: "duet-header-multi-level-nav" }, activeSegment.items &&
571
653
  activeSegment.items
572
654
  .filter(secondLevelItem => secondLevelItem.items && secondLevelItem.items.length > 0)
573
655
  .map((secondLevelItem, secondLevelItemIndex) => {
@@ -579,96 +661,17 @@ export class DuetHeader {
579
661
  h("span", null, thirdLevelItem.label),
580
662
  thirdLevelItem.badge && h("div", { class: "duet-header-badge" }))))));
581
663
  })),
582
- h("div", { class: "duet-header-multi-level-desktop-utils" },
583
- processedSearch,
584
- languageDropdown,
585
- processedSessionDropdown != null ? processedSessionDropdown : processedSession),
586
- h("slot", { name: "utility" }))))));
664
+ h("div", { class: "duet-header-multi-level-utils" },
665
+ processedSearch(),
666
+ languageDropdown(),
667
+ processedSessionDropdown() != null ? processedSessionDropdown() : processedSession()),
668
+ h("slot", { name: "utility" })))),
669
+ defaultVariationContent));
587
670
  }
588
671
  // 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
672
  return (h(Host, { class: {
595
673
  "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))))));
674
+ } }, defaultVariationContent));
672
675
  }
673
676
  static get is() { return "duet-header"; }
674
677
  static get encapsulation() { return "shadow"; }
@@ -977,7 +980,7 @@ export class DuetHeader {
977
980
  "optional": false,
978
981
  "docs": {
979
982
  "tags": [],
980
- "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in desktop multilevel header."
983
+ "text": "Region that is shown next to the logo. If empty, region will be hidden.\nNote: not available in multilevel header."
981
984
  },
982
985
  "attribute": "region",
983
986
  "reflect": false,
@@ -8,8 +8,11 @@ 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
11
12
  * @slot default - This is an unamed slot for a text or extra button that is placed after any buttons (or list item)
12
13
  * @slot badge - This is a slot for a status badge that sits next to pre-heading inside the hero component.
14
+ * @slot bottom - This is a slot for content under the main hero content.
15
+ * @slot heading - This is a slot for heading content inside the hero component.
13
16
  */
14
17
  export class DuetHero {
15
18
  constructor() {
@@ -25,6 +28,7 @@ export class DuetHero {
25
28
  */
26
29
  this.theme = "";
27
30
  /**
31
+ * @deprecated please use heading slot instead.
28
32
  * The heading of the hero area, rendered in an H1 tag. P.S. you can control
29
33
  * the level of the HTML heading by using “level” prop. If empty, heading
30
34
  * will be hidden.
@@ -196,7 +200,7 @@ export class DuetHero {
196
200
  "duet-hero-gray-with-back": !!this.processedBack,
197
201
  "duet-hero-text-center": this.textCenter && !this.leftAlign,
198
202
  "duet-hero-left-align": this.leftAlign,
199
- } },
203
+ }, part: "duet-hero" },
200
204
  h("div", { class: "duet-hero-wrapper" },
201
205
  this.image && this.variation === "image" && (h("div", { class: "duet-hero-image-mask" },
202
206
  h("div", { class: "duet-hero-image-wrapper" },
@@ -213,7 +217,7 @@ export class DuetHero {
213
217
  h("div", { class: "duet-hero-text" },
214
218
  this.preHeading && (h("duet-paragraph", { margin: "none", class: "duet-hero-pre" }, this.preHeading)),
215
219
  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),
220
+ 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
221
  this.description && (h("duet-paragraph", { theme: this.theme, color: textColor, variation: "intro" }, this.description)),
218
222
  (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
223
  h("span", { slot: "label" }, item.label),
@@ -230,7 +234,8 @@ export class DuetHero {
230
234
  this.accessibleLabelExternal),
231
235
  item.external && (h("div", { class: "duet-hero-action-arrow" },
232
236
  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 }))));
237
+ this.image && this.variation !== "image" && h("div", { class: "duet-hero-image", style: styles }),
238
+ h("slot", { name: "bottom" }))));
234
239
  }
235
240
  static get is() { return "duet-hero"; }
236
241
  static get encapsulation() { return "shadow"; }
@@ -275,8 +280,11 @@ export class DuetHero {
275
280
  "required": false,
276
281
  "optional": false,
277
282
  "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."
283
+ "tags": [{
284
+ "name": "deprecated",
285
+ "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."
286
+ }],
287
+ "text": ""
280
288
  },
281
289
  "attribute": "heading",
282
290
  "reflect": false,
@@ -30,6 +30,11 @@ export class DuetInput {
30
30
  fi: "Tyhjennä",
31
31
  sv: "Rensa",
32
32
  });
33
+ this.timeAnnouncement = getLocaleString({
34
+ en: "Time",
35
+ fi: "Aika",
36
+ sv: "Tid",
37
+ });
33
38
  /**
34
39
  * Indicates the id or a string of space seperated ids of a component(s) that describes the input.
35
40
  */
@@ -281,14 +286,26 @@ export class DuetInput {
281
286
  else if (!this.pattern && this.type === "tel") {
282
287
  inputProps.pattern = "[0-9+ ]+";
283
288
  }
289
+ let selectedTime;
290
+ if (this.value) {
291
+ selectedTime = new Date();
292
+ try {
293
+ selectedTime.setHours(Number(this.value.slice(0, 2)), Number(this.value.slice(3, 5)), 0, 0);
294
+ }
295
+ catch (e) {
296
+ selectedTime = undefined;
297
+ }
298
+ }
284
299
  return (h(Host, { class: { "duet-expand": this.expand, "duet-m-0": this.margin === "none" }, onKeyUp: e => this.keyHandler(e) },
300
+ this.type === "time" && (h("duet-visually-hidden", { "aria-live": "polite", "aria-atomic": "true" }, selectedTime ? `${this.timeAnnouncement} ${selectedTime.toLocaleTimeString()}` : "")),
285
301
  h("div", { class: {
286
302
  "duet-input-container": true,
287
303
  "duet-theme-turva": this.theme === "turva",
288
304
  [`duet-input-variation-${this.variation}`]: true,
289
305
  "duet-label-hidden": this.labelHidden,
290
306
  "duet-input-top-caption-shown": this.isCaptionVisible,
291
- "has-icon": !!this.icon || (this.type !== "text" && this.type !== "tel" && this.type !== "password"),
307
+ "has-icon": !!this.icon ||
308
+ (this.type !== "text" && this.type !== "tel" && this.type !== "password" && this.type !== "time"),
292
309
  "has-error": !!this.error,
293
310
  "has-clear": this.clear,
294
311
  } },
@@ -296,7 +313,7 @@ export class DuetInput {
296
313
  this.tooltip && (h("duet-tooltip", { direction: this.tooltipDirection, accessibleInputLabel: this.label }, this.tooltip)),
297
314
  this.caption && (h("duet-caption", { id: this.topCaptionId, size: "medium" }, this.caption)),
298
315
  h("div", { class: "duet-input-relative" },
299
- this.placeholder && this.echoPlaceholder && this.value && (h("duet-caption", { id: this.topCaptionPlaceholderId, class: "duet-input-placeholder", margin: "none", size: "small" }, this.placeholder)),
316
+ this.placeholder && this.echoPlaceholder && (this.value || this.type === "time") && (h("duet-caption", { id: this.topCaptionPlaceholderId, class: "duet-input-placeholder", margin: "none", size: "small" }, this.placeholder)),
300
317
  h("input", Object.assign({ ref: input => (this.nativeInput = input), onInput: this.onInput, onBlur: this.onBlur, onFocus: this.onFocus, type: this.type, class: {
301
318
  "duet-input": true,
302
319
  disabled: this.disabled,
@@ -309,6 +326,7 @@ export class DuetInput {
309
326
  this.type !== "text" &&
310
327
  this.type !== "tel" &&
311
328
  this.type !== "password" &&
329
+ this.type !== "time" &&
312
330
  this.variation !== "button" && (h("div", { class: "duet-input-icon" },
313
331
  h("duet-icon", { margin: "none", size: "small", icon: icons[this.type].svg, color: "currentColor" }))),
314
332
  this.clear && this.value && (h("div", { class: "duet-input-clear-icon" },
@@ -697,7 +715,7 @@ export class DuetInput {
697
715
  "mutable": false,
698
716
  "complexType": {
699
717
  "original": "DuetInputType",
700
- "resolved": "\"email\" | \"password\" | \"search\" | \"tel\" | \"text\"",
718
+ "resolved": "\"email\" | \"password\" | \"search\" | \"tel\" | \"text\" | \"time\"",
701
719
  "references": {
702
720
  "DuetInputType": {
703
721
  "location": "local"
@@ -2,7 +2,7 @@
2
2
  * Built with Duet Design System
3
3
  */
4
4
  import { Component, Element, Event, h, Host, Method, Prop, State, Watch } from "@stencil/core";
5
- import { inheritGlobalTheme } from "../../common/themeable-component";
5
+ import { inheritGlobalTheme } from "../../common";
6
6
  import { createID } from "../../utils/create-id";
7
7
  import { debounce } from "../../utils/js-utils";
8
8
  import { getLocaleString, sanitizeString } from "../../utils/language-utils";
@@ -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
@@ -35,7 +35,7 @@ export function getTheme(theme = "") {
35
35
  }
36
36
  return "";
37
37
  }
38
- function capitalizeFirstLetter(string) {
38
+ export function capitalizeFirstLetter(string) {
39
39
  return string.charAt(0).toUpperCase() + string.slice(1);
40
40
  }
41
41
  function hasType(t, str = "") {