@duetds/components 8.5.5 → 8.6.1

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 (274) hide show
  1. package/hydrate/index.js +315 -273
  2. package/lib/cjs/duet-action-button.cjs.entry.js +5 -6
  3. package/lib/cjs/duet-alert.cjs.entry.js +1 -1
  4. package/lib/cjs/duet-banner.cjs.entry.js +1 -1
  5. package/lib/cjs/duet-callout.cjs.entry.js +1 -1
  6. package/lib/cjs/duet-chip.cjs.entry.js +9 -2
  7. package/lib/cjs/duet-choice_2.cjs.entry.js +8 -1
  8. package/lib/cjs/duet-collapsible.cjs.entry.js +1 -1
  9. package/lib/cjs/duet-combobox.cjs.entry.js +260 -127
  10. package/lib/cjs/duet-date-picker.cjs.entry.js +1 -1
  11. package/lib/cjs/duet-fieldset.cjs.entry.js +1 -1
  12. package/lib/cjs/duet-hero.cjs.entry.js +1 -1
  13. package/lib/cjs/duet-input_2.cjs.entry.js +39 -3
  14. package/lib/cjs/duet-menu-bar-button.cjs.entry.js +2 -34
  15. package/lib/cjs/duet-menu-bar-dropdown.cjs.entry.js +2 -37
  16. package/lib/cjs/duet-menu-bar-link.cjs.entry.js +2 -37
  17. package/lib/cjs/duet-modal.cjs.entry.js +1 -1
  18. package/lib/cjs/duet-multiselect.cjs.entry.js +1 -1
  19. package/lib/cjs/duet-number-input.cjs.entry.js +1 -1
  20. package/lib/cjs/duet-promo-card.cjs.entry.js +1 -1
  21. package/lib/cjs/duet-radio_2.cjs.entry.js +1 -1
  22. package/lib/cjs/duet-scrollable_3.cjs.entry.js +1 -1
  23. package/lib/cjs/duet-select.cjs.entry.js +1 -1
  24. package/lib/cjs/duet-slideout-panel.cjs.entry.js +1 -1
  25. package/lib/cjs/duet-slideout.cjs.entry.js +1 -1
  26. package/lib/cjs/duet-submenu-bar-dropdown.cjs.entry.js +2 -5
  27. package/lib/cjs/duet-submenu-bar-link.cjs.entry.js +2 -37
  28. package/lib/cjs/duet-textarea.cjs.entry.js +1 -1
  29. package/lib/cjs/duet.cjs.js +1 -1
  30. package/lib/cjs/loader.cjs.js +1 -1
  31. package/lib/cjs/{slot-utils-f5073417.js → slot-utils-03a40c78.js} +3 -1
  32. package/lib/collection/components/duet-action-button/duet-action-button.js +6 -8
  33. package/lib/collection/components/duet-chip/duet-chip.css +7 -0
  34. package/lib/collection/components/duet-chip/duet-chip.js +29 -2
  35. package/lib/collection/components/duet-choice-group/duet-choice-group.e2e.js +15 -0
  36. package/lib/collection/components/duet-choice-group/duet-choice-group.js +31 -0
  37. package/lib/collection/components/duet-combobox/duet-combobox-select-single.js +2 -2
  38. package/lib/collection/components/duet-combobox/duet-combobox.css +10 -2
  39. package/lib/collection/components/duet-combobox/duet-combobox.e2e.js +81 -51
  40. package/lib/collection/components/duet-combobox/duet-combobox.js +321 -142
  41. package/lib/collection/components/duet-input/duet-input.css +29 -0
  42. package/lib/collection/components/duet-input/duet-input.js +159 -3
  43. package/lib/collection/components/duet-menu-bar-button/duet-menu-bar-button.css +10 -0
  44. package/lib/collection/components/duet-menu-bar-button/duet-menu-bar-button.js +1 -38
  45. package/lib/collection/components/duet-menu-bar-dropdown/duet-menu-bar-dropdown.css +10 -0
  46. package/lib/collection/components/duet-menu-bar-dropdown/duet-menu-bar-dropdown.js +1 -41
  47. package/lib/collection/components/duet-menu-bar-link/duet-menu-bar-link.css +10 -0
  48. package/lib/collection/components/duet-menu-bar-link/duet-menu-bar-link.js +1 -41
  49. package/lib/collection/components/duet-submenu-bar-dropdown/duet-submenu-bar-dropdown.css +10 -0
  50. package/lib/collection/components/duet-submenu-bar-dropdown/duet-submenu-bar-dropdown.js +2 -6
  51. package/lib/collection/components/duet-submenu-bar-link/duet-submenu-bar-link.css +10 -0
  52. package/lib/collection/components/duet-submenu-bar-link/duet-submenu-bar-link.js +1 -41
  53. package/lib/collection/utils/slot-utils.js +3 -1
  54. package/lib/dist-custom-elements/duet-action-button.js +1 -1
  55. package/lib/dist-custom-elements/duet-alert.js +1 -1
  56. package/lib/dist-custom-elements/duet-banner.js +1 -1
  57. package/lib/dist-custom-elements/duet-breadcrumb.js +1 -1
  58. package/lib/dist-custom-elements/duet-callout.js +1 -1
  59. package/lib/dist-custom-elements/duet-card.js +1 -1
  60. package/lib/dist-custom-elements/duet-chip.js +1 -273
  61. package/lib/dist-custom-elements/duet-choice-group.js +14 -6
  62. package/lib/dist-custom-elements/duet-choice.js +2 -2
  63. package/lib/dist-custom-elements/duet-collapsible.js +2 -2
  64. package/lib/dist-custom-elements/duet-combobox.js +326 -132
  65. package/lib/dist-custom-elements/duet-cookie-consent.js +1 -1
  66. package/lib/dist-custom-elements/duet-date-picker.js +6 -6
  67. package/lib/dist-custom-elements/duet-editable-table.js +2 -2
  68. package/lib/dist-custom-elements/duet-fieldset.js +1 -1
  69. package/lib/dist-custom-elements/duet-footer.js +1 -1
  70. package/lib/dist-custom-elements/duet-header.js +1 -1
  71. package/lib/dist-custom-elements/duet-hero.js +1 -1
  72. package/lib/dist-custom-elements/duet-input.js +1 -1
  73. package/lib/dist-custom-elements/duet-menu-bar-button.js +2 -35
  74. package/lib/dist-custom-elements/duet-menu-bar-dropdown-link.js +1 -1
  75. package/lib/dist-custom-elements/duet-menu-bar-dropdown.js +3 -39
  76. package/lib/dist-custom-elements/duet-menu-bar-link.js +3 -39
  77. package/lib/dist-custom-elements/duet-modal.js +2 -2
  78. package/lib/dist-custom-elements/duet-multiselect.js +5 -5
  79. package/lib/dist-custom-elements/duet-notification-drawer.js +1 -1
  80. package/lib/dist-custom-elements/duet-notification.js +1 -1
  81. package/lib/dist-custom-elements/duet-number-input.js +6 -6
  82. package/lib/dist-custom-elements/duet-pagination.js +6 -6
  83. package/lib/dist-custom-elements/duet-popup-menu.js +1 -1
  84. package/lib/dist-custom-elements/duet-promo-card.js +1 -1
  85. package/lib/dist-custom-elements/duet-radio-group.js +5 -5
  86. package/lib/dist-custom-elements/duet-range-slider.js +1 -1
  87. package/lib/dist-custom-elements/duet-range-stepper.js +2 -2
  88. package/lib/dist-custom-elements/duet-scrollable.js +1 -1
  89. package/lib/dist-custom-elements/duet-select.js +1 -1
  90. package/lib/dist-custom-elements/duet-show-more.js +1 -1
  91. package/lib/dist-custom-elements/duet-slideout-panel.js +1 -1
  92. package/lib/dist-custom-elements/duet-slideout.js +2 -2
  93. package/lib/dist-custom-elements/duet-step.js +1 -1
  94. package/lib/dist-custom-elements/duet-submenu-bar-dropdown-link.js +1 -1
  95. package/lib/dist-custom-elements/duet-submenu-bar-dropdown.js +3 -7
  96. package/lib/dist-custom-elements/duet-submenu-bar-item.js +1 -1
  97. package/lib/dist-custom-elements/duet-submenu-bar-link.js +4 -40
  98. package/lib/dist-custom-elements/duet-tab-group.js +6 -6
  99. package/lib/dist-custom-elements/duet-tab.js +1 -1
  100. package/lib/dist-custom-elements/duet-textarea.js +4 -4
  101. package/lib/dist-custom-elements/duet-toggle.js +1 -1
  102. package/lib/dist-custom-elements/duet-toolbar-dropdown-link.js +1 -1
  103. package/lib/dist-custom-elements/duet-toolbar-dropdown.js +1 -1
  104. package/lib/dist-custom-elements/duet-tooltip-button.js +1 -1
  105. package/lib/dist-custom-elements/duet-tooltip-popup.js +1 -1
  106. package/lib/dist-custom-elements/duet-tooltip.js +1 -1
  107. package/lib/dist-custom-elements/duet-tray.js +1 -1
  108. package/lib/dist-custom-elements/duet-upload-item.js +1 -1
  109. package/lib/dist-custom-elements/duet-upload.js +5 -5
  110. package/lib/dist-custom-elements/{p-cff358b0.js → p-014c1177.js} +49 -8
  111. package/lib/dist-custom-elements/{p-d87f6dd5.js → p-06e608ae.js} +3 -1
  112. package/lib/dist-custom-elements/{p-9cdbc360.js → p-0cee8a12.js} +1 -1
  113. package/lib/dist-custom-elements/{p-9a833e56.js → p-28ec3461.js} +1 -1
  114. package/lib/dist-custom-elements/{p-d191ba9e.js → p-45fd4d84.js} +1 -1
  115. package/lib/dist-custom-elements/{p-89d58b60.js → p-6d366100.js} +3 -3
  116. package/lib/dist-custom-elements/p-755dd68f.js +285 -0
  117. package/lib/dist-custom-elements/{p-e44c0eff.js → p-785686e3.js} +1 -1
  118. package/lib/dist-custom-elements/{p-e00d43f3.js → p-92a16064.js} +1 -1
  119. package/lib/dist-custom-elements/{p-f9f9e33d.js → p-a02e62f3.js} +3 -3
  120. package/lib/dist-custom-elements/{p-0d5c0a22.js → p-c8415e2f.js} +1 -1
  121. package/lib/dist-custom-elements/{p-12a0876b.js → p-cb694530.js} +1 -1
  122. package/lib/dist-custom-elements/{p-d848b48d.js → p-e702eb52.js} +4 -4
  123. package/lib/dist-custom-elements/{p-c3d02eb2.js → p-f4ac6968.js} +6 -7
  124. package/lib/duet/duet.esm.js +1 -1
  125. package/lib/duet/{p-88a46585.system.entry.js → p-061f4be0.system.entry.js} +1 -1
  126. package/lib/duet/p-06e608ae.js +4 -0
  127. package/lib/duet/{p-8ca813cb.system.entry.js → p-0778ccde.system.entry.js} +1 -1
  128. package/lib/duet/p-07ac7f3e.system.entry.js +4 -0
  129. package/lib/duet/p-15e24bf0.entry.js +4 -0
  130. package/lib/duet/{p-0dac34a4.system.entry.js → p-1ef0e5ca.system.entry.js} +1 -1
  131. package/lib/duet/{p-c9781f22.entry.js → p-2084a65f.entry.js} +1 -1
  132. package/lib/duet/{p-fd0bb0bf.entry.js → p-23cecf9f.entry.js} +1 -1
  133. package/lib/duet/p-25048bf8.system.entry.js +4 -0
  134. package/lib/duet/{p-09e4195f.system.entry.js → p-257800b7.system.entry.js} +1 -1
  135. package/lib/duet/{p-892a5644.system.entry.js → p-27363096.system.entry.js} +1 -1
  136. package/lib/duet/{p-1afd901a.entry.js → p-29491f9f.entry.js} +1 -1
  137. package/lib/duet/{p-3b5ff822.entry.js → p-3302d75d.entry.js} +1 -1
  138. package/lib/duet/{p-7629cd0a.entry.js → p-40375e30.entry.js} +1 -1
  139. package/lib/duet/{p-480f37b6.entry.js → p-436fcaf7.entry.js} +1 -1
  140. package/lib/duet/{p-ba4445cf.system.entry.js → p-45bb3cd0.system.entry.js} +1 -1
  141. package/lib/duet/p-4781cd58.entry.js +4 -0
  142. package/lib/duet/p-4cb5943c.entry.js +4 -0
  143. package/lib/duet/{p-b2f2992f.system.entry.js → p-4de910bd.system.entry.js} +1 -1
  144. package/lib/duet/p-51e3af7b.system.entry.js +4 -0
  145. package/lib/duet/p-6151635f.system.js +1 -1
  146. package/lib/duet/{p-d349dd93.entry.js → p-67382632.entry.js} +1 -1
  147. package/lib/duet/p-70b705ad.entry.js +4 -0
  148. package/lib/duet/{p-699a98b4.entry.js → p-76e54ff5.entry.js} +1 -1
  149. package/lib/duet/{p-4d2ef0e2.entry.js → p-7a161455.entry.js} +1 -1
  150. package/lib/duet/{p-3d38079c.entry.js → p-7ca15c93.entry.js} +1 -1
  151. package/lib/duet/{p-bb09fff0.system.entry.js → p-7de614df.system.entry.js} +1 -1
  152. package/lib/duet/p-82d1fd63.system.entry.js +4 -0
  153. package/lib/duet/{p-7c1db591.system.entry.js → p-8a4ba903.system.entry.js} +1 -1
  154. package/lib/duet/{p-4f32a7ee.entry.js → p-8ba91848.entry.js} +1 -1
  155. package/lib/duet/p-9065a864.entry.js +4 -0
  156. package/lib/duet/{p-708359ec.system.entry.js → p-999fff8d.system.entry.js} +1 -1
  157. package/lib/duet/p-9ac25886.system.entry.js +4 -0
  158. package/lib/duet/{p-9d91a1dd.system.entry.js → p-9e75e5d8.system.entry.js} +1 -1
  159. package/lib/duet/{p-343d037e.entry.js → p-a3afb1af.entry.js} +1 -1
  160. package/lib/duet/{p-2ca6a8a0.system.entry.js → p-a3e90064.system.entry.js} +1 -1
  161. package/lib/duet/{p-cd87960a.system.entry.js → p-a659cdb5.system.entry.js} +1 -1
  162. package/lib/duet/p-ae21ad57.system.js +4 -0
  163. package/lib/duet/p-b02ca265.entry.js +4 -0
  164. package/lib/duet/{p-ce05fe6d.system.entry.js → p-b2fc4b72.system.entry.js} +1 -1
  165. package/lib/duet/{p-84778369.entry.js → p-b5595969.entry.js} +1 -1
  166. package/lib/duet/p-c12d34fd.system.entry.js +4 -0
  167. package/lib/duet/{p-bf51f8a5.system.entry.js → p-c68602c9.system.entry.js} +1 -1
  168. package/lib/duet/p-c776e072.entry.js +4 -0
  169. package/lib/duet/p-d1d79e0c.entry.js +4 -0
  170. package/lib/duet/{p-f6530332.system.entry.js → p-d5721f0d.system.entry.js} +1 -1
  171. package/lib/duet/{p-c00fe4ed.entry.js → p-dc133655.entry.js} +1 -1
  172. package/lib/duet/p-de5054b6.system.entry.js +4 -0
  173. package/lib/duet/{p-61feb701.entry.js → p-df345202.entry.js} +1 -1
  174. package/lib/duet/{p-2628a322.entry.js → p-e0907f29.entry.js} +1 -1
  175. package/lib/duet/p-e333b9fc.system.entry.js +4 -0
  176. package/lib/duet/p-e411627f.entry.js +4 -0
  177. package/lib/duet/{p-da51c71f.system.entry.js → p-eafed149.system.entry.js} +1 -1
  178. package/lib/duet/p-f2279e1e.entry.js +4 -0
  179. package/lib/duet/{p-b1ab1664.system.entry.js → p-fa311641.system.entry.js} +1 -1
  180. package/lib/duet/{p-320318de.system.entry.js → p-fa72c79b.system.entry.js} +1 -1
  181. package/lib/duet/p-ffab115e.entry.js +4 -0
  182. package/lib/esm/duet-action-button.entry.js +5 -6
  183. package/lib/esm/duet-alert.entry.js +1 -1
  184. package/lib/esm/duet-banner.entry.js +1 -1
  185. package/lib/esm/duet-callout.entry.js +1 -1
  186. package/lib/esm/duet-chip.entry.js +9 -2
  187. package/lib/esm/duet-choice_2.entry.js +8 -1
  188. package/lib/esm/duet-collapsible.entry.js +1 -1
  189. package/lib/esm/duet-combobox.entry.js +261 -128
  190. package/lib/esm/duet-date-picker.entry.js +1 -1
  191. package/lib/esm/duet-fieldset.entry.js +1 -1
  192. package/lib/esm/duet-hero.entry.js +1 -1
  193. package/lib/esm/duet-input_2.entry.js +39 -3
  194. package/lib/esm/duet-menu-bar-button.entry.js +2 -34
  195. package/lib/esm/duet-menu-bar-dropdown.entry.js +2 -37
  196. package/lib/esm/duet-menu-bar-link.entry.js +2 -37
  197. package/lib/esm/duet-modal.entry.js +1 -1
  198. package/lib/esm/duet-multiselect.entry.js +1 -1
  199. package/lib/esm/duet-number-input.entry.js +1 -1
  200. package/lib/esm/duet-promo-card.entry.js +1 -1
  201. package/lib/esm/duet-radio_2.entry.js +1 -1
  202. package/lib/esm/duet-scrollable_3.entry.js +1 -1
  203. package/lib/esm/duet-select.entry.js +1 -1
  204. package/lib/esm/duet-slideout-panel.entry.js +1 -1
  205. package/lib/esm/duet-slideout.entry.js +1 -1
  206. package/lib/esm/duet-submenu-bar-dropdown.entry.js +2 -5
  207. package/lib/esm/duet-submenu-bar-link.entry.js +2 -37
  208. package/lib/esm/duet-textarea.entry.js +1 -1
  209. package/lib/esm/duet.js +1 -1
  210. package/lib/esm/loader.js +1 -1
  211. package/lib/esm/{slot-utils-1115a819.js → slot-utils-b50aaef5.js} +3 -1
  212. package/lib/esm-es5/duet-action-button.entry.js +1 -1
  213. package/lib/esm-es5/duet-alert.entry.js +1 -1
  214. package/lib/esm-es5/duet-banner.entry.js +1 -1
  215. package/lib/esm-es5/duet-callout.entry.js +1 -1
  216. package/lib/esm-es5/duet-chip.entry.js +1 -1
  217. package/lib/esm-es5/duet-choice_2.entry.js +1 -1
  218. package/lib/esm-es5/duet-collapsible.entry.js +1 -1
  219. package/lib/esm-es5/duet-combobox.entry.js +2 -2
  220. package/lib/esm-es5/duet-date-picker.entry.js +1 -1
  221. package/lib/esm-es5/duet-fieldset.entry.js +1 -1
  222. package/lib/esm-es5/duet-hero.entry.js +1 -1
  223. package/lib/esm-es5/duet-input_2.entry.js +2 -2
  224. package/lib/esm-es5/duet-menu-bar-button.entry.js +1 -1
  225. package/lib/esm-es5/duet-menu-bar-dropdown.entry.js +2 -2
  226. package/lib/esm-es5/duet-menu-bar-link.entry.js +1 -1
  227. package/lib/esm-es5/duet-modal.entry.js +1 -1
  228. package/lib/esm-es5/duet-multiselect.entry.js +1 -1
  229. package/lib/esm-es5/duet-number-input.entry.js +2 -2
  230. package/lib/esm-es5/duet-promo-card.entry.js +2 -2
  231. package/lib/esm-es5/duet-radio_2.entry.js +1 -1
  232. package/lib/esm-es5/duet-scrollable_3.entry.js +1 -1
  233. package/lib/esm-es5/duet-select.entry.js +1 -1
  234. package/lib/esm-es5/duet-slideout-panel.entry.js +1 -1
  235. package/lib/esm-es5/duet-slideout.entry.js +1 -1
  236. package/lib/esm-es5/duet-submenu-bar-dropdown.entry.js +2 -2
  237. package/lib/esm-es5/duet-submenu-bar-link.entry.js +1 -1
  238. package/lib/esm-es5/duet-textarea.entry.js +1 -1
  239. package/lib/esm-es5/duet.js +1 -1
  240. package/lib/esm-es5/loader.js +1 -1
  241. package/lib/esm-es5/slot-utils-b50aaef5.js +4 -0
  242. package/lib/types/components/duet-chip/duet-chip.d.ts +4 -0
  243. package/lib/types/components/duet-choice-group/duet-choice-group.d.ts +5 -0
  244. package/lib/types/components/duet-combobox/duet-combobox.d.ts +49 -35
  245. package/lib/types/components/duet-input/duet-input.d.ts +30 -0
  246. package/lib/types/components/duet-menu-bar-button/duet-menu-bar-button.d.ts +1 -7
  247. package/lib/types/components/duet-menu-bar-dropdown/duet-menu-bar-dropdown.d.ts +1 -7
  248. package/lib/types/components/duet-menu-bar-link/duet-menu-bar-link.d.ts +1 -10
  249. package/lib/types/components/duet-submenu-bar-dropdown/duet-submenu-bar-dropdown.d.ts +1 -2
  250. package/lib/types/components/duet-submenu-bar-link/duet-submenu-bar-link.d.ts +1 -10
  251. package/lib/types/components.d.ts +45 -21
  252. package/package.json +2 -2
  253. package/lib/duet/p-0de8d0c0.system.entry.js +0 -4
  254. package/lib/duet/p-3f2d14e3.system.entry.js +0 -4
  255. package/lib/duet/p-7cf03aa8.system.js +0 -4
  256. package/lib/duet/p-8cc30578.entry.js +0 -4
  257. package/lib/duet/p-92e1181c.entry.js +0 -4
  258. package/lib/duet/p-9735b2f9.entry.js +0 -4
  259. package/lib/duet/p-985c0c67.system.entry.js +0 -4
  260. package/lib/duet/p-9be9b4d2.entry.js +0 -4
  261. package/lib/duet/p-9d27bc65.entry.js +0 -4
  262. package/lib/duet/p-afe29a3e.entry.js +0 -4
  263. package/lib/duet/p-bece15cd.system.entry.js +0 -4
  264. package/lib/duet/p-cba00852.entry.js +0 -4
  265. package/lib/duet/p-cc4a8964.entry.js +0 -4
  266. package/lib/duet/p-cc949a27.entry.js +0 -4
  267. package/lib/duet/p-d50ad3ed.entry.js +0 -4
  268. package/lib/duet/p-d87f6dd5.js +0 -4
  269. package/lib/duet/p-e614e39f.system.entry.js +0 -4
  270. package/lib/duet/p-e7fd0d14.entry.js +0 -4
  271. package/lib/duet/p-e86cafa6.system.entry.js +0 -4
  272. package/lib/duet/p-f1b01db9.system.entry.js +0 -4
  273. package/lib/duet/p-fa21a3b6.system.entry.js +0 -4
  274. package/lib/esm-es5/slot-utils-1115a819.js +0 -4
@@ -5,16 +5,17 @@ import { h, F as Fragment, r as registerInstance, c as createEvent, H as Host, g
5
5
  import { i as inheritGlobalTheme } from './themeable-component-724c0f7e.js';
6
6
  import { c as createID } from './create-id-149a1b6d.js';
7
7
  import { d as debounce } from './js-utils-9b9e0039.js';
8
- import { j as isEnterKey, f as isEscapeKey, o as isTabKey, b as isArrowUpKey, c as isArrowDownKey } from './keyboard-utils-439bcc8b.js';
8
+ import { j as isEnterKey, f as isEscapeKey, o as isTabKey, e as isBackspaceKey, b as isArrowUpKey, c as isArrowDownKey } from './keyboard-utils-439bcc8b.js';
9
9
  import { g as getLocaleString, a as getLanguage, c as connectLanguageChangeObserver, d as disconnectLanguageChangeObserver } from './language-utils-00ca4c55.js';
10
+ import { g as getElementsFromDefaultSlot } from './slot-utils-b50aaef5.js';
10
11
  import { p as parsePossibleJSON } from './string-utils-ca039233.js';
11
12
 
12
13
  const SelectSingle = ({ item, search = "", selected }) => {
13
- const regEx = search !== "" ? new RegExp("(" + search.split(" ").join("|") + ")", "gi") : undefined;
14
+ const regEx = search !== "" ? new RegExp("(" + search.split(" ").join("|") + ")", "i") : undefined;
14
15
  return (h(Fragment, null,
15
16
  selected && h("duet-icon", { class: "option-icon", name: "messaging-checked", size: "xx-small", margin: "none" }),
16
17
  regEx ? (h("span", { class: "option-container", "aria-hidden": "true" },
17
- h("span", { innerHTML: item.name.replace(regEx, '<span class="highlight">$&</span>') }))) : (item.name),
18
+ h("span", { innerHTML: item.name.replace(regEx, '<span class="highlight sc-duet-combobox">$&</span>') }))) : (item.name),
18
19
  item.tags && h("span", { class: "option-tags" }, item.tags.join(", "))));
19
20
  };
20
21
 
@@ -33,7 +34,7 @@ const DuetComboBoxSelect = ({ item, active, total, selected, label = undefined,
33
34
  h(SelectSingle, { item: item, search: search, selected: selected }))));
34
35
  };
35
36
 
36
- const duetComboboxCss = ".sc-duet-combobox-h{box-sizing:border-box;padding:0;margin:0;background:transparent;border:0;-moz-appearance:none;-webkit-appearance:none;appearance:none;position:relative;display:inline-block;width:100%;font-family:\"localtapiola-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(0, 41, 77)}.sc-duet-combobox-h a.sc-duet-combobox{color:rgb(0, 41, 77);transition:none}.duet-theme-turva.sc-duet-combobox-h{font-family:\"turva-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(23, 28, 58)}.duet-theme-turva.sc-duet-combobox-h a.sc-duet-combobox{color:rgb(23, 28, 58)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-tags.sc-duet-combobox{color:rgb(116, 116, 117)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.selected.sc-duet-combobox{background:rgb(244, 207, 214)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover{color:rgb(255, 255, 255);background:rgb(198, 12, 48)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox .option-tags.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus .option-tags.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover .option-tags.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox a.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus a.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover a.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-combobox-list.sc-duet-combobox{position:absolute;top:calc(100% - 12px);z-index:700;display:none;background:rgb(255, 255, 255);border-radius:0 4px;box-shadow:0 2px 10px 0 rgba(0, 41, 77, 0.1)}.duet-combobox-list.open.sc-duet-combobox{display:block}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox{max-height:200px;padding:0.75rem 0;margin:0;overflow-y:scroll;font-weight:600;list-style:none;cursor:pointer;scroll-behavior:smooth}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox{padding:4px 0}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:not(.selected){padding-left:16px}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:not(.selected) .highlight.sc-duet-combobox{text-decoration:underline}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-link.sc-duet-combobox{display:block;width:100%}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-tags.sc-duet-combobox{float:right;padding-right:0.875rem;font-weight:400;color:rgb(144, 149, 153)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option-link.sc-duet-combobox{display:block;width:100%}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.sc-duet-combobox{padding-left:0;background:rgb(205, 229, 241)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.option.sc-duet-combobox .option-icon.sc-duet-combobox{padding:0 8px 0 8px}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.option.sc-duet-combobox .option-tags.sc-duet-combobox{color:rgb(144, 149, 153)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover{color:rgb(255, 255, 255);background:rgb(0, 119, 179)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox .option-tags.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus .option-tags.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover .option-tags.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox a.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus a.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover a.sc-duet-combobox{color:rgb(255, 255, 255)}";
37
+ const duetComboboxCss = ".sc-duet-combobox-h{box-sizing:border-box;padding:0;margin:0;background:transparent;border:0;-moz-appearance:none;-webkit-appearance:none;appearance:none;position:relative;display:inline-block;width:100%;font-family:\"localtapiola-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(0, 41, 77)}.sc-duet-combobox-h a.sc-duet-combobox{color:rgb(0, 41, 77);transition:none}.duet-theme-turva.sc-duet-combobox-h{font-family:\"turva-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(23, 28, 58)}.duet-theme-turva.sc-duet-combobox-h a.sc-duet-combobox{color:rgb(23, 28, 58)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-tags.sc-duet-combobox{color:rgb(116, 116, 117)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.selected.sc-duet-combobox{background:rgb(244, 207, 214)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover{color:rgb(255, 255, 255);background:rgb(198, 12, 48)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox .option-tags.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus .option-tags.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover .option-tags.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox a.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus a.sc-duet-combobox,.duet-theme-turva.sc-duet-combobox-h .duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover a.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-combobox-list.sc-duet-combobox{position:absolute;top:calc(100% - 12px);z-index:700;margin:8px 0 0;visibility:hidden;background:rgb(255, 255, 255);border-radius:0 4px;box-shadow:0 2px 10px 0 rgba(0, 41, 77, 0.1);opacity:0;transition:transform 300ms ease, opacity 300ms ease, visibility 300ms ease;transform:scale(0.96) translateZ(0) translateY(-20px);transform-origin:top right}.duet-combobox-list.open.sc-duet-combobox{visibility:visible;opacity:1;transition-property:transform, opacity;transform:scale(1.0001) translateZ(0) translateY(0)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox{max-height:200px;padding:0.75rem 0;margin:0;overflow-y:scroll;font-weight:600;list-style:none;cursor:pointer;scroll-behavior:smooth}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox{padding:4px 0}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:not(.selected){padding-left:16px}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:not(.selected) .highlight.sc-duet-combobox{text-decoration:underline}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-link.sc-duet-combobox{display:block;width:100%}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option.sc-duet-combobox .option-tags.sc-duet-combobox{float:right;padding-right:0.875rem;font-weight:400;color:rgb(144, 149, 153)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.option-link.sc-duet-combobox{display:block;width:100%}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.sc-duet-combobox{padding-left:0;background:rgb(205, 229, 241)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.option.sc-duet-combobox .option-icon.sc-duet-combobox{padding:0 8px 0 8px}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.selected.option.sc-duet-combobox .option-tags.sc-duet-combobox{color:rgb(144, 149, 153)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover{color:rgb(255, 255, 255);background:rgb(0, 119, 179)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox .option-tags.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus .option-tags.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover .option-tags.sc-duet-combobox{color:rgb(255, 255, 255)}.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.active.sc-duet-combobox a.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:focus a.sc-duet-combobox,.duet-combobox-list.sc-duet-combobox .duet-combobox-listbox.sc-duet-combobox .list-item.sc-duet-combobox:hover a.sc-duet-combobox{color:rgb(255, 255, 255)}";
37
38
 
38
39
  const DuetCombobox = class {
39
40
  constructor(hostRef) {
@@ -49,24 +50,63 @@ const DuetCombobox = class {
49
50
  // this.listElement.style.width = `${currentWidth + 1}px`
50
51
  }
51
52
  }, 100));
52
- this.handleInputKeyDownEvent = (e) => {
53
+ this.onInputChange = async (e) => {
54
+ const newValue = e.detail.value;
55
+ this.inputValue = newValue;
56
+ };
57
+ this.onInputClick = () => {
58
+ var _a, _b;
59
+ if (this.openListOnClick) {
60
+ this.listOpen = !this.listOpen;
61
+ }
62
+ else {
63
+ this.listOpen = ((_a = this.inputValue) === null || _a === void 0 ? void 0 : _a.length) >= this.minCharacters;
64
+ }
65
+ if (!((_b = this.getFilteredItems()) === null || _b === void 0 ? void 0 : _b.length)) {
66
+ this.listOpen = false;
67
+ }
68
+ };
69
+ this.onInputTyping = async (e) => {
70
+ var _a;
71
+ const newValue = e.detail.value;
72
+ if (!this.force && !this.multiple && this.selectedItems.size > 0 && newValue !== this.getSelectedItemLabel()) {
73
+ this.selectedItems.clear();
74
+ }
75
+ this.listOpen = String(newValue).length >= this.minCharacters && ((_a = this.getFilteredItems()) === null || _a === void 0 ? void 0 : _a.length) > 0;
76
+ };
77
+ this.onKeyDown = (e) => {
53
78
  //if selection is made, close the list and update internal and external values
79
+ const listItems = this.returnFilteredOrNonFiltered();
54
80
  // this should be set to undefined on everything BUT up/down arrow according to the aria 1.1 specs
55
81
  // https://www.w3.org/TR/wai-aria-practices-1.1/#combobox
56
82
  this.input.accessibleActiveDescendant = undefined;
57
83
  if (isEnterKey(e)) {
58
84
  e.preventDefault();
59
- this.selectActiveItem();
60
- this.updateInputText(false);
85
+ if (this.listOpen && this.activeItem !== undefined && listItems[this.activeItem]) {
86
+ if (this.multiple) {
87
+ this.addSelectedItem(listItems[this.activeItem].id, true);
88
+ }
89
+ else {
90
+ this.updateSelectedItem(listItems[this.activeItem].id, true);
91
+ }
92
+ }
93
+ this.activeItem = undefined;
61
94
  this.listOpen = false;
62
95
  return;
63
96
  }
64
- //tabbing out or escaping, restore initial state
65
97
  if (isEscapeKey(e) || isTabKey(e)) {
66
98
  this.updateInputText(true);
99
+ this.activeItem = undefined;
67
100
  this.listOpen = false;
68
101
  return;
69
102
  }
103
+ if (isBackspaceKey(e) && this.inputValue === "") {
104
+ if (this.multiple && this.selectedItems.size > 0) {
105
+ const lastItem = Array.from(this.selectedItems).pop();
106
+ this.removeSelectedItem(lastItem, true);
107
+ }
108
+ return;
109
+ }
70
110
  //handle arrow up/down navigation
71
111
  let nextActiveItem = this.activeItem;
72
112
  if (isArrowUpKey(e)) {
@@ -79,7 +119,6 @@ const DuetCombobox = class {
79
119
  this.listOpen = true;
80
120
  }
81
121
  if (isArrowDownKey(e) || isArrowUpKey(e)) {
82
- const listItems = this.shouldListBeFiltered() ? this.getFilteredItems() : this.processedItems;
83
122
  if (nextActiveItem < 0 || !nextActiveItem) {
84
123
  nextActiveItem = 0;
85
124
  }
@@ -92,13 +131,10 @@ const DuetCombobox = class {
92
131
  this.activeItem = nextActiveItem;
93
132
  this.scrollToActive();
94
133
  }
95
- this.announceActive();
96
134
  return;
97
135
  };
98
136
  this.processedItems = null;
99
- this.inputWidth = 0;
100
137
  this.inputValue = "";
101
- this.selectionMsg = "";
102
138
  this.listOpen = false;
103
139
  this.selectedItems = new Set();
104
140
  this.activeItem = undefined;
@@ -120,8 +156,11 @@ const DuetCombobox = class {
120
156
  },
121
157
  };
122
158
  this.accessibleLabels = getLocaleString(this.accessibleLabelDefaults, getLanguage());
159
+ this.label = "";
160
+ this.caption = "";
123
161
  this.theme = "";
124
162
  this.force = false;
163
+ this.multiple = false;
125
164
  this.items = undefined;
126
165
  this.formatter = (item) => item && item.name ? item.name : "";
127
166
  this.value = undefined;
@@ -137,7 +176,7 @@ const DuetCombobox = class {
137
176
  const path = e.composedPath();
138
177
  const isClickOutside = path.every(el => el !== this.element);
139
178
  if (isClickOutside) {
140
- this.updateInputText(true, true);
179
+ this.updateInputText(true);
141
180
  this.listOpen = false;
142
181
  }
143
182
  }
@@ -148,17 +187,67 @@ const DuetCombobox = class {
148
187
  async formatItem(item) {
149
188
  return this.formatter(item);
150
189
  }
151
- async processItems() {
152
- this.items = this.processedItems = parsePossibleJSON(this.items);
153
- await this.updateInputText();
190
+ processItems() {
191
+ const ids = [];
192
+ this.processedItems = parsePossibleJSON(this.items);
193
+ if (!Array.isArray(this.processedItems)) {
194
+ console.error("DuetCombobox: Items should be an array");
195
+ return;
196
+ }
197
+ if (this.processedItems.length !== new Set([...this.processedItems]).size) {
198
+ console.warn("DuetCombobox: Duplicate item values found in the list");
199
+ }
200
+ this.processedItems = this.processedItems.map((item, index) => {
201
+ if (typeof item === "string") {
202
+ item = { name: item, value: item };
203
+ }
204
+ if (item.id !== undefined) {
205
+ item.id = String(item.id);
206
+ }
207
+ else {
208
+ item.id = `${JSON.stringify(item.value)}-${item.name}`;
209
+ }
210
+ if (ids.includes(item.id)) {
211
+ console.warn("DuetCombobox: Duplicate item id found in the list, postfixed with index");
212
+ item.id = `${item.id}-${index}`;
213
+ }
214
+ ids.push(item.id);
215
+ return item;
216
+ });
217
+ // remove any item selections that are no longer in the items list
218
+ const selectionsMissing = Array.from(this.selectedItems).filter(id => !this.processedItems.find(item => item.id === id));
219
+ if (selectionsMissing.length) {
220
+ if (this.multiple) {
221
+ selectionsMissing.forEach(id => this.removeSelectedItem(id));
222
+ }
223
+ else {
224
+ this.updateSelectedItem(selectionsMissing[0], true);
225
+ }
226
+ }
154
227
  }
155
- async processValue() {
156
- if (this.value) {
157
- const selectedItem = this.items.find(item => item.value === this.value);
158
- this.updateSelectedItems(selectedItem.id);
228
+ processValue() {
229
+ // empty string may be valid item value
230
+ if (this.value !== "" && !this.value) {
231
+ this.selectedItems.clear();
232
+ return;
233
+ }
234
+ const values = Array.isArray(this.value) ? this.value : [this.value];
235
+ const ids = this.processedItems.filter(item => values.includes(item.value)).map(item => item.id);
236
+ // if value corresponds to the selectedItems, do nothing
237
+ if (ids.length === this.selectedItems.size && ids.every(id => this.selectedItems.has(id))) {
238
+ return;
239
+ }
240
+ if (this.multiple) {
241
+ this.selectedItems.clear();
242
+ this.input.clearChips();
243
+ ids.forEach(id => this.addSelectedItem(id));
244
+ }
245
+ else {
246
+ const selectedItem = this.processedItems.find(item => item.value === this.value);
247
+ this.updateSelectedItem(selectedItem.id);
159
248
  }
160
249
  }
161
- async processListOpenChange() {
250
+ processListOpenChange() {
162
251
  if (this.openListOnClick) {
163
252
  this.input.icon = this.listOpen ? "action-arrow-up" : "action-arrow-down";
164
253
  }
@@ -171,63 +260,51 @@ const DuetCombobox = class {
171
260
  inheritGlobalTheme(this);
172
261
  }
173
262
  connectedCallback() {
174
- this.items = this.processedItems = parsePossibleJSON(this.items);
175
- this.input = this.element.querySelector("duet-input");
176
- this.input.addEventListener("duetChange", this.updateInputValue.bind(this));
177
- this.input.addEventListener("click", () => {
178
- if (!this.openListOnClick) {
179
- this.inputValue.length >= this.minCharacters ? (this.listOpen = true) : (this.listOpen = false);
180
- }
181
- else {
182
- this.listOpen = !this.listOpen;
183
- }
184
- });
185
- this.element.addEventListener("keydown", this.handleInputKeyDownEvent);
186
- connectLanguageChangeObserver(this, { prop: "accessibleLabels", defaults: "accessibleLabelDefaults" });
263
+ if (this.items) {
264
+ this.processItems();
265
+ }
266
+ const slottedElements = getElementsFromDefaultSlot(this.element);
267
+ if (slottedElements.length) {
268
+ this.input = slottedElements[0];
269
+ }
270
+ else {
271
+ this.input = document.createElement("duet-input");
272
+ this.input.label = this.label;
273
+ this.input.caption = this.caption;
274
+ this.input.expand = true;
275
+ this.element.prepend(this.input);
276
+ }
277
+ this.input.chips = this.multiple;
278
+ this.input.addEventListener("duetChange", this.onInputChange);
279
+ this.input.addEventListener("duetInput", this.onInputTyping);
280
+ this.input.addEventListener("click", this.onInputClick);
187
281
  //add correct aria attributes to the input element
188
282
  this.input.role = "combobox";
189
283
  this.input.accessibleExpanded = this.listOpen ? "true" : "false";
190
284
  this.input.accessibleAutocomplete = "list";
191
285
  this.input.accessibleControls = this.listBoxId;
286
+ this.element.addEventListener("keydown", this.onKeyDown);
287
+ connectLanguageChangeObserver(this, { prop: "accessibleLabels", defaults: "accessibleLabelDefaults" });
192
288
  this.processListOpenChange();
193
289
  }
194
290
  disconnectedCallback() {
195
- this.input.removeEventListener("duetChange", this.updateInputValue.bind(this));
196
- this.input.removeEventListener("click", () => this.inputValue.length ? (this.listOpen = true) : (this.listOpen = false));
197
- this.element.removeEventListener("keydown", this.handleInputKeyDownEvent);
198
- this.listElement.removeEventListener("click", e => {
199
- e.stopPropagation();
200
- });
291
+ this.input.removeEventListener("duetChange", this.onInputChange);
292
+ this.input.removeEventListener("click", this.onInputClick);
293
+ this.element.removeEventListener("keydown", this.onKeyDown);
201
294
  this.resizeObserver.disconnect();
202
295
  disconnectLanguageChangeObserver(this);
203
296
  }
204
297
  componentDidLoad() {
205
298
  // observe resize events to dynamically adjust size of dropdown area
206
299
  this.resizeObserver.observe(this.input);
207
- this.listElement.addEventListener("click", e => {
208
- e.stopPropagation();
209
- });
210
300
  this.processValue();
211
301
  }
212
- /**
213
- * Updates the input text based on the selected/clicked items.
214
- * @param event - event
215
- *'param item: DuetComboboxItem - the item that was selected
216
- */
217
- onListClick(e, item) {
218
- e.preventDefault();
219
- // update selected item with id
220
- this.updateSelectedItems(item.id, true);
221
- this.listOpen = false;
222
- return this.listOpen;
223
- }
224
302
  /**
225
303
  * Helper function that checks inputs in the field, compares it with the item list and returns true when inputvalue matches selectedItem id
226
- * TODO: this should be disabled in multiple mode
227
304
  */
228
305
  shouldListBeFiltered() {
229
- if (this.selectedItems.size && this.input.value === this.inputValue) {
230
- const item = this.items.filter(item => this.selectedItems.has(item.id));
306
+ if (!this.multiple && this.selectedItems.size && this.input.value === this.inputValue) {
307
+ const item = this.processedItems.find(item => this.selectedItems.has(item.id));
231
308
  return !(this.formatter(item).toLowerCase() === this.input.value.toLowerCase());
232
309
  }
233
310
  return true;
@@ -242,91 +319,135 @@ const DuetCombobox = class {
242
319
  : this.sortFilteredItems(this.processedItems)
243
320
  : [];
244
321
  }
322
+ emitChangeEvent(id) {
323
+ const item = this.processedItems.find(item => item.id === id);
324
+ this.duetChange.emit({
325
+ item,
326
+ value: this.value,
327
+ component: "duet-combobox",
328
+ });
329
+ }
245
330
  /**
246
- * Updates the selected items based on the item id.
247
- * @param id
248
- * @private
331
+ * Updates the value after selected items have changed for multiple selection.
249
332
  */
250
- async updateSelectedItems(id, emitEvent) {
251
- // for a multiple scenario wrap this in an if/else and just don't clear here
252
- this.selectedItems.clear();
253
- if (this.selectedItems) {
254
- if (this.selectedItems.has(id)) {
255
- this.selectedItems.delete(id);
256
- }
257
- else {
258
- this.selectedItems.add(id);
259
- }
333
+ updateMultipleValue() {
334
+ this.value = this.processedItems.filter(item => this.selectedItems.has(item.id)).map(item => item.value);
335
+ this.input.value = "";
336
+ this.updateChips();
337
+ }
338
+ /**
339
+ * Add item with id to the selectedItems set. Used only when multiple is true.
340
+ */
341
+ addSelectedItem(id, emitEvent) {
342
+ if (this.selectedItems.has(id)) {
343
+ return;
260
344
  }
345
+ this.selectedItems.add(id);
346
+ this.updateMultipleValue();
261
347
  if (emitEvent) {
262
- const item = this.selectedItems.size === 0 ? [] : this.items.filter(item => this.selectedItems.has(item.id));
263
- this.duetChange.emit({
264
- value: item[0].value,
265
- item: item[0],
266
- component: "duet-combobox",
267
- });
348
+ this.emitChangeEvent(id);
268
349
  }
269
- await this.updateInputText();
270
350
  }
271
351
  /**
272
- * Updates the input text based on the selected/clicked items.
273
- * @param bool -override to clear if invoked by "click outside"
352
+ * Remove item with id from the selectedItems set. Used only when multiple is true.
274
353
  */
275
- async updateInputText(isBlurred = false, isClickOutside = false) {
276
- const item = this.selectedItems.size === 0 ? [] : this.items.filter(item => this.selectedItems.has(item.id));
277
- //if items changed and given id no longer exists
278
- if (item.length === 0 && this.selectedItems.size > 0) {
279
- this.selectedItems.clear();
280
- this.input.value = "";
354
+ removeSelectedItem(id, emitEvent) {
355
+ if (!this.selectedItems.has(id)) {
356
+ return;
357
+ }
358
+ this.selectedItems.delete(id);
359
+ this.updateMultipleValue();
360
+ if (emitEvent) {
361
+ this.emitChangeEvent(id);
362
+ }
363
+ }
364
+ /**
365
+ * Updates the selected item based on the item id. Used only when multiple is false.
366
+ */
367
+ async updateSelectedItem(id, emitEvent) {
368
+ if (this.selectedItems.has(id)) {
369
+ this.selectedItems.delete(id);
281
370
  this.value = undefined;
282
- this.activeItem = undefined;
283
371
  }
284
- if (!isClickOutside && this.selectedItems.size === 1) {
285
- this.input.value = ""; // set value to empty so that cursor position follows accordingly
286
- this.input.value = await this.formatItem(item[0]);
287
- this.input.scrollLeft = this.input.scrollWidth;
288
- this.activeItem = undefined;
289
- this.value = item[0].value;
372
+ else {
373
+ this.selectedItems.clear();
374
+ this.selectedItems.add(id);
375
+ this.value = this.processedItems.find(item => item.id === id).value;
290
376
  }
291
- if (isBlurred) {
292
- if (this.selectedItems.size === 0) {
293
- this.activeItem = undefined;
294
- if (this.force) {
295
- this.inputValue = "";
296
- this.input.value = "";
297
- }
377
+ if (emitEvent) {
378
+ this.emitChangeEvent(id);
379
+ }
380
+ await this.updateInputText();
381
+ }
382
+ /**
383
+ * Add or remove chips of the input based on the selectedItems Set.
384
+ */
385
+ async updateChips() {
386
+ const ids = Array.from(this.selectedItems);
387
+ const chips = await this.input.getChips();
388
+ ids.forEach(async (id) => {
389
+ const item = this.processedItems.find(i => i.id === id);
390
+ const text = await this.formatItem(item);
391
+ const chipExists = await this.input.hasChip({ value: `${id}`, text });
392
+ if (!chipExists) {
393
+ const chip = document.createElement("duet-chip");
394
+ chip.variation = "input";
395
+ chip.value = `${id}`;
396
+ chip.textContent = text;
397
+ chip.addEventListener("duetRemove", evt => {
398
+ const id = evt.detail.value;
399
+ this.removeSelectedItem(id, true);
400
+ });
401
+ this.input.addChip(chip);
298
402
  }
299
- else if (this.force) {
300
- const selectedValueIndex = [...this.selectedItems][0];
301
- const selectedValueLabel = await this.formatItem(this.items[selectedValueIndex]);
302
- this.inputValue = selectedValueLabel;
303
- this.input.value = selectedValueLabel;
403
+ });
404
+ chips.forEach(chip => {
405
+ if (!ids.includes(chip.value)) {
406
+ chip.remove();
304
407
  }
305
- }
306
- this.listOpen = false;
408
+ });
307
409
  }
308
- updateInputValue(e) {
309
- var _a;
310
- this.inputValue = e.detail.value;
311
- this.listOpen = String(this.inputValue).length >= this.minCharacters && ((_a = this.getFilteredItems()) === null || _a === void 0 ? void 0 : _a.length) > 0;
410
+ async getSelectedItemLabel() {
411
+ const item = this.processedItems.find(item => this.selectedItems.has(item.id));
412
+ const label = item ? await this.formatItem(item) : "";
413
+ return label;
312
414
  }
313
- selectActiveItem() {
314
- if (this.activeItem === undefined) {
415
+ /**
416
+ * Updates the input text when the combobox loses focus or when a selection is made.
417
+ */
418
+ async updateInputText(isBlurred = false) {
419
+ if (isBlurred && this.multiple) {
420
+ this.input.value = "";
315
421
  return;
316
422
  }
317
- const filteredItem = this.returnFilteredOrNonFiltered();
318
- const item = filteredItem[this.activeItem];
319
- this.updateSelectedItems(item.id, true);
423
+ if (isBlurred && this.force) {
424
+ if (this.selectedItems.size === 0) {
425
+ this.input.value = "";
426
+ }
427
+ else {
428
+ this.input.value = await this.getSelectedItemLabel();
429
+ }
430
+ }
431
+ if (!isBlurred && this.selectedItems.size > 0) {
432
+ this.input.value = ""; // set value to empty so that cursor position follows accordingly
433
+ this.input.value = await this.getSelectedItemLabel();
434
+ this.input.scrollLeft = this.input.scrollWidth;
435
+ }
320
436
  }
321
- announceActive(items) {
322
- if (!items) {
323
- items = this.returnFilteredOrNonFiltered();
437
+ // Event handlers
438
+ onListClick(e, item) {
439
+ e.preventDefault();
440
+ e.stopPropagation();
441
+ // update selected item with id
442
+ if (this.multiple) {
443
+ this.addSelectedItem(item.id, true);
324
444
  }
325
- if (this.activeItem === undefined || this.activeItem === -1) {
326
- return;
445
+ else {
446
+ this.updateSelectedItem(item.id, true);
327
447
  }
328
- const item = items[this.activeItem];
329
- this.selectionMsg = structuredClone(this.formatLabel(item, items.length, this.items.length));
448
+ this.activeItem = undefined;
449
+ this.listOpen = false;
450
+ return this.listOpen;
330
451
  }
331
452
  //function that scrolls to the li element with the class "active"
332
453
  scrollToActive() {
@@ -354,16 +475,27 @@ const DuetCombobox = class {
354
475
  */
355
476
  getFilteredItems() {
356
477
  // filter items based on user inputs
357
- const filteredItems = this.processedItems.filter(item => {
358
- var _a, _b, _c, _d;
478
+ const filteredItems = this.processedItems
479
+ .filter(item => {
480
+ var _a, _b, _c, _d, _e;
359
481
  // filter by name and value
360
482
  // if value contains inputvalue
361
483
  return ((_a = String(item.value)) === null || _a === void 0 ? void 0 : _a.toLowerCase()[this.filterType]((_b = this.inputValue) === null || _b === void 0 ? void 0 : _b.toLowerCase())) ||
362
484
  (
363
485
  // if name contains input value
364
486
  (_c = String(item.name)) === null || _c === void 0 ? void 0 : _c.toLowerCase()[this.filterType]((_d = this.inputValue) === null || _d === void 0 ? void 0 : _d.toLowerCase())) ||
487
+ // if name contains input value
488
+ this.formatter(item).toLowerCase()[this.filterType]((_e = this.inputValue) === null || _e === void 0 ? void 0 : _e.toLowerCase()) ||
365
489
  // if the item is selected
366
490
  this.selectedItems.has(item.id);
491
+ })
492
+ // if multiple, filter out the selected items
493
+ .filter(item => {
494
+ let include = true;
495
+ if (this.multiple && this.selectedItems.has(item.id)) {
496
+ include = false;
497
+ }
498
+ return include;
367
499
  });
368
500
  return this.sortFilteredItems(filteredItems);
369
501
  }
@@ -397,9 +529,10 @@ const DuetCombobox = class {
397
529
  }, ref: el => (this.listContainer = el) }, h("ul", { class: {
398
530
  "duet-combobox-listbox-open": this.listOpen,
399
531
  "duet-combobox-listbox": true,
400
- }, role: "listbox", ref: el => (this.listElement = el), id: this.listBoxId }, selectElements.map((item, index) => {
401
- 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, selectElements.length, this.items.length) }));
402
- })))));
532
+ }, role: "listbox", ref: el => (this.listElement = el), id: this.listBoxId }, this.listOpen &&
533
+ selectElements.map((item, index) => {
534
+ 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, selectElements.length, this.processedItems.length) }));
535
+ })))));
403
536
  }
404
537
  get element() { return getElement(this); }
405
538
  static get watchers() { return {
@@ -6,7 +6,7 @@ import { i as inheritGlobalTheme } from './themeable-component-724c0f7e.js';
6
6
  import { c as createID } from './create-id-149a1b6d.js';
7
7
  import { F as FocusGuard } from './focus-utils-ef611bf3.js';
8
8
  import { a as getLanguage, g as getLocaleString, c as connectLanguageChangeObserver, d as disconnectLanguageChangeObserver } from './language-utils-00ca4c55.js';
9
- import { c as checkNamedSlotElement } from './slot-utils-1115a819.js';
9
+ import { c as checkNamedSlotElement } from './slot-utils-b50aaef5.js';
10
10
  import './string-utils-ca039233.js';
11
11
 
12
12
  const formatOptionsShort = { day: "numeric", month: "long" };
@@ -4,7 +4,7 @@
4
4
  import { r as registerInstance, h, H as Host, g as getElement } from './index-356c0666.js';
5
5
  import { i as inheritGlobalTheme } from './themeable-component-724c0f7e.js';
6
6
  import { c as createID } from './create-id-149a1b6d.js';
7
- import { h as hasSlot } from './slot-utils-1115a819.js';
7
+ import { h as hasSlot } from './slot-utils-b50aaef5.js';
8
8
 
9
9
  const duetFieldsetCss = "*,*::after,*::before{box-sizing:border-box;padding:0;margin:0;background:transparent;border:0;-moz-appearance:none;-webkit-appearance:none;appearance:none}:host{box-sizing:border-box;padding:0;margin:0;background:transparent;border:0;-moz-appearance:none;-webkit-appearance:none;appearance:none;margin-bottom:12px !important;display:block;width:100%}:host(.duet-m-0){margin:0 !important}fieldset{position:relative;width:100%;min-width:0;border:0}fieldset legend{position:absolute !important;top:0;width:1px !important;height:1px !important;padding:0 !important;overflow:hidden !important;clip:rect(1px, 1px, 1px, 1px) !important;border:0 !important}.duet-legend-wrapper{position:relative;display:block;width:100%;font-family:\"localtapiola-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";font-size:1rem;font-weight:600;line-height:1.5;color:rgb(0, 41, 77);text-align:left;background:transparent}.duet-legend-wrapper.duet-legend-compact:not(.duet-legend-has-caption){line-height:1.25}.duet-theme-turva .duet-legend-wrapper{font-family:\"turva-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(23, 28, 58)}.duet-fieldset-label{margin-bottom:12px !important;margin-top:8px}.duet-legend-has-caption .duet-fieldset-label{margin-bottom:6px !important}.duet-legend-has-tooltip .duet-fieldset-label{padding-right:36px}@media (min-width: 48em){.duet-legend-has-tooltip .duet-fieldset-label{margin-bottom:3px !important;padding-right:0}}@media (min-width: 48em){.duet-legend-has-tooltip.duet-legend-has-caption .duet-fieldset-label{margin-bottom:-3px !important}}.duet-fieldset-caption{margin-bottom:12px !important}.duet-fieldset-help{display:block;font-family:\"localtapiola-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";font-size:0.875rem;font-weight:400;line-height:1.25;color:rgb(222, 35, 98);border-radius:4px}.duet-fieldset-help span{display:block;margin-top:12px}.duet-theme-turva .duet-fieldset-help{font-family:\"turva-sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";color:rgb(224, 42, 13)}::slotted(duet-tooltip){position:absolute;top:4px;right:0}@media (min-width: 48em){::slotted(duet-tooltip){position:relative;right:auto}}.duet-legend-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}";
10
10