@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,18 +5,29 @@ import { p as proxyCustomElement, H, c as createEvent, h as h$1, d as Host } fro
5
5
  import { i as inheritGlobalTheme } from './p-a58bd561.js';
6
6
  import { c as createID } from './p-5e59e970.js';
7
7
  import { d as debounce } from './p-9e371678.js';
8
- import { c as isEnterKey, b as isEscapeKey, d as isTabKey, e as isArrowUpKey, f as isArrowDownKey } from './p-e44c0eff.js';
8
+ import { c as isEnterKey, b as isEscapeKey, d as isTabKey, e as isBackspaceKey, f as isArrowUpKey, g as isArrowDownKey } from './p-785686e3.js';
9
9
  import { g as getLocaleString, a as getLanguage, c as connectLanguageChangeObserver, d as disconnectLanguageChangeObserver } from './p-2e36d5bf.js';
10
+ import { g as getElementsFromDefaultSlot } from './p-06e608ae.js';
10
11
  import { p as parsePossibleJSON } from './p-0e052642.js';
11
12
  import { h, F as Fragment } from './p-33937fd7.js';
12
- import { d as defineCustomElement$2 } from './p-667579b0.js';
13
+ import { d as defineCustomElement$c } from './p-83231ea8.js';
14
+ import { d as defineCustomElement$b } from './p-b6322d8d.js';
15
+ import { d as defineCustomElement$a } from './p-755dd68f.js';
16
+ import { d as defineCustomElement$9 } from './p-667579b0.js';
17
+ import { d as defineCustomElement$8 } from './p-014c1177.js';
18
+ import { d as defineCustomElement$7 } from './p-e3d597b6.js';
19
+ import { d as defineCustomElement$6 } from './p-63954651.js';
20
+ import { d as defineCustomElement$5 } from './p-a02e62f3.js';
21
+ import { d as defineCustomElement$4 } from './p-c8415e2f.js';
22
+ import { d as defineCustomElement$3 } from './p-0cee8a12.js';
23
+ import { d as defineCustomElement$2 } from './p-d1815d2a.js';
13
24
 
14
25
  const SelectSingle = ({ item, search = "", selected }) => {
15
- const regEx = search !== "" ? new RegExp("(" + search.split(" ").join("|") + ")", "gi") : undefined;
26
+ const regEx = search !== "" ? new RegExp("(" + search.split(" ").join("|") + ")", "i") : undefined;
16
27
  return (h(Fragment, null,
17
28
  selected && h("duet-icon", { class: "option-icon", name: "messaging-checked", size: "xx-small", margin: "none" }),
18
29
  regEx ? (h("span", { class: "option-container", "aria-hidden": "true" },
19
- h("span", { innerHTML: item.name.replace(regEx, '<span class="highlight">$&</span>') }))) : (item.name),
30
+ h("span", { innerHTML: item.name.replace(regEx, '<span class="highlight sc-duet-combobox">$&</span>') }))) : (item.name),
20
31
  item.tags && h("span", { class: "option-tags" }, item.tags.join(", "))));
21
32
  };
22
33
 
@@ -35,7 +46,7 @@ const DuetComboBoxSelect = ({ item, active, total, selected, label = undefined,
35
46
  h(SelectSingle, { item: item, search: search, selected: selected }))));
36
47
  };
37
48
 
38
- 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)}";
49
+ 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)}";
39
50
 
40
51
  const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox extends H {
41
52
  constructor() {
@@ -52,24 +63,63 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
52
63
  // this.listElement.style.width = `${currentWidth + 1}px`
53
64
  }
54
65
  }, 100));
55
- this.handleInputKeyDownEvent = (e) => {
66
+ this.onInputChange = async (e) => {
67
+ const newValue = e.detail.value;
68
+ this.inputValue = newValue;
69
+ };
70
+ this.onInputClick = () => {
71
+ var _a, _b;
72
+ if (this.openListOnClick) {
73
+ this.listOpen = !this.listOpen;
74
+ }
75
+ else {
76
+ this.listOpen = ((_a = this.inputValue) === null || _a === void 0 ? void 0 : _a.length) >= this.minCharacters;
77
+ }
78
+ if (!((_b = this.getFilteredItems()) === null || _b === void 0 ? void 0 : _b.length)) {
79
+ this.listOpen = false;
80
+ }
81
+ };
82
+ this.onInputTyping = async (e) => {
83
+ var _a;
84
+ const newValue = e.detail.value;
85
+ if (!this.force && !this.multiple && this.selectedItems.size > 0 && newValue !== this.getSelectedItemLabel()) {
86
+ this.selectedItems.clear();
87
+ }
88
+ this.listOpen = String(newValue).length >= this.minCharacters && ((_a = this.getFilteredItems()) === null || _a === void 0 ? void 0 : _a.length) > 0;
89
+ };
90
+ this.onKeyDown = (e) => {
56
91
  //if selection is made, close the list and update internal and external values
92
+ const listItems = this.returnFilteredOrNonFiltered();
57
93
  // this should be set to undefined on everything BUT up/down arrow according to the aria 1.1 specs
58
94
  // https://www.w3.org/TR/wai-aria-practices-1.1/#combobox
59
95
  this.input.accessibleActiveDescendant = undefined;
60
96
  if (isEnterKey(e)) {
61
97
  e.preventDefault();
62
- this.selectActiveItem();
63
- this.updateInputText(false);
98
+ if (this.listOpen && this.activeItem !== undefined && listItems[this.activeItem]) {
99
+ if (this.multiple) {
100
+ this.addSelectedItem(listItems[this.activeItem].id, true);
101
+ }
102
+ else {
103
+ this.updateSelectedItem(listItems[this.activeItem].id, true);
104
+ }
105
+ }
106
+ this.activeItem = undefined;
64
107
  this.listOpen = false;
65
108
  return;
66
109
  }
67
- //tabbing out or escaping, restore initial state
68
110
  if (isEscapeKey(e) || isTabKey(e)) {
69
111
  this.updateInputText(true);
112
+ this.activeItem = undefined;
70
113
  this.listOpen = false;
71
114
  return;
72
115
  }
116
+ if (isBackspaceKey(e) && this.inputValue === "") {
117
+ if (this.multiple && this.selectedItems.size > 0) {
118
+ const lastItem = Array.from(this.selectedItems).pop();
119
+ this.removeSelectedItem(lastItem, true);
120
+ }
121
+ return;
122
+ }
73
123
  //handle arrow up/down navigation
74
124
  let nextActiveItem = this.activeItem;
75
125
  if (isArrowUpKey(e)) {
@@ -82,7 +132,6 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
82
132
  this.listOpen = true;
83
133
  }
84
134
  if (isArrowDownKey(e) || isArrowUpKey(e)) {
85
- const listItems = this.shouldListBeFiltered() ? this.getFilteredItems() : this.processedItems;
86
135
  if (nextActiveItem < 0 || !nextActiveItem) {
87
136
  nextActiveItem = 0;
88
137
  }
@@ -95,13 +144,10 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
95
144
  this.activeItem = nextActiveItem;
96
145
  this.scrollToActive();
97
146
  }
98
- this.announceActive();
99
147
  return;
100
148
  };
101
149
  this.processedItems = null;
102
- this.inputWidth = 0;
103
150
  this.inputValue = "";
104
- this.selectionMsg = "";
105
151
  this.listOpen = false;
106
152
  this.selectedItems = new Set();
107
153
  this.activeItem = undefined;
@@ -123,8 +169,11 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
123
169
  },
124
170
  };
125
171
  this.accessibleLabels = getLocaleString(this.accessibleLabelDefaults, getLanguage());
172
+ this.label = "";
173
+ this.caption = "";
126
174
  this.theme = "";
127
175
  this.force = false;
176
+ this.multiple = false;
128
177
  this.items = undefined;
129
178
  this.formatter = (item) => item && item.name ? item.name : "";
130
179
  this.value = undefined;
@@ -140,7 +189,7 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
140
189
  const path = e.composedPath();
141
190
  const isClickOutside = path.every(el => el !== this.element);
142
191
  if (isClickOutside) {
143
- this.updateInputText(true, true);
192
+ this.updateInputText(true);
144
193
  this.listOpen = false;
145
194
  }
146
195
  }
@@ -151,17 +200,67 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
151
200
  async formatItem(item) {
152
201
  return this.formatter(item);
153
202
  }
154
- async processItems() {
155
- this.items = this.processedItems = parsePossibleJSON(this.items);
156
- await this.updateInputText();
203
+ processItems() {
204
+ const ids = [];
205
+ this.processedItems = parsePossibleJSON(this.items);
206
+ if (!Array.isArray(this.processedItems)) {
207
+ console.error("DuetCombobox: Items should be an array");
208
+ return;
209
+ }
210
+ if (this.processedItems.length !== new Set([...this.processedItems]).size) {
211
+ console.warn("DuetCombobox: Duplicate item values found in the list");
212
+ }
213
+ this.processedItems = this.processedItems.map((item, index) => {
214
+ if (typeof item === "string") {
215
+ item = { name: item, value: item };
216
+ }
217
+ if (item.id !== undefined) {
218
+ item.id = String(item.id);
219
+ }
220
+ else {
221
+ item.id = `${JSON.stringify(item.value)}-${item.name}`;
222
+ }
223
+ if (ids.includes(item.id)) {
224
+ console.warn("DuetCombobox: Duplicate item id found in the list, postfixed with index");
225
+ item.id = `${item.id}-${index}`;
226
+ }
227
+ ids.push(item.id);
228
+ return item;
229
+ });
230
+ // remove any item selections that are no longer in the items list
231
+ const selectionsMissing = Array.from(this.selectedItems).filter(id => !this.processedItems.find(item => item.id === id));
232
+ if (selectionsMissing.length) {
233
+ if (this.multiple) {
234
+ selectionsMissing.forEach(id => this.removeSelectedItem(id));
235
+ }
236
+ else {
237
+ this.updateSelectedItem(selectionsMissing[0], true);
238
+ }
239
+ }
157
240
  }
158
- async processValue() {
159
- if (this.value) {
160
- const selectedItem = this.items.find(item => item.value === this.value);
161
- this.updateSelectedItems(selectedItem.id);
241
+ processValue() {
242
+ // empty string may be valid item value
243
+ if (this.value !== "" && !this.value) {
244
+ this.selectedItems.clear();
245
+ return;
246
+ }
247
+ const values = Array.isArray(this.value) ? this.value : [this.value];
248
+ const ids = this.processedItems.filter(item => values.includes(item.value)).map(item => item.id);
249
+ // if value corresponds to the selectedItems, do nothing
250
+ if (ids.length === this.selectedItems.size && ids.every(id => this.selectedItems.has(id))) {
251
+ return;
252
+ }
253
+ if (this.multiple) {
254
+ this.selectedItems.clear();
255
+ this.input.clearChips();
256
+ ids.forEach(id => this.addSelectedItem(id));
257
+ }
258
+ else {
259
+ const selectedItem = this.processedItems.find(item => item.value === this.value);
260
+ this.updateSelectedItem(selectedItem.id);
162
261
  }
163
262
  }
164
- async processListOpenChange() {
263
+ processListOpenChange() {
165
264
  if (this.openListOnClick) {
166
265
  this.input.icon = this.listOpen ? "action-arrow-up" : "action-arrow-down";
167
266
  }
@@ -174,63 +273,51 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
174
273
  inheritGlobalTheme(this);
175
274
  }
176
275
  connectedCallback() {
177
- this.items = this.processedItems = parsePossibleJSON(this.items);
178
- this.input = this.element.querySelector("duet-input");
179
- this.input.addEventListener("duetChange", this.updateInputValue.bind(this));
180
- this.input.addEventListener("click", () => {
181
- if (!this.openListOnClick) {
182
- this.inputValue.length >= this.minCharacters ? (this.listOpen = true) : (this.listOpen = false);
183
- }
184
- else {
185
- this.listOpen = !this.listOpen;
186
- }
187
- });
188
- this.element.addEventListener("keydown", this.handleInputKeyDownEvent);
189
- connectLanguageChangeObserver(this, { prop: "accessibleLabels", defaults: "accessibleLabelDefaults" });
276
+ if (this.items) {
277
+ this.processItems();
278
+ }
279
+ const slottedElements = getElementsFromDefaultSlot(this.element);
280
+ if (slottedElements.length) {
281
+ this.input = slottedElements[0];
282
+ }
283
+ else {
284
+ this.input = document.createElement("duet-input");
285
+ this.input.label = this.label;
286
+ this.input.caption = this.caption;
287
+ this.input.expand = true;
288
+ this.element.prepend(this.input);
289
+ }
290
+ this.input.chips = this.multiple;
291
+ this.input.addEventListener("duetChange", this.onInputChange);
292
+ this.input.addEventListener("duetInput", this.onInputTyping);
293
+ this.input.addEventListener("click", this.onInputClick);
190
294
  //add correct aria attributes to the input element
191
295
  this.input.role = "combobox";
192
296
  this.input.accessibleExpanded = this.listOpen ? "true" : "false";
193
297
  this.input.accessibleAutocomplete = "list";
194
298
  this.input.accessibleControls = this.listBoxId;
299
+ this.element.addEventListener("keydown", this.onKeyDown);
300
+ connectLanguageChangeObserver(this, { prop: "accessibleLabels", defaults: "accessibleLabelDefaults" });
195
301
  this.processListOpenChange();
196
302
  }
197
303
  disconnectedCallback() {
198
- this.input.removeEventListener("duetChange", this.updateInputValue.bind(this));
199
- this.input.removeEventListener("click", () => this.inputValue.length ? (this.listOpen = true) : (this.listOpen = false));
200
- this.element.removeEventListener("keydown", this.handleInputKeyDownEvent);
201
- this.listElement.removeEventListener("click", e => {
202
- e.stopPropagation();
203
- });
304
+ this.input.removeEventListener("duetChange", this.onInputChange);
305
+ this.input.removeEventListener("click", this.onInputClick);
306
+ this.element.removeEventListener("keydown", this.onKeyDown);
204
307
  this.resizeObserver.disconnect();
205
308
  disconnectLanguageChangeObserver(this);
206
309
  }
207
310
  componentDidLoad() {
208
311
  // observe resize events to dynamically adjust size of dropdown area
209
312
  this.resizeObserver.observe(this.input);
210
- this.listElement.addEventListener("click", e => {
211
- e.stopPropagation();
212
- });
213
313
  this.processValue();
214
314
  }
215
- /**
216
- * Updates the input text based on the selected/clicked items.
217
- * @param event - event
218
- *'param item: DuetComboboxItem - the item that was selected
219
- */
220
- onListClick(e, item) {
221
- e.preventDefault();
222
- // update selected item with id
223
- this.updateSelectedItems(item.id, true);
224
- this.listOpen = false;
225
- return this.listOpen;
226
- }
227
315
  /**
228
316
  * Helper function that checks inputs in the field, compares it with the item list and returns true when inputvalue matches selectedItem id
229
- * TODO: this should be disabled in multiple mode
230
317
  */
231
318
  shouldListBeFiltered() {
232
- if (this.selectedItems.size && this.input.value === this.inputValue) {
233
- const item = this.items.filter(item => this.selectedItems.has(item.id));
319
+ if (!this.multiple && this.selectedItems.size && this.input.value === this.inputValue) {
320
+ const item = this.processedItems.find(item => this.selectedItems.has(item.id));
234
321
  return !(this.formatter(item).toLowerCase() === this.input.value.toLowerCase());
235
322
  }
236
323
  return true;
@@ -245,91 +332,135 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
245
332
  : this.sortFilteredItems(this.processedItems)
246
333
  : [];
247
334
  }
335
+ emitChangeEvent(id) {
336
+ const item = this.processedItems.find(item => item.id === id);
337
+ this.duetChange.emit({
338
+ item,
339
+ value: this.value,
340
+ component: "duet-combobox",
341
+ });
342
+ }
248
343
  /**
249
- * Updates the selected items based on the item id.
250
- * @param id
251
- * @private
344
+ * Updates the value after selected items have changed for multiple selection.
252
345
  */
253
- async updateSelectedItems(id, emitEvent) {
254
- // for a multiple scenario wrap this in an if/else and just don't clear here
255
- this.selectedItems.clear();
256
- if (this.selectedItems) {
257
- if (this.selectedItems.has(id)) {
258
- this.selectedItems.delete(id);
259
- }
260
- else {
261
- this.selectedItems.add(id);
262
- }
346
+ updateMultipleValue() {
347
+ this.value = this.processedItems.filter(item => this.selectedItems.has(item.id)).map(item => item.value);
348
+ this.input.value = "";
349
+ this.updateChips();
350
+ }
351
+ /**
352
+ * Add item with id to the selectedItems set. Used only when multiple is true.
353
+ */
354
+ addSelectedItem(id, emitEvent) {
355
+ if (this.selectedItems.has(id)) {
356
+ return;
263
357
  }
358
+ this.selectedItems.add(id);
359
+ this.updateMultipleValue();
264
360
  if (emitEvent) {
265
- const item = this.selectedItems.size === 0 ? [] : this.items.filter(item => this.selectedItems.has(item.id));
266
- this.duetChange.emit({
267
- value: item[0].value,
268
- item: item[0],
269
- component: "duet-combobox",
270
- });
361
+ this.emitChangeEvent(id);
271
362
  }
272
- await this.updateInputText();
273
363
  }
274
364
  /**
275
- * Updates the input text based on the selected/clicked items.
276
- * @param bool -override to clear if invoked by "click outside"
365
+ * Remove item with id from the selectedItems set. Used only when multiple is true.
277
366
  */
278
- async updateInputText(isBlurred = false, isClickOutside = false) {
279
- const item = this.selectedItems.size === 0 ? [] : this.items.filter(item => this.selectedItems.has(item.id));
280
- //if items changed and given id no longer exists
281
- if (item.length === 0 && this.selectedItems.size > 0) {
282
- this.selectedItems.clear();
283
- this.input.value = "";
367
+ removeSelectedItem(id, emitEvent) {
368
+ if (!this.selectedItems.has(id)) {
369
+ return;
370
+ }
371
+ this.selectedItems.delete(id);
372
+ this.updateMultipleValue();
373
+ if (emitEvent) {
374
+ this.emitChangeEvent(id);
375
+ }
376
+ }
377
+ /**
378
+ * Updates the selected item based on the item id. Used only when multiple is false.
379
+ */
380
+ async updateSelectedItem(id, emitEvent) {
381
+ if (this.selectedItems.has(id)) {
382
+ this.selectedItems.delete(id);
284
383
  this.value = undefined;
285
- this.activeItem = undefined;
286
384
  }
287
- if (!isClickOutside && this.selectedItems.size === 1) {
288
- this.input.value = ""; // set value to empty so that cursor position follows accordingly
289
- this.input.value = await this.formatItem(item[0]);
290
- this.input.scrollLeft = this.input.scrollWidth;
291
- this.activeItem = undefined;
292
- this.value = item[0].value;
385
+ else {
386
+ this.selectedItems.clear();
387
+ this.selectedItems.add(id);
388
+ this.value = this.processedItems.find(item => item.id === id).value;
293
389
  }
294
- if (isBlurred) {
295
- if (this.selectedItems.size === 0) {
296
- this.activeItem = undefined;
297
- if (this.force) {
298
- this.inputValue = "";
299
- this.input.value = "";
300
- }
390
+ if (emitEvent) {
391
+ this.emitChangeEvent(id);
392
+ }
393
+ await this.updateInputText();
394
+ }
395
+ /**
396
+ * Add or remove chips of the input based on the selectedItems Set.
397
+ */
398
+ async updateChips() {
399
+ const ids = Array.from(this.selectedItems);
400
+ const chips = await this.input.getChips();
401
+ ids.forEach(async (id) => {
402
+ const item = this.processedItems.find(i => i.id === id);
403
+ const text = await this.formatItem(item);
404
+ const chipExists = await this.input.hasChip({ value: `${id}`, text });
405
+ if (!chipExists) {
406
+ const chip = document.createElement("duet-chip");
407
+ chip.variation = "input";
408
+ chip.value = `${id}`;
409
+ chip.textContent = text;
410
+ chip.addEventListener("duetRemove", evt => {
411
+ const id = evt.detail.value;
412
+ this.removeSelectedItem(id, true);
413
+ });
414
+ this.input.addChip(chip);
301
415
  }
302
- else if (this.force) {
303
- const selectedValueIndex = [...this.selectedItems][0];
304
- const selectedValueLabel = await this.formatItem(this.items[selectedValueIndex]);
305
- this.inputValue = selectedValueLabel;
306
- this.input.value = selectedValueLabel;
416
+ });
417
+ chips.forEach(chip => {
418
+ if (!ids.includes(chip.value)) {
419
+ chip.remove();
307
420
  }
308
- }
309
- this.listOpen = false;
421
+ });
310
422
  }
311
- updateInputValue(e) {
312
- var _a;
313
- this.inputValue = e.detail.value;
314
- this.listOpen = String(this.inputValue).length >= this.minCharacters && ((_a = this.getFilteredItems()) === null || _a === void 0 ? void 0 : _a.length) > 0;
423
+ async getSelectedItemLabel() {
424
+ const item = this.processedItems.find(item => this.selectedItems.has(item.id));
425
+ const label = item ? await this.formatItem(item) : "";
426
+ return label;
315
427
  }
316
- selectActiveItem() {
317
- if (this.activeItem === undefined) {
428
+ /**
429
+ * Updates the input text when the combobox loses focus or when a selection is made.
430
+ */
431
+ async updateInputText(isBlurred = false) {
432
+ if (isBlurred && this.multiple) {
433
+ this.input.value = "";
318
434
  return;
319
435
  }
320
- const filteredItem = this.returnFilteredOrNonFiltered();
321
- const item = filteredItem[this.activeItem];
322
- this.updateSelectedItems(item.id, true);
436
+ if (isBlurred && this.force) {
437
+ if (this.selectedItems.size === 0) {
438
+ this.input.value = "";
439
+ }
440
+ else {
441
+ this.input.value = await this.getSelectedItemLabel();
442
+ }
443
+ }
444
+ if (!isBlurred && this.selectedItems.size > 0) {
445
+ this.input.value = ""; // set value to empty so that cursor position follows accordingly
446
+ this.input.value = await this.getSelectedItemLabel();
447
+ this.input.scrollLeft = this.input.scrollWidth;
448
+ }
323
449
  }
324
- announceActive(items) {
325
- if (!items) {
326
- items = this.returnFilteredOrNonFiltered();
450
+ // Event handlers
451
+ onListClick(e, item) {
452
+ e.preventDefault();
453
+ e.stopPropagation();
454
+ // update selected item with id
455
+ if (this.multiple) {
456
+ this.addSelectedItem(item.id, true);
327
457
  }
328
- if (this.activeItem === undefined || this.activeItem === -1) {
329
- return;
458
+ else {
459
+ this.updateSelectedItem(item.id, true);
330
460
  }
331
- const item = items[this.activeItem];
332
- this.selectionMsg = structuredClone(this.formatLabel(item, items.length, this.items.length));
461
+ this.activeItem = undefined;
462
+ this.listOpen = false;
463
+ return this.listOpen;
333
464
  }
334
465
  //function that scrolls to the li element with the class "active"
335
466
  scrollToActive() {
@@ -357,16 +488,27 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
357
488
  */
358
489
  getFilteredItems() {
359
490
  // filter items based on user inputs
360
- const filteredItems = this.processedItems.filter(item => {
361
- var _a, _b, _c, _d;
491
+ const filteredItems = this.processedItems
492
+ .filter(item => {
493
+ var _a, _b, _c, _d, _e;
362
494
  // filter by name and value
363
495
  // if value contains inputvalue
364
496
  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())) ||
365
497
  (
366
498
  // if name contains input value
367
499
  (_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())) ||
500
+ // if name contains input value
501
+ this.formatter(item).toLowerCase()[this.filterType]((_e = this.inputValue) === null || _e === void 0 ? void 0 : _e.toLowerCase()) ||
368
502
  // if the item is selected
369
503
  this.selectedItems.has(item.id);
504
+ })
505
+ // if multiple, filter out the selected items
506
+ .filter(item => {
507
+ let include = true;
508
+ if (this.multiple && this.selectedItems.has(item.id)) {
509
+ include = false;
510
+ }
511
+ return include;
370
512
  });
371
513
  return this.sortFilteredItems(filteredItems);
372
514
  }
@@ -400,9 +542,10 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
400
542
  }, ref: el => (this.listContainer = el) }, h$1("ul", { class: {
401
543
  "duet-combobox-listbox-open": this.listOpen,
402
544
  "duet-combobox-listbox": true,
403
- }, role: "listbox", ref: el => (this.listElement = el), id: this.listBoxId }, selectElements.map((item, index) => {
404
- return (h$1(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) }));
405
- })))));
545
+ }, role: "listbox", ref: el => (this.listElement = el), id: this.listBoxId }, this.listOpen &&
546
+ selectElements.map((item, index) => {
547
+ return (h$1(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) }));
548
+ })))));
406
549
  }
407
550
  get element() { return this; }
408
551
  static get watchers() { return {
@@ -415,8 +558,11 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
415
558
  }, [6, "duet-combobox", {
416
559
  "accessibleLabelDefaults": [1, "accessible-label-defaults"],
417
560
  "accessibleLabels": [1040],
561
+ "label": [1],
562
+ "caption": [1],
418
563
  "theme": [1025],
419
564
  "force": [4],
565
+ "multiple": [4],
420
566
  "items": [1032],
421
567
  "formatter": [16],
422
568
  "value": [1537],
@@ -424,9 +570,7 @@ const DuetCombobox$1 = /*@__PURE__*/ proxyCustomElement(class DuetCombobox exten
424
570
  "openListOnClick": [4, "open-list-on-click"],
425
571
  "filterType": [1, "filter-type"],
426
572
  "processedItems": [32],
427
- "inputWidth": [32],
428
573
  "inputValue": [32],
429
- "selectionMsg": [32],
430
574
  "listOpen": [32],
431
575
  "selectedItems": [32],
432
576
  "activeItem": [32],
@@ -441,14 +585,64 @@ function defineCustomElement$1() {
441
585
  if (typeof customElements === "undefined") {
442
586
  return;
443
587
  }
444
- const components = ["duet-combobox", "duet-icon"];
588
+ const components = ["duet-combobox", "duet-button", "duet-caption", "duet-chip", "duet-icon", "duet-input", "duet-label", "duet-spinner", "duet-tooltip", "duet-tooltip-button", "duet-tooltip-popup", "duet-visually-hidden"];
445
589
  components.forEach(tagName => { switch (tagName) {
446
590
  case "duet-combobox":
447
591
  if (!customElements.get(tagName)) {
448
592
  customElements.define(tagName, DuetCombobox$1);
449
593
  }
450
594
  break;
595
+ case "duet-button":
596
+ if (!customElements.get(tagName)) {
597
+ defineCustomElement$c();
598
+ }
599
+ break;
600
+ case "duet-caption":
601
+ if (!customElements.get(tagName)) {
602
+ defineCustomElement$b();
603
+ }
604
+ break;
605
+ case "duet-chip":
606
+ if (!customElements.get(tagName)) {
607
+ defineCustomElement$a();
608
+ }
609
+ break;
451
610
  case "duet-icon":
611
+ if (!customElements.get(tagName)) {
612
+ defineCustomElement$9();
613
+ }
614
+ break;
615
+ case "duet-input":
616
+ if (!customElements.get(tagName)) {
617
+ defineCustomElement$8();
618
+ }
619
+ break;
620
+ case "duet-label":
621
+ if (!customElements.get(tagName)) {
622
+ defineCustomElement$7();
623
+ }
624
+ break;
625
+ case "duet-spinner":
626
+ if (!customElements.get(tagName)) {
627
+ defineCustomElement$6();
628
+ }
629
+ break;
630
+ case "duet-tooltip":
631
+ if (!customElements.get(tagName)) {
632
+ defineCustomElement$5();
633
+ }
634
+ break;
635
+ case "duet-tooltip-button":
636
+ if (!customElements.get(tagName)) {
637
+ defineCustomElement$4();
638
+ }
639
+ break;
640
+ case "duet-tooltip-popup":
641
+ if (!customElements.get(tagName)) {
642
+ defineCustomElement$3();
643
+ }
644
+ break;
645
+ case "duet-visually-hidden":
452
646
  if (!customElements.get(tagName)) {
453
647
  defineCustomElement$2();
454
648
  }