@duetds/components 5.0.5 → 5.1.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 (307) hide show
  1. package/hydrate/index.js +482 -19
  2. package/lib/cjs/duet-action-button.cjs.entry.js +5 -5
  3. package/lib/cjs/duet-alert.cjs.entry.js +4 -4
  4. package/lib/cjs/duet-badge.cjs.entry.js +2 -2
  5. package/lib/cjs/duet-breadcrumb.cjs.entry.js +2 -2
  6. package/lib/cjs/duet-breadcrumbs.cjs.entry.js +4 -4
  7. package/lib/cjs/duet-button_2.cjs.entry.js +4 -4
  8. package/lib/cjs/duet-caption_4.cjs.entry.js +4 -4
  9. package/lib/cjs/duet-card.cjs.entry.js +4 -4
  10. package/lib/cjs/duet-checkbox.cjs.entry.js +2 -2
  11. package/lib/cjs/duet-choice_2.cjs.entry.js +6 -6
  12. package/lib/cjs/duet-collapsible.cjs.entry.js +4 -4
  13. package/lib/cjs/duet-combobox.cjs.entry.js +390 -0
  14. package/lib/cjs/duet-cookie-consent.cjs.entry.js +2 -2
  15. package/lib/cjs/duet-date-picker.cjs.entry.js +5 -5
  16. package/lib/cjs/duet-divider_2.cjs.entry.js +2 -2
  17. package/lib/cjs/duet-editable-table_3.cjs.entry.js +10 -8
  18. package/lib/cjs/duet-empty-state.cjs.entry.js +2 -2
  19. package/lib/cjs/duet-fieldset.cjs.entry.js +2 -2
  20. package/lib/cjs/duet-footer.cjs.entry.js +6 -6
  21. package/lib/cjs/duet-grid_2.cjs.entry.js +2 -2
  22. package/lib/cjs/duet-header_2.cjs.entry.js +48 -11
  23. package/lib/cjs/duet-hero.cjs.entry.js +4 -4
  24. package/lib/cjs/duet-icon.cjs.entry.js +2 -2
  25. package/lib/cjs/duet-input_2.cjs.entry.js +19 -4
  26. package/lib/cjs/duet-layout.cjs.entry.js +1 -1
  27. package/lib/cjs/duet-list_2.cjs.entry.js +2 -2
  28. package/lib/cjs/duet-modal.cjs.entry.js +6 -6
  29. package/lib/cjs/duet-notification_2.cjs.entry.js +4 -4
  30. package/lib/cjs/duet-number-input.cjs.entry.js +5 -5
  31. package/lib/cjs/duet-pagination_2.cjs.entry.js +5 -5
  32. package/lib/cjs/duet-progress.cjs.entry.js +4 -4
  33. package/lib/cjs/duet-radio_2.cjs.entry.js +2 -2
  34. package/lib/cjs/duet-range-slider.cjs.entry.js +2 -2
  35. package/lib/cjs/duet-scrollable_3.cjs.entry.js +12 -8
  36. package/lib/cjs/duet-select.cjs.entry.js +3 -3
  37. package/lib/cjs/duet-step_2.cjs.entry.js +3 -3
  38. package/lib/cjs/duet-textarea.cjs.entry.js +3 -3
  39. package/lib/cjs/duet-toggle.cjs.entry.js +2 -2
  40. package/lib/cjs/duet-tooltip.cjs.entry.js +4 -4
  41. package/lib/cjs/duet-tray.cjs.entry.js +4 -4
  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-88e98997.js → focus-utils-b7b1bede.js} +1 -1
  46. package/lib/cjs/{index-ef094178.js → index-a521d11c.js} +1 -1
  47. package/lib/cjs/{input-utils-f3e3854c.js → input-utils-b5e8f524.js} +1 -1
  48. package/lib/cjs/{keyboard-utils-898cfe14.js → keyboard-utils-bb32119b.js} +3 -0
  49. package/lib/cjs/{language-utils-aa282901.js → language-utils-4f62a7db.js} +1 -1
  50. package/lib/cjs/loader.cjs.js +2 -2
  51. package/lib/cjs/{string-utils-267e3dbb.js → string-utils-5cadd058.js} +6 -0
  52. package/lib/cjs/themeable-component-940d3b50.js +15 -0
  53. package/lib/collection/collection-manifest.json +1 -0
  54. package/lib/collection/components/duet-combobox/duet-combobox-select-single.js +12 -0
  55. package/lib/collection/components/duet-combobox/duet-combobox-select.js +19 -0
  56. package/lib/collection/components/duet-combobox/duet-combobox.css +78 -0
  57. package/lib/collection/components/duet-combobox/duet-combobox.js +592 -0
  58. package/lib/collection/components/duet-footer/duet-footer.js +6 -2
  59. package/lib/collection/components/duet-header/duet-header.css +15 -0
  60. package/lib/collection/components/duet-header/duet-header.js +67 -5
  61. package/lib/collection/components/duet-input/duet-input.js +67 -1
  62. package/lib/collection/components/duet-tab-group/duet-tab-group.js +25 -3
  63. package/lib/collection/components/duet-upload/duet-upload.css +12 -0
  64. package/lib/collection/components/duet-upload/duet-upload.js +4 -1
  65. package/lib/collection/components/duet-upload/upload-editable-item-success.js +1 -1
  66. package/lib/collection/utils/input-utils.js +1 -1
  67. package/lib/collection/utils/string-utils.js +6 -0
  68. package/lib/collection/utils/themeable-component.js +5 -2
  69. package/lib/custom-elements-bundle/index.d.ts +6 -0
  70. package/lib/custom-elements-bundle/index.js +478 -31
  71. package/lib/duet/duet.esm.js +1 -1
  72. package/lib/duet/duet.js +1 -1
  73. package/lib/duet/{p-b06d63cb.entry.js → p-00c21573.entry.js} +1 -1
  74. package/lib/duet/{p-f1b62aca.entry.js → p-02ebff5d.entry.js} +1 -1
  75. package/lib/duet/{p-e81f1326.entry.js → p-0a4b7633.entry.js} +1 -1
  76. package/lib/duet/{p-db63fb3a.system.entry.js → p-0d165a50.system.entry.js} +1 -1
  77. package/lib/duet/{p-d2b5efc0.system.entry.js → p-1028c3a0.system.entry.js} +1 -1
  78. package/lib/duet/{p-8bca2ae9.system.entry.js → p-1111a916.system.entry.js} +1 -1
  79. package/lib/duet/{p-e1d56708.entry.js → p-11adc839.entry.js} +1 -1
  80. package/lib/duet/{p-b47892c9.entry.js → p-14f2d627.entry.js} +1 -1
  81. package/lib/duet/{p-1ccd57c6.entry.js → p-18fc1046.entry.js} +1 -1
  82. package/lib/duet/{p-298aff96.system.entry.js → p-1bf42e5a.system.entry.js} +1 -1
  83. package/lib/duet/p-1cb29dd2.system.js +4 -0
  84. package/lib/duet/{p-a7a1ece1.system.entry.js → p-1d2717f7.system.entry.js} +1 -1
  85. package/lib/duet/{p-84eb2808.entry.js → p-1f1eb2c6.entry.js} +1 -1
  86. package/lib/duet/p-2227bd88.entry.js +4 -0
  87. package/lib/duet/{p-71cdfd93.system.entry.js → p-2266dd2f.system.entry.js} +1 -1
  88. package/lib/duet/{p-217b9e24.entry.js → p-28efbf26.entry.js} +1 -1
  89. package/lib/duet/{p-d9ac5f05.entry.js → p-2ec15916.entry.js} +1 -1
  90. package/lib/duet/{p-ad77f9e2.entry.js → p-309e1d13.entry.js} +1 -1
  91. package/lib/duet/{p-adaede01.entry.js → p-3128467f.entry.js} +1 -1
  92. package/lib/duet/p-32358ab8.entry.js +4 -0
  93. package/lib/duet/{p-a37de615.system.entry.js → p-3292f542.system.entry.js} +1 -1
  94. package/lib/duet/{p-1bb6c66f.system.entry.js → p-33473844.system.entry.js} +1 -1
  95. package/lib/duet/{p-f4c60fd8.system.entry.js → p-33701731.system.entry.js} +1 -1
  96. package/lib/duet/{p-92722c37.system.entry.js → p-3762c001.system.entry.js} +1 -1
  97. package/lib/duet/{p-b110c837.entry.js → p-378615ba.entry.js} +1 -1
  98. package/lib/duet/{p-ea4674fd.system.entry.js → p-37ec8cc0.system.entry.js} +1 -1
  99. package/lib/duet/{p-68fecc14.system.entry.js → p-388ccb59.system.entry.js} +1 -1
  100. package/lib/duet/{p-2b1b8246.entry.js → p-39141813.entry.js} +1 -1
  101. package/lib/duet/p-411d8bf6.entry.js +4 -0
  102. package/lib/duet/{p-5d6f8c04.entry.js → p-42042a04.entry.js} +1 -1
  103. package/lib/duet/{p-90223d57.entry.js → p-4990454b.entry.js} +1 -1
  104. package/lib/duet/{p-689fe862.entry.js → p-4cb101e7.entry.js} +1 -1
  105. package/lib/duet/p-54f35a79.js +4 -0
  106. package/lib/duet/p-56118313.js +4 -0
  107. package/lib/duet/{p-16df6ccc.system.entry.js → p-56834d68.system.entry.js} +1 -1
  108. package/lib/duet/p-5a9d75e1.js +4 -0
  109. package/lib/duet/{p-7dbf8797.system.entry.js → p-5d223c1b.system.entry.js} +1 -1
  110. package/lib/duet/{p-1cfeab55.system.entry.js → p-5dc7ecff.system.entry.js} +1 -1
  111. package/lib/duet/{p-b985a189.entry.js → p-5e46fd23.entry.js} +1 -1
  112. package/lib/duet/{p-cbd12107.system.entry.js → p-5ea44650.system.entry.js} +1 -1
  113. package/lib/duet/{p-a96ead6c.entry.js → p-63c4fa58.entry.js} +1 -1
  114. package/lib/duet/{p-1144c927.entry.js → p-6440a77d.entry.js} +1 -1
  115. package/lib/duet/{p-fdf8fba5.entry.js → p-6a164c72.entry.js} +1 -1
  116. package/lib/duet/p-6b03322b.system.js +4 -0
  117. package/lib/duet/p-6bfd3066.system.entry.js +4 -0
  118. package/lib/duet/{p-d98ed960.entry.js → p-6d85cb27.entry.js} +1 -1
  119. package/lib/duet/{p-d688612f.entry.js → p-6eb9415c.entry.js} +1 -1
  120. package/lib/duet/p-6ee89e1c.entry.js +4 -0
  121. package/lib/duet/{p-27eac9a4.entry.js → p-70d5c815.entry.js} +1 -1
  122. package/lib/duet/{p-2c65e170.entry.js → p-77151f3f.entry.js} +1 -1
  123. package/lib/duet/{p-a3bd8a71.entry.js → p-7a24425d.entry.js} +1 -1
  124. package/lib/duet/{p-a52c08c6.entry.js → p-7e46cb73.entry.js} +1 -1
  125. package/lib/duet/{p-04145769.system.js → p-82d3171d.system.js} +1 -1
  126. package/lib/duet/{p-eb7c1a1d.system.entry.js → p-86565a1a.system.entry.js} +2 -2
  127. package/lib/duet/{p-85b2213b.system.entry.js → p-87d500c2.system.entry.js} +1 -1
  128. package/lib/duet/{p-128983f7.system.entry.js → p-88a9fc7c.system.entry.js} +1 -1
  129. package/lib/duet/{p-123c8434.system.entry.js → p-89564214.system.entry.js} +1 -1
  130. package/lib/duet/{p-97bdc2bf.entry.js → p-8a0299fb.entry.js} +1 -1
  131. package/lib/duet/{p-e0b5e649.entry.js → p-906611b7.entry.js} +1 -1
  132. package/lib/duet/{p-f414ff23.system.entry.js → p-918ad15f.system.entry.js} +1 -1
  133. package/lib/duet/{p-00db0857.system.entry.js → p-971f8880.system.entry.js} +1 -1
  134. package/lib/duet/{p-f125dfff.system.js → p-99457149.system.js} +1 -1
  135. package/lib/duet/{p-ef99ea4d.entry.js → p-a54fb28f.entry.js} +1 -1
  136. package/lib/duet/p-a63f753e.system.js +4 -0
  137. package/lib/duet/{p-1a2ab8e8.system.entry.js → p-a6974134.system.entry.js} +1 -1
  138. package/lib/duet/{p-285e2473.system.entry.js → p-a87a33f4.system.entry.js} +2 -2
  139. package/lib/duet/{p-30a28555.system.entry.js → p-a9e9112d.system.entry.js} +1 -1
  140. package/lib/duet/p-abf8eaf7.js +4 -0
  141. package/lib/duet/{p-4c8d801e.system.entry.js → p-ae1e63fc.system.entry.js} +1 -1
  142. package/lib/duet/{p-2495cec7.system.entry.js → p-b0bde198.system.entry.js} +1 -1
  143. package/lib/duet/{p-d494f1a3.system.entry.js → p-b57856ea.system.entry.js} +1 -1
  144. package/lib/duet/p-b6d51921.system.js +4 -0
  145. package/lib/duet/{p-b5bc8221.entry.js → p-b7906516.entry.js} +1 -1
  146. package/lib/duet/{p-36e7114b.system.entry.js → p-bac34cd4.system.entry.js} +1 -1
  147. package/lib/duet/p-bb1a594c.entry.js +4 -0
  148. package/lib/duet/{p-ea5a73c3.system.entry.js → p-bc0356dd.system.entry.js} +1 -1
  149. package/lib/duet/{p-87bedb24.system.entry.js → p-be1bc370.system.entry.js} +1 -1
  150. package/lib/duet/p-bef4f0ab.entry.js +4 -0
  151. package/lib/duet/{p-9a8d5b11.system.js → p-c466bad9.system.js} +1 -1
  152. package/lib/duet/{p-c5037594.entry.js → p-c4c1c9e8.entry.js} +1 -1
  153. package/lib/duet/{p-aa16ca33.system.entry.js → p-c512a307.system.entry.js} +1 -1
  154. package/lib/duet/{p-912eed2f.entry.js → p-c5f6ab22.entry.js} +1 -1
  155. package/lib/duet/{p-17a8d23c.system.entry.js → p-c76f0697.system.entry.js} +1 -1
  156. package/lib/duet/{p-6733b42f.js → p-c8698d8a.js} +1 -1
  157. package/lib/duet/p-d281c96e.system.entry.js +4 -0
  158. package/lib/duet/{p-9fccab71.entry.js → p-d74e231c.entry.js} +1 -1
  159. package/lib/duet/p-d91eec1f.system.entry.js +4 -0
  160. package/lib/duet/{p-b631407a.system.entry.js → p-df4857f8.system.entry.js} +1 -1
  161. package/lib/duet/{p-086325ff.system.entry.js → p-e073de9a.system.entry.js} +1 -1
  162. package/lib/duet/{p-ee6d9bc6.entry.js → p-e3945d28.entry.js} +1 -1
  163. package/lib/duet/p-ede854e1.js +4 -0
  164. package/lib/duet/p-f233cbe6.js +4 -0
  165. package/lib/duet/{p-70fafc98.system.js → p-f69b64c9.system.js} +1 -1
  166. package/lib/duet/{p-901ddd73.system.entry.js → p-f708dc6c.system.entry.js} +1 -1
  167. package/lib/duet/{p-f056be12.entry.js → p-f7aa0500.entry.js} +1 -1
  168. package/lib/duet/{p-104c3fa5.system.entry.js → p-f8f31ff0.system.entry.js} +1 -1
  169. package/lib/duet/{p-42d3a162.system.entry.js → p-f9784014.system.entry.js} +1 -1
  170. package/lib/duet/{p-c0071398.system.entry.js → p-fbfc5798.system.entry.js} +1 -1
  171. package/lib/duet/{p-5d997107.entry.js → p-fc02305a.entry.js} +1 -1
  172. package/lib/esm/duet-action-button.entry.js +5 -5
  173. package/lib/esm/duet-alert.entry.js +4 -4
  174. package/lib/esm/duet-badge.entry.js +2 -2
  175. package/lib/esm/duet-breadcrumb.entry.js +2 -2
  176. package/lib/esm/duet-breadcrumbs.entry.js +4 -4
  177. package/lib/esm/duet-button_2.entry.js +4 -4
  178. package/lib/esm/duet-caption_4.entry.js +4 -4
  179. package/lib/esm/duet-card.entry.js +4 -4
  180. package/lib/esm/duet-checkbox.entry.js +2 -2
  181. package/lib/esm/duet-choice_2.entry.js +6 -6
  182. package/lib/esm/duet-collapsible.entry.js +4 -4
  183. package/lib/esm/duet-combobox.entry.js +386 -0
  184. package/lib/esm/duet-cookie-consent.entry.js +2 -2
  185. package/lib/esm/duet-date-picker.entry.js +5 -5
  186. package/lib/esm/duet-divider_2.entry.js +2 -2
  187. package/lib/esm/duet-editable-table_3.entry.js +10 -8
  188. package/lib/esm/duet-empty-state.entry.js +2 -2
  189. package/lib/esm/duet-fieldset.entry.js +2 -2
  190. package/lib/esm/duet-footer.entry.js +6 -6
  191. package/lib/esm/duet-grid_2.entry.js +2 -2
  192. package/lib/esm/duet-header_2.entry.js +48 -11
  193. package/lib/esm/duet-hero.entry.js +4 -4
  194. package/lib/esm/duet-icon.entry.js +2 -2
  195. package/lib/esm/duet-input_2.entry.js +19 -4
  196. package/lib/esm/duet-layout.entry.js +1 -1
  197. package/lib/esm/duet-list_2.entry.js +2 -2
  198. package/lib/esm/duet-modal.entry.js +6 -6
  199. package/lib/esm/duet-notification_2.entry.js +4 -4
  200. package/lib/esm/duet-number-input.entry.js +5 -5
  201. package/lib/esm/duet-pagination_2.entry.js +5 -5
  202. package/lib/esm/duet-progress.entry.js +4 -4
  203. package/lib/esm/duet-radio_2.entry.js +2 -2
  204. package/lib/esm/duet-range-slider.entry.js +2 -2
  205. package/lib/esm/duet-scrollable_3.entry.js +12 -8
  206. package/lib/esm/duet-select.entry.js +3 -3
  207. package/lib/esm/duet-step_2.entry.js +3 -3
  208. package/lib/esm/duet-textarea.entry.js +3 -3
  209. package/lib/esm/duet-toggle.entry.js +2 -2
  210. package/lib/esm/duet-tooltip.entry.js +4 -4
  211. package/lib/esm/duet-tray.entry.js +4 -4
  212. package/lib/esm/duet-upload-aria-status.entry.js +1 -1
  213. package/lib/esm/duet-visually-hidden.entry.js +1 -1
  214. package/lib/esm/duet.js +2 -2
  215. package/lib/esm/{focus-utils-d02ee9d2.js → focus-utils-8681b5ae.js} +1 -1
  216. package/lib/esm/{index-3cfa1b7e.js → index-ff5be49a.js} +1 -1
  217. package/lib/esm/{input-utils-f4cafee1.js → input-utils-de45e099.js} +1 -1
  218. package/lib/esm/{keyboard-utils-6eb55cd5.js → keyboard-utils-88ea1007.js} +2 -1
  219. package/lib/esm/{language-utils-344d894c.js → language-utils-bf701d37.js} +1 -1
  220. package/lib/esm/loader.js +2 -2
  221. package/lib/esm/{string-utils-2f1793b8.js → string-utils-5954f458.js} +6 -0
  222. package/lib/esm/themeable-component-e8fc98bf.js +13 -0
  223. package/lib/esm-es5/duet-action-button.entry.js +1 -1
  224. package/lib/esm-es5/duet-alert.entry.js +1 -1
  225. package/lib/esm-es5/duet-badge.entry.js +1 -1
  226. package/lib/esm-es5/duet-breadcrumb.entry.js +1 -1
  227. package/lib/esm-es5/duet-breadcrumbs.entry.js +1 -1
  228. package/lib/esm-es5/duet-button_2.entry.js +1 -1
  229. package/lib/esm-es5/duet-caption_4.entry.js +1 -1
  230. package/lib/esm-es5/duet-card.entry.js +1 -1
  231. package/lib/esm-es5/duet-checkbox.entry.js +1 -1
  232. package/lib/esm-es5/duet-choice_2.entry.js +2 -2
  233. package/lib/esm-es5/duet-collapsible.entry.js +1 -1
  234. package/lib/esm-es5/duet-combobox.entry.js +4 -0
  235. package/lib/esm-es5/duet-cookie-consent.entry.js +1 -1
  236. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  237. package/lib/esm-es5/duet-divider_2.entry.js +1 -1
  238. package/lib/esm-es5/duet-editable-table_3.entry.js +1 -1
  239. package/lib/esm-es5/duet-empty-state.entry.js +1 -1
  240. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  241. package/lib/esm-es5/duet-footer.entry.js +1 -1
  242. package/lib/esm-es5/duet-grid_2.entry.js +1 -1
  243. package/lib/esm-es5/duet-header_2.entry.js +2 -2
  244. package/lib/esm-es5/duet-hero.entry.js +1 -1
  245. package/lib/esm-es5/duet-icon.entry.js +1 -1
  246. package/lib/esm-es5/duet-input_2.entry.js +1 -1
  247. package/lib/esm-es5/duet-layout.entry.js +1 -1
  248. package/lib/esm-es5/duet-list_2.entry.js +1 -1
  249. package/lib/esm-es5/duet-modal.entry.js +1 -1
  250. package/lib/esm-es5/duet-notification_2.entry.js +1 -1
  251. package/lib/esm-es5/duet-number-input.entry.js +1 -1
  252. package/lib/esm-es5/duet-pagination_2.entry.js +1 -1
  253. package/lib/esm-es5/duet-progress.entry.js +1 -1
  254. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  255. package/lib/esm-es5/duet-range-slider.entry.js +1 -1
  256. package/lib/esm-es5/duet-scrollable_3.entry.js +2 -2
  257. package/lib/esm-es5/duet-select.entry.js +1 -1
  258. package/lib/esm-es5/duet-step_2.entry.js +1 -1
  259. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  260. package/lib/esm-es5/duet-toggle.entry.js +1 -1
  261. package/lib/esm-es5/duet-tooltip.entry.js +1 -1
  262. package/lib/esm-es5/duet-tray.entry.js +1 -1
  263. package/lib/esm-es5/duet-upload-aria-status.entry.js +1 -1
  264. package/lib/esm-es5/duet-visually-hidden.entry.js +1 -1
  265. package/lib/esm-es5/duet.js +1 -1
  266. package/lib/esm-es5/{focus-utils-d02ee9d2.js → focus-utils-8681b5ae.js} +1 -1
  267. package/lib/esm-es5/index-ff5be49a.js +4 -0
  268. package/lib/esm-es5/input-utils-de45e099.js +4 -0
  269. package/lib/esm-es5/keyboard-utils-88ea1007.js +4 -0
  270. package/lib/esm-es5/{language-utils-344d894c.js → language-utils-bf701d37.js} +1 -1
  271. package/lib/esm-es5/loader.js +1 -1
  272. package/lib/esm-es5/string-utils-5954f458.js +4 -0
  273. package/lib/esm-es5/themeable-component-e8fc98bf.js +4 -0
  274. package/lib/html.html-data.json +5325 -0
  275. package/lib/types/components/duet-combobox/duet-combobox-select-single.d.ts +8 -0
  276. package/lib/types/components/duet-combobox/duet-combobox-select.d.ts +14 -0
  277. package/lib/types/components/duet-combobox/duet-combobox.d.ts +131 -0
  278. package/lib/types/components/duet-footer/duet-footer.d.ts +4 -0
  279. package/lib/types/components/duet-header/duet-header.d.ts +16 -0
  280. package/lib/types/components/duet-input/duet-input.d.ts +13 -0
  281. package/lib/types/components/duet-tab-group/duet-tab-group.d.ts +4 -0
  282. package/lib/types/components.d.ts +120 -1
  283. package/package.json +5 -5
  284. package/lib/cjs/themeable-component-0c1be552.js +0 -12
  285. package/lib/duet/p-195f73d6.entry.js +0 -4
  286. package/lib/duet/p-2764f081.js +0 -4
  287. package/lib/duet/p-74780bca.system.js +0 -4
  288. package/lib/duet/p-7e2e9a28.js +0 -4
  289. package/lib/duet/p-898f30a5.js +0 -4
  290. package/lib/duet/p-98228d0a.system.js +0 -4
  291. package/lib/duet/p-986779fb.js +0 -4
  292. package/lib/duet/p-9a945278.system.js +0 -4
  293. package/lib/duet/p-9dfcd29a.js +0 -4
  294. package/lib/duet/p-a0b09d95.system.entry.js +0 -4
  295. package/lib/duet/p-a28cf57b.js +0 -4
  296. package/lib/duet/p-a8ff3a13.entry.js +0 -4
  297. package/lib/duet/p-b769b313.entry.js +0 -4
  298. package/lib/duet/p-c9097a6c.system.entry.js +0 -4
  299. package/lib/duet/p-d70b3f27.entry.js +0 -4
  300. package/lib/duet/p-d8c526b4.entry.js +0 -4
  301. package/lib/duet/p-efaa0c04.system.js +0 -4
  302. package/lib/esm/themeable-component-572685dd.js +0 -10
  303. package/lib/esm-es5/index-3cfa1b7e.js +0 -4
  304. package/lib/esm-es5/input-utils-f4cafee1.js +0 -4
  305. package/lib/esm-es5/keyboard-utils-6eb55cd5.js +0 -4
  306. package/lib/esm-es5/string-utils-2f1793b8.js +0 -4
  307. package/lib/esm-es5/themeable-component-572685dd.js +0 -4
@@ -0,0 +1,592 @@
1
+ /*!
2
+ * Built with Duet Design System
3
+ */
4
+ import { Build, Component, Element, Event, h, Host, Listen, Method, Prop, State, Watch, } from "@stencil/core";
5
+ import { debounce } from "../../utils/js-utils";
6
+ import { isArrowDownKey, isArrowUpKey, isEnterKey, isEscapeKey, isTabKey } from "../../utils/keyboard-utils";
7
+ import { getLanguage, getLocaleString } from "../../utils/language-utils";
8
+ import { parsePossibleJSON } from "../../utils/string-utils";
9
+ import { inheritGlobalTheme } from "../../utils/themeable-component";
10
+ import { DuetComboBoxSelect } from "./duet-combobox-select";
11
+ export class DuetCombobox {
12
+ constructor() {
13
+ // Safari doesnt properly support aria-activedecendatn, the code associated with this bool is a workaround for that,
14
+ // this should be removed when Safari fixes the issue
15
+ // see: https://a11ysupport.io/tests/apg__aria-1-2-combobox-with-list-autocomplete-example#assertion-aria-aria-activedescendant_attribute-convey_value-aria-combobox_role-vo_macos-safari
16
+ this.isSafari = false;
17
+ this.resizeObserver = new ResizeObserver(debounce(entries => {
18
+ var _a, _b;
19
+ // otherwise, something is wrong, expecting 1 element only
20
+ if ((entries === null || entries === void 0 ? void 0 : entries.length) === 1) {
21
+ const currentWidth = (_b = (_a = entries[0]) === null || _a === void 0 ? void 0 : _a.target) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().width;
22
+ this.listContainer.style.width = `${currentWidth + 1}px`;
23
+ // this.listElement.style.width = `${currentWidth + 1}px`
24
+ }
25
+ }, 100));
26
+ this.processedItems = null;
27
+ this.inputWidth = 0;
28
+ this.inputValue = "";
29
+ this.selectionMsg = "";
30
+ this.listOpen = false;
31
+ // the selected item is based upon the DuetComboboxItem.id value
32
+ this.selectedItems = new Set();
33
+ // the activeItem number is based upon the array.index of the array stored in processedItems
34
+ this.activeItem = undefined;
35
+ /**
36
+ * Placeholder defaults
37
+ * @default { fi: "pp.kk.vvvv", en: "dd.mm.yyyy", sv: "dd.mm.åååå" }
38
+ */
39
+ this.accessibleLabelDefaults = {
40
+ en: {
41
+ heading: "Select:",
42
+ item: "{name}, ({current} of {total})",
43
+ itemFiltered: "{name}, ({current} of {total}, {hiddenItems} filtered)",
44
+ },
45
+ fi: {
46
+ heading: "Valitse:",
47
+ item: "{name}, ({current}/{total})",
48
+ itemFiltered: "{name}, ({current}/{total}, {hiddenItems} suodatettu)",
49
+ },
50
+ sv: {
51
+ heading: "Välj:",
52
+ item: "{name}, ({current} av {total})",
53
+ itemFiltered: "{name}, ({current} av {total}, {hiddenItems} filtrerade)",
54
+ },
55
+ };
56
+ /**
57
+ * Hint text to display before the user types into the date picker input.
58
+ * @default {
59
+ * heading: "Valitse:",
60
+ * item: "{0}, ({1}/{2})",
61
+ * itemFiltered: "{0}, ({1}/{2} - {3} suodatettu"
62
+ * }
63
+ */
64
+ this.accessibleLabels = getLocaleString(parsePossibleJSON(this.accessibleLabelDefaults), getLanguage());
65
+ /**
66
+ * Theme of the combobox.
67
+ */
68
+ this.theme = "";
69
+ /**
70
+ * Force the user to make a selection (typing things in the input field will only be used for list search)
71
+ */
72
+ this.force = false;
73
+ /**
74
+ * A hook to overwrite how the values are displayed in the input field after a User select an item
75
+ * @example (item) => `${item.name} (${item.value})`
76
+ * @default undefined
77
+ */
78
+ this.formatter = (item) => item && item.name ? item.name : "";
79
+ }
80
+ activeItemHandler(state) {
81
+ this.input.accessibleActiveDescendant = this.listOpen && (state || state === 0) ? `active_item` : "";
82
+ }
83
+ handleDocumentClick(e) {
84
+ //we want to remove all user text if they have NOT selected from the dropdown
85
+ const path = e.composedPath();
86
+ const isClickOutside = path.every(el => el !== this.element);
87
+ if (isClickOutside) {
88
+ this.updateInputText(true);
89
+ this.listOpen = false;
90
+ }
91
+ }
92
+ /**
93
+ * Exposes a formatter function to format the item value displayed after a user selects an item
94
+ * @param item: DuetComboboxItem
95
+ */
96
+ async formatItem(item) {
97
+ return this.formatter(item);
98
+ }
99
+ /**
100
+ * Component lifecycle events.
101
+ */
102
+ componentWillLoad() {
103
+ inheritGlobalTheme(this);
104
+ }
105
+ connectedCallback() {
106
+ if (Build.isServer) {
107
+ return;
108
+ }
109
+ if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
110
+ this.isSafari = true;
111
+ }
112
+ this.items = this.processedItems = parsePossibleJSON(this.items);
113
+ this.input = this.element.querySelector("duet-input");
114
+ this.input.addEventListener("duetChange", this.updateInputValue.bind(this));
115
+ this.input.addEventListener("click", () => {
116
+ this.inputValue.length ? (this.listOpen = true) : (this.listOpen = false);
117
+ });
118
+ this.element.addEventListener("keydown", this.handleInputKeyDownEvent.bind(this));
119
+ //add correct aria attributes to the input element
120
+ this.input.accessibleAutocomplete = "list";
121
+ this.input.accessibleControls = "duet-combobox-list-element";
122
+ }
123
+ disconnectedCallback() {
124
+ if (Build.isServer) {
125
+ return;
126
+ }
127
+ this.input.removeEventListener("duetChange", this.updateInputValue.bind(this));
128
+ this.input.removeEventListener("click", () => this.inputValue.length ? (this.listOpen = true) : (this.listOpen = false));
129
+ this.element.removeEventListener("keydown", this.handleInputKeyDownEvent.bind(this));
130
+ this.listElement.removeEventListener("click", e => {
131
+ e.stopPropagation();
132
+ });
133
+ this.resizeObserver.disconnect();
134
+ }
135
+ componentDidLoad() {
136
+ // observe resize events to dynamically adjust size of dropdown area
137
+ this.resizeObserver.observe(this.input);
138
+ this.listElement.addEventListener("click", e => {
139
+ e.stopPropagation();
140
+ });
141
+ }
142
+ /**
143
+ * Updates the input text based on the selected/clicked items.
144
+ * @param event - event
145
+ *'param item: DuetComboboxItem - the item that was selected
146
+ */
147
+ onListClick(e, item) {
148
+ e.preventDefault();
149
+ // update selected item with id
150
+ this.updateSelectedItems(item.id);
151
+ this.listOpen = false;
152
+ return this.listOpen;
153
+ }
154
+ /**
155
+ * Helper function that checks inputs in the field, compares it with the item list and returns true when inputvalue matches selectedItem id
156
+ * TODO: this should be disabled in multiple mode
157
+ */
158
+ shouldListBeFiltered() {
159
+ if (this.selectedItems.size && this.input.value === this.inputValue) {
160
+ const item = this.items.filter(item => this.selectedItems.has(item.id));
161
+ return !(this.formatter(item).toLowerCase() === this.input.value.toLowerCase());
162
+ }
163
+ return true;
164
+ }
165
+ /**
166
+ * Helper function that return correct collection depending on filter status returend by shouldListBeFiltered
167
+ */
168
+ returnFilteredOrNonFiltered() {
169
+ return this.processedItems
170
+ ? this.shouldListBeFiltered()
171
+ ? this.getFilteredItems()
172
+ : this.sortFilteredItems(this.processedItems)
173
+ : [];
174
+ }
175
+ /**
176
+ * Updates the selected items based on the item id.
177
+ * @param id
178
+ * @private
179
+ */
180
+ async updateSelectedItems(id) {
181
+ // for a multiple scenario wrap this in an if/else and just don't clear here
182
+ this.selectedItems.clear();
183
+ if (this.selectedItems) {
184
+ if (this.selectedItems.has(id)) {
185
+ this.selectedItems.delete(id);
186
+ }
187
+ else {
188
+ this.selectedItems.add(id);
189
+ }
190
+ }
191
+ await this.updateInputText();
192
+ }
193
+ /**
194
+ * Updates the input text based on the selected/clicked items.
195
+ * @param bool -override to clear if invoked by "click outside"
196
+ */
197
+ async updateInputText(isBlurred = false) {
198
+ const item = this.selectedItems.size === 0 ? [] : this.items.filter(item => this.selectedItems.has(item.id));
199
+ if (this.selectedItems.size === 1) {
200
+ this.input.value = ""; // set value to empty so that cursor position follows accordingly
201
+ this.input.value = await this.formatItem(item[0]);
202
+ this.input.scrollLeft = this.input.scrollWidth;
203
+ this.activeItem = undefined;
204
+ this.value = await this.formatItem(item[0]);
205
+ this.duetChange.emit({
206
+ value: item[0].value,
207
+ item: item[0],
208
+ component: "duet-combobox",
209
+ });
210
+ }
211
+ else if (isBlurred && this.selectedItems.size === 0) {
212
+ //if nothing is selected and a user clicks outside, we want the input field to clearly illustrate that nothing was selected
213
+ if (this.force) {
214
+ this.inputValue = "";
215
+ this.input.value = "";
216
+ }
217
+ this.activeItem = undefined;
218
+ }
219
+ this.listOpen = false;
220
+ }
221
+ updateInputValue(e) {
222
+ var _a;
223
+ this.inputValue = e.detail.value;
224
+ this.listOpen = String(this.inputValue).length > 0 && ((_a = this.getFilteredItems()) === null || _a === void 0 ? void 0 : _a.length) > 0;
225
+ }
226
+ handleInputKeyDownEvent(e) {
227
+ //if selection is made, close the list and update internal and external values
228
+ // this should be set to undefined on everything BUT up/down arrow according to the aria 1.1 specs
229
+ // https://www.w3.org/TR/wai-aria-practices-1.1/#combobox
230
+ this.input.accessibleActiveDescendant = undefined;
231
+ if (isEnterKey(e)) {
232
+ e.preventDefault();
233
+ this.selectActiveItem();
234
+ this.listOpen = false;
235
+ return;
236
+ }
237
+ //tabbing out or escaping, restore initial state
238
+ if (isEscapeKey(e) || isTabKey(e)) {
239
+ this.updateInputText(true);
240
+ this.listOpen = false;
241
+ return;
242
+ }
243
+ //handle arrow up/down navigation
244
+ let nextActiveItem = this.activeItem;
245
+ if (isArrowUpKey(e)) {
246
+ e.preventDefault();
247
+ nextActiveItem = this.activeItem - 1;
248
+ }
249
+ else if (isArrowDownKey(e)) {
250
+ e.preventDefault();
251
+ nextActiveItem = this.listOpen ? this.activeItem + 1 : this.activeItem;
252
+ this.listOpen = true;
253
+ }
254
+ if (isArrowDownKey(e) || isArrowUpKey(e)) {
255
+ const listItems = this.shouldListBeFiltered() ? this.getFilteredItems() : this.processedItems;
256
+ if (nextActiveItem < 0 || !nextActiveItem) {
257
+ nextActiveItem = 0;
258
+ }
259
+ if (nextActiveItem >= listItems.length) {
260
+ nextActiveItem = listItems.length - 1;
261
+ }
262
+ // this should be set to undefined on everything BUT up/down arrow according to the aria 1.1 specs
263
+ // https://www.w3.org/TR/wai-aria-practices-1.1/#combobox
264
+ this.input.accessibleActiveDescendant = "active_item";
265
+ this.activeItem = nextActiveItem;
266
+ this.scrollToActive();
267
+ }
268
+ this.announceActive();
269
+ return;
270
+ }
271
+ selectActiveItem() {
272
+ if (this.activeItem === undefined) {
273
+ return;
274
+ }
275
+ const filteredItem = this.returnFilteredOrNonFiltered();
276
+ const item = filteredItem[this.activeItem];
277
+ this.updateSelectedItems(item.id);
278
+ }
279
+ announceActive(items) {
280
+ if (!items) {
281
+ items = this.returnFilteredOrNonFiltered();
282
+ }
283
+ if (this.activeItem === undefined || this.activeItem === -1) {
284
+ return;
285
+ }
286
+ const item = items[this.activeItem];
287
+ this.selectionMsg = this.formatLabel(item, items.length, this.items.length);
288
+ }
289
+ //function that scrolls to the li element with the class "active"
290
+ scrollToActive() {
291
+ const activeElement = this.listElement.querySelector(".active");
292
+ if (activeElement) {
293
+ activeElement.scrollIntoView({
294
+ behavior: "smooth",
295
+ block: "center",
296
+ });
297
+ }
298
+ }
299
+ formatLabel(item, length, itemsLength) {
300
+ if (!item || itemsLength === undefined) {
301
+ return "";
302
+ }
303
+ const labelString = length === itemsLength ? this.accessibleLabels.item : this.accessibleLabels.itemFiltered;
304
+ return labelString
305
+ .replace("{name}", String(item.name))
306
+ .replace("{current}", String(this.activeItem + 1))
307
+ .replace("{total}", String(length))
308
+ .replace("{hiddenItems}", String(itemsLength - length));
309
+ }
310
+ /**
311
+ * Filter the items based on the input value
312
+ */
313
+ getFilteredItems() {
314
+ // filter items based on user inputs
315
+ const filteredItems = this.processedItems.filter(item =>
316
+ // filter by name and value
317
+ // if value contains inputvalue
318
+ String(item.value).toLowerCase().includes(this.inputValue.toLowerCase()) ||
319
+ // if name contains input value
320
+ String(item.name).toLowerCase().includes(this.inputValue.toLowerCase()) ||
321
+ // if the item is selected
322
+ this.selectedItems.has(item.id));
323
+ return this.sortFilteredItems(filteredItems);
324
+ }
325
+ /**
326
+ * Sort the return from getFilteredItems so that any item with and item.id that matches this.selectedItems is placed first
327
+ */
328
+ sortFilteredItems(items) {
329
+ if (items.length > 0) {
330
+ items
331
+ .filter(item => this.selectedItems.has(item.id))
332
+ .forEach(item => {
333
+ const index = items.indexOf(item);
334
+ items.splice(index, 1);
335
+ items.unshift(item);
336
+ });
337
+ }
338
+ return items;
339
+ }
340
+ /**
341
+ * render() function
342
+ * Always the last one in the class.
343
+ */
344
+ render() {
345
+ const selectElements = this.returnFilteredOrNonFiltered();
346
+ return (h(Host, { role: "combobox", "aria-expanded": this.listOpen ? "true" : "false", "aria-owns": this.listOpen ? "duet-combobox-list-element" : undefined, "aria-haspopup": "listbox", class: {
347
+ "duet-combobox": true,
348
+ [`duet-theme-${this.theme}`]: true,
349
+ } },
350
+ h("slot", null),
351
+ this.isSafari && (h("duet-visually-hidden", { "aria-live": "assertive", "aria-atomic": "true", "aria-relevant": "all" }, this.selectionMsg)),
352
+ h("div", { role: "list", class: {
353
+ "duet-combobox-list": true,
354
+ open: this.listOpen,
355
+ }, ref: el => (this.listContainer = el) },
356
+ h("ul", { role: "listbox", ref: el => (this.listElement = el), id: "duet-combobox-list-element", class: "listbox" }, this.processedItems &&
357
+ selectElements.map((item, index) => {
358
+ return (h(DuetComboBoxSelect, { item: item, active: index === this.activeItem, selected: this.selectedItems.has(item.id), search: this.inputValue, total: selectElements.length, clickHandler: e => this.onListClick(e, item), label: this.formatLabel(item, this.returnFilteredOrNonFiltered().length, this.items.length) }));
359
+ })))));
360
+ }
361
+ static get is() { return "duet-combobox"; }
362
+ static get encapsulation() { return "scoped"; }
363
+ static get originalStyleUrls() { return {
364
+ "$": ["duet-combobox.scss"]
365
+ }; }
366
+ static get styleUrls() { return {
367
+ "$": ["duet-combobox.css"]
368
+ }; }
369
+ static get properties() { return {
370
+ "accessibleLabelDefaults": {
371
+ "type": "string",
372
+ "mutable": false,
373
+ "complexType": {
374
+ "original": "DuetLangObject | string",
375
+ "resolved": "DuetLangObject | string",
376
+ "references": {
377
+ "DuetLangObject": {
378
+ "location": "import",
379
+ "path": "../../utils/language-utils"
380
+ }
381
+ }
382
+ },
383
+ "required": false,
384
+ "optional": false,
385
+ "docs": {
386
+ "tags": [{
387
+ "name": "default",
388
+ "text": "{ fi: \"pp.kk.vvvv\", en: \"dd.mm.yyyy\", sv: \"dd.mm.\u00E5\u00E5\u00E5\u00E5\" }"
389
+ }],
390
+ "text": "Placeholder defaults"
391
+ },
392
+ "attribute": "accessible-label-defaults",
393
+ "reflect": false,
394
+ "defaultValue": "{\n en: {\n heading: \"Select:\",\n item: \"{name}, ({current} of {total})\",\n itemFiltered: \"{name}, ({current} of {total}, {hiddenItems} filtered)\",\n },\n fi: {\n heading: \"Valitse:\",\n item: \"{name}, ({current}/{total})\",\n itemFiltered: \"{name}, ({current}/{total}, {hiddenItems} suodatettu)\",\n },\n sv: {\n heading: \"V\u00E4lj:\",\n item: \"{name}, ({current} av {total})\",\n itemFiltered: \"{name}, ({current} av {total}, {hiddenItems} filtrerade)\",\n },\n }"
395
+ },
396
+ "accessibleLabels": {
397
+ "type": "unknown",
398
+ "mutable": false,
399
+ "complexType": {
400
+ "original": "Record<string, string>",
401
+ "resolved": "{ [x: string]: string; }",
402
+ "references": {
403
+ "Record": {
404
+ "location": "global"
405
+ }
406
+ }
407
+ },
408
+ "required": false,
409
+ "optional": false,
410
+ "docs": {
411
+ "tags": [{
412
+ "name": "default",
413
+ "text": "{\nheading: \"Valitse:\",\nitem: \"{0}, ({1}/{2})\",\nitemFiltered: \"{0}, ({1}/{2} - {3} suodatettu\"\n}"
414
+ }],
415
+ "text": "Hint text to display before the user types into the date picker input."
416
+ },
417
+ "defaultValue": "getLocaleString(\n parsePossibleJSON(this.accessibleLabelDefaults),\n getLanguage()\n )"
418
+ },
419
+ "theme": {
420
+ "type": "string",
421
+ "mutable": true,
422
+ "complexType": {
423
+ "original": "DuetTheme",
424
+ "resolved": "\"\" | \"default\" | \"turva\"",
425
+ "references": {
426
+ "DuetTheme": {
427
+ "location": "import",
428
+ "path": "../../common-types"
429
+ }
430
+ }
431
+ },
432
+ "required": false,
433
+ "optional": false,
434
+ "docs": {
435
+ "tags": [],
436
+ "text": "Theme of the combobox."
437
+ },
438
+ "attribute": "theme",
439
+ "reflect": false,
440
+ "defaultValue": "\"\""
441
+ },
442
+ "force": {
443
+ "type": "boolean",
444
+ "mutable": false,
445
+ "complexType": {
446
+ "original": "boolean",
447
+ "resolved": "boolean",
448
+ "references": {}
449
+ },
450
+ "required": false,
451
+ "optional": false,
452
+ "docs": {
453
+ "tags": [],
454
+ "text": "Force the user to make a selection (typing things in the input field will only be used for list search)"
455
+ },
456
+ "attribute": "force",
457
+ "reflect": false,
458
+ "defaultValue": "false"
459
+ },
460
+ "items": {
461
+ "type": "any",
462
+ "mutable": true,
463
+ "complexType": {
464
+ "original": "any",
465
+ "resolved": "any",
466
+ "references": {}
467
+ },
468
+ "required": false,
469
+ "optional": false,
470
+ "docs": {
471
+ "tags": [],
472
+ "text": "Array of item objects."
473
+ },
474
+ "attribute": "items",
475
+ "reflect": false
476
+ },
477
+ "formatter": {
478
+ "type": "unknown",
479
+ "mutable": false,
480
+ "complexType": {
481
+ "original": "(item: DuetComboboxItem) => string",
482
+ "resolved": "(item: DuetComboboxItem) => string",
483
+ "references": {
484
+ "DuetComboboxItem": {
485
+ "location": "local"
486
+ }
487
+ }
488
+ },
489
+ "required": false,
490
+ "optional": false,
491
+ "docs": {
492
+ "tags": [{
493
+ "name": "example",
494
+ "text": "(item) => `${item.name} (${item.value})`"
495
+ }, {
496
+ "name": "default",
497
+ "text": "undefined"
498
+ }],
499
+ "text": "A hook to overwrite how the values are displayed in the input field after a User select an item"
500
+ },
501
+ "defaultValue": "(item: DuetComboboxItem) =>\n item && item.name ? item.name : \"\""
502
+ },
503
+ "value": {
504
+ "type": "string",
505
+ "mutable": true,
506
+ "complexType": {
507
+ "original": "string",
508
+ "resolved": "string",
509
+ "references": {}
510
+ },
511
+ "required": false,
512
+ "optional": false,
513
+ "docs": {
514
+ "tags": [],
515
+ "text": "Object containing selected item/s"
516
+ },
517
+ "attribute": "value",
518
+ "reflect": true
519
+ }
520
+ }; }
521
+ static get states() { return {
522
+ "processedItems": {},
523
+ "inputWidth": {},
524
+ "inputValue": {},
525
+ "selectionMsg": {},
526
+ "listOpen": {},
527
+ "selectedItems": {},
528
+ "activeItem": {}
529
+ }; }
530
+ static get events() { return [{
531
+ "method": "duetChange",
532
+ "name": "duetChange",
533
+ "bubbles": false,
534
+ "cancelable": true,
535
+ "composed": true,
536
+ "docs": {
537
+ "tags": [],
538
+ "text": "Emitted when a keyboard input occurred."
539
+ },
540
+ "complexType": {
541
+ "original": "DuetComboboxEvent",
542
+ "resolved": "{ originalEvent?: Event; component: \"duet-combobox\"; value: any; item: DuetComboboxItem; }",
543
+ "references": {
544
+ "DuetComboboxEvent": {
545
+ "location": "local"
546
+ }
547
+ }
548
+ }
549
+ }]; }
550
+ static get methods() { return {
551
+ "formatItem": {
552
+ "complexType": {
553
+ "signature": "(item: DuetComboboxItem) => Promise<string>",
554
+ "parameters": [{
555
+ "tags": [{
556
+ "name": "param",
557
+ "text": "item : DuetComboboxItem"
558
+ }],
559
+ "text": ": DuetComboboxItem"
560
+ }],
561
+ "references": {
562
+ "Promise": {
563
+ "location": "global"
564
+ },
565
+ "DuetComboboxItem": {
566
+ "location": "local"
567
+ }
568
+ },
569
+ "return": "Promise<string>"
570
+ },
571
+ "docs": {
572
+ "text": "Exposes a formatter function to format the item value displayed after a user selects an item",
573
+ "tags": [{
574
+ "name": "param",
575
+ "text": "item : DuetComboboxItem"
576
+ }]
577
+ }
578
+ }
579
+ }; }
580
+ static get elementRef() { return "element"; }
581
+ static get watchers() { return [{
582
+ "propName": "activeItem",
583
+ "methodName": "activeItemHandler"
584
+ }]; }
585
+ static get listeners() { return [{
586
+ "name": "click",
587
+ "method": "handleDocumentClick",
588
+ "target": "document",
589
+ "capture": false,
590
+ "passive": false
591
+ }]; }
592
+ }
@@ -19,6 +19,10 @@ const createEvent = (ev, data) => ({
19
19
  data,
20
20
  originalEvent: ev,
21
21
  });
22
+ /**
23
+ * @part top - piercing selector for styling the top part of the footer
24
+ * @part menu - piercing selector for styling the menu section of the footer
25
+ */
22
26
  export class DuetFooter {
23
27
  constructor() {
24
28
  /**
@@ -117,7 +121,7 @@ export class DuetFooter {
117
121
  "duet-footer-simple": this.variation === "simple",
118
122
  } },
119
123
  h("div", { class: "duet-footer-wrapper" },
120
- h("div", { class: "duet-footer-top" },
124
+ h("div", { class: "duet-footer-top", part: "top" },
121
125
  this.variation !== "simple" && (h("duet-logo", { href: this.logoHref, onClick: this.handleLogoClick, size: "large", inverse: true, language: this.language, theme: this.theme })),
122
126
  this.processedItems &&
123
127
  this.variation !== "simple" &&
@@ -129,7 +133,7 @@ export class DuetFooter {
129
133
  ", ",
130
134
  this.accessibleLabelExternal),
131
135
  h("div", { class: "duet-footer-arrow" }, item.external ? (h("duet-icon", { icon: newWindowIcon.svg, size: "xx-small", margin: "none", color: "currentColor" })) : (h("duet-icon", { icon: arrowRightIcon.svg, size: "auto", margin: "none", color: "currentColor" }))))))),
132
- h("p", { class: "duet-footer-menu" },
136
+ h("p", { class: "duet-footer-menu", part: "menu" },
133
137
  h("span", { class: "duet-footer-copyright" }, `${copyrightLabel} ${new Date().getFullYear()}`),
134
138
  this.processedMenu && (h(Fragment, null,
135
139
  h("span", { class: "duet-footer-divider", role: "presentation", "aria-hidden": "true" }, "/"),
@@ -838,11 +838,23 @@ button {
838
838
  transition: 300ms ease;
839
839
  transform: scale(0.85) translateZ(0) translateY(-20px);
840
840
  }
841
+ .duet-header-dropdown .duet-header-dropdown-content.duet-header-session-items {
842
+ right: 0%;
843
+ left: auto;
844
+ min-width: 225px;
845
+ }
846
+ .duet-header-dropdown .duet-header-dropdown-content.duet-header-session-items .duet-header-session-label {
847
+ padding: 0 20px;
848
+ font-weight: 600;
849
+ }
841
850
  }
842
851
  @media (min-width: 64.0625em) {
843
852
  .duet-header-dropdown .duet-header-dropdown-content {
844
853
  min-width: 170px;
845
854
  }
855
+ .duet-header-dropdown .duet-header-dropdown-content.duet-header-session-items {
856
+ min-width: 225px;
857
+ }
846
858
  }
847
859
  .duet-header-dropdown .duet-header-dropdown-content.active {
848
860
  display: block;
@@ -1105,6 +1117,9 @@ button {
1105
1117
  .duet-header-multi-level-desktop-utils > :last-child::before {
1106
1118
  display: none;
1107
1119
  }
1120
+ .duet-header-multi-level-desktop-utils > :last-child.duet-header-dropdown .duet-header-button::before {
1121
+ display: none;
1122
+ }
1108
1123
  .duet-header-multi-level-desktop-utils .duet-header-dropdown {
1109
1124
  z-index: 400;
1110
1125
  }