@mhmo91/schmancy 0.10.15 → 0.10.16

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 (541) hide show
  1. package/custom-elements.json +2554 -3086
  2. package/dist/active-host-BP0zy_Y9.js +63 -0
  3. package/dist/{active-host-CvNYoprt.js.map → active-host-BP0zy_Y9.js.map} +1 -1
  4. package/dist/active-host-jH3iloCR.cjs +1 -0
  5. package/dist/{active-host-CcIa2tmW.cjs.map → active-host-jH3iloCR.cjs.map} +1 -1
  6. package/dist/agent/schmancy.agent.js +2579 -2385
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +971 -1189
  9. package/dist/{animation-CO_Csq84.cjs.map → animation-CCOIW4wJ.cjs.map} +1 -1
  10. package/dist/{animation-BK-8BwY8.js.map → animation-DCznELuT.js.map} +1 -1
  11. package/dist/{area-C_kgZZhN.js → area-ChxsDTu_.js} +2 -2
  12. package/dist/{area-C_kgZZhN.js.map → area-ChxsDTu_.js.map} +1 -1
  13. package/dist/{area-DFPtKzWy.cjs → area-Qt6yUnuA.cjs} +3 -3
  14. package/dist/{area-DFPtKzWy.cjs.map → area-Qt6yUnuA.cjs.map} +1 -1
  15. package/dist/area.cjs +1 -1
  16. package/dist/area.js +2 -2
  17. package/dist/{audio-CluX8Qpq.cjs → audio-D-TZzpXF.cjs} +1 -1
  18. package/dist/{audio-CluX8Qpq.cjs.map → audio-D-TZzpXF.cjs.map} +1 -1
  19. package/dist/{audio-DcXphulJ.js → audio-DS43uoRA.js} +1 -1
  20. package/dist/{audio-DcXphulJ.js.map → audio-DS43uoRA.js.map} +1 -1
  21. package/dist/audio.cjs +1 -1
  22. package/dist/audio.js +2 -2
  23. package/dist/{autocomplete-DWSuwSRS.js → autocomplete-CXvUjMD-.js} +46 -71
  24. package/dist/autocomplete-CXvUjMD-.js.map +1 -0
  25. package/dist/autocomplete-Ck2zbdF9.cjs +115 -0
  26. package/dist/autocomplete-Ck2zbdF9.cjs.map +1 -0
  27. package/dist/autocomplete.cjs +1 -1
  28. package/dist/autocomplete.js +1 -1
  29. package/dist/avatar.cjs +2 -2
  30. package/dist/avatar.cjs.map +1 -1
  31. package/dist/avatar.js +3 -3
  32. package/dist/badge.cjs +1 -1
  33. package/dist/badge.js +1 -1
  34. package/dist/{boat-CZma2ojF.js → boat-Bj0wVcZi.js} +5 -5
  35. package/dist/{boat-CZma2ojF.js.map → boat-Bj0wVcZi.js.map} +1 -1
  36. package/dist/{boat-Dy6cc3hB.cjs → boat-DpFkILFF.cjs} +2 -2
  37. package/dist/{boat-Dy6cc3hB.cjs.map → boat-DpFkILFF.cjs.map} +1 -1
  38. package/dist/boat.cjs +1 -1
  39. package/dist/boat.js +1 -1
  40. package/dist/breadcrumb.cjs +3 -3
  41. package/dist/breadcrumb.cjs.map +1 -1
  42. package/dist/breadcrumb.js +2 -2
  43. package/dist/{busy-DCsqryvq.cjs → busy-CtcnclA3.cjs} +3 -3
  44. package/dist/{busy-DCsqryvq.cjs.map → busy-CtcnclA3.cjs.map} +1 -1
  45. package/dist/{busy-DeV2ByMw.js → busy-CyZSBnZP.js} +2 -2
  46. package/dist/{busy-DeV2ByMw.js.map → busy-CyZSBnZP.js.map} +1 -1
  47. package/dist/busy.cjs +1 -1
  48. package/dist/busy.js +1 -1
  49. package/dist/button.cjs +4 -4
  50. package/dist/button.cjs.map +1 -1
  51. package/dist/button.js +19 -4
  52. package/dist/button.js.map +1 -1
  53. package/dist/{card--GgSX4X5.cjs → card-Cl6jp1yX.cjs} +5 -5
  54. package/dist/{card--GgSX4X5.cjs.map → card-Cl6jp1yX.cjs.map} +1 -1
  55. package/dist/{card-BTTsHzJJ.js → card-nYZCKmOO.js} +3 -3
  56. package/dist/{card-BTTsHzJJ.js.map → card-nYZCKmOO.js.map} +1 -1
  57. package/dist/card.cjs +1 -1
  58. package/dist/card.js +1 -1
  59. package/dist/{checkbox-NNReP9s_.cjs → checkbox-BeNo0ZGt.cjs} +4 -4
  60. package/dist/{checkbox-Cj5j-ppk.js.map → checkbox-BeNo0ZGt.cjs.map} +1 -1
  61. package/dist/{checkbox-Cj5j-ppk.js → checkbox-DiUrZiyc.js} +17 -30
  62. package/dist/checkbox-DiUrZiyc.js.map +1 -0
  63. package/dist/checkbox.cjs +1 -1
  64. package/dist/checkbox.js +1 -1
  65. package/dist/{chips-CP-CbfoZ.js → chips-CfPFXv7Z.js} +5 -5
  66. package/dist/{chips-CP-CbfoZ.js.map → chips-CfPFXv7Z.js.map} +1 -1
  67. package/dist/{chips-iporOXxK.cjs → chips-DK6m-VCM.cjs} +5 -5
  68. package/dist/{chips-iporOXxK.cjs.map → chips-DK6m-VCM.cjs.map} +1 -1
  69. package/dist/chips.cjs +1 -1
  70. package/dist/chips.js +2 -2
  71. package/dist/connectivity.cjs +2 -2
  72. package/dist/connectivity.cjs.map +1 -1
  73. package/dist/connectivity.js +3 -3
  74. package/dist/content-drawer.cjs +1 -1
  75. package/dist/content-drawer.js +1 -1
  76. package/dist/{context-DJTJnSK4.js.map → context-6oXCZmZN.js.map} +1 -1
  77. package/dist/{context-BpCETidA.cjs.map → context-CRZeiCqq.cjs.map} +1 -1
  78. package/dist/{cursor-glow-Bulq-38P.cjs → cursor-glow-C8LgCxpI.cjs} +1 -1
  79. package/dist/{cursor-glow-Bulq-38P.cjs.map → cursor-glow-C8LgCxpI.cjs.map} +1 -1
  80. package/dist/{cursor-glow-Ah7VXSj7.js → cursor-glow-Cs2XLDB9.js} +1 -1
  81. package/dist/{cursor-glow-Ah7VXSj7.js.map → cursor-glow-Cs2XLDB9.js.map} +1 -1
  82. package/dist/date-range-DA6anfcF.cjs +131 -0
  83. package/dist/date-range-DA6anfcF.cjs.map +1 -0
  84. package/dist/{date-range-CgNujP8r.js → date-range-DjlF2u7o.js} +124 -89
  85. package/dist/date-range-DjlF2u7o.js.map +1 -0
  86. package/dist/date-range-inline-BfYK795W.cjs +43 -0
  87. package/dist/{date-range-inline-D4IjOOO0.cjs.map → date-range-inline-BfYK795W.cjs.map} +1 -1
  88. package/dist/{date-range-inline-C2PXX_GY.js → date-range-inline-n7y_H6PJ.js} +2 -2
  89. package/dist/{date-range-inline-C2PXX_GY.js.map → date-range-inline-n7y_H6PJ.js.map} +1 -1
  90. package/dist/date-range-inline.cjs +1 -1
  91. package/dist/date-range-inline.js +1 -1
  92. package/dist/date-range.cjs +1 -1
  93. package/dist/date-range.js +1 -1
  94. package/dist/delay.cjs +2 -2
  95. package/dist/delay.cjs.map +1 -1
  96. package/dist/delay.js +3 -3
  97. package/dist/{details-DT2b3xOn.cjs → details-BdAVsLl-.cjs} +2 -2
  98. package/dist/{details-DT2b3xOn.cjs.map → details-BdAVsLl-.cjs.map} +1 -1
  99. package/dist/{details-VjaNwtfd.js → details-CS_ToAOj.js} +6 -6
  100. package/dist/{details-VjaNwtfd.js.map → details-CS_ToAOj.js.map} +1 -1
  101. package/dist/details.cjs +1 -1
  102. package/dist/details.js +1 -1
  103. package/dist/directives.cjs +1 -1
  104. package/dist/directives.js +5 -5
  105. package/dist/{divider-BMO8pzEO.js → divider-COLK0RbT.js} +2 -2
  106. package/dist/{divider-BMO8pzEO.js.map → divider-COLK0RbT.js.map} +1 -1
  107. package/dist/{divider-BW33TZ-X.cjs → divider-CvWAnvdO.cjs} +2 -2
  108. package/dist/{divider-BW33TZ-X.cjs.map → divider-CvWAnvdO.cjs.map} +1 -1
  109. package/dist/divider.cjs +1 -1
  110. package/dist/divider.js +1 -1
  111. package/dist/dropdown.cjs +3 -3
  112. package/dist/dropdown.cjs.map +1 -1
  113. package/dist/dropdown.js +2 -2
  114. package/dist/{expand-DbELKKOt.js → expand-D9LzmpoV.js} +5 -5
  115. package/dist/{expand-DbELKKOt.js.map → expand-D9LzmpoV.js.map} +1 -1
  116. package/dist/{expand-_f5EUKWB.cjs → expand-r2sATPUJ.cjs} +3 -3
  117. package/dist/{expand-_f5EUKWB.cjs.map → expand-r2sATPUJ.cjs.map} +1 -1
  118. package/dist/expand.cjs +1 -1
  119. package/dist/expand.js +1 -1
  120. package/dist/float-2nHYuBx-.cjs +1 -0
  121. package/dist/{float-CKmd-0-t.cjs.map → float-2nHYuBx-.cjs.map} +1 -1
  122. package/dist/{float-B6RBb2dN.js → float-BWy39CXr.js} +2 -2
  123. package/dist/{float-B6RBb2dN.js.map → float-BWy39CXr.js.map} +1 -1
  124. package/dist/float.cjs +1 -1
  125. package/dist/float.js +1 -1
  126. package/dist/form-DhjedCWm.js +258 -0
  127. package/dist/form-DhjedCWm.js.map +1 -0
  128. package/dist/form-g5c70rac.cjs +42 -0
  129. package/dist/form-g5c70rac.cjs.map +1 -0
  130. package/dist/form.cjs +1 -1
  131. package/dist/form.js +2 -2
  132. package/dist/handover/agent-runtime-followups.md +1 -1
  133. package/dist/handover/agent-runtime-v1.md +3 -3
  134. package/dist/{hashContent-Bobsobip.cjs.map → hashContent-Ck6laKlk.cjs.map} +1 -1
  135. package/dist/{hashContent-BU6jl5ih.js.map → hashContent-dJrI-9sc.js.map} +1 -1
  136. package/dist/{icons-r-S17M8U.cjs → icons-1HIENBco.cjs} +2 -2
  137. package/dist/{icons-r-S17M8U.cjs.map → icons-1HIENBco.cjs.map} +1 -1
  138. package/dist/{icons-CoDo95Cu.js → icons-3y0kr1aB.js} +3 -3
  139. package/dist/{icons-CoDo95Cu.js.map → icons-3y0kr1aB.js.map} +1 -1
  140. package/dist/icons.cjs +1 -1
  141. package/dist/icons.js +1 -1
  142. package/dist/{iframe-P9c_qg1-.cjs → iframe-CjqYuZG5.cjs} +2 -2
  143. package/dist/{iframe-P9c_qg1-.cjs.map → iframe-CjqYuZG5.cjs.map} +1 -1
  144. package/dist/{iframe-k4oI-TIj.js → iframe-Z5gTK-gd.js} +2 -2
  145. package/dist/{iframe-k4oI-TIj.js.map → iframe-Z5gTK-gd.js.map} +1 -1
  146. package/dist/iframe.cjs +1 -1
  147. package/dist/iframe.js +1 -1
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.js +60 -60
  150. package/dist/{input-D95GjINh.js → input-B-fw6f_r.js} +103 -104
  151. package/dist/input-B-fw6f_r.js.map +1 -0
  152. package/dist/input-BtcIhu0Q.cjs +52 -0
  153. package/dist/input-BtcIhu0Q.cjs.map +1 -0
  154. package/dist/{input-chip-DpC_XEKN.js → input-chip-CtQ0pH5b.js} +2 -2
  155. package/dist/{input-chip-DpC_XEKN.js.map → input-chip-CtQ0pH5b.js.map} +1 -1
  156. package/dist/{input-chip-D0ZXqTt5.cjs → input-chip-DZktYohr.cjs} +2 -2
  157. package/dist/{input-chip-D0ZXqTt5.cjs.map → input-chip-DZktYohr.cjs.map} +1 -1
  158. package/dist/input.cjs +1 -1
  159. package/dist/input.js +1 -1
  160. package/dist/json.cjs +2 -2
  161. package/dist/json.cjs.map +1 -1
  162. package/dist/json.js +3 -3
  163. package/dist/kbd.cjs +2 -2
  164. package/dist/kbd.cjs.map +1 -1
  165. package/dist/kbd.js +2 -2
  166. package/dist/{layout-CXPNsUIo.js → layout-BH28sKGc.js} +1 -1
  167. package/dist/{layout-CXPNsUIo.js.map → layout-BH28sKGc.js.map} +1 -1
  168. package/dist/{layout-Zhe7wSZ_.cjs → layout-Delq-QvR.cjs} +1 -1
  169. package/dist/{layout-Zhe7wSZ_.cjs.map → layout-Delq-QvR.cjs.map} +1 -1
  170. package/dist/layout.cjs +1 -1
  171. package/dist/layout.js +1 -1
  172. package/dist/{lazy-Dq9mRRjT.cjs.map → lazy-CayEFyC3.cjs.map} +1 -1
  173. package/dist/{lazy-B0ia54tT.js.map → lazy-D-bO2r4m.js.map} +1 -1
  174. package/dist/{lightbox-C-yHeoK0.cjs → lightbox-BHTZOn8K.cjs} +3 -3
  175. package/dist/{lightbox-C-yHeoK0.cjs.map → lightbox-BHTZOn8K.cjs.map} +1 -1
  176. package/dist/{lightbox-CovQtmyn.js → lightbox-BL3LWp-P.js} +9 -9
  177. package/dist/{lightbox-CovQtmyn.js.map → lightbox-BL3LWp-P.js.map} +1 -1
  178. package/dist/lightbox.cjs +1 -1
  179. package/dist/lightbox.js +1 -1
  180. package/dist/{list-CAijuky4.cjs → list-CHYa5VGY.cjs} +3 -3
  181. package/dist/{list-CAijuky4.cjs.map → list-CHYa5VGY.cjs.map} +1 -1
  182. package/dist/{list-C1pR9vhu.js → list-DLJL1JQj.js} +2 -2
  183. package/dist/{list-C1pR9vhu.js.map → list-DLJL1JQj.js.map} +1 -1
  184. package/dist/list.cjs +1 -1
  185. package/dist/list.js +1 -1
  186. package/dist/{magnetic-BJgB1dVi.cjs → magnetic-Bgh7aHHI.cjs} +1 -1
  187. package/dist/{magnetic-BJgB1dVi.cjs.map → magnetic-Bgh7aHHI.cjs.map} +1 -1
  188. package/dist/{magnetic-YwCNvtbB.js → magnetic-DxvoEz8_.js} +2 -2
  189. package/dist/{magnetic-YwCNvtbB.js.map → magnetic-DxvoEz8_.js.map} +1 -1
  190. package/dist/{menu-B59vZv9n.js → menu-BNq93w6X.js} +3 -3
  191. package/dist/{menu-B59vZv9n.js.map → menu-BNq93w6X.js.map} +1 -1
  192. package/dist/{menu-BaHO3Cip.cjs → menu-DAikvkeV.cjs} +3 -3
  193. package/dist/{menu-BaHO3Cip.cjs.map → menu-DAikvkeV.cjs.map} +1 -1
  194. package/dist/menu.cjs +1 -1
  195. package/dist/menu.js +1 -1
  196. package/dist/mixins-BOOu6q2n.cjs +298 -0
  197. package/dist/mixins-BOOu6q2n.cjs.map +1 -0
  198. package/dist/mixins-BWb9_e1s.js +680 -0
  199. package/dist/mixins-BWb9_e1s.js.map +1 -0
  200. package/dist/mixins.cjs +1 -1
  201. package/dist/mixins.js +2 -2
  202. package/dist/nav-drawer.cjs +1 -1
  203. package/dist/nav-drawer.js +1 -1
  204. package/dist/navigation-bar.cjs +1 -1
  205. package/dist/navigation-bar.js +1 -1
  206. package/dist/navigation-rail.cjs +3 -3
  207. package/dist/navigation-rail.cjs.map +1 -1
  208. package/dist/navigation-rail.js +2 -2
  209. package/dist/{notification-BeLoVa47.js → notification-CUmb9c3Y.js} +4 -4
  210. package/dist/{notification-BeLoVa47.js.map → notification-CUmb9c3Y.js.map} +1 -1
  211. package/dist/notification-Dy2azMyt.cjs +23 -0
  212. package/dist/{notification-BC9nG8Sr.cjs.map → notification-Dy2azMyt.cjs.map} +1 -1
  213. package/dist/notification.cjs +1 -1
  214. package/dist/notification.js +1 -1
  215. package/dist/{option-BWF4GBp-.cjs → option-CDgIKifG.cjs} +2 -2
  216. package/dist/{option-BWF4GBp-.cjs.map → option-CDgIKifG.cjs.map} +1 -1
  217. package/dist/{option-UvlSAcC4.js → option-DFvQ551b.js} +2 -2
  218. package/dist/{option-UvlSAcC4.js.map → option-DFvQ551b.js.map} +1 -1
  219. package/dist/option.cjs +1 -1
  220. package/dist/option.js +1 -1
  221. package/dist/{overlay-stack-DCDS17uj.js.map → overlay-stack-BR4iYivO.js.map} +1 -1
  222. package/dist/{overlay-stack-DPIe_aYv.cjs.map → overlay-stack-Dk0xETTy.cjs.map} +1 -1
  223. package/dist/overlay.cjs +2 -2
  224. package/dist/overlay.cjs.map +1 -1
  225. package/dist/{overlay.confirm-body-URtE1gI3.cjs → overlay.confirm-body-BkhNvr0c.cjs} +2 -2
  226. package/dist/{overlay.confirm-body-URtE1gI3.cjs.map → overlay.confirm-body-BkhNvr0c.cjs.map} +1 -1
  227. package/dist/{overlay.confirm-body-9W0B5QGv.js → overlay.confirm-body-uFp-0Zfh.js} +2 -2
  228. package/dist/{overlay.confirm-body-9W0B5QGv.js.map → overlay.confirm-body-uFp-0Zfh.js.map} +1 -1
  229. package/dist/overlay.js +8 -8
  230. package/dist/{overlay.service-DnZTcKyJ.cjs → overlay.service-1YWfUD2S.cjs} +1 -1
  231. package/dist/{overlay.service-DnZTcKyJ.cjs.map → overlay.service-1YWfUD2S.cjs.map} +1 -1
  232. package/dist/{overlay.service-CVqs2Gu1.js → overlay.service-BcF12kGb.js} +2 -2
  233. package/dist/{overlay.service-CVqs2Gu1.js.map → overlay.service-BcF12kGb.js.map} +1 -1
  234. package/dist/page.cjs +2 -2
  235. package/dist/page.cjs.map +1 -1
  236. package/dist/page.js +5 -5
  237. package/dist/{progress-CwzwY8Oe.cjs → progress-C02sWkmE.cjs} +2 -2
  238. package/dist/{progress-CwzwY8Oe.cjs.map → progress-C02sWkmE.cjs.map} +1 -1
  239. package/dist/{progress-C29Uw-WJ.js → progress-bLbGRuQ1.js} +2 -2
  240. package/dist/{progress-C29Uw-WJ.js.map → progress-bLbGRuQ1.js.map} +1 -1
  241. package/dist/progress.cjs +1 -1
  242. package/dist/progress.js +1 -1
  243. package/dist/radio-group-BA-jRct5.cjs +40 -0
  244. package/dist/radio-group-BA-jRct5.cjs.map +1 -0
  245. package/dist/{radio-group-CW8airhZ.js → radio-group-DA4eIGCj.js} +4 -4
  246. package/dist/radio-group-DA4eIGCj.js.map +1 -0
  247. package/dist/radio-group.cjs +1 -1
  248. package/dist/radio-group.js +1 -1
  249. package/dist/range.cjs +6 -4
  250. package/dist/range.cjs.map +1 -1
  251. package/dist/range.js +19 -15
  252. package/dist/range.js.map +1 -1
  253. package/dist/{reduced-motion-D-L12p7G.js.map → reduced-motion-D7LqTUMn.js.map} +1 -1
  254. package/dist/{reduced-motion-Ds-HjMzn.cjs.map → reduced-motion-Dzfp_w5x.cjs.map} +1 -1
  255. package/dist/{rxjs-utils-CVeJQ9KG.js.map → rxjs-utils-D9U4MW0Q.js.map} +1 -1
  256. package/dist/{rxjs-utils-DCUHg_Ml.cjs.map → rxjs-utils-kWPShgKu.cjs.map} +1 -1
  257. package/dist/rxjs-utils.cjs +1 -1
  258. package/dist/rxjs-utils.js +1 -1
  259. package/dist/{scroll-BotoGcMU.js → scroll-CG5up5oy.js} +2 -2
  260. package/dist/{scroll-BotoGcMU.js.map → scroll-CG5up5oy.js.map} +1 -1
  261. package/dist/{scroll-CmhmUebp.cjs → scroll-D8vBF_gY.cjs} +2 -2
  262. package/dist/{scroll-CmhmUebp.cjs.map → scroll-D8vBF_gY.cjs.map} +1 -1
  263. package/dist/{search-BLCRsxIC.cjs.map → search-DPKoC-dT.cjs.map} +1 -1
  264. package/dist/{search-BTz7-Rev.js.map → search-MvIBA93K.js.map} +1 -1
  265. package/dist/{select-Dbn-CImU.js → select-BrK1BJoU.js} +52 -73
  266. package/dist/select-BrK1BJoU.js.map +1 -0
  267. package/dist/select-Dh2j7Qc-.cjs +56 -0
  268. package/dist/select-Dh2j7Qc-.cjs.map +1 -0
  269. package/dist/select.cjs +1 -1
  270. package/dist/select.js +1 -1
  271. package/dist/skeleton.cjs +2 -2
  272. package/dist/skeleton.cjs.map +1 -1
  273. package/dist/skeleton.js +2 -2
  274. package/dist/skills/autocomplete.md +16 -3
  275. package/dist/skills/button.md +19 -0
  276. package/dist/skills/checkbox.md +19 -0
  277. package/dist/skills/date-range.md +19 -0
  278. package/dist/skills/form-ux-rules.md +55 -0
  279. package/dist/skills/form.md +121 -25
  280. package/dist/skills/input.md +19 -4
  281. package/dist/skills/range.md +15 -1
  282. package/dist/skills/schmancy/autocomplete.md +16 -3
  283. package/dist/skills/schmancy/button.md +19 -0
  284. package/dist/skills/schmancy/checkbox.md +19 -0
  285. package/dist/skills/schmancy/date-range.md +19 -0
  286. package/dist/skills/schmancy/form-ux-rules.md +55 -0
  287. package/dist/skills/schmancy/form.md +121 -25
  288. package/dist/skills/schmancy/input.md +19 -4
  289. package/dist/skills/schmancy/range.md +15 -1
  290. package/dist/skills/schmancy/select.md +13 -1
  291. package/dist/skills/schmancy/switch.md +21 -2
  292. package/dist/skills/schmancy/textarea.md +13 -0
  293. package/dist/skills/select.md +13 -1
  294. package/dist/skills/switch.md +21 -2
  295. package/dist/skills/textarea.md +13 -0
  296. package/dist/slider.cjs +3 -3
  297. package/dist/slider.cjs.map +1 -1
  298. package/dist/slider.js +2 -2
  299. package/dist/{sound.service-kKfsN0m-.js → sound.service-BIN2W7Rv.js} +1 -1
  300. package/dist/{sound.service-kKfsN0m-.js.map → sound.service-BIN2W7Rv.js.map} +1 -1
  301. package/dist/{sound.service-BGs6m0Cm.cjs → sound.service-DyY78ukR.cjs} +1 -1
  302. package/dist/{sound.service-BGs6m0Cm.cjs.map → sound.service-DyY78ukR.cjs.map} +1 -1
  303. package/dist/{splash-screen-DtkjCJYo.js → splash-screen-BcjjJSlK.js} +2 -2
  304. package/dist/{splash-screen-DtkjCJYo.js.map → splash-screen-BcjjJSlK.js.map} +1 -1
  305. package/dist/{splash-screen-DlQUv-kV.cjs → splash-screen-Kr1sPtME.cjs} +2 -2
  306. package/dist/{splash-screen-DlQUv-kV.cjs.map → splash-screen-Kr1sPtME.cjs.map} +1 -1
  307. package/dist/splash-screen.cjs +1 -1
  308. package/dist/splash-screen.js +1 -1
  309. package/dist/{src-DEUjlTsX.cjs → src-B2-CU8fu.cjs} +11 -11
  310. package/dist/{src-DEUjlTsX.cjs.map → src-B2-CU8fu.cjs.map} +1 -1
  311. package/dist/{src-D6e0adHi.js → src-DvywUq7l.js} +38 -38
  312. package/dist/{src-D6e0adHi.js.map → src-DvywUq7l.js.map} +1 -1
  313. package/dist/state-avic94Ft.cjs +1 -0
  314. package/dist/{state-DNdCPITt.cjs.map → state-avic94Ft.cjs.map} +1 -1
  315. package/dist/{state-BusMG6sM.js → state-nm8yzMPp.js} +1 -2
  316. package/dist/{state-BusMG6sM.js.map → state-nm8yzMPp.js.map} +1 -1
  317. package/dist/state.cjs +1 -1
  318. package/dist/state.js +2 -2
  319. package/dist/steps.cjs +3 -3
  320. package/dist/steps.cjs.map +1 -1
  321. package/dist/steps.js +2 -2
  322. package/dist/{surface-A82O1kgu.js → surface-BtMMHKol.js} +2 -2
  323. package/dist/{surface-A82O1kgu.js.map → surface-BtMMHKol.js.map} +1 -1
  324. package/dist/surface-CgXeKdGL.cjs +7 -0
  325. package/dist/{surface-BpppoNXN.cjs.map → surface-CgXeKdGL.cjs.map} +1 -1
  326. package/dist/surface.cjs +1 -1
  327. package/dist/surface.js +1 -1
  328. package/dist/switch.cjs +3 -3
  329. package/dist/switch.cjs.map +1 -1
  330. package/dist/switch.js +27 -43
  331. package/dist/switch.js.map +1 -1
  332. package/dist/table.cjs +3 -3
  333. package/dist/table.cjs.map +1 -1
  334. package/dist/table.js +2 -2
  335. package/dist/{tabs-cVHHd1dY.js → tabs-CikPr7by.js} +2 -2
  336. package/dist/{tabs-cVHHd1dY.js.map → tabs-CikPr7by.js.map} +1 -1
  337. package/dist/{tabs-TO3UiBsm.cjs → tabs-CitVls3_.cjs} +2 -2
  338. package/dist/{tabs-TO3UiBsm.cjs.map → tabs-CitVls3_.cjs.map} +1 -1
  339. package/dist/tabs.cjs +1 -1
  340. package/dist/tabs.js +1 -1
  341. package/dist/teleport.cjs +1 -1
  342. package/dist/teleport.js +1 -1
  343. package/dist/textarea-CqV1wvmB.cjs +43 -0
  344. package/dist/textarea-CqV1wvmB.cjs.map +1 -0
  345. package/dist/textarea-DVkwQSis.js +186 -0
  346. package/dist/textarea-DVkwQSis.js.map +1 -0
  347. package/dist/textarea.cjs +1 -1
  348. package/dist/textarea.js +1 -1
  349. package/dist/{theme-CT408FqH.js → theme-BIWS4TOW.js} +9 -9
  350. package/dist/{theme-CT408FqH.js.map → theme-BIWS4TOW.js.map} +1 -1
  351. package/dist/theme-DMgjiKda.cjs +181 -0
  352. package/dist/{theme-CpuF3D3q.cjs.map → theme-DMgjiKda.cjs.map} +1 -1
  353. package/dist/{theme-button-pTb5-Wxx.js → theme-button-DC_shZ_7.js} +2 -2
  354. package/dist/{theme-button-pTb5-Wxx.js.map → theme-button-DC_shZ_7.js.map} +1 -1
  355. package/dist/theme-button-ENKa3TPT.cjs +8 -0
  356. package/dist/{theme-button-B6Xf-EiH.cjs.map → theme-button-ENKa3TPT.cjs.map} +1 -1
  357. package/dist/theme-button.cjs +1 -1
  358. package/dist/theme-button.js +1 -1
  359. package/dist/theme.cjs +1 -1
  360. package/dist/{theme.interface-B9TjbSBF.js.map → theme.interface-C8OHheXg.js.map} +1 -1
  361. package/dist/{theme.interface-BujperTo.cjs.map → theme.interface-CYo4UpWK.cjs.map} +1 -1
  362. package/dist/theme.js +4 -4
  363. package/dist/{theme.service-DIUo1mBP.js → theme.service-BOWIT_5k.js} +1 -1
  364. package/dist/{theme.service-DIUo1mBP.js.map → theme.service-BOWIT_5k.js.map} +1 -1
  365. package/dist/{theme.service-Cfk88qHK.cjs → theme.service-DkdH1t60.cjs} +1 -1
  366. package/dist/{theme.service-Cfk88qHK.cjs.map → theme.service-DkdH1t60.cjs.map} +1 -1
  367. package/dist/tree.cjs +2 -2
  368. package/dist/tree.cjs.map +1 -1
  369. package/dist/tree.js +2 -2
  370. package/dist/typography.cjs +2 -2
  371. package/dist/typography.cjs.map +1 -1
  372. package/dist/typography.js +2 -2
  373. package/dist/{utils-kND2Z9Xg.js → utils-Cj_nRRyx.js} +2 -2
  374. package/dist/{utils-kND2Z9Xg.js.map → utils-Cj_nRRyx.js.map} +1 -1
  375. package/dist/{utils-Dt5PpmaQ.cjs → utils-D2QUu4-g.cjs} +1 -1
  376. package/dist/{utils-Dt5PpmaQ.cjs.map → utils-D2QUu4-g.cjs.map} +1 -1
  377. package/dist/utils.cjs +1 -1
  378. package/dist/utils.js +4 -4
  379. package/dist/visually-hidden.cjs +2 -2
  380. package/dist/visually-hidden.cjs.map +1 -1
  381. package/dist/visually-hidden.js +2 -2
  382. package/dist/{window-CuBcOxbc.js → window-BTecgE_U.js} +7 -7
  383. package/dist/{window-CuBcOxbc.js.map → window-BTecgE_U.js.map} +1 -1
  384. package/dist/{window-CSKvv4Ts.cjs → window-DGydMS0g.cjs} +2 -2
  385. package/dist/{window-CSKvv4Ts.cjs.map → window-DGydMS0g.cjs.map} +1 -1
  386. package/dist/window.cjs +1 -1
  387. package/dist/window.js +1 -1
  388. package/package.json +1 -1
  389. package/skills/schmancy/autocomplete.md +16 -3
  390. package/skills/schmancy/button.md +19 -0
  391. package/skills/schmancy/checkbox.md +19 -0
  392. package/skills/schmancy/date-range.md +19 -0
  393. package/skills/schmancy/form-ux-rules.md +55 -0
  394. package/skills/schmancy/form.md +121 -25
  395. package/skills/schmancy/input.md +19 -4
  396. package/skills/schmancy/range.md +15 -1
  397. package/skills/schmancy/select.md +13 -1
  398. package/skills/schmancy/switch.md +21 -2
  399. package/skills/schmancy/textarea.md +13 -0
  400. package/src/button/button.test.ts +122 -0
  401. package/src/button/button.ts +36 -0
  402. package/src/{autocomplete → form/fields/autocomplete}/autocomplete.ts +48 -75
  403. package/src/{checkbox → form/fields/checkbox}/checkbox.test.ts +1 -1
  404. package/src/form/fields/checkbox/checkbox.ts +126 -0
  405. package/src/form/fields/date-range/date-range.test.ts +102 -0
  406. package/src/{date-range → form/fields/date-range}/date-range.ts +90 -7
  407. package/src/form/fields/input/input.test.ts +201 -0
  408. package/src/{input → form/fields/input}/input.ts +153 -238
  409. package/src/{radio-group → form/fields/radio-group}/radio-button.ts +1 -1
  410. package/src/{radio-group → form/fields/radio-group}/radio-group.ts +1 -1
  411. package/src/form/fields/range/range.test.ts +90 -0
  412. package/src/{range → form/fields/range}/range.ts +34 -13
  413. package/src/{select → form/fields/select}/select.ts +77 -108
  414. package/src/{switch → form/fields/switch}/switch.test.ts +1 -1
  415. package/src/{switch → form/fields/switch}/switch.ts +71 -51
  416. package/src/form/fields/textarea/textarea.test.ts +54 -0
  417. package/src/{textarea → form/fields/textarea}/textarea.ts +33 -72
  418. package/src/form/form-state.ts +31 -0
  419. package/src/form/form-summary.test.ts +105 -0
  420. package/src/form/form-summary.ts +171 -0
  421. package/src/form/form.test.ts +218 -35
  422. package/src/form/form.ts +330 -99
  423. package/src/form/index.ts +2 -0
  424. package/src/index.ts +9 -9
  425. package/types/mixins/formField.mixin.d.ts +90 -0
  426. package/types/src/button/button.d.ts +9 -0
  427. package/types/src/button/button.test.d.ts +3 -0
  428. package/types/src/{autocomplete → form/fields/autocomplete}/autocomplete.d.ts +6 -15
  429. package/types/src/form/fields/checkbox/checkbox.d.ts +47 -0
  430. package/types/src/{date-range → form/fields/date-range}/date-range.d.ts +22 -4
  431. package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
  432. package/types/src/{input → form/fields/input}/input.d.ts +20 -45
  433. package/types/src/form/fields/input/input.test.d.ts +1 -0
  434. package/types/src/{radio-group → form/fields/radio-group}/radio-button.d.ts +1 -1
  435. package/types/src/{radio-group → form/fields/radio-group}/radio-group.d.ts +1 -1
  436. package/types/src/form/fields/range/range.d.ts +28 -0
  437. package/types/src/form/fields/range/range.test.d.ts +1 -0
  438. package/types/src/{select → form/fields/select}/select.d.ts +23 -24
  439. package/types/src/form/fields/switch/switch.d.ts +57 -0
  440. package/types/src/{textarea → form/fields/textarea}/textarea.d.ts +6 -39
  441. package/types/src/form/fields/textarea/textarea.test.d.ts +1 -0
  442. package/types/src/form/form-state.d.ts +22 -0
  443. package/types/src/form/form-summary.d.ts +42 -0
  444. package/types/src/form/form-summary.test.d.ts +4 -0
  445. package/types/src/form/form.d.ts +79 -34
  446. package/types/src/form/form.test.d.ts +2 -2
  447. package/types/src/form/index.d.ts +2 -0
  448. package/types/src/index.d.ts +9 -9
  449. package/dist/active-host-CcIa2tmW.cjs +0 -1
  450. package/dist/active-host-CvNYoprt.js +0 -57
  451. package/dist/autocomplete-DWSuwSRS.js.map +0 -1
  452. package/dist/autocomplete-iCJOia-q.cjs +0 -115
  453. package/dist/autocomplete-iCJOia-q.cjs.map +0 -1
  454. package/dist/checkbox-NNReP9s_.cjs.map +0 -1
  455. package/dist/date-range-CaOxwZDq.cjs +0 -131
  456. package/dist/date-range-CaOxwZDq.cjs.map +0 -1
  457. package/dist/date-range-CgNujP8r.js.map +0 -1
  458. package/dist/date-range-inline-D4IjOOO0.cjs +0 -43
  459. package/dist/decorate-23nYs4Le.js +0 -7
  460. package/dist/decorate-DpFmy0nm.cjs +0 -1
  461. package/dist/float-CKmd-0-t.cjs +0 -1
  462. package/dist/form-CFvwnfuJ.js +0 -68
  463. package/dist/form-CFvwnfuJ.js.map +0 -1
  464. package/dist/form-Ceijw1aA.cjs +0 -1
  465. package/dist/form-Ceijw1aA.cjs.map +0 -1
  466. package/dist/input-D95GjINh.js.map +0 -1
  467. package/dist/input-D9s4jDAb.cjs +0 -51
  468. package/dist/input-D9s4jDAb.cjs.map +0 -1
  469. package/dist/mixins-BV0w2yIE.js +0 -627
  470. package/dist/mixins-BV0w2yIE.js.map +0 -1
  471. package/dist/mixins-DvAYa-F7.cjs +0 -298
  472. package/dist/mixins-DvAYa-F7.cjs.map +0 -1
  473. package/dist/notification-BC9nG8Sr.cjs +0 -23
  474. package/dist/radio-group-ByMD6Lsj.cjs +0 -40
  475. package/dist/radio-group-ByMD6Lsj.cjs.map +0 -1
  476. package/dist/radio-group-CW8airhZ.js.map +0 -1
  477. package/dist/select-BdBThja4.cjs +0 -56
  478. package/dist/select-BdBThja4.cjs.map +0 -1
  479. package/dist/select-Dbn-CImU.js.map +0 -1
  480. package/dist/state-DNdCPITt.cjs +0 -1
  481. package/dist/surface-BpppoNXN.cjs +0 -7
  482. package/dist/textarea-B9dy-yec.js +0 -211
  483. package/dist/textarea-B9dy-yec.js.map +0 -1
  484. package/dist/textarea-DFY0Flgv.cjs +0 -39
  485. package/dist/textarea-DFY0Flgv.cjs.map +0 -1
  486. package/dist/theme-CpuF3D3q.cjs +0 -181
  487. package/dist/theme-button-B6Xf-EiH.cjs +0 -8
  488. package/src/checkbox/checkbox.ts +0 -162
  489. package/types/src/checkbox/checkbox.d.ts +0 -71
  490. package/types/src/range/range.d.ts +0 -25
  491. package/types/src/switch/switch.d.ts +0 -53
  492. /package/dist/{animation-CO_Csq84.cjs → animation-CCOIW4wJ.cjs} +0 -0
  493. /package/dist/{animation-BK-8BwY8.js → animation-DCznELuT.js} +0 -0
  494. /package/dist/{context-DJTJnSK4.js → context-6oXCZmZN.js} +0 -0
  495. /package/dist/{context-BpCETidA.cjs → context-CRZeiCqq.cjs} +0 -0
  496. /package/dist/{hashContent-Bobsobip.cjs → hashContent-Ck6laKlk.cjs} +0 -0
  497. /package/dist/{hashContent-BU6jl5ih.js → hashContent-dJrI-9sc.js} +0 -0
  498. /package/dist/{lazy-Dq9mRRjT.cjs → lazy-CayEFyC3.cjs} +0 -0
  499. /package/dist/{lazy-B0ia54tT.js → lazy-D-bO2r4m.js} +0 -0
  500. /package/dist/{overlay-stack-DCDS17uj.js → overlay-stack-BR4iYivO.js} +0 -0
  501. /package/dist/{overlay-stack-DPIe_aYv.cjs → overlay-stack-Dk0xETTy.cjs} +0 -0
  502. /package/dist/{reduced-motion-D-L12p7G.js → reduced-motion-D7LqTUMn.js} +0 -0
  503. /package/dist/{reduced-motion-Ds-HjMzn.cjs → reduced-motion-Dzfp_w5x.cjs} +0 -0
  504. /package/dist/{rxjs-utils-CVeJQ9KG.js → rxjs-utils-D9U4MW0Q.js} +0 -0
  505. /package/dist/{rxjs-utils-DCUHg_Ml.cjs → rxjs-utils-kWPShgKu.cjs} +0 -0
  506. /package/dist/{search-BLCRsxIC.cjs → search-DPKoC-dT.cjs} +0 -0
  507. /package/dist/{search-BTz7-Rev.js → search-MvIBA93K.js} +0 -0
  508. /package/dist/{theme.interface-B9TjbSBF.js → theme.interface-C8OHheXg.js} +0 -0
  509. /package/dist/{theme.interface-BujperTo.cjs → theme.interface-CYo4UpWK.cjs} +0 -0
  510. /package/src/{autocomplete → form/fields/autocomplete}/autocomplete.scss +0 -0
  511. /package/src/{autocomplete → form/fields/autocomplete}/index.ts +0 -0
  512. /package/src/{checkbox → form/fields/checkbox}/index.ts +0 -0
  513. /package/src/{date-range → form/fields/date-range}/date-range-dialog.ts +0 -0
  514. /package/src/{date-range → form/fields/date-range}/date-range-helpers.ts +0 -0
  515. /package/src/{date-range → form/fields/date-range}/date-range-presets.ts +0 -0
  516. /package/src/{date-range → form/fields/date-range}/date-utils.ts +0 -0
  517. /package/src/{date-range → form/fields/date-range}/index.ts +0 -0
  518. /package/src/{input → form/fields/input}/index.ts +0 -0
  519. /package/src/{input → form/fields/input}/input.scss +0 -0
  520. /package/src/{radio-group → form/fields/radio-group}/index.ts +0 -0
  521. /package/src/{radio-group → form/fields/radio-group}/radio-group.scss +0 -0
  522. /package/src/{range → form/fields/range}/index.ts +0 -0
  523. /package/src/{select → form/fields/select}/index.ts +0 -0
  524. /package/src/{switch → form/fields/switch}/index.ts +0 -0
  525. /package/src/{textarea → form/fields/textarea}/index.ts +0 -0
  526. /package/src/{textarea → form/fields/textarea}/textarea.scss +0 -0
  527. /package/types/src/{autocomplete → form/fields/autocomplete}/index.d.ts +0 -0
  528. /package/types/src/{checkbox → form/fields/checkbox}/checkbox.test.d.ts +0 -0
  529. /package/types/src/{checkbox → form/fields/checkbox}/index.d.ts +0 -0
  530. /package/types/src/{date-range → form/fields/date-range}/date-range-dialog.d.ts +0 -0
  531. /package/types/src/{date-range → form/fields/date-range}/date-range-helpers.d.ts +0 -0
  532. /package/types/src/{date-range → form/fields/date-range}/date-range-presets.d.ts +0 -0
  533. /package/types/src/{date-range → form/fields/date-range}/date-utils.d.ts +0 -0
  534. /package/types/src/{date-range → form/fields/date-range}/index.d.ts +0 -0
  535. /package/types/src/{input → form/fields/input}/index.d.ts +0 -0
  536. /package/types/src/{radio-group → form/fields/radio-group}/index.d.ts +0 -0
  537. /package/types/src/{range → form/fields/range}/index.d.ts +0 -0
  538. /package/types/src/{select → form/fields/select}/index.d.ts +0 -0
  539. /package/types/src/{switch → form/fields/switch}/index.d.ts +0 -0
  540. /package/types/src/{switch → form/fields/switch}/switch.test.d.ts +0 -0
  541. /package/types/src/{textarea → form/fields/textarea}/index.d.ts +0 -0
@@ -1,39 +1,22 @@
1
- import { s as e } from "./mixins-BV0w2yIE.js";
2
- import { t } from "./decorate-23nYs4Le.js";
3
- import { t as n } from "./search-BTz7-Rev.js";
4
- import "./input-chip-DpC_XEKN.js";
5
- import { BehaviorSubject as r, combineLatest as i } from "rxjs";
6
- import { debounceTime as a, distinctUntilChanged as o, take as s, takeUntil as c, tap as l } from "rxjs/operators";
7
- import { classMap as u } from "lit/directives/class-map.js";
8
- import { customElement as d, property as f, query as p, queryAssignedElements as m, state as h } from "lit/decorators.js";
9
- import { html as g, nothing as _, unsafeCSS as v } from "lit";
10
- import { ifDefined as y } from "lit/directives/if-defined.js";
11
- import { createRef as b, ref as x } from "lit/directives/ref.js";
12
- import { repeat as S } from "lit/directives/repeat.js";
13
- import { when as C } from "lit/directives/when.js";
14
- var w = class extends e {
15
- static {
16
- this.styles = [v(":host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}@keyframes onAutoFillStart{0%{}to{}}:-webkit-any(sch-input::part(input):-webkit-autofill,sch-input input:-webkit-autofill){animation-name:onAutoFillStart;animation-duration:1ms}:is(sch-input::part(input):autofill,sch-input input:autofill){animation-name:onAutoFillStart;animation-duration:1ms}")];
1
+ import { o as e } from "./mixins-BWb9_e1s.js";
2
+ import { a as t } from "./active-host-BP0zy_Y9.js";
3
+ import { t as n } from "./search-MvIBA93K.js";
4
+ import "./input-chip-CtQ0pH5b.js";
5
+ import { BehaviorSubject as r, combineLatest as i, fromEvent as a, timer as o } from "rxjs";
6
+ import { debounceTime as s, distinctUntilChanged as c, takeUntil as l, tap as u } from "rxjs/operators";
7
+ import { classMap as d } from "lit/directives/class-map.js";
8
+ import { customElement as f, property as p, query as m, queryAssignedElements as h, state as g } from "lit/decorators.js";
9
+ import { html as _, nothing as v, unsafeCSS as y } from "lit";
10
+ import { ifDefined as b } from "lit/directives/if-defined.js";
11
+ import { createRef as x, ref as S } from "lit/directives/ref.js";
12
+ import { repeat as C } from "lit/directives/repeat.js";
13
+ import { when as w } from "lit/directives/when.js";
14
+ var T = class extends e(y(":host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}@keyframes onAutoFillStart{0%{}to{}}:-webkit-any(sch-input::part(input):-webkit-autofill,sch-input input:-webkit-autofill){animation-name:onAutoFillStart;animation-duration:1ms}:is(sch-input::part(input):autofill,sch-input input:autofill){animation-name:onAutoFillStart;animation-duration:1ms}")) {
15
+ constructor(...e) {
16
+ super(...e), this._valueSet = !1, this._valuesSet = !1, this.placeholder = "", this.maxHeight = "300px", this.multi = !1, this.description = "", this.size = "md", this.autocomplete = "off", this.debounceMs = 200, this.similarityThreshold = .3, this._a11yId = `schmancy-autocomplete-${Math.random().toString(36).slice(2, 10)}`, this._open = !1, this._inputValue = "", this._visibleOptionsCount = 0, this._hasResults = !0, this._inputElementRef = x(), this._selectedValue$ = new r(""), this._selectedValues$ = new r([]), this._inputValue$ = new r("");
17
17
  }
18
- static {
19
- this.formAssociated = !0;
20
- }
21
- constructor() {
22
- super(), this._valueSet = !1, this._valuesSet = !1, this.required = !1, this.placeholder = "", this.label = "", this.name = "", this.maxHeight = "300px", this.multi = !1, this.description = "", this.size = "md", this.autocomplete = "off", this.debounceMs = 200, this.similarityThreshold = .3, this.error = !1, this.validationMessage = "", this._a11yId = `schmancy-autocomplete-${Math.random().toString(36).slice(2, 10)}`, this._open = !1, this._inputValue = "", this._visibleOptionsCount = 0, this._hasResults = !0, this._inputElementRef = b(), this._selectedValue$ = new r(""), this._selectedValues$ = new r([]), this._inputValue$ = new r("");
23
- try {
24
- this.internals = this.attachInternals();
25
- } catch {
26
- this.internals = void 0;
27
- }
28
- }
29
- get form() {
30
- return this.internals?.form ?? null;
31
- }
32
- formResetCallback() {
33
- this.multi ? this._selectedValues$.next([]) : this._selectedValue$.next(""), this._inputValue = "", this._inputValue$.next(""), this.error = !1, this.validationMessage = "";
34
- }
35
- formDisabledCallback(e) {
36
- e ? this.setAttribute("disabled", "") : this.removeAttribute("disabled");
18
+ resetForm() {
19
+ this.multi ? this._selectedValues$.next([]) : this._selectedValue$.next(""), this._inputValue = "", this._inputValue$.next(""), super.resetForm();
37
20
  }
38
21
  get values() {
39
22
  return [...this._selectedValues$.value];
@@ -51,25 +34,23 @@ var w = class extends e {
51
34
  } else e !== this._selectedValue$.value && (this._selectedValue$.next(e), this._updateInputDisplay());
52
35
  }
53
36
  connectedCallback() {
54
- super.connectedCallback(), this.id ||= `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`, this._setupAutocompleteLogic(), this._setupDocumentClickHandler();
37
+ super.connectedCallback(), this._setupAutocompleteLogic(), this._setupDocumentClickHandler();
55
38
  }
56
39
  _setupAutocompleteLogic() {
57
- i([this._selectedValue$, this._selectedValues$]).pipe(l(([e, t]) => {
40
+ i([this._selectedValue$, this._selectedValues$]).pipe(u(([e, t]) => {
58
41
  this._updateOptionSelection(e, t);
59
42
  let n = this.multi ? t.join(",") : e;
60
43
  if (this.internals?.setFormValue(n || null), this.required) {
61
44
  let n = this.multi ? t.length === 0 : !e;
62
45
  this.internals?.setValidity(n ? { valueMissing: !0 } : {}, n ? this.validationMessage || "Please select an option." : void 0);
63
46
  }
64
- }), c(this.disconnecting)).subscribe(), this._inputValue$.pipe(o(), a(this.debounceMs), l((e) => {
47
+ }), l(this.disconnecting)).subscribe(), this._inputValue$.pipe(c(), s(this.debounceMs), u((e) => {
65
48
  this._open && this._filterOptions(e);
66
- }), c(this.disconnecting)).subscribe();
49
+ }), l(this.disconnecting)).subscribe();
67
50
  }
68
51
  _setupOptionHandlers() {
69
52
  this._options.forEach((e, t) => {
70
- e.setAttribute("role", "option"), e.tabIndex = -1, e.id ||= `${this.id}-option-${t}`, e.dataset.schmancyAutocompleteHandlers !== "attached" && (e.dataset.schmancyAutocompleteHandlers = "attached", e.addEventListener("mousedown", (e) => {
71
- e.preventDefault();
72
- }), e.addEventListener("click", (t) => {
53
+ e.setAttribute("role", "option"), e.tabIndex = -1, e.id ||= `${this.id}-option-${t}`, e.dataset.schmancyAutocompleteHandlers !== "attached" && (e.dataset.schmancyAutocompleteHandlers = "attached", a(e, "mousedown").pipe(l(this.disconnecting)).subscribe((e) => e.preventDefault()), a(e, "click").pipe(l(this.disconnecting)).subscribe((t) => {
73
54
  t.stopPropagation(), this._selectOption(e);
74
55
  }));
75
56
  });
@@ -110,13 +91,10 @@ var w = class extends e {
110
91
  } else this._selectedValue$.next(e.value), this._open = !1, this._fireChangeEvent(), this._inputValue = e.label || e.textContent || "", this._inputValue$.next(this._inputValue), this._announceToScreenReader(`Selected: ${e.label || e.textContent}`);
111
92
  }
112
93
  _setupDocumentClickHandler() {
113
- let e = (e) => {
94
+ a(document, "click").pipe(l(this.disconnecting)).subscribe((e) => {
114
95
  if (!this._open) return;
115
96
  let t = e.composedPath();
116
97
  t.includes(this) || this._options.some((e) => t.includes(e)) || (this._open = !1, this._updateInputDisplay());
117
- };
118
- document.addEventListener("click", e), this.disconnecting.pipe(s(1)).subscribe(() => {
119
- document.removeEventListener("click", e);
120
98
  });
121
99
  }
122
100
  _updateInputDisplay() {
@@ -184,31 +162,31 @@ var w = class extends e {
184
162
  };
185
163
  }
186
164
  })();
187
- return g`
165
+ return _`
188
166
  <div class="relative">
189
167
  <!-- Screen reader live region -->
190
168
  <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
191
169
 
192
170
  <!-- Description -->
193
- ${this.description ? g`<div id="${e}" class="sr-only">${this.description}</div>` : ""}
171
+ ${this.description ? _`<div id="${e}" class="sr-only">${this.description}</div>` : ""}
194
172
 
195
173
  <!-- Custom input wrapper for Gmail-style chip input -->
196
174
  <slot name="trigger">
197
- ${C(this.multi, () => g`
175
+ ${w(this.multi, () => _`
198
176
  <!-- Custom multi-select input with inline chips -->
199
177
  <div class="relative">
200
- ${C(this.label, () => g`
201
- <label class="${u({
178
+ ${w(this.label, () => _`
179
+ <label class="${d({
202
180
  "block mb-1 font-medium": !0,
203
181
  "text-primary-default": !this.error,
204
182
  "text-error-default": this.error,
205
183
  [i]: !0
206
184
  })}">
207
- ${this.label}${this.required ? g`<span class="text-error-default ml-1">*</span>` : ""}
185
+ ${this.label}${this.required ? _`<span class="text-error-default ml-1">*</span>` : ""}
208
186
  </label>
209
187
  `)}
210
188
  <div
211
- class="${u({
189
+ class="${d({
212
190
  "flex flex-wrap items-center gap-1": !0,
213
191
  [t]: !0,
214
192
  [n]: !0,
@@ -227,7 +205,7 @@ var w = class extends e {
227
205
  aria-expanded=${this._open}
228
206
  >
229
207
  <!-- Render chips inline -->
230
- ${S(this._selectedValues$.value, (e) => e, (e) => g`
208
+ ${C(this._selectedValues$.value, (e) => e, (e) => _`
231
209
  <schmancy-input-chip
232
210
  .value=${e}
233
211
  @remove=${(e) => this.handleChipRemove(e.detail.value)}
@@ -239,7 +217,7 @@ var w = class extends e {
239
217
 
240
218
  <!-- Text input for typing -->
241
219
  <input
242
- ${x(this._inputElementRef)}
220
+ ${S(this._inputElementRef)}
243
221
  id="autocomplete-input"
244
222
  type="text"
245
223
  class="flex-1 min-w-[120px] py-1 bg-transparent border-none outline-none ${r} font-medium text-surface-on placeholder:text-muted"
@@ -249,8 +227,8 @@ var w = class extends e {
249
227
  .autocomplete=${this.autocomplete}
250
228
  aria-invalid=${this.error ? "true" : "false"}
251
229
  aria-required=${this.required ? "true" : "false"}
252
- aria-describedby=${this.error && this.validationMessage ? `${this._a11yId}-err` : _}
253
- aria-label=${!this.label && this.placeholder ? this.placeholder : _}
230
+ aria-describedby=${this.error && this.validationMessage ? `${this._a11yId}-err` : v}
231
+ aria-label=${!this.label && this.placeholder ? this.placeholder : v}
254
232
  @input=${(e) => {
255
233
  let t = e.target.value;
256
234
  this._inputValue = t, this._inputValue$.next(t);
@@ -268,17 +246,17 @@ var w = class extends e {
268
246
  </div>
269
247
 
270
248
  <!-- Validation message -->
271
- ${C(this.error && this.validationMessage, () => g`
249
+ ${w(this.error && this.validationMessage, () => _`
272
250
  <div id="${this._a11yId}-err" class="mt-1 text-sm text-error-default" role="alert">
273
251
  ${this.validationMessage}
274
252
  </div>
275
253
  `)}
276
254
  </div>
277
- `, () => g`
255
+ `, () => _`
278
256
  <!-- Regular single-select input -->
279
257
  <schmancy-input
280
258
  .size=${this.size}
281
- ${x(this._inputElementRef)}
259
+ ${S(this._inputElementRef)}
282
260
  id="autocomplete-input"
283
261
  class="w-full"
284
262
  .name=${this.name || this.label?.toLowerCase().replace(/\s+/g, "-") || ""}
@@ -294,7 +272,7 @@ var w = class extends e {
294
272
  aria-haspopup="listbox"
295
273
  aria-controls="options"
296
274
  aria-expanded=${this._open}
297
- aria-describedby=${y(this.description ? e : void 0)}
275
+ aria-describedby=${b(this.description ? e : void 0)}
298
276
  @input=${(e) => {
299
277
  let t = e.target.value;
300
278
  this._inputValue = t, this._inputValue$.next(t);
@@ -319,7 +297,7 @@ var w = class extends e {
319
297
  <!-- Options dropdown -->
320
298
  <ul
321
299
  id="options"
322
- class=${u({
300
+ class=${d({
323
301
  absolute: !0,
324
302
  "z-[1000]": !0,
325
303
  "mt-1": !0,
@@ -342,7 +320,7 @@ var w = class extends e {
342
320
  }}
343
321
  >
344
322
  <slot></slot>
345
- ${this._hasResults ? "" : g`
323
+ ${this._hasResults ? "" : _`
346
324
  <li class="px-3 py-2 text-sm text-muted">No results found</li>
347
325
  `}
348
326
  </ul>
@@ -366,9 +344,9 @@ var w = class extends e {
366
344
  this.handleChipRemove(t);
367
345
  return;
368
346
  }
369
- if (!t && (e.key === "ArrowDown" || e.key === "Enter")) return e.preventDefault(), this._openDropdown(), void setTimeout(() => {
347
+ if (!t && (e.key === "ArrowDown" || e.key === "Enter")) return e.preventDefault(), this._openDropdown(), void o(10).pipe(l(this.disconnecting)).subscribe(() => {
370
348
  this._options.find((e) => !e.hidden)?.focus();
371
- }, 10);
349
+ });
372
350
  if (!t) return;
373
351
  let r = this._options.filter((e) => !e.hidden).toSorted((e, t) => parseInt(e.style.order || "0") - parseInt(t.style.order || "0")), i = r.find((e) => e === document.activeElement), a = i ? r.indexOf(i) : -1;
374
352
  switch (e.key) {
@@ -395,13 +373,10 @@ var w = class extends e {
395
373
  }
396
374
  }
397
375
  };
398
- t([f({ type: Boolean })], w.prototype, "required", void 0), t([f({ type: String })], w.prototype, "placeholder", void 0), t([f({
399
- type: String,
400
- reflect: !0
401
- })], w.prototype, "label", void 0), t([f({ type: String })], w.prototype, "name", void 0), t([f({ type: String })], w.prototype, "maxHeight", void 0), t([f({ type: Boolean })], w.prototype, "multi", void 0), t([f({ type: String })], w.prototype, "description", void 0), t([f({
376
+ t([p({ type: String })], T.prototype, "placeholder", void 0), t([p({ type: String })], T.prototype, "maxHeight", void 0), t([p({ type: Boolean })], T.prototype, "multi", void 0), t([p({ type: String })], T.prototype, "description", void 0), t([p({
402
377
  type: String,
403
378
  reflect: !0
404
- })], w.prototype, "size", void 0), t([f({ type: String })], w.prototype, "autocomplete", void 0), t([f({ type: Number })], w.prototype, "debounceMs", void 0), t([f({ type: Number })], w.prototype, "similarityThreshold", void 0), t([f({ type: Boolean })], w.prototype, "error", void 0), t([f({ type: String })], w.prototype, "validationMessage", void 0), t([f({ type: Array })], w.prototype, "values", null), t([f({
379
+ })], T.prototype, "size", void 0), t([p({ type: String })], T.prototype, "autocomplete", void 0), t([p({ type: Number })], T.prototype, "debounceMs", void 0), t([p({ type: Number })], T.prototype, "similarityThreshold", void 0), t([p({ type: Array })], T.prototype, "values", null), t([p({
405
380
  type: String,
406
381
  reflect: !0
407
- })], w.prototype, "value", null), t([h()], w.prototype, "_open", void 0), t([h()], w.prototype, "_inputValue", void 0), t([h()], w.prototype, "_visibleOptionsCount", void 0), t([h()], w.prototype, "_hasResults", void 0), t([p("#options")], w.prototype, "_listbox", void 0), t([p("sch-input")], w.prototype, "_input", void 0), t([m({ flatten: !0 })], w.prototype, "_options", void 0), w = t([d("schmancy-autocomplete")], w);
382
+ })], T.prototype, "value", null), t([g()], T.prototype, "_open", void 0), t([g()], T.prototype, "_inputValue", void 0), t([g()], T.prototype, "_visibleOptionsCount", void 0), t([g()], T.prototype, "_hasResults", void 0), t([m("#options")], T.prototype, "_listbox", void 0), t([m("sch-input")], T.prototype, "_input", void 0), t([h({ flatten: !0 })], T.prototype, "_options", void 0), T = t([f("schmancy-autocomplete")], T);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-CXvUjMD-.js","names":[],"sources":["../src/form/fields/autocomplete/autocomplete.scss?inline","../src/form/fields/autocomplete/autocomplete.ts"],"sourcesContent":[":host {\n\tdisplay: block;\n\tborder: unset !important;\n\tline-height: unset !important;\n\tbackground: unset !important;\n\tpadding: unset !important;\n\tfont-size: unset !important;\n\tbox-shadow: unset !important;\n}\n\n:host:focus {\n\tbox-shadow: unset !important;\n}\n\n@keyframes onAutoFillStart {\n\tfrom {/**/}\n\tto {/**/}\n}\n\nsch-input::part(input):-webkit-autofill,\nsch-input input:-webkit-autofill {\n\tanimation-name: onAutoFillStart;\n\tanimation-duration: 1ms;\n}\n","import { SchmancyFormField } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html, nothing, unsafeCSS } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n takeUntil,\n tap\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../../../utils/search'\n// Import chip component for multi-select display\nimport '../../../chips/input-chip'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n/**\n * Autocomplete input component with filtering and multi-select support.\n *\n * @prop {string} name - Name attribute for form submission\n * @prop {string} label - Label text displayed above the input\n * @prop {string} placeholder - Placeholder text for the input\n * @prop {boolean} required - Whether the field is required\n * @prop {boolean} multi - Enable multi-select mode\n * @prop {string} value - Selected value (single select mode)\n * @prop {string[]} values - Selected values (multi-select mode)\n */\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends SchmancyFormField(unsafeCSS(style)) {\n\n // `formAssociated`, `internals`, `attachInternals`, `name`, `label`,\n // `required`, `disabled`, `error`, `validationMessage`, `hint`, `id`,\n // `validateOn`, `touched/dirty/submitted`, `markTouched/markSubmitted`,\n // `setCustomValidity`, `formDisabledCallback`, FIELD_CONNECT_EVENT dispatch\n // — all from the mixin.\n\n /** Override mixin's resetForm with autocomplete-specific subject reset. */\n override resetForm(): void {\n if (this.multi) {\n this._selectedValues$.next([])\n } else {\n this._selectedValue$.next('')\n }\n this._inputValue = ''\n this._inputValue$.next('')\n super.resetForm()\n }\n\n // Track whether value/values have been explicitly set\n _valueSet: boolean = false\n _valuesSet: boolean = false\n\n // Autocomplete-specific properties only — `name`, `label`, `required`,\n // `error`, `validationMessage` come from the mixin.\n @property({ type: String }) placeholder = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'off'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n private readonly _a11yId = `schmancy-autocomplete-${Math.random().toString(36).slice(2, 10)}`\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._valuesSet = true\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property — narrowed override of the mixin's wide value union.\n @property({ type: String, reflect: true })\n override get value(): string {\n return this.multi\n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n override set value(val: string) {\n this._valueSet = true\n if (this.multi) {\n const newValues = val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n const currentValues = this._selectedValues$.value\n // Only update if values actually changed\n if (JSON.stringify(newValues) !== JSON.stringify(currentValues)) {\n this._selectedValues$.next(newValues)\n }\n } else {\n // Only update if value actually changed\n if (val !== this._selectedValue$.value) {\n this._selectedValue$.next(val)\n // Update the input display when value is set\n this._updateInputDisplay()\n }\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects - only what we actually need\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n\n override connectedCallback() {\n // FIELD_CONNECT_EVENT is dispatched by the mixin's connectedCallback.\n super.connectedCallback()\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n }\n\n private _setupAutocompleteLogic() {\n // Sync selection state\n combineLatest([\n this._selectedValue$,\n this._selectedValues$\n ]).pipe(\n tap(([selectedValue, selectedValues]) => {\n this._updateOptionSelection(selectedValue, selectedValues)\n // Keep ElementInternals form value in sync with selection (single and multi).\n const formValue = this.multi ? selectedValues.join(',') : selectedValue\n this.internals?.setFormValue(formValue || null)\n if (this.required) {\n const missing = this.multi ? selectedValues.length === 0 : !selectedValue\n this.internals?.setValidity(\n missing ? { valueMissing: true } : {},\n missing ? this.validationMessage || 'Please select an option.' : undefined,\n )\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Filter options based on input\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n tap(searchTerm => {\n if (this._open) {\n this._filterOptions(searchTerm)\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupOptionHandlers() {\n this._options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n // Idempotent: slotchange may fire repeatedly for the same option nodes,\n // and addEventListener doesn't replace prior handlers like onfoo= did.\n if (option.dataset.schmancyAutocompleteHandlers === 'attached') return\n option.dataset.schmancyAutocompleteHandlers = 'attached'\n\n // Prevent blur handler from interfering with option selection\n fromEvent<MouseEvent>(option, 'mousedown')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => e.preventDefault())\n\n // Handle the actual selection\n fromEvent<MouseEvent>(option, 'click')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => {\n e.stopPropagation()\n this._selectOption(option)\n })\n })\n }\n\n private _updateOptionSelection(selectedValue: string, selectedValues: string[]) {\n this._options.forEach(option => {\n option.selected = this.multi\n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }\n\n private _filterOptions(searchTerm: string) {\n const term = searchTerm.trim()\n\n if (!term) {\n // Show all options if no search term\n this._options.forEach(option => {\n option.hidden = false\n option.style.order = '0'\n })\n this._visibleOptionsCount = this._options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = this._options.map(option => {\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n const score = Math.max(labelScore * 1.1, valueScore)\n\n return { option, score }\n })\n\n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n\n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n option.style.order = String(index)\n }\n })\n\n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n\n this._announceToScreenReader(\n this._visibleOptionsCount > 0\n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }\n\n private _openDropdown() {\n this._open = true\n // Reset filters based on current input value when dropdown opens\n this._filterOptions(this._inputValue)\n }\n\n private _selectOption(option: SchmancyOption) {\n if (this.multi) {\n const currentValues = this._selectedValues$.value\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? currentValues.filter(v => v !== option.value)\n : [...currentValues, option.value]\n\n this._selectedValues$.next(newValues)\n this._announceToScreenReader(\n newValues.length > 0\n ? `Selected: ${this._getSelectedLabels().join(', ')}`\n : 'No options selected'\n )\n this._fireChangeEvent()\n } else {\n // Update value first\n this._selectedValue$.next(option.value)\n\n // Close dropdown IMMEDIATELY to prevent blur handler from firing\n this._open = false\n\n // Now fire event with the NEW value\n this._fireChangeEvent()\n\n // Update UI\n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n\n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }\n\n private _setupDocumentClickHandler() {\n fromEvent<MouseEvent>(document, 'click')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => {\n if (!this._open) return\n const path = e.composedPath()\n if (!path.includes(this) && !this._options.some(opt => path.includes(opt))) {\n this._open = false\n this._updateInputDisplay()\n }\n })\n }\n\n\n private _updateInputDisplay() {\n // For multi-select, we don't update input display since chips show the selections\n if (this.multi) return\n\n const selectedValue = this._selectedValue$.value\n const option = this._options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n this._inputValue$.next(this._inputValue)\n\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = this._inputValue\n }\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n this._setupOptionHandlers()\n\n // Sync initial value with display after options are available\n this._updateInputDisplay()\n\n // Update options when slot changes\n const slot = this.shadowRoot?.querySelector('slot')\n slot?.addEventListener('slotchange', () => {\n this._setupOptionHandlers()\n this._updateOptionSelection(this._selectedValue$.value, this._selectedValues$.value)\n })\n }\n\n private handleChipRemove(value: string) {\n const currentValues = this._selectedValues$.value\n const newValues = currentValues.filter(v => v !== value)\n this._selectedValues$.next(newValues)\n this._fireChangeEvent()\n this._announceToScreenReader(`Removed: ${this._getChipLabel(value)}`)\n }\n\n private _getChipLabel(value: string): string {\n const option = this._options.find(opt => opt.value === value)\n return option ? option.label || option.textContent || value : value\n }\n\n private _focusTextInput() {\n if (this._inputElementRef.value) {\n this._inputElementRef.value.focus()\n }\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n // Get size-based styling to match Schmancy input\n const getSizeStyles = () => {\n switch (this.size) {\n case 'sm':\n return {\n height: 'min-h-[40px]',\n padding: 'px-2',\n fontSize: 'text-sm', // 14px\n labelSize: 'text-sm'\n }\n case 'lg':\n return {\n height: 'min-h-[60px]',\n padding: 'px-5',\n fontSize: 'text-lg', // 18px\n labelSize: 'text-lg'\n }\n case 'md':\n default:\n return {\n height: 'min-h-[50px]',\n padding: 'px-4',\n fontSize: 'text-base', // 16px\n labelSize: 'text-base'\n }\n }\n }\n\n const { height, padding, fontSize, labelSize } = getSizeStyles()\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Custom input wrapper for Gmail-style chip input -->\n <slot name=\"trigger\">\n ${when(this.multi,\n () => html`\n <!-- Custom multi-select input with inline chips -->\n <div class=\"relative\">\n ${when(this.label, () => html`\n <label class=\"${classMap({\n 'block mb-1 font-medium': true,\n 'text-primary-default': !this.error,\n 'text-error-default': this.error,\n [labelSize]: true\n })}\">\n ${this.label}${this.required ? html`<span class=\"text-error-default ml-1\">*</span>` : ''}\n </label>\n `)}\n <div\n class=\"${classMap({\n 'flex flex-wrap items-center gap-1': true,\n [height]: true,\n [padding]: true,\n 'block w-full min-w-0 rounded-[8px] border-0': true,\n 'bg-surface-highest text-surface-on': true,\n 'ring-0 ring-inset focus-within:ring-1 focus-within:ring-inset': true,\n 'ring-secondary-default focus-within:ring-secondary-default': !this.error,\n 'ring-error-default focus-within:ring-error-default': this.error,\n 'cursor-text transition-colors duration-200': true\n })}\"\n @click=${() => this._focusTextInput()}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n >\n <!-- Render chips inline -->\n ${repeat(\n this._selectedValues$.value,\n value => value,\n value => html`\n <schmancy-input-chip\n .value=${value}\n @remove=${(e: CustomEvent) => this.handleChipRemove(e.detail.value)}\n class=\"shrink-0 my-0.5\"\n >\n ${this._getChipLabel(value)}\n </schmancy-input-chip>\n `\n )}\n\n <!-- Text input for typing -->\n <input\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n type=\"text\"\n class=\"flex-1 min-w-[120px] py-1 bg-transparent border-none outline-none ${fontSize} font-medium text-surface-on placeholder:text-muted\"\n name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-') || ''}\n .placeholder=${this._selectedValues$.value.length > 0 ? 'Add more...' : this.placeholder}\n .value=${this._inputValue}\n .autocomplete=${this.autocomplete}\n aria-invalid=${this.error ? 'true' : 'false'}\n aria-required=${this.required ? 'true' : 'false'}\n aria-describedby=${this.error && this.validationMessage ? `${this._a11yId}-err` : nothing}\n aria-label=${!this.label && this.placeholder ? this.placeholder : nothing}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n // Clear input on focus for new searches\n this._inputValue = ''\n this._inputValue$.next('')\n this._openDropdown()\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n />\n </div>\n\n <!-- Validation message -->\n ${when(this.error && this.validationMessage, () => html`\n <div id=\"${this._a11yId}-err\" class=\"mt-1 text-sm text-error-default\" role=\"alert\">\n ${this.validationMessage}\n </div>\n `)}\n </div>\n `,\n () => html`\n <!-- Regular single-select input -->\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-') || ''}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${ifDefined(this.description ? descriptionId : undefined)}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n this._openDropdown()\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._openDropdown()\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n >\n </schmancy-input>\n `\n )}\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._setupOptionHandlers()\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n `\n }\n\n private _handleAutoSelectOnBlur() {\n // Only auto-select in single-select mode and when dropdown is open with a search term\n if (this.multi || !this._open || !this._inputValue.trim()) {\n return\n }\n \n const searchTerm = this._inputValue.trim()\n \n // Find the best matching option using the same similarity logic as filtering\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n this._options.forEach(option => {\n // Skip hidden options\n if (option.hidden) return\n \n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(searchTerm, optionLabel)\n const valueScore = similarity(searchTerm, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n // Keep track of best match that meets threshold\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n \n // Auto-select the best match if found\n if (bestMatch) {\n // Silently update the selected value without firing change event\n this._selectedValue$.next(bestMatch.value)\n this._inputValue = bestMatch.label || bestMatch.textContent || ''\n this._inputValue$.next(this._inputValue)\n this._open = false\n }\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n const isOpen = this._open\n const selectedValues = this._selectedValues$.value\n\n // Handle backspace to remove last chip in multi-select when input is empty\n if (this.multi && event.key === 'Backspace' && !this._inputValue && selectedValues.length > 0 && !isOpen) {\n event.preventDefault()\n const lastValue = selectedValues[selectedValues.length - 1]\n this.handleChipRemove(lastValue)\n return\n }\n\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._openDropdown()\n\n timer(10)\n .pipe(takeUntil(this.disconnecting))\n .subscribe(() => {\n const firstVisible = this._options.find(opt => !opt.hidden)\n firstVisible?.focus()\n })\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = this._options.filter(opt => !opt.hidden)\n .toSorted((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n\n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open = false\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open = false\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._selectOption(focusedOption)\n }\n break\n }\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-BOOu6q2n.cjs`),t=require(`./active-host-jH3iloCR.cjs`),n=require(`./search-DPKoC-dT.cjs`);require(`./input-chip-DZktYohr.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/directives/class-map.js`),o=require(`lit/decorators.js`),s=require(`lit`),c=require(`lit/directives/if-defined.js`),l=require(`lit/directives/ref.js`),u=require(`lit/directives/repeat.js`),d=require(`lit/directives/when.js`);var f=class extends e.o((0,s.unsafeCSS)(`:host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}@keyframes onAutoFillStart{0%{}to{}}:-webkit-any(sch-input::part(input):-webkit-autofill,sch-input input:-webkit-autofill){animation-name:onAutoFillStart;animation-duration:1ms}:is(sch-input::part(input):autofill,sch-input input:autofill){animation-name:onAutoFillStart;animation-duration:1ms}`)){constructor(...e){super(...e),this._valueSet=!1,this._valuesSet=!1,this.placeholder=``,this.maxHeight=`300px`,this.multi=!1,this.description=``,this.size=`md`,this.autocomplete=`off`,this.debounceMs=200,this.similarityThreshold=.3,this._a11yId=`schmancy-autocomplete-${Math.random().toString(36).slice(2,10)}`,this._open=!1,this._inputValue=``,this._visibleOptionsCount=0,this._hasResults=!0,this._inputElementRef=(0,l.createRef)(),this._selectedValue$=new r.BehaviorSubject(``),this._selectedValues$=new r.BehaviorSubject([]),this._inputValue$=new r.BehaviorSubject(``)}resetForm(){this.multi?this._selectedValues$.next([]):this._selectedValue$.next(``),this._inputValue=``,this._inputValue$.next(``),super.resetForm()}get values(){return[...this._selectedValues$.value]}set values(e){this._valuesSet=!0,this._selectedValues$.next(Array.isArray(e)?[...e]:[])}get value(){return this.multi?this._selectedValues$.value.join(`,`):this._selectedValue$.value}set value(e){if(this._valueSet=!0,this.multi){let t=e?e.split(`,`).map(e=>e.trim()).filter(Boolean):[],n=this._selectedValues$.value;JSON.stringify(t)!==JSON.stringify(n)&&this._selectedValues$.next(t)}else e!==this._selectedValue$.value&&(this._selectedValue$.next(e),this._updateInputDisplay())}connectedCallback(){super.connectedCallback(),this._setupAutocompleteLogic(),this._setupDocumentClickHandler()}_setupAutocompleteLogic(){(0,r.combineLatest)([this._selectedValue$,this._selectedValues$]).pipe((0,i.tap)(([e,t])=>{this._updateOptionSelection(e,t);let n=this.multi?t.join(`,`):e;if(this.internals?.setFormValue(n||null),this.required){let n=this.multi?t.length===0:!e;this.internals?.setValidity(n?{valueMissing:!0}:{},n?this.validationMessage||`Please select an option.`:void 0)}}),(0,i.takeUntil)(this.disconnecting)).subscribe(),this._inputValue$.pipe((0,i.distinctUntilChanged)(),(0,i.debounceTime)(this.debounceMs),(0,i.tap)(e=>{this._open&&this._filterOptions(e)}),(0,i.takeUntil)(this.disconnecting)).subscribe()}_setupOptionHandlers(){this._options.forEach((e,t)=>{e.setAttribute(`role`,`option`),e.tabIndex=-1,e.id||=`${this.id}-option-${t}`,e.dataset.schmancyAutocompleteHandlers!==`attached`&&(e.dataset.schmancyAutocompleteHandlers=`attached`,(0,r.fromEvent)(e,`mousedown`).pipe((0,i.takeUntil)(this.disconnecting)).subscribe(e=>e.preventDefault()),(0,r.fromEvent)(e,`click`).pipe((0,i.takeUntil)(this.disconnecting)).subscribe(t=>{t.stopPropagation(),this._selectOption(e)}))})}_updateOptionSelection(e,t){this._options.forEach(n=>{n.selected=this.multi?t.includes(n.value):n.value===e,n.setAttribute(`aria-selected`,String(n.selected))})}_filterOptions(e){let t=e.trim();if(t){let e=this._options.map(e=>{let r=e.label||e.textContent||``,i=e.value,a=n.t(t,r),o=n.t(t,i);return{option:e,score:Math.max(1.1*a,o)}});e.sort((e,t)=>t.score-e.score);let r=0;e.forEach((e,t)=>{let{option:n,score:i}=e;i<this.similarityThreshold?n.hidden=!0:(n.hidden=!1,r++,n.style.order=String(t))}),this._visibleOptionsCount=r,this._hasResults=r>0}else this._options.forEach(e=>{e.hidden=!1,e.style.order=`0`}),this._visibleOptionsCount=this._options.length,this._hasResults=!0;this._announceToScreenReader(this._visibleOptionsCount>0?`${this._visibleOptionsCount} option${this._visibleOptionsCount===1?``:`s`} available.`:`No results found.`)}_openDropdown(){this._open=!0,this._filterOptions(this._inputValue)}_selectOption(e){if(this.multi){let t=this._selectedValues$.value,n=t.indexOf(e.value)>-1?t.filter(t=>t!==e.value):[...t,e.value];this._selectedValues$.next(n),this._announceToScreenReader(n.length>0?`Selected: ${this._getSelectedLabels().join(`, `)}`:`No options selected`),this._fireChangeEvent()}else this._selectedValue$.next(e.value),this._open=!1,this._fireChangeEvent(),this._inputValue=e.label||e.textContent||``,this._inputValue$.next(this._inputValue),this._announceToScreenReader(`Selected: ${e.label||e.textContent}`)}_setupDocumentClickHandler(){(0,r.fromEvent)(document,`click`).pipe((0,i.takeUntil)(this.disconnecting)).subscribe(e=>{if(!this._open)return;let t=e.composedPath();t.includes(this)||this._options.some(e=>t.includes(e))||(this._open=!1,this._updateInputDisplay())})}_updateInputDisplay(){if(this.multi)return;let e=this._selectedValue$.value,t=this._options.find(t=>t.value===e);this._inputValue=t&&(t.label||t.textContent)||``,this._inputValue$.next(this._inputValue),this._inputElementRef.value&&(this._inputElementRef.value.value=this._inputValue)}_getSelectedLabels(){return this._options.filter(e=>this.multi?this._selectedValues$.value.includes(e.value):e.value===this._selectedValue$.value).map(e=>e.label||e.textContent||``)}_announceToScreenReader(e){let t=this.shadowRoot?.querySelector(`#live-status`);t&&(t.textContent=e)}_fireChangeEvent(){let e={value:this.value};this.multi&&(e.values=[...this._selectedValues$.value]),this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}checkValidity(){return!this.required||(this.multi?this._selectedValues$.value.length>0:!!this._selectedValue$.value)}reportValidity(){return this._inputElementRef.value?this._inputElementRef.value.reportValidity():this.checkValidity()}firstUpdated(){this._setupOptionHandlers(),this._updateInputDisplay(),(this.shadowRoot?.querySelector(`slot`))?.addEventListener(`slotchange`,()=>{this._setupOptionHandlers(),this._updateOptionSelection(this._selectedValue$.value,this._selectedValues$.value)})}handleChipRemove(e){let t=this._selectedValues$.value.filter(t=>t!==e);this._selectedValues$.next(t),this._fireChangeEvent(),this._announceToScreenReader(`Removed: ${this._getChipLabel(e)}`)}_getChipLabel(e){let t=this._options.find(t=>t.value===e);return t&&(t.label||t.textContent)||e}_focusTextInput(){this._inputElementRef.value&&this._inputElementRef.value.focus()}render(){let e=`${this.id}-desc`,{height:t,padding:n,fontSize:r,labelSize:i}=(()=>{switch(this.size){case`sm`:return{height:`min-h-[40px]`,padding:`px-2`,fontSize:`text-sm`,labelSize:`text-sm`};case`lg`:return{height:`min-h-[60px]`,padding:`px-5`,fontSize:`text-lg`,labelSize:`text-lg`};default:return{height:`min-h-[50px]`,padding:`px-4`,fontSize:`text-base`,labelSize:`text-base`}}})();return s.html`
2
+ <div class="relative">
3
+ <!-- Screen reader live region -->
4
+ <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
5
+
6
+ <!-- Description -->
7
+ ${this.description?s.html`<div id="${e}" class="sr-only">${this.description}</div>`:``}
8
+
9
+ <!-- Custom input wrapper for Gmail-style chip input -->
10
+ <slot name="trigger">
11
+ ${(0,d.when)(this.multi,()=>s.html`
12
+ <!-- Custom multi-select input with inline chips -->
13
+ <div class="relative">
14
+ ${(0,d.when)(this.label,()=>s.html`
15
+ <label class="${(0,a.classMap)({"block mb-1 font-medium":!0,"text-primary-default":!this.error,"text-error-default":this.error,[i]:!0})}">
16
+ ${this.label}${this.required?s.html`<span class="text-error-default ml-1">*</span>`:``}
17
+ </label>
18
+ `)}
19
+ <div
20
+ class="${(0,a.classMap)({"flex flex-wrap items-center gap-1":!0,[t]:!0,[n]:!0,"block w-full min-w-0 rounded-[8px] border-0":!0,"bg-surface-highest text-surface-on":!0,"ring-0 ring-inset focus-within:ring-1 focus-within:ring-inset":!0,"ring-secondary-default focus-within:ring-secondary-default":!this.error,"ring-error-default focus-within:ring-error-default":this.error,"cursor-text transition-colors duration-200":!0})}"
21
+ @click=${()=>this._focusTextInput()}
22
+ role="combobox"
23
+ aria-autocomplete="list"
24
+ aria-haspopup="listbox"
25
+ aria-controls="options"
26
+ aria-expanded=${this._open}
27
+ >
28
+ <!-- Render chips inline -->
29
+ ${(0,u.repeat)(this._selectedValues$.value,e=>e,e=>s.html`
30
+ <schmancy-input-chip
31
+ .value=${e}
32
+ @remove=${e=>this.handleChipRemove(e.detail.value)}
33
+ class="shrink-0 my-0.5"
34
+ >
35
+ ${this._getChipLabel(e)}
36
+ </schmancy-input-chip>
37
+ `)}
38
+
39
+ <!-- Text input for typing -->
40
+ <input
41
+ ${(0,l.ref)(this._inputElementRef)}
42
+ id="autocomplete-input"
43
+ type="text"
44
+ class="flex-1 min-w-[120px] py-1 bg-transparent border-none outline-none ${r} font-medium text-surface-on placeholder:text-muted"
45
+ name=${this.name||this.label?.toLowerCase().replace(/\s+/g,`-`)||``}
46
+ .placeholder=${this._selectedValues$.value.length>0?`Add more...`:this.placeholder}
47
+ .value=${this._inputValue}
48
+ .autocomplete=${this.autocomplete}
49
+ aria-invalid=${this.error?`true`:`false`}
50
+ aria-required=${this.required?`true`:`false`}
51
+ aria-describedby=${this.error&&this.validationMessage?`${this._a11yId}-err`:s.nothing}
52
+ aria-label=${!this.label&&this.placeholder?this.placeholder:s.nothing}
53
+ @input=${e=>{let t=e.target.value;this._inputValue=t,this._inputValue$.next(t)}}
54
+ @focus=${e=>{e.stopPropagation(),this._inputValue=``,this._inputValue$.next(``),this._openDropdown()}}
55
+ @keydown=${e=>{this._handleKeyDown(e)}}
56
+ @blur=${()=>{this._handleAutoSelectOnBlur()}}
57
+ />
58
+ </div>
59
+
60
+ <!-- Validation message -->
61
+ ${(0,d.when)(this.error&&this.validationMessage,()=>s.html`
62
+ <div id="${this._a11yId}-err" class="mt-1 text-sm text-error-default" role="alert">
63
+ ${this.validationMessage}
64
+ </div>
65
+ `)}
66
+ </div>
67
+ `,()=>s.html`
68
+ <!-- Regular single-select input -->
69
+ <schmancy-input
70
+ .size=${this.size}
71
+ ${(0,l.ref)(this._inputElementRef)}
72
+ id="autocomplete-input"
73
+ class="w-full"
74
+ .name=${this.name||this.label?.toLowerCase().replace(/\s+/g,`-`)||``}
75
+ .label=${this.label}
76
+ .placeholder=${this.placeholder}
77
+ .required=${this.required}
78
+ .value=${this._inputValue}
79
+ type="text"
80
+ autocomplete=${this.autocomplete}
81
+ clickable
82
+ role="combobox"
83
+ aria-autocomplete="list"
84
+ aria-haspopup="listbox"
85
+ aria-controls="options"
86
+ aria-expanded=${this._open}
87
+ aria-describedby=${(0,c.ifDefined)(this.description?e:void 0)}
88
+ @input=${e=>{let t=e.target.value;this._inputValue=t,this._inputValue$.next(t)}}
89
+ @focus=${e=>{e.stopPropagation(),this._openDropdown()}}
90
+ @click=${e=>{e.stopPropagation(),this._openDropdown()}}
91
+ @keydown=${e=>{this._handleKeyDown(e)}}
92
+ @blur=${()=>{this._handleAutoSelectOnBlur()}}
93
+ >
94
+ </schmancy-input>
95
+ `)}
96
+ </slot>
97
+
98
+ <!-- Options dropdown -->
99
+ <ul
100
+ id="options"
101
+ class=${(0,a.classMap)({absolute:!0,"z-[1000]":!0,"mt-1":!0,"w-full":!0,"rounded-md":!0,"shadow-md":!0,"overflow-auto":!0,"min-w-full":!0,"bg-surface-low":!0,flex:!0,"flex-col":!0})}
102
+ role="listbox"
103
+ aria-multiselectable=${this.multi?`true`:`false`}
104
+ aria-label=${`${this.label||`Options`} dropdown`}
105
+ ?hidden=${!this._open}
106
+ style="max-height: ${this.maxHeight}; display: ${this._open?`flex`:`none`};"
107
+ @slotchange=${()=>{this._setupOptionHandlers()}}
108
+ >
109
+ <slot></slot>
110
+ ${this._hasResults?``:s.html`
111
+ <li class="px-3 py-2 text-sm text-muted">No results found</li>
112
+ `}
113
+ </ul>
114
+ </div>
115
+ `}_handleAutoSelectOnBlur(){if(this.multi||!this._open||!this._inputValue.trim())return;let e=this._inputValue.trim(),t=null,r=0;this._options.forEach(i=>{if(i.hidden)return;let a=i.label||i.textContent||``,o=i.value,s=n.t(e,a),c=n.t(e,o),l=Math.max(1.1*s,c);l>r&&l>=this.similarityThreshold&&(r=l,t=i)}),t&&(this._selectedValue$.next(t.value),this._inputValue=t.label||t.textContent||``,this._inputValue$.next(this._inputValue),this._open=!1)}_handleKeyDown(e){let t=this._open,n=this._selectedValues$.value;if(this.multi&&e.key===`Backspace`&&!this._inputValue&&n.length>0&&!t){e.preventDefault();let t=n[n.length-1];this.handleChipRemove(t);return}if(!t&&(e.key===`ArrowDown`||e.key===`Enter`))return e.preventDefault(),this._openDropdown(),void(0,r.timer)(10).pipe((0,i.takeUntil)(this.disconnecting)).subscribe(()=>{this._options.find(e=>!e.hidden)?.focus()});if(!t)return;let a=this._options.filter(e=>!e.hidden).toSorted((e,t)=>parseInt(e.style.order||`0`)-parseInt(t.style.order||`0`)),o=a.find(e=>e===document.activeElement),s=o?a.indexOf(o):-1;switch(e.key){case`Escape`:e.preventDefault(),this._open=!1,this._updateInputDisplay(),this._inputElementRef.value?.focus();break;case`Tab`:this._open=!1,this._updateInputDisplay();break;case`ArrowDown`:e.preventDefault(),a[s<a.length-1?s+1:0]?.focus();break;case`ArrowUp`:e.preventDefault(),a[s>0?s-1:a.length-1]?.focus();break;case`Home`:e.preventDefault(),a[0]?.focus();break;case`End`:e.preventDefault(),a[a.length-1]?.focus();break;case`Enter`:case` `:o&&(e.preventDefault(),this._selectOption(o))}}};t.a([(0,o.property)({type:String})],f.prototype,`placeholder`,void 0),t.a([(0,o.property)({type:String})],f.prototype,`maxHeight`,void 0),t.a([(0,o.property)({type:Boolean})],f.prototype,`multi`,void 0),t.a([(0,o.property)({type:String})],f.prototype,`description`,void 0),t.a([(0,o.property)({type:String,reflect:!0})],f.prototype,`size`,void 0),t.a([(0,o.property)({type:String})],f.prototype,`autocomplete`,void 0),t.a([(0,o.property)({type:Number})],f.prototype,`debounceMs`,void 0),t.a([(0,o.property)({type:Number})],f.prototype,`similarityThreshold`,void 0),t.a([(0,o.property)({type:Array})],f.prototype,`values`,null),t.a([(0,o.property)({type:String,reflect:!0})],f.prototype,`value`,null),t.a([(0,o.state)()],f.prototype,`_open`,void 0),t.a([(0,o.state)()],f.prototype,`_inputValue`,void 0),t.a([(0,o.state)()],f.prototype,`_visibleOptionsCount`,void 0),t.a([(0,o.state)()],f.prototype,`_hasResults`,void 0),t.a([(0,o.query)(`#options`)],f.prototype,`_listbox`,void 0),t.a([(0,o.query)(`sch-input`)],f.prototype,`_input`,void 0),t.a([(0,o.queryAssignedElements)({flatten:!0})],f.prototype,`_options`,void 0),f=t.a([(0,o.customElement)(`schmancy-autocomplete`)],f);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete-Ck2zbdF9.cjs","names":[],"sources":["../src/form/fields/autocomplete/autocomplete.scss?inline","../src/form/fields/autocomplete/autocomplete.ts"],"sourcesContent":[":host {\n\tdisplay: block;\n\tborder: unset !important;\n\tline-height: unset !important;\n\tbackground: unset !important;\n\tpadding: unset !important;\n\tfont-size: unset !important;\n\tbox-shadow: unset !important;\n}\n\n:host:focus {\n\tbox-shadow: unset !important;\n}\n\n@keyframes onAutoFillStart {\n\tfrom {/**/}\n\tto {/**/}\n}\n\nsch-input::part(input):-webkit-autofill,\nsch-input input:-webkit-autofill {\n\tanimation-name: onAutoFillStart;\n\tanimation-duration: 1ms;\n}\n","import { SchmancyFormField } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html, nothing, unsafeCSS } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n takeUntil,\n tap\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../../../utils/search'\n// Import chip component for multi-select display\nimport '../../../chips/input-chip'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n/**\n * Autocomplete input component with filtering and multi-select support.\n *\n * @prop {string} name - Name attribute for form submission\n * @prop {string} label - Label text displayed above the input\n * @prop {string} placeholder - Placeholder text for the input\n * @prop {boolean} required - Whether the field is required\n * @prop {boolean} multi - Enable multi-select mode\n * @prop {string} value - Selected value (single select mode)\n * @prop {string[]} values - Selected values (multi-select mode)\n */\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends SchmancyFormField(unsafeCSS(style)) {\n\n // `formAssociated`, `internals`, `attachInternals`, `name`, `label`,\n // `required`, `disabled`, `error`, `validationMessage`, `hint`, `id`,\n // `validateOn`, `touched/dirty/submitted`, `markTouched/markSubmitted`,\n // `setCustomValidity`, `formDisabledCallback`, FIELD_CONNECT_EVENT dispatch\n // — all from the mixin.\n\n /** Override mixin's resetForm with autocomplete-specific subject reset. */\n override resetForm(): void {\n if (this.multi) {\n this._selectedValues$.next([])\n } else {\n this._selectedValue$.next('')\n }\n this._inputValue = ''\n this._inputValue$.next('')\n super.resetForm()\n }\n\n // Track whether value/values have been explicitly set\n _valueSet: boolean = false\n _valuesSet: boolean = false\n\n // Autocomplete-specific properties only — `name`, `label`, `required`,\n // `error`, `validationMessage` come from the mixin.\n @property({ type: String }) placeholder = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'off'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n private readonly _a11yId = `schmancy-autocomplete-${Math.random().toString(36).slice(2, 10)}`\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._valuesSet = true\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property — narrowed override of the mixin's wide value union.\n @property({ type: String, reflect: true })\n override get value(): string {\n return this.multi\n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n override set value(val: string) {\n this._valueSet = true\n if (this.multi) {\n const newValues = val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n const currentValues = this._selectedValues$.value\n // Only update if values actually changed\n if (JSON.stringify(newValues) !== JSON.stringify(currentValues)) {\n this._selectedValues$.next(newValues)\n }\n } else {\n // Only update if value actually changed\n if (val !== this._selectedValue$.value) {\n this._selectedValue$.next(val)\n // Update the input display when value is set\n this._updateInputDisplay()\n }\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects - only what we actually need\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n\n override connectedCallback() {\n // FIELD_CONNECT_EVENT is dispatched by the mixin's connectedCallback.\n super.connectedCallback()\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n }\n\n private _setupAutocompleteLogic() {\n // Sync selection state\n combineLatest([\n this._selectedValue$,\n this._selectedValues$\n ]).pipe(\n tap(([selectedValue, selectedValues]) => {\n this._updateOptionSelection(selectedValue, selectedValues)\n // Keep ElementInternals form value in sync with selection (single and multi).\n const formValue = this.multi ? selectedValues.join(',') : selectedValue\n this.internals?.setFormValue(formValue || null)\n if (this.required) {\n const missing = this.multi ? selectedValues.length === 0 : !selectedValue\n this.internals?.setValidity(\n missing ? { valueMissing: true } : {},\n missing ? this.validationMessage || 'Please select an option.' : undefined,\n )\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Filter options based on input\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n tap(searchTerm => {\n if (this._open) {\n this._filterOptions(searchTerm)\n }\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupOptionHandlers() {\n this._options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n // Idempotent: slotchange may fire repeatedly for the same option nodes,\n // and addEventListener doesn't replace prior handlers like onfoo= did.\n if (option.dataset.schmancyAutocompleteHandlers === 'attached') return\n option.dataset.schmancyAutocompleteHandlers = 'attached'\n\n // Prevent blur handler from interfering with option selection\n fromEvent<MouseEvent>(option, 'mousedown')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => e.preventDefault())\n\n // Handle the actual selection\n fromEvent<MouseEvent>(option, 'click')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => {\n e.stopPropagation()\n this._selectOption(option)\n })\n })\n }\n\n private _updateOptionSelection(selectedValue: string, selectedValues: string[]) {\n this._options.forEach(option => {\n option.selected = this.multi\n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }\n\n private _filterOptions(searchTerm: string) {\n const term = searchTerm.trim()\n\n if (!term) {\n // Show all options if no search term\n this._options.forEach(option => {\n option.hidden = false\n option.style.order = '0'\n })\n this._visibleOptionsCount = this._options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = this._options.map(option => {\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n const score = Math.max(labelScore * 1.1, valueScore)\n\n return { option, score }\n })\n\n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n\n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n option.style.order = String(index)\n }\n })\n\n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n\n this._announceToScreenReader(\n this._visibleOptionsCount > 0\n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }\n\n private _openDropdown() {\n this._open = true\n // Reset filters based on current input value when dropdown opens\n this._filterOptions(this._inputValue)\n }\n\n private _selectOption(option: SchmancyOption) {\n if (this.multi) {\n const currentValues = this._selectedValues$.value\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? currentValues.filter(v => v !== option.value)\n : [...currentValues, option.value]\n\n this._selectedValues$.next(newValues)\n this._announceToScreenReader(\n newValues.length > 0\n ? `Selected: ${this._getSelectedLabels().join(', ')}`\n : 'No options selected'\n )\n this._fireChangeEvent()\n } else {\n // Update value first\n this._selectedValue$.next(option.value)\n\n // Close dropdown IMMEDIATELY to prevent blur handler from firing\n this._open = false\n\n // Now fire event with the NEW value\n this._fireChangeEvent()\n\n // Update UI\n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n\n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }\n\n private _setupDocumentClickHandler() {\n fromEvent<MouseEvent>(document, 'click')\n .pipe(takeUntil(this.disconnecting))\n .subscribe(e => {\n if (!this._open) return\n const path = e.composedPath()\n if (!path.includes(this) && !this._options.some(opt => path.includes(opt))) {\n this._open = false\n this._updateInputDisplay()\n }\n })\n }\n\n\n private _updateInputDisplay() {\n // For multi-select, we don't update input display since chips show the selections\n if (this.multi) return\n\n const selectedValue = this._selectedValue$.value\n const option = this._options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n this._inputValue$.next(this._inputValue)\n\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = this._inputValue\n }\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n this._setupOptionHandlers()\n\n // Sync initial value with display after options are available\n this._updateInputDisplay()\n\n // Update options when slot changes\n const slot = this.shadowRoot?.querySelector('slot')\n slot?.addEventListener('slotchange', () => {\n this._setupOptionHandlers()\n this._updateOptionSelection(this._selectedValue$.value, this._selectedValues$.value)\n })\n }\n\n private handleChipRemove(value: string) {\n const currentValues = this._selectedValues$.value\n const newValues = currentValues.filter(v => v !== value)\n this._selectedValues$.next(newValues)\n this._fireChangeEvent()\n this._announceToScreenReader(`Removed: ${this._getChipLabel(value)}`)\n }\n\n private _getChipLabel(value: string): string {\n const option = this._options.find(opt => opt.value === value)\n return option ? option.label || option.textContent || value : value\n }\n\n private _focusTextInput() {\n if (this._inputElementRef.value) {\n this._inputElementRef.value.focus()\n }\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n // Get size-based styling to match Schmancy input\n const getSizeStyles = () => {\n switch (this.size) {\n case 'sm':\n return {\n height: 'min-h-[40px]',\n padding: 'px-2',\n fontSize: 'text-sm', // 14px\n labelSize: 'text-sm'\n }\n case 'lg':\n return {\n height: 'min-h-[60px]',\n padding: 'px-5',\n fontSize: 'text-lg', // 18px\n labelSize: 'text-lg'\n }\n case 'md':\n default:\n return {\n height: 'min-h-[50px]',\n padding: 'px-4',\n fontSize: 'text-base', // 16px\n labelSize: 'text-base'\n }\n }\n }\n\n const { height, padding, fontSize, labelSize } = getSizeStyles()\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Custom input wrapper for Gmail-style chip input -->\n <slot name=\"trigger\">\n ${when(this.multi,\n () => html`\n <!-- Custom multi-select input with inline chips -->\n <div class=\"relative\">\n ${when(this.label, () => html`\n <label class=\"${classMap({\n 'block mb-1 font-medium': true,\n 'text-primary-default': !this.error,\n 'text-error-default': this.error,\n [labelSize]: true\n })}\">\n ${this.label}${this.required ? html`<span class=\"text-error-default ml-1\">*</span>` : ''}\n </label>\n `)}\n <div\n class=\"${classMap({\n 'flex flex-wrap items-center gap-1': true,\n [height]: true,\n [padding]: true,\n 'block w-full min-w-0 rounded-[8px] border-0': true,\n 'bg-surface-highest text-surface-on': true,\n 'ring-0 ring-inset focus-within:ring-1 focus-within:ring-inset': true,\n 'ring-secondary-default focus-within:ring-secondary-default': !this.error,\n 'ring-error-default focus-within:ring-error-default': this.error,\n 'cursor-text transition-colors duration-200': true\n })}\"\n @click=${() => this._focusTextInput()}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n >\n <!-- Render chips inline -->\n ${repeat(\n this._selectedValues$.value,\n value => value,\n value => html`\n <schmancy-input-chip\n .value=${value}\n @remove=${(e: CustomEvent) => this.handleChipRemove(e.detail.value)}\n class=\"shrink-0 my-0.5\"\n >\n ${this._getChipLabel(value)}\n </schmancy-input-chip>\n `\n )}\n\n <!-- Text input for typing -->\n <input\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n type=\"text\"\n class=\"flex-1 min-w-[120px] py-1 bg-transparent border-none outline-none ${fontSize} font-medium text-surface-on placeholder:text-muted\"\n name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-') || ''}\n .placeholder=${this._selectedValues$.value.length > 0 ? 'Add more...' : this.placeholder}\n .value=${this._inputValue}\n .autocomplete=${this.autocomplete}\n aria-invalid=${this.error ? 'true' : 'false'}\n aria-required=${this.required ? 'true' : 'false'}\n aria-describedby=${this.error && this.validationMessage ? `${this._a11yId}-err` : nothing}\n aria-label=${!this.label && this.placeholder ? this.placeholder : nothing}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n // Clear input on focus for new searches\n this._inputValue = ''\n this._inputValue$.next('')\n this._openDropdown()\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n />\n </div>\n\n <!-- Validation message -->\n ${when(this.error && this.validationMessage, () => html`\n <div id=\"${this._a11yId}-err\" class=\"mt-1 text-sm text-error-default\" role=\"alert\">\n ${this.validationMessage}\n </div>\n `)}\n </div>\n `,\n () => html`\n <!-- Regular single-select input -->\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-') || ''}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${ifDefined(this.description ? descriptionId : undefined)}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n this._openDropdown()\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._openDropdown()\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n >\n </schmancy-input>\n `\n )}\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._setupOptionHandlers()\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n `\n }\n\n private _handleAutoSelectOnBlur() {\n // Only auto-select in single-select mode and when dropdown is open with a search term\n if (this.multi || !this._open || !this._inputValue.trim()) {\n return\n }\n \n const searchTerm = this._inputValue.trim()\n \n // Find the best matching option using the same similarity logic as filtering\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n this._options.forEach(option => {\n // Skip hidden options\n if (option.hidden) return\n \n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(searchTerm, optionLabel)\n const valueScore = similarity(searchTerm, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n // Keep track of best match that meets threshold\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n \n // Auto-select the best match if found\n if (bestMatch) {\n // Silently update the selected value without firing change event\n this._selectedValue$.next(bestMatch.value)\n this._inputValue = bestMatch.label || bestMatch.textContent || ''\n this._inputValue$.next(this._inputValue)\n this._open = false\n }\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n const isOpen = this._open\n const selectedValues = this._selectedValues$.value\n\n // Handle backspace to remove last chip in multi-select when input is empty\n if (this.multi && event.key === 'Backspace' && !this._inputValue && selectedValues.length > 0 && !isOpen) {\n event.preventDefault()\n const lastValue = selectedValues[selectedValues.length - 1]\n this.handleChipRemove(lastValue)\n return\n }\n\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._openDropdown()\n\n timer(10)\n .pipe(takeUntil(this.disconnecting))\n .subscribe(() => {\n const firstVisible = this._options.find(opt => !opt.hidden)\n firstVisible?.focus()\n })\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = this._options.filter(opt => !opt.hidden)\n .toSorted((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n\n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open = false\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open = false\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._selectOption(focusedOption)\n }\n break\n }\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- require(`./autocomplete-iCJOia-q.cjs`);
1
+ require(`./autocomplete-Ck2zbdF9.cjs`);