@nova-design-system/nova-webcomponents 3.18.0 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/cjs/index.cjs.js +13 -0
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/native.cjs.js +1 -1
  5. package/dist/cjs/nv-badge_2.cjs.entry.js +1 -1
  6. package/dist/cjs/nv-fielddate.cjs.entry.js +10 -6
  7. package/dist/cjs/nv-fielddate.cjs.entry.js.map +1 -1
  8. package/dist/cjs/nv-fielddaterange.cjs.entry.js +11 -7
  9. package/dist/cjs/nv-fielddaterange.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nv-fielddropdown.cjs.entry.js +193 -209
  11. package/dist/cjs/nv-fielddropdown.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nv-fielddropdownitem.cjs.entry.js +7 -4
  13. package/dist/cjs/nv-fielddropdownitem.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js +4 -0
  15. package/dist/cjs/nv-fieldmultiselect.cjs.entry.js.map +1 -1
  16. package/dist/cjs/nv-fieldnumber.cjs.entry.js +3 -3
  17. package/dist/cjs/nv-fieldpassword.cjs.entry.js +3 -3
  18. package/dist/cjs/nv-fieldradio.cjs.entry.js +3 -3
  19. package/dist/cjs/nv-fieldselect.cjs.entry.js +5 -5
  20. package/dist/cjs/nv-fieldslider.cjs.entry.js +3 -3
  21. package/dist/cjs/nv-fieldtext.cjs.entry.js +3 -3
  22. package/dist/cjs/nv-fieldtextarea.cjs.entry.js +3 -3
  23. package/dist/cjs/nv-fieldtime.cjs.entry.js +4 -3
  24. package/dist/cjs/nv-fieldtime.cjs.entry.js.map +1 -1
  25. package/dist/cjs/nv-icon.cjs.entry.js +2 -2
  26. package/dist/cjs/nv-icon.cjs.entry.js.map +1 -1
  27. package/dist/cjs/nv-iconbutton_2.cjs.entry.js +2 -2
  28. package/dist/cjs/nv-menu.cjs.entry.js +2 -2
  29. package/dist/cjs/nv-menu.cjs.entry.js.map +1 -1
  30. package/dist/cjs/nv-menuitem.cjs.entry.js +1 -1
  31. package/dist/cjs/nv-notification.cjs.entry.js +1 -1
  32. package/dist/cjs/nv-notificationcontainer.cjs.entry.js +1 -1
  33. package/dist/cjs/nv-popover.cjs.entry.js +2 -2
  34. package/dist/cjs/nv-popover.cjs.entry.js.map +1 -1
  35. package/dist/cjs/nv-row.cjs.entry.js +1 -1
  36. package/dist/cjs/nv-split.cjs.entry.js +1 -1
  37. package/dist/cjs/nv-stack.cjs.entry.js +1 -1
  38. package/dist/cjs/nv-table.cjs.entry.js +1 -1
  39. package/dist/cjs/nv-toggle.cjs.entry.js +2 -2
  40. package/dist/cjs/nv-togglebutton.cjs.entry.js +1 -1
  41. package/dist/cjs/nv-togglebuttongroup.cjs.entry.js +1 -1
  42. package/dist/cjs/nv-tooltip.cjs.entry.js +1 -1
  43. package/dist/collection/components/nv-fielddate/nv-fielddate.js +10 -6
  44. package/dist/collection/components/nv-fielddate/nv-fielddate.js.map +1 -1
  45. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js +10 -6
  46. package/dist/collection/components/nv-fielddaterange/nv-fielddaterange.js.map +1 -1
  47. package/dist/collection/components/nv-fielddaterange/styles/nv-fielddaterange.css +2 -0
  48. package/dist/collection/components/nv-fielddropdown/nv-fielddropdown.docs.js +31 -13
  49. package/dist/collection/components/nv-fielddropdown/nv-fielddropdown.docs.js.map +1 -1
  50. package/dist/collection/components/nv-fielddropdown/nv-fielddropdown.js +310 -245
  51. package/dist/collection/components/nv-fielddropdown/nv-fielddropdown.js.map +1 -1
  52. package/dist/collection/components/nv-fielddropdownitem/nv-fielddropdownitem.js +29 -6
  53. package/dist/collection/components/nv-fielddropdownitem/nv-fielddropdownitem.js.map +1 -1
  54. package/dist/collection/components/nv-fielddropdownitemcheck/nv-fielddropdownitemcheck.js +1 -1
  55. package/dist/collection/components/nv-fieldmultiselect/nv-fieldmultiselect.js +4 -0
  56. package/dist/collection/components/nv-fieldmultiselect/nv-fieldmultiselect.js.map +1 -1
  57. package/dist/collection/components/nv-fieldnumber/nv-fieldnumber.js +3 -3
  58. package/dist/collection/components/nv-fieldpassword/nv-fieldpassword.js +3 -3
  59. package/dist/collection/components/nv-fieldradio/nv-fieldradio.js +3 -3
  60. package/dist/collection/components/nv-fieldselect/nv-fieldselect.js +5 -5
  61. package/dist/collection/components/nv-fieldslider/nv-fieldslider.js +3 -3
  62. package/dist/collection/components/nv-fieldtext/nv-fieldtext.js +3 -3
  63. package/dist/collection/components/nv-fieldtextarea/nv-fieldtextarea.js +3 -3
  64. package/dist/collection/components/nv-fieldtime/nv-fieldtime.js +4 -3
  65. package/dist/collection/components/nv-fieldtime/nv-fieldtime.js.map +1 -1
  66. package/dist/collection/components/nv-icon/nv-icon.js +1 -1
  67. package/dist/collection/components/nv-icon/nv-icons.js +13 -0
  68. package/dist/collection/components/nv-icon/nv-icons.js.map +1 -1
  69. package/dist/collection/components/nv-iconbutton/nv-iconbutton.js +1 -1
  70. package/dist/collection/components/nv-loader/nv-loader.js +1 -1
  71. package/dist/collection/components/nv-menu/nv-menu.js +3 -3
  72. package/dist/collection/components/nv-menu/nv-menu.js.map +1 -1
  73. package/dist/collection/components/nv-menuitem/nv-menuitem.js +2 -2
  74. package/dist/collection/components/nv-notification/nv-notification.js +1 -1
  75. package/dist/collection/components/nv-notificationcontainer/nv-notificationcontainer.js +1 -1
  76. package/dist/collection/components/nv-popover/nv-popover.js +2 -2
  77. package/dist/collection/components/nv-popover/nv-popover.js.map +1 -1
  78. package/dist/collection/components/nv-row/nv-row.js +1 -1
  79. package/dist/collection/components/nv-split/nv-split.js +1 -1
  80. package/dist/collection/components/nv-stack/nv-stack.js +1 -1
  81. package/dist/collection/components/nv-table/nv-table.js +1 -1
  82. package/dist/collection/components/nv-toggle/nv-toggle.js +2 -2
  83. package/dist/collection/components/nv-togglebutton/nv-togglebutton.js +1 -1
  84. package/dist/collection/components/nv-togglebuttongroup/nv-togglebuttongroup.js +1 -1
  85. package/dist/collection/components/nv-tooltip/nv-tooltip.js +1 -1
  86. package/dist/components/index.js +13 -0
  87. package/dist/components/index.js.map +1 -1
  88. package/dist/components/nv-accordion-item.js +1 -1
  89. package/dist/components/nv-accordion.js +4 -4
  90. package/dist/components/nv-alert.js +1 -1
  91. package/dist/components/nv-avatar.js +1 -1
  92. package/dist/components/nv-badge.js +1 -1
  93. package/dist/components/nv-breadcrumb.js +2 -2
  94. package/dist/components/nv-button.js +1 -1
  95. package/dist/components/nv-datagrid.js +2 -2
  96. package/dist/components/nv-dialog.js +4 -4
  97. package/dist/components/nv-dialogfooter.js +1 -1
  98. package/dist/components/nv-fielddate.js +14 -10
  99. package/dist/components/nv-fielddate.js.map +1 -1
  100. package/dist/components/nv-fielddaterange.js +15 -11
  101. package/dist/components/nv-fielddaterange.js.map +1 -1
  102. package/dist/components/nv-fielddropdown.js +207 -220
  103. package/dist/components/nv-fielddropdown.js.map +1 -1
  104. package/dist/components/nv-fielddropdownitem.js +1 -1
  105. package/dist/components/nv-fielddropdownitemcheck.js +1 -1
  106. package/dist/components/nv-fieldmultiselect.js +10 -6
  107. package/dist/components/nv-fieldmultiselect.js.map +1 -1
  108. package/dist/components/nv-fieldnumber.js +1 -1
  109. package/dist/components/nv-fieldpassword.js +6 -6
  110. package/dist/components/nv-fieldradio.js +3 -3
  111. package/dist/components/nv-fieldselect.js +8 -8
  112. package/dist/components/nv-fieldslider.js +7 -7
  113. package/dist/components/nv-fieldtext.js +1 -1
  114. package/dist/components/nv-fieldtextarea.js +3 -3
  115. package/dist/components/nv-fieldtime.js +8 -7
  116. package/dist/components/nv-fieldtime.js.map +1 -1
  117. package/dist/components/nv-icon.js +1 -1
  118. package/dist/components/nv-iconbutton.js +1 -1
  119. package/dist/components/nv-loader.js +1 -1
  120. package/dist/components/nv-menu.js +5 -5
  121. package/dist/components/nv-menu.js.map +1 -1
  122. package/dist/components/nv-menuitem.js +1 -1
  123. package/dist/components/nv-notification.js +2 -2
  124. package/dist/components/nv-notificationcontainer.js +1 -1
  125. package/dist/components/nv-popover.js +1 -1
  126. package/dist/components/nv-row.js +1 -1
  127. package/dist/components/nv-split.js +1 -1
  128. package/dist/components/nv-stack.js +1 -1
  129. package/dist/components/nv-table.js +1 -1
  130. package/dist/components/nv-toggle.js +2 -2
  131. package/dist/components/nv-togglebutton.js +1 -1
  132. package/dist/components/nv-togglebuttongroup.js +1 -1
  133. package/dist/components/nv-tooltip.js +1 -1
  134. package/dist/components/{p-015330b8.js → p-18f50d91.js} +2 -2
  135. package/dist/components/{p-015330b8.js.map → p-18f50d91.js.map} +1 -1
  136. package/dist/components/{p-c981bb48.js → p-222136c2.js} +2 -2
  137. package/dist/components/{p-c981bb48.js.map → p-222136c2.js.map} +1 -1
  138. package/dist/components/{p-fca4d85b.js → p-2ac6f42d.js} +3 -3
  139. package/dist/components/{p-fca4d85b.js.map → p-2ac6f42d.js.map} +1 -1
  140. package/dist/components/{p-fabbaf47.js → p-334e19d3.js} +4 -4
  141. package/dist/components/{p-fabbaf47.js.map → p-334e19d3.js.map} +1 -1
  142. package/dist/components/{p-5e315239.js → p-45a3cf85.js} +11 -7
  143. package/dist/components/p-45a3cf85.js.map +1 -0
  144. package/dist/components/{p-ebfecbaa.js → p-4799b6c3.js} +3 -3
  145. package/dist/components/p-4799b6c3.js.map +1 -0
  146. package/dist/components/{p-4cd6f629.js → p-49205084.js} +5 -5
  147. package/dist/components/{p-4cd6f629.js.map → p-49205084.js.map} +1 -1
  148. package/dist/components/{p-6ca3d847.js → p-5a5db065.js} +4 -4
  149. package/dist/components/{p-6ca3d847.js.map → p-5a5db065.js.map} +1 -1
  150. package/dist/components/{p-1bd396b1.js → p-60083982.js} +4 -4
  151. package/dist/components/{p-1bd396b1.js.map → p-60083982.js.map} +1 -1
  152. package/dist/components/{p-ea45f1ab.js → p-81d915ef.js} +3 -3
  153. package/dist/components/{p-ea45f1ab.js.map → p-81d915ef.js.map} +1 -1
  154. package/dist/components/p-946a047c.js +88 -0
  155. package/dist/components/p-946a047c.js.map +1 -0
  156. package/dist/components/{p-715e5235.js → p-a6c29711.js} +2 -2
  157. package/dist/components/{p-715e5235.js.map → p-a6c29711.js.map} +1 -1
  158. package/dist/components/{p-d1b02966.js → p-e0eb748c.js} +7 -7
  159. package/dist/components/{p-d1b02966.js.map → p-e0eb748c.js.map} +1 -1
  160. package/dist/components/{p-2574f8c2.js → p-e1b2eba2.js} +2 -2
  161. package/dist/components/{p-2574f8c2.js.map → p-e1b2eba2.js.map} +1 -1
  162. package/dist/esm/index.js +13 -0
  163. package/dist/esm/index.js.map +1 -1
  164. package/dist/esm/loader.js +1 -1
  165. package/dist/esm/native.js +1 -1
  166. package/dist/esm/nv-badge_2.entry.js +1 -1
  167. package/dist/esm/nv-fielddate.entry.js +10 -6
  168. package/dist/esm/nv-fielddate.entry.js.map +1 -1
  169. package/dist/esm/nv-fielddaterange.entry.js +11 -7
  170. package/dist/esm/nv-fielddaterange.entry.js.map +1 -1
  171. package/dist/esm/nv-fielddropdown.entry.js +193 -209
  172. package/dist/esm/nv-fielddropdown.entry.js.map +1 -1
  173. package/dist/esm/nv-fielddropdownitem.entry.js +7 -4
  174. package/dist/esm/nv-fielddropdownitem.entry.js.map +1 -1
  175. package/dist/esm/nv-fieldmultiselect.entry.js +4 -0
  176. package/dist/esm/nv-fieldmultiselect.entry.js.map +1 -1
  177. package/dist/esm/nv-fieldnumber.entry.js +3 -3
  178. package/dist/esm/nv-fieldpassword.entry.js +3 -3
  179. package/dist/esm/nv-fieldradio.entry.js +3 -3
  180. package/dist/esm/nv-fieldselect.entry.js +5 -5
  181. package/dist/esm/nv-fieldslider.entry.js +3 -3
  182. package/dist/esm/nv-fieldtext.entry.js +3 -3
  183. package/dist/esm/nv-fieldtextarea.entry.js +3 -3
  184. package/dist/esm/nv-fieldtime.entry.js +4 -3
  185. package/dist/esm/nv-fieldtime.entry.js.map +1 -1
  186. package/dist/esm/nv-icon.entry.js +2 -2
  187. package/dist/esm/nv-icon.entry.js.map +1 -1
  188. package/dist/esm/nv-iconbutton_2.entry.js +2 -2
  189. package/dist/esm/nv-menu.entry.js +2 -2
  190. package/dist/esm/nv-menu.entry.js.map +1 -1
  191. package/dist/esm/nv-menuitem.entry.js +1 -1
  192. package/dist/esm/nv-notification.entry.js +1 -1
  193. package/dist/esm/nv-notificationcontainer.entry.js +1 -1
  194. package/dist/esm/nv-popover.entry.js +2 -2
  195. package/dist/esm/nv-popover.entry.js.map +1 -1
  196. package/dist/esm/nv-row.entry.js +1 -1
  197. package/dist/esm/nv-split.entry.js +1 -1
  198. package/dist/esm/nv-stack.entry.js +1 -1
  199. package/dist/esm/nv-table.entry.js +1 -1
  200. package/dist/esm/nv-toggle.entry.js +2 -2
  201. package/dist/esm/nv-togglebutton.entry.js +1 -1
  202. package/dist/esm/nv-togglebuttongroup.entry.js +1 -1
  203. package/dist/esm/nv-tooltip.entry.js +1 -1
  204. package/dist/native/index.esm.js +1 -1
  205. package/dist/native/index.esm.js.map +1 -1
  206. package/dist/native/native.esm.js +1 -1
  207. package/dist/native/native.esm.js.map +1 -1
  208. package/dist/native/{p-acada158.entry.js → p-0177409b.entry.js} +2 -2
  209. package/dist/native/{p-14d2f70a.entry.js → p-075d231e.entry.js} +2 -2
  210. package/dist/native/{p-d878e90a.entry.js → p-144d0f8a.entry.js} +2 -2
  211. package/dist/native/p-144d0f8a.entry.js.map +1 -0
  212. package/dist/native/{p-b4c15f25.entry.js → p-17666092.entry.js} +2 -2
  213. package/dist/native/{p-107e80c6.entry.js → p-218135b1.entry.js} +2 -2
  214. package/dist/native/p-218135b1.entry.js.map +1 -0
  215. package/dist/native/p-2a7f80f4.entry.js +2 -0
  216. package/dist/native/p-2a7f80f4.entry.js.map +1 -0
  217. package/dist/native/{p-e5b7ce4e.entry.js → p-445221dc.entry.js} +2 -2
  218. package/dist/native/{p-4e6fb719.entry.js → p-44a78545.entry.js} +2 -2
  219. package/dist/native/p-57420a2f.entry.js +2 -0
  220. package/dist/native/{p-5c678bc7.entry.js → p-587d94f3.entry.js} +2 -2
  221. package/dist/native/{p-95184ea2.entry.js → p-6a418ec4.entry.js} +2 -2
  222. package/dist/native/{p-5039ceb8.entry.js → p-859bf9ad.entry.js} +2 -2
  223. package/dist/native/{p-5039ceb8.entry.js.map → p-859bf9ad.entry.js.map} +1 -1
  224. package/dist/native/{p-ae43eee2.entry.js → p-9950e075.entry.js} +2 -2
  225. package/dist/native/{p-ad029453.entry.js → p-9c432751.entry.js} +2 -2
  226. package/dist/native/{p-8c053954.entry.js → p-a026654f.entry.js} +2 -2
  227. package/dist/native/p-a026654f.entry.js.map +1 -0
  228. package/dist/native/{p-417fba7d.entry.js → p-a2f58133.entry.js} +2 -2
  229. package/dist/native/{p-3464b86a.entry.js → p-b02c896a.entry.js} +2 -2
  230. package/dist/native/{p-9613087c.entry.js → p-b4382c94.entry.js} +2 -2
  231. package/dist/native/{p-835abdb9.entry.js → p-b626ef47.entry.js} +2 -2
  232. package/dist/native/{p-23ee0384.entry.js → p-c0de4bb0.entry.js} +2 -2
  233. package/dist/native/{p-5f98d4cd.entry.js → p-c9fea0df.entry.js} +2 -2
  234. package/dist/native/{p-5f98d4cd.entry.js.map → p-c9fea0df.entry.js.map} +1 -1
  235. package/dist/native/{p-ca39f78d.entry.js → p-d62869ff.entry.js} +2 -2
  236. package/dist/native/p-d63689da.entry.js +2 -0
  237. package/dist/native/p-d63689da.entry.js.map +1 -0
  238. package/dist/native/p-d8f3cf92.entry.js +2 -0
  239. package/dist/native/p-d8f3cf92.entry.js.map +1 -0
  240. package/dist/native/{p-539666dd.entry.js → p-dfb6b65e.entry.js} +2 -2
  241. package/dist/native/{p-230af58a.entry.js → p-e6f24210.entry.js} +2 -2
  242. package/dist/native/p-e6f24210.entry.js.map +1 -0
  243. package/dist/native/{p-da2060a5.entry.js → p-eb74feb7.entry.js} +2 -2
  244. package/dist/native/{p-6d427897.entry.js → p-fa3e588e.entry.js} +2 -2
  245. package/dist/native/{p-112d096c.entry.js → p-fffbd3c1.entry.js} +2 -2
  246. package/dist/types/components/nv-fielddropdown/nv-fielddropdown.d.ts +54 -35
  247. package/dist/types/components/nv-fielddropdownitem/nv-fielddropdownitem.d.ts +7 -0
  248. package/dist/types/components/nv-icon/nv-icons.d.ts +1 -1
  249. package/dist/types/components.d.ts +59 -13
  250. package/dist/vscode-data.json +50 -3
  251. package/hydrate/index.js +283 -279
  252. package/hydrate/index.mjs +283 -279
  253. package/package.json +1 -1
  254. package/dist/components/p-5e315239.js.map +0 -1
  255. package/dist/components/p-ebfecbaa.js.map +0 -1
  256. package/dist/components/p-ed43bcec.js +0 -88
  257. package/dist/components/p-ed43bcec.js.map +0 -1
  258. package/dist/native/p-00d1e5e1.entry.js +0 -2
  259. package/dist/native/p-00d1e5e1.entry.js.map +0 -1
  260. package/dist/native/p-107e80c6.entry.js.map +0 -1
  261. package/dist/native/p-230af58a.entry.js.map +0 -1
  262. package/dist/native/p-5e70f9ce.entry.js +0 -2
  263. package/dist/native/p-8c053954.entry.js.map +0 -1
  264. package/dist/native/p-b72b5e88.entry.js +0 -2
  265. package/dist/native/p-b72b5e88.entry.js.map +0 -1
  266. package/dist/native/p-d7f444fb.entry.js +0 -2
  267. package/dist/native/p-d7f444fb.entry.js.map +0 -1
  268. package/dist/native/p-d878e90a.entry.js.map +0 -1
  269. /package/dist/native/{p-acada158.entry.js.map → p-0177409b.entry.js.map} +0 -0
  270. /package/dist/native/{p-14d2f70a.entry.js.map → p-075d231e.entry.js.map} +0 -0
  271. /package/dist/native/{p-b4c15f25.entry.js.map → p-17666092.entry.js.map} +0 -0
  272. /package/dist/native/{p-e5b7ce4e.entry.js.map → p-445221dc.entry.js.map} +0 -0
  273. /package/dist/native/{p-4e6fb719.entry.js.map → p-44a78545.entry.js.map} +0 -0
  274. /package/dist/native/{p-5e70f9ce.entry.js.map → p-57420a2f.entry.js.map} +0 -0
  275. /package/dist/native/{p-5c678bc7.entry.js.map → p-587d94f3.entry.js.map} +0 -0
  276. /package/dist/native/{p-95184ea2.entry.js.map → p-6a418ec4.entry.js.map} +0 -0
  277. /package/dist/native/{p-ae43eee2.entry.js.map → p-9950e075.entry.js.map} +0 -0
  278. /package/dist/native/{p-ad029453.entry.js.map → p-9c432751.entry.js.map} +0 -0
  279. /package/dist/native/{p-417fba7d.entry.js.map → p-a2f58133.entry.js.map} +0 -0
  280. /package/dist/native/{p-3464b86a.entry.js.map → p-b02c896a.entry.js.map} +0 -0
  281. /package/dist/native/{p-9613087c.entry.js.map → p-b4382c94.entry.js.map} +0 -0
  282. /package/dist/native/{p-835abdb9.entry.js.map → p-b626ef47.entry.js.map} +0 -0
  283. /package/dist/native/{p-23ee0384.entry.js.map → p-c0de4bb0.entry.js.map} +0 -0
  284. /package/dist/native/{p-ca39f78d.entry.js.map → p-d62869ff.entry.js.map} +0 -0
  285. /package/dist/native/{p-539666dd.entry.js.map → p-dfb6b65e.entry.js.map} +0 -0
  286. /package/dist/native/{p-da2060a5.entry.js.map → p-eb74feb7.entry.js.map} +0 -0
  287. /package/dist/native/{p-6d427897.entry.js.map → p-fa3e588e.entry.js.map} +0 -0
  288. /package/dist/native/{p-112d096c.entry.js.map → p-fffbd3c1.entry.js.map} +0 -0
@@ -54,10 +54,6 @@ export class NvFielddropdown {
54
54
  * Defines the maximum height of the multiselect list when open.
55
55
  */
56
56
  this.maxHeight = '';
57
- /**
58
- * State of the dropdown popover.
59
- */
60
- this.open = false;
61
57
  /**
62
58
  * The text to display when no items match the filter.
63
59
  */
@@ -67,7 +63,21 @@ export class NvFielddropdown {
67
63
  */
68
64
  this.filterable = false;
69
65
  /**
70
- * Delay in milliseconds before the search is triggered when typing in the filter input.
66
+ * When an item is selected by the user, the dropdown will continue to stay
67
+ * open.
68
+ */
69
+ this.openOnSelect = false;
70
+ /**
71
+ * Determines if the component’s filtering behavior is managed externally.
72
+ * When set to true and filterable is enabled, the component won’t
73
+ * automatically filter items. Instead, you must implement your own filtering
74
+ * logic (e.g., server-side search or custom matching) using the
75
+ * filterTextChanged event.
76
+ */
77
+ this.controlledFilter = false;
78
+ /**
79
+ * Delay in milliseconds before the search is triggered when typing in the
80
+ * filter input.
71
81
  * @default 300
72
82
  */
73
83
  this.debounceDelay = 300;
@@ -89,132 +99,75 @@ export class NvFielddropdown {
89
99
  */
90
100
  this.filterText = '';
91
101
  this.selectedValues = new Set();
92
- this.handleInputContainerClick = (event) => {
93
- if (this.disabled || this.readonly) {
102
+ this.open = false;
103
+ /**
104
+ * Closes the popover when a click is detected outside the component.
105
+ * @param {MouseEvent} event - The click event.
106
+ */
107
+ this.handleClickOutside = (event) => {
108
+ var _a;
109
+ if (!(event.target instanceof Node))
94
110
  return;
95
- }
96
- const target = event.target;
97
- if (target.tagName === 'P' || target.tagName === 'SPAN') {
98
- this.open = true;
99
- // Simulate focus to trigger "focus-within" style
100
- const inputContainer = this.el.querySelector('.input-container');
101
- if (inputContainer) {
102
- inputContainer.classList.add('focus-within');
103
- // Remove the "focus-within" class after a delay or when the popover is closed
104
- const removeFocusWithin = () => {
105
- inputContainer.classList.remove('focus-within');
106
- };
107
- // Or remove the class when the popover is closed
108
- this.popoverElement.addEventListener('hide', removeFocusWithin);
109
- }
110
- }
111
+ if (!((_a = this.el) === null || _a === void 0 ? void 0 : _a.contains(event.target)))
112
+ this.open = false;
111
113
  };
112
- this.handleInput = (event) => {
113
- if (!this.filterable)
114
- return;
115
- if (this.disabled || this.readonly) {
116
- return;
117
- }
118
- const input = event.target;
114
+ this.handleFilterInput = () => {
119
115
  this.open = true;
120
- // Clear any existing timer
121
- if (this.debounceTimer) {
122
- window.clearTimeout(this.debounceTimer);
123
- }
124
- // Set a new timer for filtering
116
+ this.filterText = this.inputElement.value;
117
+ this.filterTextChanged.emit(this.inputElement.value);
118
+ clearTimeout(this.debounceTimer);
125
119
  this.debounceTimer = window.setTimeout(() => {
126
- this.filterText = input.value.toLowerCase();
127
120
  this.filterItems();
128
121
  }, this.debounceDelay);
129
122
  };
130
- this.handleInputFocus = () => {
131
- if (this.disabled || this.readonly)
132
- return;
133
- this.open = true;
134
- };
135
- this.togglePopover = () => {
136
- if (this.disabled || this.readonly)
137
- return;
138
- this.open = !this.open;
139
- };
140
123
  this.getSelectedLabel = () => {
141
- var _a, _b, _c, _d, _e, _f;
124
+ var _a, _b, _c, _d, _e, _f, _g;
142
125
  if (!this.value)
143
126
  return '';
144
- if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.length) > 1) {
127
+ if ((_a = this.filterText) === null || _a === void 0 ? void 0 : _a.length)
128
+ return this.filterText;
129
+ if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.length) > 1) {
145
130
  const matchingItem = this.options.find(option => option.value === this.value);
146
- return (_c = (_b = matchingItem === null || matchingItem === void 0 ? void 0 : matchingItem.label) !== null && _b !== void 0 ? _b : matchingItem === null || matchingItem === void 0 ? void 0 : matchingItem.value) !== null && _c !== void 0 ? _c : this.value;
131
+ return (_d = (_c = matchingItem === null || matchingItem === void 0 ? void 0 : matchingItem.label) !== null && _c !== void 0 ? _c : matchingItem === null || matchingItem === void 0 ? void 0 : matchingItem.value) !== null && _d !== void 0 ? _d : this.value;
147
132
  }
148
133
  const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
149
134
  const matchingItem = items.find(item => item.value === this.value);
150
135
  const selectedLabel = matchingItem
151
- ? (_f = (_d = matchingItem.label) !== null && _d !== void 0 ? _d : (_e = matchingItem.textContent) === null || _e === void 0 ? void 0 : _e.trim()) !== null && _f !== void 0 ? _f : matchingItem.value
136
+ ? (_g = (_e = matchingItem.label) !== null && _e !== void 0 ? _e : (_f = matchingItem.textContent) === null || _f === void 0 ? void 0 : _f.trim()) !== null && _g !== void 0 ? _g : matchingItem.value
152
137
  : '';
153
138
  return selectedLabel;
154
139
  };
155
- this.clearFilter = () => {
156
- if (!this.filterable)
157
- return;
158
- this.filterText = '';
159
- this.inputElement.value = this.getSelectedLabel();
160
- this.inputElement.focus();
161
- this.filterItems();
162
- };
163
- this.handleBlurInput = (event) => {
164
- var _a;
165
- const relatedTarget = event.relatedTarget;
166
- if (!this.el.contains(relatedTarget) &&
167
- !((_a = this.popoverElement) === null || _a === void 0 ? void 0 : _a.contains(relatedTarget))) {
168
- this.open = false;
169
- if (this.filterable) {
170
- this.clearFilter(); // Resets input to selected label, clears filterText
171
- }
172
- }
173
- };
174
140
  }
175
141
  //#endregion EVENTS
176
142
  /****************************************************************************/
177
143
  //#region WATCHERS
178
- handleOptionsChange(newValue) {
179
- var _a;
180
- if (!newValue)
181
- return;
182
- if (!this.value) {
183
- const defaultValue = newValue.find(option => option.selected);
184
- this.value = (_a = defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.value) !== null && _a !== void 0 ? _a : '';
185
- this.updateSelectedItem(this.value);
144
+ handleOpenChange(newOpen) {
145
+ if (newOpen === false) {
146
+ clearTimeout(this.debounceTimer);
147
+ setTimeout(() => {
148
+ this.clearFilter();
149
+ }, 100);
186
150
  }
187
151
  }
188
- watchValueHandler(newValue) {
189
- this.valueChanged.emit(newValue);
152
+ handleValueChange() {
153
+ this.updateSelectedItem();
154
+ if (!this.open || !this.filterText)
155
+ this.setFilterInputToSelectedValue();
190
156
  }
191
- handleOpenChange(newOpen) {
192
- // React to external changes, e.g., clear filter or refilter on open
193
- if (newOpen && this.filterable) {
194
- this.filterItems(); // Ensure items are filtered if filterText exists
195
- }
196
- else if (!newOpen) {
197
- this.clearFilter(); // Clear on external close
198
- }
157
+ handleOptionsChange() {
158
+ this.updateSelectedItem();
199
159
  }
200
160
  //#endregion WATCHERS
201
161
  /****************************************************************************/
202
162
  //#region LISTENERS
203
- handleOpenChanged(event) {
204
- // Stop propagation to prevent the event from affecting parent components like dialogs
205
- event.stopPropagation();
206
- // Update `open` based on the popover state
207
- if (event.target === this.popoverElement) {
208
- this.open = event.detail;
209
- }
210
- if (!event.detail && this.filterable) {
211
- this.clearFilter();
212
- }
213
- }
214
163
  handleDropdownItemSelected(event) {
215
164
  if (this.disabled || this.readonly)
216
165
  return;
217
- const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
166
+ if (!this.openOnSelect)
167
+ this.open = false;
168
+ if (event.detail.detached)
169
+ return;
170
+ const items = this.getAllItems();
218
171
  items.forEach(item => {
219
172
  if (item !== event.target) {
220
173
  item.removeAttribute('selected');
@@ -223,102 +176,147 @@ export class NvFielddropdown {
223
176
  item.setAttribute('selected', 'true');
224
177
  }
225
178
  });
226
- this.clearFilter();
227
179
  this.value = event.detail.value;
228
- this.open = false;
180
+ this.setFilterInputToSelectedValue();
181
+ this.valueChanged.emit(event.detail.value);
229
182
  }
230
- handleBlur(event) {
231
- const target = event.relatedTarget;
232
- if (!(target instanceof Node) || !this.el.contains(target)) {
233
- this.open = false;
234
- if (this.inputElement) {
235
- this.filterText = '';
236
- this.inputElement.value = this.getSelectedLabel();
237
- setTimeout(() => {
238
- this.filterItems();
239
- }, 200);
240
- }
183
+ handleFocus(event) {
184
+ if (event.relatedTarget instanceof HTMLElement &&
185
+ event.relatedTarget.tagName.includes('NV-FIELDDROPDOWNITEM')) {
186
+ return;
241
187
  }
188
+ if (event.target != this.toggleElement)
189
+ this.open = true;
190
+ }
191
+ handleFocusOut(event) {
192
+ if (!(event.relatedTarget instanceof Node))
193
+ return;
194
+ if (this.el.contains(event.relatedTarget))
195
+ return;
196
+ this.open = false;
242
197
  }
243
198
  handleKeyDown(event) {
244
- if (!this.el)
199
+ if (event.key === 'Escape') {
200
+ this.focusField();
201
+ this.open = false;
245
202
  return;
246
- if (!this.open) {
247
- if (event.key === 'ArrowDown') {
203
+ }
204
+ if (event.key === ' ') {
205
+ if (event.target == this.selectElement) {
206
+ event.preventDefault(); // Prevent scrolling down
248
207
  this.open = true;
249
- event.preventDefault();
250
- return;
251
208
  }
252
209
  return;
253
210
  }
254
- const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem:not([disabled]):not([hidden])'));
255
- let currentIndex = items.findIndex(item => item.classList.contains('highlighted'));
211
+ const items = this.getNavigableItems();
212
+ const highlightedItem = this.getHighlightedItemIndex(items);
256
213
  if (event.key === 'ArrowDown') {
257
- event.preventDefault();
258
- currentIndex = (currentIndex + 1) % items.length;
259
- this.updateHighlightedItem(items, currentIndex);
260
- }
261
- else if (event.key === 'ArrowUp') {
262
- event.preventDefault();
263
- currentIndex = (currentIndex - 1 + items.length) % items.length;
264
- this.updateHighlightedItem(items, currentIndex);
214
+ event.preventDefault(); // Prevent scrolling down
215
+ this.open = true;
216
+ const nextIndex = highlightedItem + 1;
217
+ this.updateHighlightedItem(items, nextIndex >= items.length ? 0 : nextIndex);
265
218
  }
266
- else if (event.key === 'Escape') {
267
- event.preventDefault();
268
- this.open = false;
219
+ if (event.key === 'ArrowUp') {
220
+ event.preventDefault(); // Prevent scrolling up
221
+ this.open = true;
222
+ const nextIndex = highlightedItem - 1;
223
+ this.updateHighlightedItem(items, nextIndex < 0 ? items.length - 1 : nextIndex);
269
224
  }
270
225
  }
226
+ handleDocumentClick(event) {
227
+ this.handleClickOutside(event);
228
+ }
271
229
  //#endregion LISTENERS
272
230
  /****************************************************************************/
273
- //#region LIFECYCLE
274
- componentWillLoad() {
275
- this.resetFilter();
276
- if (this.filterable && this.filterText) {
277
- this.filterItems();
278
- }
279
- if (this.options) {
280
- this.handleOptionsChange(this.options);
231
+ //#region METHODS
232
+ /** Clears the filter text */
233
+ async clearFilter() {
234
+ var _a;
235
+ if (!this.filterable)
236
+ return;
237
+ if ((_a = this.filterText) === null || _a === void 0 ? void 0 : _a.length) {
238
+ this.filterText = '';
239
+ this.filterTextChanged.emit(this.filterText);
281
240
  }
241
+ this.filterItems();
242
+ // Wait for wrapper lifecycle to finish
243
+ setTimeout(() => {
244
+ this.setFilterInputToSelectedValue();
245
+ }, 0);
282
246
  }
283
- componentDidLoad() {
284
- if (this.value) {
285
- this.updateSelectedItem(this.value);
247
+ /**
248
+ * Toggles the dropdown popover open state
249
+ * @param {boolean} open - The open state to set, if null, toggles the state
250
+ */
251
+ async toggleDropdown(open) {
252
+ if (open !== undefined) {
253
+ setTimeout(() => {
254
+ this.open = open;
255
+ }, 0);
286
256
  }
287
- if (this.inputElement) {
288
- this.inputElement.value = this.getSelectedLabel();
257
+ else {
258
+ setTimeout(() => {
259
+ this.open = !this.open;
260
+ }, 0);
289
261
  }
290
262
  }
291
- //#endregion LIFECYCLE
292
- /****************************************************************************/
293
- //#region METHODS
294
- /**
295
- * Retrieves the current filter text entered by the user.
296
- * @returns {string} The filter text.
297
- */
298
- async getFilterText() {
299
- return this.filterText;
263
+ syncToggleDropdown() {
264
+ this.open = !this.open;
265
+ }
266
+ setFilterInputToSelectedValue() {
267
+ if (!this.filterable)
268
+ return;
269
+ if (!this.value)
270
+ return (this.inputElement.value = '');
271
+ this.inputElement.value = this.getSelectedLabel();
272
+ }
273
+ // Will exclude detached items and data-empty
274
+ getFilterableItems() {
275
+ return Array.from(this.el.querySelectorAll('nv-fielddropdownitem:not([data-empty]):not([detached])'));
276
+ }
277
+ getNavigableItems() {
278
+ return Array.from(this.el.querySelectorAll('nv-fielddropdownitem:not([disabled]):not([hidden])'));
279
+ }
280
+ getAllItems() {
281
+ return Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
282
+ }
283
+ getHighlightedItemIndex(items) {
284
+ return items.findIndex(item => item.classList.contains('highlighted'));
285
+ }
286
+ updateHighlightedItem(items, index) {
287
+ items.forEach((item, i) => {
288
+ item.classList.remove('highlighted');
289
+ if (i === index) {
290
+ item.classList.add('highlighted');
291
+ item.focus();
292
+ item.scrollIntoView({ block: 'nearest' });
293
+ }
294
+ });
295
+ }
296
+ focusField() {
297
+ const focusableItem = this.el.querySelector('[data-scope="focusable"]');
298
+ focusableItem === null || focusableItem === void 0 ? void 0 : focusableItem.focus();
300
299
  }
301
300
  /**
302
301
  * Filter dropdown items based on the text entered by the user.
303
302
  * If no items are found, display a message indicating no results.
304
303
  */
305
304
  filterItems() {
306
- var _a;
307
- const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
308
- // Remove the "no results found" item if it exists
309
- const existingEmptyItem = this.el.querySelector('nv-fielddropdownitem[data-empty]');
310
- if (existingEmptyItem) {
311
- existingEmptyItem.remove();
312
- }
305
+ var _a, _b;
306
+ if (this.controlledFilter)
307
+ return;
313
308
  let hasVisibleItems = false;
314
- // Iterate over all items and adjust their visibility
309
+ const items = this.getFilterableItems();
310
+ // Remove the "no results found" item if it exists
311
+ (_a = this.el
312
+ .querySelector('nv-fielddropdownitem[data-empty]')) === null || _a === void 0 ? void 0 : _a.remove();
315
313
  items.forEach(item => {
316
314
  var _a, _b;
317
- const textContent = ((_a = item.textContent) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || ''; // Get the textual content of the slot
318
- const value = ((_b = item.value) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || ''; // Get the value of the `value` attribute
319
- // Check if the filtered text is present either in the value or in the textual content
320
- const shouldShow = value.includes(this.filterText) ||
321
- textContent.includes(this.filterText);
315
+ const filterText = this.filterText.toLowerCase();
316
+ const textContent = ((_a = item.textContent) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
317
+ const value = ((_b = item.value) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || '';
318
+ // Either in the value or in the textual content
319
+ const shouldShow = value.includes(filterText) || textContent.includes(filterText);
322
320
  if (shouldShow)
323
321
  item.removeAttribute('hidden');
324
322
  else
@@ -333,56 +331,40 @@ export class NvFielddropdown {
333
331
  emptyItem.setAttribute('data-empty', 'true');
334
332
  emptyItem.setAttribute('disabled', 'true');
335
333
  emptyItem.textContent = this.emptyResult;
336
- (_a = this.el.querySelector('ul[slot="content"]')) === null || _a === void 0 ? void 0 : _a.appendChild(emptyItem);
334
+ (_b = this.el.querySelector('div[slot="content"] ul')) === null || _b === void 0 ? void 0 : _b.prepend(emptyItem);
337
335
  }
338
336
  }
339
- /** Reset the filter and make all items visible. */
340
- resetFilter() {
341
- const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
342
- items.forEach(item => {
343
- item.style.display = '';
344
- });
337
+ async updateSelectedItem() {
338
+ const items = this.getAllItems();
339
+ if (this.value) {
340
+ items.forEach(item => {
341
+ if (item.value === this.value) {
342
+ item.selected = true;
343
+ }
344
+ else {
345
+ item.selected = false;
346
+ }
347
+ });
348
+ }
345
349
  }
346
- updateHighlightedItem(items, index) {
347
- items.forEach((item, i) => {
348
- if (i === index) {
349
- item.classList.add('highlighted');
350
- item.focus();
351
- item.scrollIntoView({ block: 'nearest' });
352
- }
353
- else {
354
- item.classList.remove('highlighted');
355
- }
356
- });
350
+ //#endregion METHODS
351
+ /****************************************************************************/
352
+ //#region LIFECYCLE
353
+ componentDidLoad() {
354
+ this.updateSelectedItem();
355
+ this.setFilterInputToSelectedValue();
357
356
  }
358
- updateSelectedItem(value) {
359
- if (!value)
360
- return;
361
- const items = Array.from(this.el.querySelectorAll('nv-fielddropdownitem'));
362
- const matchingItem = items.find(item => {
363
- var _a;
364
- const itemLabel = item.getAttribute('label');
365
- const itemValue = item.getAttribute('value');
366
- const itemText = (_a = item.textContent) === null || _a === void 0 ? void 0 : _a.trim();
367
- return itemLabel === value || itemValue === value || itemText === value;
368
- });
369
- items.forEach(item => {
370
- if (item === matchingItem) {
371
- item.setAttribute('selected', '');
372
- }
373
- else {
374
- item.removeAttribute('selected');
375
- }
376
- });
357
+ disconnectedCallback() {
358
+ clearTimeout(this.debounceTimer);
377
359
  }
378
- //#endregion METHODS
360
+ //#endregion LIFECYCLE
379
361
  /****************************************************************************/
380
362
  //#region RENDER
381
363
  render() {
382
364
  var _a;
383
- return (h(Host, { key: '1d5a87b2a5e9d9ca0be659ba5706b1db068d1d2d', role: "combobox", "aria-expanded": this.open.toString(), "aria-haspopup": "listbox", "aria-label": this.label }, (this.label || this.el.querySelector('[slot="label"]')) && (h("label", { key: 'b07ca241c89f45292e479de79de618c6444a9c42', htmlFor: this.inputId }, h("slot", { key: '0dd6ac2799e187e7233a5a5651ef18d59e4507e8', name: "label" }, this.label))), h("nv-popover", { key: 'b06d107776724937816dc4b98a035b282ed6c1f3', ref: el => (this.popoverElement = el), triggerMode: "controlled", placement: "bottom-start", open: this.open }, h("div", { key: 'ab755801a0f2a732ea895e04d6c3a85261422f17', class: "input-wrapper", slot: "trigger" }, h("slot", { key: 'b78c41d4064cf067d69fa20ae583c1be29d1f620', name: "before-input" }), h("div", { key: 'b46f6440660056ff71b9debf503f15ca7046ca02', class: "input-container", onClick: this.handleInputContainerClick }, h("slot", { key: '36069ce529fba771c9339a3cb6c9c5c838f441c4', name: "leading-input" }), this.filterable || this.disabled || this.readonly ? (h("input", { "data-scope": "focusable", id: this.inputId, type: "search", ref: e => (this.inputElement = e), autofocus: this.autofocus, autocomplete: this.autocomplete, placeholder: this.placeholder, name: this.name, value: this.getSelectedLabel(), required: this.required, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleInput, onFocus: this.handleInputFocus, onClick: this.handleInputFocus, onKeyDown: this.handleKeyDown, onBlur: this.handleBlurInput })) : (h("p", { "data-scope": "focusable", id: this.inputId, class: "non-filterable-text", onClick: this.handleInputContainerClick, tabIndex: this.disabled ? -1 : 0, onKeyDown: this.handleKeyDown, onFocus: this.handleInputFocus, onBlur: this.handleBlurInput }, this.getSelectedLabel() || this.value || this.placeholder)), this.filterable && this.filterText && this.open && (h("nv-iconbutton", { key: '36f76135c0e3e1e6750c95116aae6ddd397eec1f', name: "x", size: "md", emphasis: "lower", class: "clear-button", onClick: this.clearFilter, "aria-label": "Clear input" })), this.error && (h("nv-icon", { key: 'bd73c43ffae11897359adfae69572ee490f0f5c2', name: "alert-circle", class: "validation", size: "md" })), h("nv-iconbutton", { key: 'a0f237814e9f58aa9e4d72e73a1747248911ade8', "data-scope": "toggle-dropdown", name: this.open ? 'chevron-top' : 'chevron-down', size: "md", emphasis: "lower", "aria-label": this.open ? 'Hide dropdown' : 'Show dropdown', onClick: this.togglePopover, tabIndex: this.disabled ? -1 : 0 })), h("slot", { key: '66d2b27cfcf7ef97df493accaa333e0694234344', name: "after-input" })), h("div", { key: 'de6d7e18d676788cf0c7bfebd25f22b5cd2067ce', slot: "content", style: this.maxHeight ? { maxHeight: this.maxHeight } : {} }, ((_a = this.options) === null || _a === void 0 ? void 0 : _a.length) > 0 ? (h("ul", null, this.options.map(option => (h("nv-fielddropdownitem", { label: option.label, value: option.value, disabled: option.disabled, selected: option.value === this.value }))))) : (h("slot", { name: "content" })))), (this.description ||
384
- this.el.querySelector('[slot="description"]')) && (h("div", { key: 'ea889c8ecdcfad160010374541b73f548322a0ad', class: "description" }, h("slot", { key: 'b69f67d3a03bf1839edd912ea369cfd87395ae51', name: "description" }, this.description))), (this.errorDescription ||
385
- this.el.querySelector('[slot="error-description"]')) && (h("div", { key: '6ecd397cb41aab81173992c90e42f593f1227730', hidden: !this.error, class: "error-description" }, h("slot", { key: '3dff83b119d3cbbf2d00bc8641882326d08f939d', name: "error-description" }, this.errorDescription)))));
365
+ return (h(Host, { key: '428dd85337710d430ac04cf8cbc9021a93307bfe', role: "combobox", "aria-expanded": this.open.toString(), "aria-haspopup": "listbox", "aria-label": this.label }, (this.label || this.el.querySelector('[slot="label"]')) && (h("label", { key: 'a527c33d31152a90f8641e27fbaf91cf73eb06b6', htmlFor: this.inputId, onClick: this.syncToggleDropdown.bind(this) }, h("slot", { key: 'e4cf96c38db69080228666e4b924367a0c3a9d72', name: "label" }, this.label))), h("nv-popover", { key: '41723f7ec67e4e5680381e217eba45a1d73b47fc', triggerMode: "controlled", placement: "bottom-start", open: this.open }, h("div", { key: 'd4af00d5171b09923c36df9fd44853e1399e584f', class: "input-wrapper", slot: "trigger" }, h("slot", { key: 'bb6e53746c70fcc8172acd9a7ef8cbf72ae70698', name: "before-input" }), h("div", { key: 'ef3dc9ac5d0d895384653a17f8e61f616a7cbba9', class: "input-container" }, h("slot", { key: '7621b8cb7222330e73a426282877df2e0040714c', name: "leading-input" }), this.filterable || this.disabled || this.readonly ? (h("input", { "data-scope": "focusable", id: this.inputId, type: "search", ref: e => (this.inputElement = e), autofocus: this.autofocus, autocomplete: this.autocomplete, placeholder: this.placeholder, name: this.name, required: this.required, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleFilterInput })) : (h("p", { "data-scope": "focusable", id: this.inputId, ref: el => (this.selectElement = el), class: "non-filterable-text", tabIndex: this.disabled ? -1 : 0 }, this.getSelectedLabel() || this.value || this.placeholder)), this.filterable && this.filterText && (h("nv-iconbutton", { key: '3de283e59d0c7811b39e30d98fdd7e400a1b3d49', name: "x", size: "md", emphasis: "lower", class: "clear-button", onClick: this.clearFilter.bind(this), "aria-label": "Clear input" })), this.error && (h("nv-icon", { key: '6f826edb19430ce535dc8742dfbd77b05d673f4d', name: "alert-circle", class: "validation", size: "md" })), h("nv-iconbutton", { key: '611f8df410c38faeb9fec9a43ac1f7013ce9b32b', "data-scope": "toggle-dropdown", ref: el => (this.toggleElement = el), name: this.open ? 'chevron-top' : 'chevron-down', size: "md", emphasis: "lower", "aria-label": this.open ? 'Hide dropdown' : 'Show dropdown', onClick: this.syncToggleDropdown.bind(this), tabIndex: this.disabled ? -1 : 0 })), h("slot", { key: '18d16b6c1d3c1ab910f8a45a339ae750e2277542', name: "after-input" })), h("div", { key: '53624675adac2c6c9345b64e634cbbad4f009a82', slot: "content", style: this.maxHeight ? { maxHeight: this.maxHeight } : {} }, ((_a = this.options) === null || _a === void 0 ? void 0 : _a.length) > 0 && (h("ul", { key: '3dfd5e914176bab898fd7872eb4ea0206d12b80a' }, this.options.map(option => (h("nv-fielddropdownitem", { label: option.label, value: option.value, disabled: option.disabled, selected: option.value === this.value }))))), h("slot", { key: 'e1c9151e125d0fe6f129b879b0adf1ae91b94bc4', name: "content" }))), (this.description ||
366
+ this.el.querySelector('[slot="description"]')) && (h("div", { key: '13247930760480ec767ce75c61385036126cd2f3', class: "description" }, h("slot", { key: '09c3f2fa0a1be5bcbe69b757a68a8327fef29ec1', name: "description" }, this.description))), (this.errorDescription ||
367
+ this.el.querySelector('[slot="error-description"]')) && (h("div", { key: '9b43e41b6b38242b21c750d2d442c78e0930b9bc', hidden: !this.error, class: "error-description" }, h("slot", { key: '44f7756522adbc54b8d85a211dace24a37073fc6', name: "error-description" }, this.errorDescription)))));
386
368
  }
387
369
  static get is() { return "nv-fielddropdown"; }
388
370
  static get formAssociated() { return true; }
@@ -664,9 +646,29 @@ export class NvFielddropdown {
664
646
  "reflect": true,
665
647
  "defaultValue": "''"
666
648
  },
667
- "open": {
649
+ "emptyResult": {
650
+ "type": "string",
651
+ "mutable": false,
652
+ "complexType": {
653
+ "original": "string",
654
+ "resolved": "string",
655
+ "references": {}
656
+ },
657
+ "required": false,
658
+ "optional": false,
659
+ "docs": {
660
+ "tags": [],
661
+ "text": "The text to display when no items match the filter."
662
+ },
663
+ "getter": false,
664
+ "setter": false,
665
+ "attribute": "empty-result",
666
+ "reflect": true,
667
+ "defaultValue": "'No results found'"
668
+ },
669
+ "filterable": {
668
670
  "type": "boolean",
669
- "mutable": true,
671
+ "mutable": false,
670
672
  "complexType": {
671
673
  "original": "boolean",
672
674
  "resolved": "boolean",
@@ -676,35 +678,35 @@ export class NvFielddropdown {
676
678
  "optional": false,
677
679
  "docs": {
678
680
  "tags": [],
679
- "text": "State of the dropdown popover."
681
+ "text": "Enables or disables the filtering feature for the dropdown items."
680
682
  },
681
683
  "getter": false,
682
684
  "setter": false,
683
- "attribute": "open",
685
+ "attribute": "filterable",
684
686
  "reflect": true,
685
687
  "defaultValue": "false"
686
688
  },
687
- "emptyResult": {
688
- "type": "string",
689
+ "openOnSelect": {
690
+ "type": "boolean",
689
691
  "mutable": false,
690
692
  "complexType": {
691
- "original": "string",
692
- "resolved": "string",
693
+ "original": "boolean",
694
+ "resolved": "boolean",
693
695
  "references": {}
694
696
  },
695
697
  "required": false,
696
698
  "optional": false,
697
699
  "docs": {
698
700
  "tags": [],
699
- "text": "The text to display when no items match the filter."
701
+ "text": "When an item is selected by the user, the dropdown will continue to stay\nopen."
700
702
  },
701
703
  "getter": false,
702
704
  "setter": false,
703
- "attribute": "empty-result",
705
+ "attribute": "open-on-select",
704
706
  "reflect": true,
705
- "defaultValue": "'No results found'"
707
+ "defaultValue": "false"
706
708
  },
707
- "filterable": {
709
+ "controlledFilter": {
708
710
  "type": "boolean",
709
711
  "mutable": false,
710
712
  "complexType": {
@@ -716,11 +718,11 @@ export class NvFielddropdown {
716
718
  "optional": false,
717
719
  "docs": {
718
720
  "tags": [],
719
- "text": "Enables or disables the filtering feature for the dropdown items."
721
+ "text": "Determines if the component\u2019s filtering behavior is managed externally.\nWhen set to true and filterable is enabled, the component won\u2019t\nautomatically filter items. Instead, you must implement your own filtering\nlogic (e.g., server-side search or custom matching) using the\nfilterTextChanged event."
720
722
  },
721
723
  "getter": false,
722
724
  "setter": false,
723
- "attribute": "filterable",
725
+ "attribute": "controlled-filter",
724
726
  "reflect": true,
725
727
  "defaultValue": "false"
726
728
  },
@@ -728,8 +730,8 @@ export class NvFielddropdown {
728
730
  "type": "unknown",
729
731
  "mutable": false,
730
732
  "complexType": {
731
- "original": "{\n /** Label to display for the option */\n label: string;\n /** Value associated with the option */\n value: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n /** Whether this option is pre-selected */\n selected?: boolean;\n }[]",
732
- "resolved": "{ label: string; value: string; disabled?: boolean; selected?: boolean; }[]",
733
+ "original": "{\n /** Label to display for the option */\n label: string;\n /** Value associated with the option */\n value: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n }[]",
734
+ "resolved": "{ label: string; value: string; disabled?: boolean; }[]",
733
735
  "references": {}
734
736
  },
735
737
  "required": false,
@@ -759,7 +761,7 @@ export class NvFielddropdown {
759
761
  "name": "default",
760
762
  "text": "300"
761
763
  }],
762
- "text": "Delay in milliseconds before the search is triggered when typing in the filter input."
764
+ "text": "Delay in milliseconds before the search is triggered when typing in the\nfilter input."
763
765
  },
764
766
  "getter": false,
765
767
  "setter": false,
@@ -812,7 +814,8 @@ export class NvFielddropdown {
812
814
  static get states() {
813
815
  return {
814
816
  "filterText": {},
815
- "selectedValues": {}
817
+ "selectedValues": {},
818
+ "open": {}
816
819
  };
817
820
  }
818
821
  static get events() {
@@ -834,6 +837,41 @@ export class NvFielddropdown {
834
837
  "resolved": "string",
835
838
  "references": {}
836
839
  }
840
+ }, {
841
+ "method": "filterTextChanged",
842
+ "name": "filterTextChanged",
843
+ "bubbles": true,
844
+ "cancelable": true,
845
+ "composed": true,
846
+ "docs": {
847
+ "tags": [],
848
+ "text": "Event emitted when the filter input value changes."
849
+ },
850
+ "complexType": {
851
+ "original": "string",
852
+ "resolved": "string",
853
+ "references": {}
854
+ }
855
+ }, {
856
+ "method": "openChanged",
857
+ "name": "openChanged",
858
+ "bubbles": true,
859
+ "cancelable": true,
860
+ "composed": true,
861
+ "docs": {
862
+ "tags": [],
863
+ "text": "Event emitted when the dropdown opened or closed."
864
+ },
865
+ "complexType": {
866
+ "original": "HTMLNvPopoverElementEventMap['openChanged']",
867
+ "resolved": "boolean",
868
+ "references": {
869
+ "HTMLNvPopoverElementEventMap": {
870
+ "location": "global",
871
+ "id": "global::HTMLNvPopoverElementEventMap"
872
+ }
873
+ }
874
+ }
837
875
  }, {
838
876
  "method": "dropdownItemSelected",
839
877
  "name": "dropdownItemSelected",
@@ -846,7 +884,7 @@ export class NvFielddropdown {
846
884
  },
847
885
  "complexType": {
848
886
  "original": "HTMLNvFielddropdownitemElementEventMap['dropdownItemSelected']",
849
- "resolved": "{ label?: string; value: string; }",
887
+ "resolved": "{ label?: string; value: string; detached?: boolean; }",
850
888
  "references": {
851
889
  "HTMLNvFielddropdownitemElementEventMap": {
852
890
  "location": "global",
@@ -858,9 +896,9 @@ export class NvFielddropdown {
858
896
  }
859
897
  static get methods() {
860
898
  return {
861
- "getFilterText": {
899
+ "clearFilter": {
862
900
  "complexType": {
863
- "signature": "() => Promise<string>",
901
+ "signature": "() => Promise<void>",
864
902
  "parameters": [],
865
903
  "references": {
866
904
  "Promise": {
@@ -868,13 +906,34 @@ export class NvFielddropdown {
868
906
  "id": "global::Promise"
869
907
  }
870
908
  },
871
- "return": "Promise<string>"
909
+ "return": "Promise<void>"
910
+ },
911
+ "docs": {
912
+ "text": "Clears the filter text",
913
+ "tags": []
914
+ }
915
+ },
916
+ "toggleDropdown": {
917
+ "complexType": {
918
+ "signature": "(open?: boolean) => Promise<void>",
919
+ "parameters": [{
920
+ "name": "open",
921
+ "type": "boolean",
922
+ "docs": "- The open state to set, if null, toggles the state"
923
+ }],
924
+ "references": {
925
+ "Promise": {
926
+ "location": "global",
927
+ "id": "global::Promise"
928
+ }
929
+ },
930
+ "return": "Promise<void>"
872
931
  },
873
932
  "docs": {
874
- "text": "Retrieves the current filter text entered by the user.",
933
+ "text": "Toggles the dropdown popover open state",
875
934
  "tags": [{
876
- "name": "returns",
877
- "text": "The filter text."
935
+ "name": "param",
936
+ "text": "open - The open state to set, if null, toggles the state"
878
937
  }]
879
938
  }
880
939
  }
@@ -883,41 +942,47 @@ export class NvFielddropdown {
883
942
  static get elementRef() { return "el"; }
884
943
  static get watchers() {
885
944
  return [{
886
- "propName": "options",
887
- "methodName": "handleOptionsChange"
945
+ "propName": "open",
946
+ "methodName": "handleOpenChange"
888
947
  }, {
889
948
  "propName": "value",
890
- "methodName": "watchValueHandler"
949
+ "methodName": "handleValueChange"
891
950
  }, {
892
- "propName": "open",
893
- "methodName": "handleOpenChange"
951
+ "propName": "options",
952
+ "methodName": "handleOptionsChange"
894
953
  }];
895
954
  }
896
955
  static get listeners() {
897
956
  return [{
898
- "name": "openChanged",
899
- "method": "handleOpenChanged",
900
- "target": undefined,
901
- "capture": false,
902
- "passive": false
903
- }, {
904
957
  "name": "dropdownItemSelected",
905
958
  "method": "handleDropdownItemSelected",
906
959
  "target": undefined,
907
960
  "capture": false,
908
961
  "passive": false
909
962
  }, {
910
- "name": "blur",
911
- "method": "handleBlur",
963
+ "name": "focus",
964
+ "method": "handleFocus",
912
965
  "target": undefined,
913
966
  "capture": true,
914
- "passive": false
967
+ "passive": true
968
+ }, {
969
+ "name": "focusout",
970
+ "method": "handleFocusOut",
971
+ "target": undefined,
972
+ "capture": true,
973
+ "passive": true
915
974
  }, {
916
975
  "name": "keydown",
917
976
  "method": "handleKeyDown",
918
977
  "target": undefined,
919
978
  "capture": false,
920
979
  "passive": false
980
+ }, {
981
+ "name": "click",
982
+ "method": "handleDocumentClick",
983
+ "target": "document",
984
+ "capture": false,
985
+ "passive": false
921
986
  }];
922
987
  }
923
988
  }