@mhmo91/schmancy 0.2.131 → 0.2.132

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 (241) hide show
  1. package/dist/{animated-text-rLaot0v2.cjs → animated-text-BA466KMo.cjs} +2 -2
  2. package/dist/{animated-text-rLaot0v2.cjs.map → animated-text-BA466KMo.cjs.map} +1 -1
  3. package/dist/{animated-text-BJXm6krF.js → animated-text-DGzNS4Kd.js} +3 -3
  4. package/dist/{animated-text-BJXm6krF.js.map → animated-text-DGzNS4Kd.js.map} +1 -1
  5. package/dist/animated-text.cjs +1 -1
  6. package/dist/animated-text.js +1 -1
  7. package/dist/area.cjs +1 -1
  8. package/dist/{area.component-CP5oin2j.cjs → area.component-BsTipdPH.cjs} +2 -2
  9. package/dist/{area.component-CP5oin2j.cjs.map → area.component-BsTipdPH.cjs.map} +1 -1
  10. package/dist/{area.component-DlAEUmgd.js → area.component-DqakKBYJ.js} +3 -3
  11. package/dist/{area.component-DlAEUmgd.js.map → area.component-DqakKBYJ.js.map} +1 -1
  12. package/dist/area.js +1 -1
  13. package/dist/autocomplete-CsePKzPw.cjs +62 -0
  14. package/dist/autocomplete-CsePKzPw.cjs.map +1 -0
  15. package/dist/autocomplete-DQKvgQXh.js +249 -0
  16. package/dist/autocomplete-DQKvgQXh.js.map +1 -0
  17. package/dist/autocomplete.cjs +1 -1
  18. package/dist/autocomplete.js +1 -1
  19. package/dist/busy.cjs +1 -1
  20. package/dist/busy.js +1 -1
  21. package/dist/button.cjs +1 -1
  22. package/dist/button.js +1 -1
  23. package/dist/card.cjs +1 -1
  24. package/dist/card.js +1 -1
  25. package/dist/{checkbox-DrrcDAjr.cjs → checkbox-B2iiLgtv.cjs} +2 -2
  26. package/dist/{checkbox-DrrcDAjr.cjs.map → checkbox-B2iiLgtv.cjs.map} +1 -1
  27. package/dist/{checkbox-N_JVa-1W.js → checkbox-CxcVktYo.js} +2 -2
  28. package/dist/{checkbox-N_JVa-1W.js.map → checkbox-CxcVktYo.js.map} +1 -1
  29. package/dist/checkbox.cjs +1 -1
  30. package/dist/checkbox.js +1 -1
  31. package/dist/{chips-DuSV3Pg2.js → chips-BqYp-S9g.js} +15 -15
  32. package/dist/{chips-DuSV3Pg2.js.map → chips-BqYp-S9g.js.map} +1 -1
  33. package/dist/{chips-DrYrCyTG.cjs → chips-UqRrSW28.cjs} +15 -15
  34. package/dist/{chips-DrYrCyTG.cjs.map → chips-UqRrSW28.cjs.map} +1 -1
  35. package/dist/chips.cjs +1 -1
  36. package/dist/chips.js +1 -1
  37. package/dist/components.cjs +1 -1
  38. package/dist/components.js +1 -1
  39. package/dist/content-drawer.cjs +1 -1
  40. package/dist/content-drawer.js +1 -1
  41. package/dist/{date-range-DoZNetuD.cjs → date-range-BwgdrpOA.cjs} +3 -3
  42. package/dist/date-range-BwgdrpOA.cjs.map +1 -0
  43. package/dist/{date-range-6fQ4ypDJ.js → date-range-CdoDJ3L2.js} +16 -16
  44. package/dist/date-range-CdoDJ3L2.js.map +1 -0
  45. package/dist/date-range.cjs +1 -1
  46. package/dist/date-range.js +1 -1
  47. package/dist/{delay-CSAsNZ4k.js → delay-CS6opyMk.js} +2 -2
  48. package/dist/{delay-CSAsNZ4k.js.map → delay-CS6opyMk.js.map} +1 -1
  49. package/dist/{delay-WrR6CJK_.cjs → delay-uWrg9zzM.cjs} +2 -2
  50. package/dist/{delay-WrR6CJK_.cjs.map → delay-uWrg9zzM.cjs.map} +1 -1
  51. package/dist/delay.cjs +1 -1
  52. package/dist/delay.js +1 -1
  53. package/dist/{divider-Cl2Thq2Y.cjs → divider-2ok73Eva.cjs} +2 -2
  54. package/dist/{divider-Cl2Thq2Y.cjs.map → divider-2ok73Eva.cjs.map} +1 -1
  55. package/dist/{divider-ByXACxEQ.js → divider-7V3DrqCq.js} +3 -3
  56. package/dist/{divider-ByXACxEQ.js.map → divider-7V3DrqCq.js.map} +1 -1
  57. package/dist/divider.cjs +1 -1
  58. package/dist/divider.js +1 -1
  59. package/dist/extra.cjs +1 -1
  60. package/dist/extra.js +1 -1
  61. package/dist/{flex-BGVyAdBX.js → flex-Dl-3pfaZ.js} +2 -2
  62. package/dist/{flex-BGVyAdBX.js.map → flex-Dl-3pfaZ.js.map} +1 -1
  63. package/dist/{flex-DeB79N0h.cjs → flex-Wu22kbKr.cjs} +2 -2
  64. package/dist/{flex-DeB79N0h.cjs.map → flex-Wu22kbKr.cjs.map} +1 -1
  65. package/dist/{form-DATARECy.js → form-D3iNn8mF.js} +2 -2
  66. package/dist/{form-DATARECy.js.map → form-D3iNn8mF.js.map} +1 -1
  67. package/dist/{form-Dkh-YG_8.cjs → form-DtbsNIva.cjs} +2 -2
  68. package/dist/{form-Dkh-YG_8.cjs.map → form-DtbsNIva.cjs.map} +1 -1
  69. package/dist/form.cjs +1 -1
  70. package/dist/form.js +1 -1
  71. package/dist/{icon-BbqYaRVu.cjs → icon-CcfC08Kv.cjs} +2 -2
  72. package/dist/{icon-BbqYaRVu.cjs.map → icon-CcfC08Kv.cjs.map} +1 -1
  73. package/dist/{icon-BdqEZEF8.js → icon-Daf3V5zc.js} +3 -3
  74. package/dist/{icon-BdqEZEF8.js.map → icon-Daf3V5zc.js.map} +1 -1
  75. package/dist/{icon-button-DlnuclQQ.js → icon-button-CvzPbHj1.js} +4 -4
  76. package/dist/icon-button-CvzPbHj1.js.map +1 -0
  77. package/dist/{icon-button-BUUtmKnu.cjs → icon-button-D02HHUju.cjs} +3 -3
  78. package/dist/icon-button-D02HHUju.cjs.map +1 -0
  79. package/dist/icons.cjs +1 -1
  80. package/dist/icons.js +1 -1
  81. package/dist/index.cjs +1 -1
  82. package/dist/index.js +35 -35
  83. package/dist/{input-BDUd1ZGs.js → input-CRKlzC_n.js} +2 -2
  84. package/dist/{input-BDUd1ZGs.js.map → input-CRKlzC_n.js.map} +1 -1
  85. package/dist/{input-B_MWCRet.cjs → input-DkYfzuf_.cjs} +2 -2
  86. package/dist/{input-B_MWCRet.cjs.map → input-DkYfzuf_.cjs.map} +1 -1
  87. package/dist/input.cjs +1 -1
  88. package/dist/input.js +1 -1
  89. package/dist/layout.cjs +1 -1
  90. package/dist/layout.js +1 -1
  91. package/dist/{list-D0J2ndMA.js → list-CIfX9HAX.js} +2 -2
  92. package/dist/{list-D0J2ndMA.js.map → list-CIfX9HAX.js.map} +1 -1
  93. package/dist/{list-UOeNjOTt.cjs → list-ClN4WGiv.cjs} +2 -2
  94. package/dist/{list-UOeNjOTt.cjs.map → list-ClN4WGiv.cjs.map} +1 -1
  95. package/dist/list.cjs +1 -1
  96. package/dist/list.js +1 -1
  97. package/dist/{litElement.mixin-PXLBM6N4.js → litElement.mixin-Bc-mD_fE.js} +2 -2
  98. package/dist/{litElement.mixin-PXLBM6N4.js.map → litElement.mixin-Bc-mD_fE.js.map} +1 -1
  99. package/dist/{litElement.mixin-CfkMd-bR.cjs → litElement.mixin-S3xWZjIN.cjs} +2 -2
  100. package/dist/{litElement.mixin-CfkMd-bR.cjs.map → litElement.mixin-S3xWZjIN.cjs.map} +1 -1
  101. package/dist/{menu-D7PxtMOz.js → menu-BLHROh10.js} +3 -3
  102. package/dist/{menu-D7PxtMOz.js.map → menu-BLHROh10.js.map} +1 -1
  103. package/dist/{menu-B4k2_5rl.cjs → menu-BVIo2QsA.cjs} +2 -2
  104. package/dist/{menu-B4k2_5rl.cjs.map → menu-BVIo2QsA.cjs.map} +1 -1
  105. package/dist/menu.cjs +1 -1
  106. package/dist/menu.js +1 -1
  107. package/dist/nav-drawer.cjs +1 -1
  108. package/dist/nav-drawer.js +1 -1
  109. package/dist/notification.cjs +1 -1
  110. package/dist/notification.js +1 -1
  111. package/dist/{option-vV2BM1B_.js → option-DJwUNDv1.js} +3 -3
  112. package/dist/option-DJwUNDv1.js.map +1 -0
  113. package/dist/{option-hsAZB8ji.cjs → option-DUsQh2li.cjs} +3 -3
  114. package/dist/option-DUsQh2li.cjs.map +1 -0
  115. package/dist/option.cjs +1 -1
  116. package/dist/option.js +1 -1
  117. package/dist/{outlet-DRaXjbOY.js → outlet-Ch6PcF31.js} +2 -2
  118. package/dist/{outlet-DRaXjbOY.js.map → outlet-Ch6PcF31.js.map} +1 -1
  119. package/dist/{outlet-DMOeEL6g.cjs → outlet-D0yXIpoJ.cjs} +2 -2
  120. package/dist/{outlet-DMOeEL6g.cjs.map → outlet-D0yXIpoJ.cjs.map} +1 -1
  121. package/dist/{payment-card-form-DfbqzyTv.cjs → payment-card-form-DHnv_dB5.cjs} +2 -2
  122. package/dist/{payment-card-form-DfbqzyTv.cjs.map → payment-card-form-DHnv_dB5.cjs.map} +1 -1
  123. package/dist/{payment-card-form-8oXgNTFN.js → payment-card-form-RVkRt3dw.js} +3 -3
  124. package/dist/{payment-card-form-8oXgNTFN.js.map → payment-card-form-RVkRt3dw.js.map} +1 -1
  125. package/dist/{radio-group-CLt-d-Ni.cjs → radio-group-D3GZyViJ.cjs} +2 -2
  126. package/dist/{radio-group-CLt-d-Ni.cjs.map → radio-group-D3GZyViJ.cjs.map} +1 -1
  127. package/dist/{radio-group-DRXtgyf5.js → radio-group-Pnq88mNF.js} +2 -2
  128. package/dist/{radio-group-DRXtgyf5.js.map → radio-group-Pnq88mNF.js.map} +1 -1
  129. package/dist/radio-group.cjs +1 -1
  130. package/dist/radio-group.js +1 -1
  131. package/dist/{schmancy-steps-container-DguK5NK4.cjs → schmancy-steps-container-BfAnYBQC.cjs} +2 -2
  132. package/dist/{schmancy-steps-container-DguK5NK4.cjs.map → schmancy-steps-container-BfAnYBQC.cjs.map} +1 -1
  133. package/dist/{schmancy-steps-container-D1k0kjKI.js → schmancy-steps-container-Cxi9CAKu.js} +2 -2
  134. package/dist/{schmancy-steps-container-D1k0kjKI.js.map → schmancy-steps-container-Cxi9CAKu.js.map} +1 -1
  135. package/dist/{select-BUUelLow.cjs → select-D_vwLTzC.cjs} +2 -2
  136. package/dist/{select-BUUelLow.cjs.map → select-D_vwLTzC.cjs.map} +1 -1
  137. package/dist/{select-By_Pm8TG.js → select-Dvc0m2Du.js} +3 -3
  138. package/dist/{select-By_Pm8TG.js.map → select-Dvc0m2Du.js.map} +1 -1
  139. package/dist/select.cjs +1 -1
  140. package/dist/select.js +1 -1
  141. package/dist/{sheet-CyZB5a4W.cjs → sheet-CckiFxcM.cjs} +2 -2
  142. package/dist/{sheet-CyZB5a4W.cjs.map → sheet-CckiFxcM.cjs.map} +1 -1
  143. package/dist/{sheet-CHow9LJ8.js → sheet-Cmkb43UV.js} +3 -3
  144. package/dist/{sheet-CHow9LJ8.js.map → sheet-Cmkb43UV.js.map} +1 -1
  145. package/dist/sheet.cjs +1 -1
  146. package/dist/sheet.js +1 -1
  147. package/dist/{slider-BORUoU4I.js → slider-CTOGZsFh.js} +3 -3
  148. package/dist/{slider-BORUoU4I.js.map → slider-CTOGZsFh.js.map} +1 -1
  149. package/dist/{slider-DCRfwhaP.cjs → slider-Cy4MNGb2.cjs} +2 -2
  150. package/dist/{slider-DCRfwhaP.cjs.map → slider-Cy4MNGb2.cjs.map} +1 -1
  151. package/dist/slider.cjs +1 -1
  152. package/dist/slider.js +1 -1
  153. package/dist/{spinner-DeHbns2e.cjs → spinner-Dw4YE-LZ.cjs} +2 -2
  154. package/dist/{spinner-DeHbns2e.cjs.map → spinner-Dw4YE-LZ.cjs.map} +1 -1
  155. package/dist/{spinner-C-rMlbyB.js → spinner-nNr0i8Wf.js} +3 -3
  156. package/dist/{spinner-C-rMlbyB.js.map → spinner-nNr0i8Wf.js.map} +1 -1
  157. package/dist/steps.cjs +1 -1
  158. package/dist/steps.js +1 -1
  159. package/dist/{surface-TpxKBWnD.cjs → surface-CMTttVEi.cjs} +2 -2
  160. package/dist/{surface-TpxKBWnD.cjs.map → surface-CMTttVEi.cjs.map} +1 -1
  161. package/dist/{surface-HAEl5c8W.js → surface-CcVbJOTT.js} +2 -2
  162. package/dist/{surface-HAEl5c8W.js.map → surface-CcVbJOTT.js.map} +1 -1
  163. package/dist/surface.cjs +1 -1
  164. package/dist/surface.js +1 -1
  165. package/dist/{table-D7KL2FaN.js → table-ByZ8ut41.js} +2 -2
  166. package/dist/{table-D7KL2FaN.js.map → table-ByZ8ut41.js.map} +1 -1
  167. package/dist/{table-DXPDEHEh.cjs → table-CbQcK1h5.cjs} +2 -2
  168. package/dist/{table-DXPDEHEh.cjs.map → table-CbQcK1h5.cjs.map} +1 -1
  169. package/dist/table.cjs +1 -1
  170. package/dist/table.js +1 -1
  171. package/dist/{tabs-group-CR2cSCNr.cjs → tabs-group-BEEKbPIG.cjs} +2 -2
  172. package/dist/{tabs-group-CR2cSCNr.cjs.map → tabs-group-BEEKbPIG.cjs.map} +1 -1
  173. package/dist/{tabs-group-Dm_FCj7q.js → tabs-group-Co1gWTv7.js} +2 -2
  174. package/dist/{tabs-group-Dm_FCj7q.js.map → tabs-group-Co1gWTv7.js.map} +1 -1
  175. package/dist/tabs.cjs +1 -1
  176. package/dist/tabs.js +1 -1
  177. package/dist/tailwind.mixin-BpqwMTLX.js +43 -0
  178. package/dist/{tailwind.mixin-Cxj7n9Jd.js.map → tailwind.mixin-BpqwMTLX.js.map} +1 -1
  179. package/dist/tailwind.mixin-CfdJw976.cjs +2 -0
  180. package/dist/{tailwind.mixin-CjSVtdHt.cjs.map → tailwind.mixin-CfdJw976.cjs.map} +1 -1
  181. package/dist/teleport.cjs +1 -1
  182. package/dist/{teleport.component-C43YKRMJ.cjs → teleport.component-Br--aL4K.cjs} +2 -2
  183. package/dist/{teleport.component-C43YKRMJ.cjs.map → teleport.component-Br--aL4K.cjs.map} +1 -1
  184. package/dist/{teleport.component-Cv7rwX-_.js → teleport.component-D98NF0fA.js} +37 -37
  185. package/dist/{teleport.component-Cv7rwX-_.js.map → teleport.component-D98NF0fA.js.map} +1 -1
  186. package/dist/teleport.js +1 -1
  187. package/dist/{textarea-DcSAsR60.js → textarea-4HpWvkc3.js} +2 -2
  188. package/dist/{textarea-DcSAsR60.js.map → textarea-4HpWvkc3.js.map} +1 -1
  189. package/dist/{textarea-CLlh5-HA.cjs → textarea-DIBNzSOF.cjs} +2 -2
  190. package/dist/{textarea-CLlh5-HA.cjs.map → textarea-DIBNzSOF.cjs.map} +1 -1
  191. package/dist/textarea.cjs +1 -1
  192. package/dist/textarea.js +1 -1
  193. package/dist/{theme-button-B7_LXWoe.js → theme-button-ChDLKOJ8.js} +2 -2
  194. package/dist/{theme-button-B7_LXWoe.js.map → theme-button-ChDLKOJ8.js.map} +1 -1
  195. package/dist/{theme-button-53Mhj3kQ.cjs → theme-button-CrQPvn70.cjs} +2 -2
  196. package/dist/{theme-button-53Mhj3kQ.cjs.map → theme-button-CrQPvn70.cjs.map} +1 -1
  197. package/dist/theme-button.cjs +1 -1
  198. package/dist/theme-button.js +1 -1
  199. package/dist/theme.cjs +1 -1
  200. package/dist/{theme.component-Drmkh4sF.cjs → theme.component-DJ8BSZaI.cjs} +2 -2
  201. package/dist/{theme.component-Drmkh4sF.cjs.map → theme.component-DJ8BSZaI.cjs.map} +1 -1
  202. package/dist/{theme.component-yFb6vlsT.js → theme.component-DhPLhwDE.js} +2 -2
  203. package/dist/{theme.component-yFb6vlsT.js.map → theme.component-DhPLhwDE.js.map} +1 -1
  204. package/dist/theme.js +1 -1
  205. package/dist/{timezone-enXRjPy1.cjs → timezone-BH5wNofv.cjs} +2 -2
  206. package/dist/{timezone-enXRjPy1.cjs.map → timezone-BH5wNofv.cjs.map} +1 -1
  207. package/dist/{timezone-DxkvIe7V.js → timezone-CzCyse5N.js} +3 -3
  208. package/dist/{timezone-DxkvIe7V.js.map → timezone-CzCyse5N.js.map} +1 -1
  209. package/dist/{tree-Bt4J6QVI.cjs → tree-BSKoUX-3.cjs} +2 -2
  210. package/dist/{tree-Bt4J6QVI.cjs.map → tree-BSKoUX-3.cjs.map} +1 -1
  211. package/dist/{tree-CQccoc9W.js → tree-DwEecdA9.js} +2 -2
  212. package/dist/{tree-CQccoc9W.js.map → tree-DwEecdA9.js.map} +1 -1
  213. package/dist/tree.cjs +1 -1
  214. package/dist/tree.js +1 -1
  215. package/dist/{typewriter-DGserMVU.js → typewriter-Cw_HKjhG.js} +4 -4
  216. package/dist/{typewriter-DGserMVU.js.map → typewriter-Cw_HKjhG.js.map} +1 -1
  217. package/dist/{typewriter-WqDo75_3.cjs → typewriter-DdhbEfaH.cjs} +2 -2
  218. package/dist/{typewriter-WqDo75_3.cjs.map → typewriter-DdhbEfaH.cjs.map} +1 -1
  219. package/dist/typewriter.cjs +1 -1
  220. package/dist/typewriter.js +1 -1
  221. package/dist/{typography-D5E46rwN.js → typography-D2EIvv42.js} +2 -2
  222. package/dist/{typography-D5E46rwN.js.map → typography-D2EIvv42.js.map} +1 -1
  223. package/dist/{typography-DbNitvGl.cjs → typography-d490P1tM.cjs} +2 -2
  224. package/dist/{typography-DbNitvGl.cjs.map → typography-d490P1tM.cjs.map} +1 -1
  225. package/dist/typography.cjs +1 -1
  226. package/dist/typography.js +1 -1
  227. package/package.json +1 -1
  228. package/types/src/autocomplete/autocomplete.d.ts +102 -59
  229. package/types/src/chips/chip.d.ts +0 -1
  230. package/dist/autocomplete-ChDCoDb2.cjs +0 -59
  231. package/dist/autocomplete-ChDCoDb2.cjs.map +0 -1
  232. package/dist/autocomplete-D8HWdpyS.js +0 -296
  233. package/dist/autocomplete-D8HWdpyS.js.map +0 -1
  234. package/dist/date-range-6fQ4ypDJ.js.map +0 -1
  235. package/dist/date-range-DoZNetuD.cjs.map +0 -1
  236. package/dist/icon-button-BUUtmKnu.cjs.map +0 -1
  237. package/dist/icon-button-DlnuclQQ.js.map +0 -1
  238. package/dist/option-hsAZB8ji.cjs.map +0 -1
  239. package/dist/option-vV2BM1B_.js.map +0 -1
  240. package/dist/tailwind.mixin-CjSVtdHt.cjs +0 -2
  241. package/dist/tailwind.mixin-Cxj7n9Jd.js +0 -43
@@ -1,90 +1,133 @@
1
1
  import { InputSize } from '@schmancy/input';
2
+ import SchmancyInput from '@schmancy/input/input';
3
+ /**
4
+ * @fires change - When selection changes
5
+ */
2
6
  export type SchmancyAutocompleteChangeEvent = CustomEvent<{
3
7
  value: string | string[];
4
8
  }>;
5
9
  declare const SchmancyAutocomplete_base: CustomElementConstructor & import("@mixins/index").Constructor<import("lit").LitElement> & import("@mixins/index").Constructor<import("@mixins/index").IBaseMixin>;
6
10
  /**
7
- * The SchmancyAutocomplete component provides an accessible autocomplete field with keyboard navigation.
11
+ * SchmancyAutocomplete provides an accessible autocomplete/combobox component
12
+ * with keyboard navigation and single or multi-select capabilities.
13
+ *
8
14
  * @element schmancy-autocomplete
9
- * @fires change - Emitted when a selection is made
10
- * @slot - Default slot for schmancy-option elements
11
- * @slot trigger - Optional slot to override the default input
15
+ * @slot - Default slot for option elements
16
+ * @slot trigger - Optional slot to override the default input element
12
17
  */
13
18
  export default class SchmancyAutocomplete extends SchmancyAutocomplete_base {
14
19
  required: boolean;
15
20
  placeholder: string;
16
- value: string;
17
21
  label: string;
18
22
  maxHeight: string;
19
23
  multi: boolean;
20
- /**
21
- * Optional description for the autocomplete to improve accessibility.
22
- * Will be associated with the input via aria-describedby.
23
- */
24
24
  description: string;
25
- /** Direct reference to the <input> inside <sch-input> */
26
- inputRef: import("lit-html/directives/ref").Ref<HTMLInputElement>;
27
- private optionsContainer;
28
- private empty;
29
- private input;
30
- private options;
31
- /**
32
- * The size of the input.
33
- * - 'sm': Small, compact size
34
- * - 'md': Medium size (default)
35
- * - 'lg': Large size
36
- */
37
25
  size: InputSize;
38
- private readonly searchTerm$;
39
- isOpen: boolean;
40
- /** Autocomplete/autofill hints. */
41
- autocomplete: AutoFill;
42
- private startY;
43
- private statusMessage;
26
+ autocomplete: string;
27
+ debounceMs: number;
28
+ get value(): string;
29
+ set value(val: string);
30
+ private _open;
31
+ private _inputValue;
32
+ private _selectedValue;
33
+ private _selectedValues;
34
+ private _suppressFocusOpen;
35
+ private _debounceTimer;
36
+ _listbox: HTMLUListElement;
37
+ _input: SchmancyInput;
38
+ private _options;
39
+ private _inputElementRef;
40
+ private _documentClickHandler;
44
41
  connectedCallback(): void;
42
+ disconnectedCallback(): void;
45
43
  firstUpdated(): void;
46
- protected updated(changedProps: Map<string | number | symbol, unknown>): void;
44
+ updated(changedProps: Map<string, unknown>): void;
47
45
  /**
48
- * When the <slot> changes (i.e. options are added/removed), update the following:
49
- * 1. Show or hide the "No results found" option.
50
- * 2. Sync the selection state.
51
- * 3. Setup accessibility attributes on the options.
46
+ * Handle document clicks to close dropdown when clicking outside
52
47
  */
53
- private handleSlotChange;
48
+ private _onDocumentClick;
54
49
  /**
55
- * Loops through assigned options and sets accessibility attributes:
56
- * - role="option"
57
- * - A unique ID (if not already set)
58
- * - tabindex="-1"
59
- * - aria-selected (based on whether the option is selected)
50
+ * Set up initial option accessibility attributes
60
51
  */
61
- private setupOptionsAccessibility;
62
- private syncSelectionFromValue;
63
- private updateInputValue;
52
+ private _setupOptionsAccessibility;
64
53
  /**
65
- * MAIN: Show the dropdown. Uses Floating UI to position and size the options container.
54
+ * Update options' selection state based on component value
66
55
  */
67
- private showOptions;
68
- private hideOptions;
69
- private handleInputChange;
70
- private handleOptionClick;
71
- checkValidity(): boolean;
72
- reportValidity(): boolean;
73
- private handleTouchStart;
74
- private preventScroll;
56
+ private _syncOptionsSelection;
57
+ /**
58
+ * Filter options based on input text - this operation can be expensive
59
+ * with many options or complex filtering logic
60
+ */
61
+ private _filterOptions;
62
+ /**
63
+ * Get all currently visible options
64
+ */
65
+ private _getVisibleOptions;
66
+ /**
67
+ * Get labels of selected options
68
+ */
69
+ private _getSelectedLabels;
70
+ /**
71
+ * Update the input display based on selection state
72
+ */
73
+ private _updateInputDisplay;
74
+ /**
75
+ * Handle input focus
76
+ */
77
+ private _onInputFocus;
78
+ /**
79
+ * Debounce a function call
80
+ * @param fn Function to debounce
81
+ */
82
+ private _debounce;
83
+ /**
84
+ * Handle input text changes with debouncing
85
+ */
86
+ private _onInputChange;
75
87
  /**
76
- * Keyboard navigation for the autocomplete.
77
- * – When the dropdown is closed, ArrowDown (or Enter/Space) opens it.
78
- * – When open, ArrowDown/ArrowUp move focus between options (which must have role="option").
79
- * – Enter or Space selects the active option.
80
- * – Escape (or Tab) hides the dropdown.
81
- * - Home/End to navigate to first/last option
88
+ * Show the dropdown with filtered options
82
89
  */
83
- private handleKeyDown;
90
+ private _showDropdown;
84
91
  /**
85
- * Helper to focus an option by index and update the combobox's aria-activedescendant.
92
+ * Announce message to screen readers
86
93
  */
87
- private focusOption;
94
+ private _announceToScreenReader;
95
+ /**
96
+ * Select an option (either via click or keyboard)
97
+ */
98
+ private _selectOption;
99
+ /**
100
+ * Handle keyboard navigation
101
+ */
102
+ private _onKeyDown;
103
+ /**
104
+ * Get the currently focused option
105
+ */
106
+ private _getFocusedOption;
107
+ /**
108
+ * Move focus to next/previous option
109
+ */
110
+ private _moveFocus;
111
+ /**
112
+ * Focus the first visible option
113
+ */
114
+ private _focusFirstOption;
115
+ /**
116
+ * Focus the last visible option
117
+ */
118
+ private _focusLastOption;
119
+ /**
120
+ * Fire change event
121
+ */
122
+ private _fireChangeEvent;
123
+ /**
124
+ * Check validity for form integration
125
+ */
126
+ checkValidity(): boolean;
127
+ /**
128
+ * Report validity for form integration
129
+ */
130
+ reportValidity(): boolean;
88
131
  render(): import("lit-html").TemplateResult<1>;
89
132
  }
90
133
  declare global {
@@ -3,7 +3,6 @@ import '@material/web/chips/filter-chip.js';
3
3
  import { LitElement } from 'lit';
4
4
  declare const SchmancyChip_base: CustomElementConstructor & import("@mixins/index").Constructor<LitElement> & import("@mixins/index").Constructor<import("@mixins/index").IBaseMixin>;
5
5
  export default class SchmancyChip extends SchmancyChip_base {
6
- label: string;
7
6
  value: string;
8
7
  selected: boolean;
9
8
  icon: string;
@@ -1,59 +0,0 @@
1
- "use strict";const C=require("@floating-ui/dom"),O=require("rxjs");require("lit/directives/class-map.js"),require("lit/directives/style-map.js");const A=require("./litElement.mixin-CfkMd-bR.cjs");require("./tailwind.mixin-CjSVtdHt.cjs");const E=require("./ripple-C2BHbhcS.cjs"),D=require("./theme.interface-Xg5Zi46a.cjs"),$=require("lit"),p=require("lit/decorators.js"),x=require("lit/directives/ref.js"),b=require("rxjs/operators");function I(t,e){if(!t||!e)return 0;if(t===e)return 1;const i=t.toLowerCase().trim(),s=e.toLowerCase().trim();if(i===s)return 1;const r=s.includes(i)?1:0,o=function(u,d){let l=0,n=0;for(;l<u.length&&n<d.length;)u[l]===d[n]&&l++,n++;return l===u.length}(i,s)?.8:0,a=function(u,d){const l=m=>m.split("").reduce((v,g)=>(v[g]=(v[g]||0)+1,v),{}),n=l(u),y=l(d);return Object.keys(n).every(m=>(y[m]||0)>=n[m])}(i,s)?.7:0,w=function(u,d){if(u.length<2||d.length<2)return 0;const l=k(u),n=k(d);let y=0;const m=new Array(n.length).fill(!1);for(const v of l)for(let g=0;g<n.length;g++)if(!m[g]&&n[g]===v){y++,m[g]=!0;break}return 2*y/(l.length+n.length)}(i,s),f=Math.max(i.length,s.length),S=function(u,d){if(u.length===0)return d.length;if(d.length===0)return u.length;const l=[];for(let n=0;n<=d.length;n++)l[n]=[n];for(let n=0;n<=u.length;n++)l[0][n]=n;for(let n=1;n<=d.length;n++)for(let y=1;y<=u.length;y++){const m=u[y-1]===d[n-1]?0:1;l[n][y]=Math.min(l[n-1][y]+1,l[n][y-1]+1,l[n-1][y-1]+m)}return l[d.length][u.length]}(i,s),q=f?1-S/f:0;return Math.max(r,o,a,w,q)}function k(t){const e=[];for(let i=0;i<t.length-1;i++)e.push(t.substring(i,i+2));return e}var V=Object.defineProperty,M=Object.getOwnPropertyDescriptor,c=(t,e,i,s)=>{for(var r,o=s>1?void 0:s?M(e,i):e,a=t.length-1;a>=0;a--)(r=t[a])&&(o=(s?r(e,i,o):r(o))||o);return s&&o&&V(e,i,o),o};let h=class extends A.$LitElement(":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}"){constructor(){super(...arguments),this.required=!1,this.placeholder="",this.value="",this.label="",this.maxHeight="25vh",this.multi=!1,this.description="",this.inputRef=x.createRef(),this.size="md",this.searchTerm$=new O.Subject,this.isOpen=!1,this.autocomplete="on",this.startY=0,this.statusMessage="",this.handleKeyDown=t=>{const e=this.options.filter(s=>!s.hidden);if(!this.isOpen)return void(["Enter","ArrowDown"].includes(t.key)&&(t.preventDefault(),this.showOptions().then(()=>{e.length>0&&this.focusOption(e,0)})));let i=e.findIndex(s=>s.matches(":focus"));switch(i===-1&&(i=0),t.key){case"Escape":t.preventDefault(),this.hideOptions(),this.input.focus();break;case"ArrowDown":t.preventDefault(),this.focusOption(e,Math.min(i+1,e.length-1));break;case"ArrowUp":t.preventDefault(),this.focusOption(e,Math.max(i-1,0));break;case"Home":t.preventDefault(),this.focusOption(e,0);break;case"End":t.preventDefault(),this.focusOption(e,e.length-1);break;case"Enter":if(t.preventDefault(),e[i]){const s=e[i].getAttribute("data-value")||e[i].getAttribute("value");s&&this.handleOptionClick(s)}break;case"Tab":this.hideOptions();break;default:if(t.key.length===1&&/[a-zA-Z0-9]/.test(t.key)){const s=t.key.toLowerCase(),r=e.findIndex(o=>(o.label||o.textContent||"").toLowerCase().startsWith(s));r!==-1&&(t.preventDefault(),this.focusOption(e,r))}}}}connectedCallback(){super.connectedCallback(),this.id||(this.id=`schmancy-autocomplete-${Math.random().toString(36).substr(2,9)}`),O.fromEvent(this,"keydown").pipe(b.takeUntil(this.disconnecting)).subscribe({next:t=>{this.handleKeyDown(t)}}),this.searchTerm$.pipe(b.distinctUntilChanged(),b.tap(t=>{var r;const e=t.trim().toLowerCase(),i=this.options.map(o=>{const a=(o.label||o.textContent||"").toLowerCase();return{option:o,score:I(e,a)}}).filter(({score:o})=>o>.8).sort((o,a)=>o.score-a.score);this.options.forEach(o=>o.hidden=!0);for(const{option:o}of i)o.hidden=!1;this.empty.hidden=i.length>0,this.statusMessage=i.length>0?`${i.length} option${i.length===1?"":"s"} available.`:"No results found.";const s=(r=this.shadowRoot)==null?void 0:r.querySelector("#live-status");s&&(s.textContent=this.statusMessage),this.setupOptionsAccessibility(),this.requestUpdate()}),b.takeUntil(this.disconnecting)).subscribe(()=>{this.showOptions()}),O.fromEvent(this,"focusout").pipe(b.takeUntil(this.disconnecting),b.filter(t=>{const e=t.relatedTarget;return!this.contains(e)&&(e==null?void 0:e.tagName)!=="SCHMANCY-OPTION"}),b.switchMap(()=>{this.options.forEach(e=>e.hidden=!1);const t=this.optionsContainer.animate([{opacity:1},{opacity:0}],{duration:150,easing:"cubic-bezier(0.5, 0.01, 0.25, 1)"});return O.from(new Promise(e=>{t.onfinish=()=>{this.optionsContainer.style.display="none",this.optionsContainer.style.opacity="1",this.isOpen=!1,e()}}))})).subscribe({next:()=>{var t;if(this.multi){const e=this.options.filter(i=>i.selected).map(i=>i.label);this.input.value=e.join(", ")}else this.input.value=((t=this.options.find(e=>e.value===this.value))==null?void 0:t.label)??""}})}firstUpdated(){this.updateInputValue()}updated(t){super.updated(t),t.has("value")&&(this.syncSelectionFromValue(),this.updateInputValue())}handleSlotChange(){this.empty.hidden=this.options.some(t=>!t.hidden),this.syncSelectionFromValue(),this.updateInputValue(),this.setupOptionsAccessibility()}setupOptionsAccessibility(){this.options.forEach((t,e)=>{t.setAttribute("role","option"),t.id||(t.id=`${this.id}-option-${e}`),t.tabIndex=-1,t.setAttribute("aria-selected",String(this.multi?t.selected:t.value===this.value))})}syncSelectionFromValue(){if(this.multi){const t=this.value.split(",").map(e=>e.trim()).filter(Boolean);this.options.forEach(e=>{e.selected=t.includes(e.value)})}else this.options.forEach(t=>{t.selected=t.value===this.value})}updateInputValue(){requestAnimationFrame(()=>{var t;if(this.multi){const e=this.options.filter(i=>i.selected).map(i=>i.label);this.input.value=e.join(", ")}else{const e=(t=this.options.find(i=>i.value===this.value))==null?void 0:t.label;this.input.value=e??""}})}async showOptions(){if(!this.optionsContainer)return;this.optionsContainer.removeAttribute("hidden"),this.optionsContainer.style.display="block",this.isOpen=!0;const{x:t,y:e}=await C.computePosition(this.input,this.optionsContainer,{placement:"bottom-start",middleware:[C.offset(5),C.shift({padding:5}),C.size({apply({availableWidth:i,availableHeight:s,elements:r,rects:o}){const a=o.reference.width;r.floating.style.minWidth=`${a}px`,r.floating.style.maxWidth=`${i}px`,r.floating.style.maxHeight=`${s}px`}})]});Object.assign(this.optionsContainer.style,{left:`${t}px`,top:`${e}px`,position:"absolute",zIndex:"9999",overflowY:"auto"})}hideOptions(){var e,i;(e=this.optionsContainer)==null||e.setAttribute("hidden","true"),this.optionsContainer&&(this.optionsContainer.style.display="none"),this.isOpen=!1;const t=(i=this.shadowRoot)==null?void 0:i.querySelector("#live-status");t&&(t.textContent="Dropdown closed.")}handleInputChange(t){t.preventDefault(),t.stopPropagation();const e=t.detail.value;this.searchTerm$.next(e)}handleOptionClick(t){var e,i;if(this.multi){const s=this.options.find(f=>f.value===t);s&&(s.selected=!s.selected);const r=this.options.filter(f=>f.selected).map(f=>f.value);this.value=r.join(","),this.updateInputValue();const o=this.options.filter(f=>f.selected).map(f=>f.label),a=o.length>0?`Selected: ${o.join(", ")}`:"No options selected",w=(e=this.shadowRoot)==null?void 0:e.querySelector("#live-status");w&&(w.textContent=a),this.dispatchEvent(new CustomEvent("change",{detail:{value:r},bubbles:!0,composed:!0}))}else{const s=this.options.find(a=>a.value===t),r=(s==null?void 0:s.label)||"";this.hideOptions(),this.value=t,this.updateInputValue();const o=(i=this.shadowRoot)==null?void 0:i.querySelector("#live-status");o&&(o.textContent=`Selected: ${r}`),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0,composed:!0}))}}checkValidity(){return this.multi?this.options.some(t=>t.selected):!!this.value}reportValidity(){var t;return(t=this.inputRef.value)==null?void 0:t.reportValidity()}handleTouchStart(t){var e,i;this.startY=((i=(e=t.touches)==null?void 0:e[0])==null?void 0:i.clientY)??0}preventScroll(t){var o,a;const e=t.target;if(!this.optionsContainer.contains(e))return;const i=this.optionsContainer.scrollTop,s=this.optionsContainer.scrollHeight-this.optionsContainer.offsetHeight,r=((a=(o=t.touches)==null?void 0:o[0])==null?void 0:a.clientY)??0;(i<=0&&r>this.startY||i>=s&&r<this.startY)&&t.preventDefault()}focusOption(t,e){if(!t.length)return;const i=t[e];i&&(i.focus(),this.input.setAttribute("aria-activedescendant",i.id),i.scrollIntoView&&i.scrollIntoView({block:"nearest"}))}render(){const t=`${this.id}-desc`;return $.html`
2
- <div class="relative">
3
- <!-- Live region for screen reader announcements -->
4
- <div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
5
-
6
- <!-- Optional description for the autocomplete -->
7
- ${this.description?$.html`<div id="${t}" class="sr-only">${this.description}</div>`:""}
8
-
9
- <!-- The trigger slot (if any) overrides the default SchmancyInput -->
10
- <slot name="trigger">
11
- <sch-input
12
- .size=${this.size}
13
- .autocomplete=${this.autocomplete}
14
- ${x.ref(this.inputRef)}
15
- id="input"
16
- class="w-full"
17
- .label=${this.label}
18
- .placeholder=${this.placeholder}
19
- .required=${this.required}
20
- type="search"
21
- inputmode="text"
22
- autocomplete="off"
23
- clickable
24
- role="combobox"
25
- aria-autocomplete="list"
26
- aria-haspopup="listbox"
27
- aria-controls="options"
28
- aria-expanded=${this.isOpen}
29
- aria-describedby=${this.description?t:void 0}
30
- @focus=${()=>this.showOptions()}
31
- @change=${this.handleInputChange}
32
- >
33
- </sch-input>
34
- </slot>
35
-
36
- <ul
37
- id="options"
38
- tabindex="-1"
39
- class="absolute z-30 mt-1 w-full overflow-auto rounded-md shadow-sm"
40
- role="listbox"
41
- aria-multiselectable=${this.multi?"true":"false"}
42
- aria-label=${`${this.label||"Options"} dropdown`}
43
- hidden
44
- @click=${e=>{var s;const i=(s=e.detail)==null?void 0:s.value;i&&this.handleOptionClick(i)}}
45
- @touchstart=${this.handleTouchStart}
46
- @touchmove=${this.preventScroll}
47
- ${E.color({bgColor:D.SchmancyTheme.sys.color.surface.container})}
48
- @slotchange=${this.handleSlotChange}
49
- >
50
- <!-- "No results" option -->
51
- <li id="empty" tabindex="-1" role="option" aria-disabled="true" class="p-2 text-center">
52
- <schmancy-typography type="label">No results found</schmancy-typography>
53
- </li>
54
- <!-- Slot for the <schmancy-option> elements -->
55
- <slot></slot>
56
- </ul>
57
- </div>
58
- `}};c([p.property({type:Boolean})],h.prototype,"required",2),c([p.property({type:String})],h.prototype,"placeholder",2),c([p.property({type:String,reflect:!0})],h.prototype,"value",2),c([p.property({type:String,reflect:!0})],h.prototype,"label",2),c([p.property({type:String})],h.prototype,"maxHeight",2),c([p.property({type:Boolean})],h.prototype,"multi",2),c([p.property({type:String})],h.prototype,"description",2),c([p.query("#options")],h.prototype,"optionsContainer",2),c([p.query("#empty")],h.prototype,"empty",2),c([p.query("sch-input")],h.prototype,"input",2),c([p.queryAssignedElements({flatten:!0})],h.prototype,"options",2),c([p.property({type:String,reflect:!0})],h.prototype,"size",2),c([p.property({type:Boolean,reflect:!0})],h.prototype,"isOpen",2),c([p.property({type:String,reflect:!0})],h.prototype,"autocomplete",2),c([p.eventOptions({passive:!0})],h.prototype,"handleOptionClick",1),h=c([p.customElement("schmancy-autocomplete")],h);
59
- //# sourceMappingURL=autocomplete-ChDCoDb2.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"autocomplete-ChDCoDb2.cjs","sources":["../src/utils/search.ts","../src/autocomplete/autocomplete.ts"],"sourcesContent":["/**\n * Calculate similarity score between two strings.\n * Returns a value between 0 (no match) and 1 (exact match).\n * Includes all similarity methods from the original filter directive.\n *\n * @param query The search query string\n * @param target The target string to compare against\n * @returns A similarity score from 0 to 1\n */\nexport function similarity(query: string, target: string): number {\n\t// Handle edge cases\n\tif (!query || !target) return 0\n\tif (query === target) return 1\n\n\t// Normalize strings for comparison\n\tconst normalizedQuery = query.toLowerCase().trim()\n\tconst normalizedTarget = target.toLowerCase().trim()\n\n\t// Simple exact match check\n\tif (normalizedQuery === normalizedTarget) return 1\n\n\t// Calculate different similarity metrics using all methods from the original filter\n\n\t// 1. Direct substring match\n\tconst substringScore = normalizedTarget.includes(normalizedQuery) ? 1 : 0\n\n\t// 2. Subsequence check\n\tconst subsequenceScore = isSubsequence(normalizedQuery, normalizedTarget) ? 0.8 : 0\n\n\t// 3. Anagram/character frequency match\n\tconst anagramScore = hasAllCharacters(normalizedQuery, normalizedTarget) ? 0.7 : 0\n\n\t// 4. Dice coefficient based on bigrams\n\tconst diceScore = diceCoefficient(normalizedQuery, normalizedTarget)\n\n\t// 5. Levenshtein distance\n\tconst maxLength = Math.max(normalizedQuery.length, normalizedTarget.length)\n\tconst levenshteinDistance = calculateLevenshtein(normalizedQuery, normalizedTarget)\n\tconst levenshteinScore = maxLength ? 1 - levenshteinDistance / maxLength : 0\n\n\t// Return the maximum score from all methods\n\treturn Math.max(substringScore, subsequenceScore, anagramScore, diceScore, levenshteinScore)\n}\n\n/**\n * Check if string 'sub' is a subsequence of string 'str'.\n * All characters in 'sub' must appear in order in 'str'.\n */\nfunction isSubsequence(sub: string, str: string): boolean {\n\tlet i = 0,\n\t\tj = 0\n\twhile (i < sub.length && j < str.length) {\n\t\tif (sub[i] === str[j]) i++\n\t\tj++\n\t}\n\treturn i === sub.length\n}\n\n/**\n * Check if all characters in 'query' are present in 'target'.\n * For example, \"aovc\" matches \"avocados\" (anagram subset matching).\n */\nfunction hasAllCharacters(query: string, target: string): boolean {\n\tconst countChars = (s: string): Record<string, number> => {\n\t\treturn s.split('').reduce(\n\t\t\t(acc, char) => {\n\t\t\t\tacc[char] = (acc[char] || 0) + 1\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t)\n\t}\n\n\tconst queryCount = countChars(query)\n\tconst targetCount = countChars(target)\n\n\treturn Object.keys(queryCount).every(char => (targetCount[char] || 0) >= queryCount[char])\n}\n\n/**\n * Generate bigrams for a string.\n * A bigram is a sequence of two adjacent characters.\n */\nfunction getBigrams(s: string): string[] {\n\tconst bigrams = []\n\tfor (let i = 0; i < s.length - 1; i++) {\n\t\tbigrams.push(s.substring(i, i + 2))\n\t}\n\treturn bigrams\n}\n\n/**\n * Compute Dice's coefficient for two strings based on bigrams.\n * Returns a value between 0 (no similarity) and 1 (perfect match).\n */\nfunction diceCoefficient(s1: string, s2: string): number {\n\tif (s1.length < 2 || s2.length < 2) return 0\n\n\tconst bigrams1 = getBigrams(s1)\n\tconst bigrams2 = getBigrams(s2)\n\n\tlet intersection = 0\n\tconst used = new Array(bigrams2.length).fill(false)\n\n\tfor (const bigram of bigrams1) {\n\t\tfor (let i = 0; i < bigrams2.length; i++) {\n\t\t\tif (!used[i] && bigrams2[i] === bigram) {\n\t\t\t\tintersection++\n\t\t\t\tused[i] = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (2 * intersection) / (bigrams1.length + bigrams2.length)\n}\n\n/**\n * Calculate Levenshtein distance between two strings.\n */\nfunction calculateLevenshtein(a: string, b: string): number {\n\tif (a.length === 0) return b.length\n\tif (b.length === 0) return a.length\n\n\tconst matrix: number[][] = []\n\n\t// Initialize the matrix\n\tfor (let i = 0; i <= b.length; i++) {\n\t\tmatrix[i] = [i]\n\t}\n\tfor (let j = 0; j <= a.length; j++) {\n\t\tmatrix[0][j] = j\n\t}\n\n\t// Calculate distances\n\tfor (let i = 1; i <= b.length; i++) {\n\t\tfor (let j = 1; j <= a.length; j++) {\n\t\t\tconst cost = a[j - 1] === b[i - 1] ? 0 : 1\n\t\t\tmatrix[i][j] = Math.min(\n\t\t\t\tmatrix[i - 1][j] + 1, // deletion\n\t\t\t\tmatrix[i][j - 1] + 1, // insertion\n\t\t\t\tmatrix[i - 1][j - 1] + cost, // substitution\n\t\t\t)\n\t\t}\n\t}\n\n\treturn matrix[b.length][a.length]\n}\n","import { computePosition, offset, shift, size } from '@floating-ui/dom'\nimport { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport SchmancyInput from '@schmancy/input/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html } from 'lit'\nimport { customElement, eventOptions, property, query, queryAssignedElements } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { from, fromEvent, Subject } from 'rxjs'\nimport { distinctUntilChanged, filter, switchMap, takeUntil, tap } from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\nimport { InputSize } from '@schmancy/input'\nimport type { SchmancyInputInputEvent } from '@schmancy/input/input'\nimport { similarity } from '@schmancy/utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n\tvalue: string | string[]\n}>\n\n/**\n * The SchmancyAutocomplete component provides an accessible autocomplete field with keyboard navigation.\n * @element schmancy-autocomplete\n * @fires change - Emitted when a selection is made\n * @slot - Default slot for schmancy-option elements\n * @slot trigger - Optional slot to override the default input\n */\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n\t// Public API properties\n\t@property({ type: Boolean }) required = false\n\t@property({ type: String }) placeholder = ''\n\t@property({ type: String, reflect: true }) value = ''\n\t@property({ type: String, reflect: true }) label = ''\n\t@property({ type: String }) maxHeight = '25vh'\n\t@property({ type: Boolean }) multi = false\n\n\t/**\n\t * Optional description for the autocomplete to improve accessibility.\n\t * Will be associated with the input via aria-describedby.\n\t */\n\t@property({ type: String }) description = ''\n\n\t/** Direct reference to the <input> inside <sch-input> */\n\tinputRef = createRef<HTMLInputElement>()\n\n\t// Query selectors for elements in the shadow DOM\n\t@query('#options') private optionsContainer!: HTMLUListElement\n\t@query('#empty') private empty!: HTMLLIElement\n\t@query('sch-input') private input!: SchmancyInput\n\t@queryAssignedElements({ flatten: true }) private options!: SchmancyOption[]\n\n\t/**\n\t * The size of the input.\n\t * - 'sm': Small, compact size\n\t * - 'md': Medium size (default)\n\t * - 'lg': Large size\n\t */\n\t@property({ type: String, reflect: true })\n\tpublic size: InputSize = 'md'\n\n\t// Subject for search term changes\n\tprivate readonly searchTerm$ = new Subject<string>()\n\n\t// Flag to track dropdown state\n\t@property({ type: Boolean, reflect: true }) isOpen = false\n\n\t/** Autocomplete/autofill hints. */\n\t@property({ type: String, reflect: true })\n\tpublic autocomplete: AutoFill = 'on'\n\n\t// iOS scroll-blocking logic\n\tprivate startY = 0\n\n\t// Store status message for screen readers\n\tprivate statusMessage = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the component has an ID (used for generating option IDs)\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-autocomplete-${Math.random().toString(36).substr(2, 9)}`\n\t\t}\n\n\t\t// Listen for keydown events on the input to enable keyboard navigation\n\t\tfromEvent(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tnext: (e: KeyboardEvent) => {\n\t\t\t\t\tthis.handleKeyDown(e)\n\t\t\t\t},\n\t\t\t})\n\n\t\t// Search filtering logic\n\t\tthis.searchTerm$\n\t\t\t.pipe(\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(term => {\n\t\t\t\t\tconst searchTerm = term.trim().toLowerCase()\n\n\t\t\t\t\t// Filter options using Levenshtein distance\n\t\t\t\t\tconst matches = this.options\n\t\t\t\t\t\t.map(option => {\n\t\t\t\t\t\t\tconst optionText = (option.label || option.textContent || '').toLowerCase()\n\t\t\t\t\t\t\tconst score = similarity(searchTerm, optionText)\n\t\t\t\t\t\t\treturn { option, score }\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.filter(({ score }) => {\n\t\t\t\t\t\t\t// For short search terms, be lenient\n\t\t\t\t\t\t\treturn score > 0.8\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => a.score - b.score)\n\n\t\t\t\t\t// Show/hide options based on filtering\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = true))\n\t\t\t\t\tfor (const { option } of matches) {\n\t\t\t\t\t\toption.hidden = false\n\t\t\t\t\t}\n\n\t\t\t\t\t// \"No results found\"\n\t\t\t\t\tthis.empty.hidden = matches.length > 0\n\n\t\t\t\t\t// Update status message for screen readers\n\t\t\t\t\tthis.statusMessage =\n\t\t\t\t\t\tmatches.length > 0\n\t\t\t\t\t\t\t? `${matches.length} option${matches.length === 1 ? '' : 's'} available.`\n\t\t\t\t\t\t\t: 'No results found.'\n\n\t\t\t\t\t// Update the live region to announce the results\n\t\t\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\t\t\tif (liveRegion) {\n\t\t\t\t\t\tliveRegion.textContent = this.statusMessage\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update accessibility attributes on options\n\t\t\t\t\tthis.setupOptionsAccessibility()\n\n\t\t\t\t\tthis.requestUpdate()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\t// Show dropdown on each new search term\n\t\t\t\tthis.showOptions()\n\t\t\t})\n\n\t\t// Focus-out animation (fade out)\n\t\tfromEvent<FocusEvent>(this, 'focusout')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\tfilter(e => {\n\t\t\t\t\t// Don't close if focus moved to an option\n\t\t\t\t\tconst relatedTarget = e.relatedTarget as Element\n\t\t\t\t\treturn !this.contains(relatedTarget) && relatedTarget?.tagName !== 'SCHMANCY-OPTION'\n\t\t\t\t}),\n\t\t\t\tswitchMap(() => {\n\t\t\t\t\t// reset options to show all\n\t\t\t\t\tthis.options.forEach(o => (o.hidden = false))\n\t\t\t\t\tconst animation = this.optionsContainer.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\t\t\tduration: 150,\n\t\t\t\t\t\teasing: 'cubic-bezier(0.5, 0.01, 0.25, 1)',\n\t\t\t\t\t})\n\t\t\t\t\treturn from(\n\t\t\t\t\t\tnew Promise<void>(resolve => {\n\t\t\t\t\t\t\tanimation.onfinish = () => {\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t\t\t\t\t\t\tthis.optionsContainer.style.opacity = '1'\n\t\t\t\t\t\t\t\tthis.isOpen = false\n\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: () => {\n\t\t\t\t\t// After closing, resync the input's value\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.input.value = this.options.find(o => o.value === this.value)?.label ?? ''\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tfirstUpdated() {\n\t\tthis.updateInputValue()\n\t}\n\n\tprotected updated(changedProps: Map<string | number | symbol, unknown>) {\n\t\tsuper.updated(changedProps)\n\t\tif (changedProps.has('value')) {\n\t\t\tthis.syncSelectionFromValue()\n\t\t\tthis.updateInputValue()\n\t\t}\n\t}\n\n\t/**\n\t * When the <slot> changes (i.e. options are added/removed), update the following:\n\t * 1. Show or hide the \"No results found\" option.\n\t * 2. Sync the selection state.\n\t * 3. Setup accessibility attributes on the options.\n\t */\n\tprivate handleSlotChange() {\n\t\tthis.empty.hidden = this.options.some(option => !option.hidden)\n\t\tthis.syncSelectionFromValue()\n\t\tthis.updateInputValue()\n\t\tthis.setupOptionsAccessibility()\n\t}\n\n\t/**\n\t * Loops through assigned options and sets accessibility attributes:\n\t * - role=\"option\"\n\t * - A unique ID (if not already set)\n\t * - tabindex=\"-1\"\n\t * - aria-selected (based on whether the option is selected)\n\t */\n\tprivate setupOptionsAccessibility() {\n\t\tthis.options.forEach((option, index) => {\n\t\t\toption.setAttribute('role', 'option')\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t}\n\t\t\toption.tabIndex = -1\n\t\t\toption.setAttribute('aria-selected', String(this.multi ? option.selected : option.value === this.value))\n\t\t})\n\t}\n\n\tprivate syncSelectionFromValue() {\n\t\tif (this.multi) {\n\t\t\tconst values = this.value\n\t\t\t\t.split(',')\n\t\t\t\t.map(v => v.trim())\n\t\t\t\t.filter(Boolean)\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = values.includes(o.value)\n\t\t\t})\n\t\t} else {\n\t\t\tthis.options.forEach(o => {\n\t\t\t\to.selected = o.value === this.value\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate updateInputValue() {\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.multi) {\n\t\t\t\tconst selected = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\t\tthis.input.value = selected.join(', ')\n\t\t\t} else {\n\t\t\t\tconst found = this.options.find(o => o.value === this.value)?.label\n\t\t\t\tthis.input.value = found ?? ''\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * MAIN: Show the dropdown. Uses Floating UI to position and size the options container.\n\t */\n\tprivate async showOptions() {\n\t\tif (!this.optionsContainer) return\n\n\t\tthis.optionsContainer.removeAttribute('hidden')\n\t\tthis.optionsContainer.style.display = 'block'\n\t\tthis.isOpen = true\n\n\t\tconst { x, y } = await computePosition(this.input, this.optionsContainer, {\n\t\t\tplacement: 'bottom-start',\n\t\t\tmiddleware: [\n\t\t\t\toffset(5),\n\t\t\t\tshift({ padding: 5 }),\n\t\t\t\tsize({\n\t\t\t\t\tapply({ availableWidth, availableHeight, elements, rects }) {\n\t\t\t\t\t\t// At least match input width\n\t\t\t\t\t\tconst referenceWidth = rects.reference.width\n\t\t\t\t\t\telements.floating.style.minWidth = `${referenceWidth}px`\n\t\t\t\t\t\t// Cap to available viewport space\n\t\t\t\t\t\telements.floating.style.maxWidth = `${availableWidth}px`\n\t\t\t\t\t\telements.floating.style.maxHeight = `${availableHeight}px`\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t})\n\n\t\tObject.assign(this.optionsContainer.style, {\n\t\t\tleft: `${x}px`,\n\t\t\ttop: `${y}px`,\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '9999',\n\t\t\toverflowY: 'auto',\n\t\t})\n\t}\n\n\tprivate hideOptions() {\n\t\tthis.optionsContainer?.setAttribute('hidden', 'true')\n\t\tif (this.optionsContainer) {\n\t\t\tthis.optionsContainer.style.display = 'none'\n\t\t}\n\t\tthis.isOpen = false\n\n\t\t// Announce that the dropdown is closed to screen readers\n\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\tif (liveRegion) {\n\t\t\tliveRegion.textContent = 'Dropdown closed.'\n\t\t}\n\t}\n\n\tprivate handleInputChange(event: SchmancyInputInputEvent) {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tconst term = event.detail.value\n\t\tthis.searchTerm$.next(term)\n\t}\n\n\t@eventOptions({ passive: true })\n\tprivate handleOptionClick(value: string) {\n\t\tif (this.multi) {\n\t\t\tconst option = this.options.find(o => o.value === value)\n\t\t\tif (option) option.selected = !option.selected\n\t\t\tconst selectedValues = this.options.filter(o => o.selected).map(o => o.value)\n\t\t\tthis.value = selectedValues.join(',')\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst selectedLabels = this.options.filter(o => o.selected).map(o => o.label)\n\t\t\tconst announcement = selectedLabels.length > 0 ? `Selected: ${selectedLabels.join(', ')}` : 'No options selected'\n\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = announcement\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value: selectedValues },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t} else {\n\t\t\tconst selectedOption = this.options.find(o => o.value === value)\n\t\t\tconst selectedLabel = selectedOption?.label || ''\n\n\t\t\tthis.hideOptions()\n\t\t\tthis.value = value\n\t\t\tthis.updateInputValue()\n\n\t\t\t// Announce selection to screen readers\n\t\t\tconst liveRegion = this.shadowRoot?.querySelector('#live-status')\n\t\t\tif (liveRegion) {\n\t\t\t\tliveRegion.textContent = `Selected: ${selectedLabel}`\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n\t\t\t\t\tdetail: { value },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\tpublic checkValidity() {\n\t\treturn this.multi ? this.options.some(o => o.selected) : Boolean(this.value)\n\t}\n\n\tpublic reportValidity() {\n\t\treturn this.inputRef.value?.reportValidity()\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent) {\n\t\tthis.startY = event.touches?.[0]?.clientY ?? 0\n\t}\n\n\tprivate preventScroll(event: TouchEvent) {\n\t\tconst target = event.target as HTMLElement\n\t\tif (!this.optionsContainer.contains(target)) return\n\n\t\tconst scrollTop = this.optionsContainer.scrollTop\n\t\tconst scrollHeight = this.optionsContainer.scrollHeight\n\t\tconst offsetHeight = this.optionsContainer.offsetHeight\n\t\tconst contentHeight = scrollHeight - offsetHeight\n\n\t\tconst currentY = event.touches?.[0]?.clientY ?? 0\n\t\tif ((scrollTop <= 0 && currentY > this.startY) || (scrollTop >= contentHeight && currentY < this.startY)) {\n\t\t\tevent.preventDefault()\n\t\t}\n\t}\n\n\t/**\n\t * Keyboard navigation for the autocomplete.\n\t * – When the dropdown is closed, ArrowDown (or Enter/Space) opens it.\n\t * – When open, ArrowDown/ArrowUp move focus between options (which must have role=\"option\").\n\t * – Enter or Space selects the active option.\n\t * – Escape (or Tab) hides the dropdown.\n\t * - Home/End to navigate to first/last option\n\t */\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\t// Get the visible options (i.e. those not hidden)\n\t\tconst options = this.options.filter(o => !o.hidden)\n\n\t\t// If the dropdown is closed, open it on Enter, Space, or ArrowDown\n\t\tif (!this.isOpen) {\n\t\t\tif (['Enter', 'ArrowDown'].includes(e.key)) {\n\t\t\t\t// Removed ' ' (space) here\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.showOptions().then(() => {\n\t\t\t\t\tif (options.length > 0) {\n\t\t\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Dropdown is open; determine the currently focused option\n\t\tlet currentIndex = options.findIndex(o => o.matches(':focus'))\n\t\tif (currentIndex === -1) {\n\t\t\t// If no option is focused, default to the first\n\t\t\tcurrentIndex = 0\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.hideOptions()\n\t\t\t\tthis.input.focus()\n\t\t\t\tbreak\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.min(currentIndex + 1, options.length - 1))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.max(currentIndex - 1, 0))\n\t\t\t\tbreak\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\tbreak\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, options.length - 1)\n\t\t\t\tbreak\n\t\t\tcase 'Enter': // Removed ' ' (space) case here\n\t\t\t\te.preventDefault()\n\t\t\t\tif (options[currentIndex]) {\n\t\t\t\t\tconst value = options[currentIndex].getAttribute('data-value') || options[currentIndex].getAttribute('value')\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tthis.handleOptionClick(value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Tab':\n\t\t\t\t// Close the dropdown on Tab\n\t\t\t\tthis.hideOptions()\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\t// For letter key presses, find and focus the first option that starts with that letter\n\t\t\t\tif (e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n\t\t\t\t\tconst searchKey = e.key.toLowerCase()\n\t\t\t\t\tconst matchIndex = options.findIndex(option =>\n\t\t\t\t\t\t(option.label || option.textContent || '').toLowerCase().startsWith(searchKey),\n\t\t\t\t\t)\n\n\t\t\t\t\tif (matchIndex !== -1) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\tthis.focusOption(options, matchIndex)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Helper to focus an option by index and update the combobox's aria-activedescendant.\n\t */\n\tprivate focusOption(options: HTMLElement[], index: number) {\n\t\tif (!options.length) return\n\n\t\tconst option = options[index]\n\t\tif (option) {\n\t\t\toption.focus()\n\t\t\t// Update the input's aria-activedescendant to match the newly focused option\n\t\t\tthis.input.setAttribute('aria-activedescendant', option.id)\n\n\t\t\t// Ensure the focused option is visible in the dropdown (scroll if needed)\n\t\t\tif (option.scrollIntoView) {\n\t\t\t\toption.scrollIntoView({ block: 'nearest' })\n\t\t\t}\n\t\t}\n\t}\n\n\trender() {\n\t\t// Create a unique ID for the description\n\t\tconst descriptionId = `${this.id}-desc`\n\n\t\treturn html`\n\t\t\t<div class=\"relative\">\n\t\t\t\t<!-- Live region for screen reader announcements -->\n\t\t\t\t<div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n\t\t\t\t<!-- Optional description for the autocomplete -->\n\t\t\t\t${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n\t\t\t\t<!-- The trigger slot (if any) overrides the default SchmancyInput -->\n\t\t\t\t<slot name=\"trigger\">\n\t\t\t\t\t<sch-input\n\t\t\t\t\t\t.size=${this.size}\n\t\t\t\t\t\t.autocomplete=${this.autocomplete}\n\t\t\t\t\t\t${ref(this.inputRef)}\n\t\t\t\t\t\tid=\"input\"\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t.label=${this.label}\n\t\t\t\t\t\t.placeholder=${this.placeholder}\n\t\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tinputmode=\"text\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tclickable\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\taria-controls=\"options\"\n\t\t\t\t\t\taria-expanded=${this.isOpen}\n\t\t\t\t\t\taria-describedby=${this.description ? descriptionId : undefined}\n\t\t\t\t\t\t@focus=${() => this.showOptions()}\n\t\t\t\t\t\t@change=${this.handleInputChange}\n\t\t\t\t\t>\n\t\t\t\t\t</sch-input>\n\t\t\t\t</slot>\n\n\t\t\t\t<ul\n\t\t\t\t\tid=\"options\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\tclass=\"absolute z-30 mt-1 w-full overflow-auto rounded-md shadow-sm\"\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${this.multi ? 'true' : 'false'}\n\t\t\t\t\taria-label=${`${this.label || 'Options'} dropdown`}\n\t\t\t\t\thidden\n\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t// Each <schmancy-option> should dispatch a CustomEvent('click', { detail: { value } })\n\t\t\t\t\t\tconst detailVal = (e as CustomEvent).detail?.value\n\t\t\t\t\t\tif (detailVal) this.handleOptionClick(detailVal)\n\t\t\t\t\t}}\n\t\t\t\t\t@touchstart=${this.handleTouchStart}\n\t\t\t\t\t@touchmove=${this.preventScroll}\n\t\t\t\t\t${color({ bgColor: SchmancyTheme.sys.color.surface.container })}\n\t\t\t\t\t@slotchange=${this.handleSlotChange}\n\t\t\t\t>\n\t\t\t\t\t<!-- \"No results\" option -->\n\t\t\t\t\t<li id=\"empty\" tabindex=\"-1\" role=\"option\" aria-disabled=\"true\" class=\"p-2 text-center\">\n\t\t\t\t\t\t<schmancy-typography type=\"label\">No results found</schmancy-typography>\n\t\t\t\t\t</li>\n\t\t\t\t\t<!-- Slot for the <schmancy-option> elements -->\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-autocomplete': SchmancyAutocomplete\n\t}\n}\n"],"names":["similarity","query","target","normalizedQuery","toLowerCase","trim","normalizedTarget","substringScore","includes","subsequenceScore","sub","str","i","j","length","anagramScore","countChars","s","split","reduce","acc","char","queryCount","targetCount","Object","keys","every","diceScore","s1","s2","bigrams1","getBigrams","bigrams2","intersection","used","Array","fill","bigram","maxLength","Math","max","levenshteinDistance","a","b","matrix","cost","min","levenshteinScore","bigrams","push","substring","SchmancyAutocomplete","$LitElement","super","arguments","this","required","placeholder","value","label","maxHeight","multi","description","inputRef","createRef","size","searchTerm$","Subject","isOpen","autocomplete","startY","statusMessage","handleKeyDown","e","options","filter","o","hidden","key","preventDefault","showOptions","then","focusOption","currentIndex","findIndex","matches","hideOptions","input","focus","getAttribute","handleOptionClick","test","searchKey","matchIndex","option","textContent","startsWith","connectedCallback","id","random","toString","substr","fromEvent","pipe","takeUntil","disconnecting","subscribe","next","distinctUntilChanged","tap","term","searchTerm","map","optionText","score","sort","forEach","empty","liveRegion","shadowRoot","querySelector","setupOptionsAccessibility","requestUpdate","relatedTarget","contains","tagName","switchMap","animation","optionsContainer","animate","opacity","duration","easing","from","Promise","resolve","onfinish","style","display","selected","join","find","updateInputValue","changedProps","updated","has","syncSelectionFromValue","handleSlotChange","some","index","setAttribute","tabIndex","String","values","v","Boolean","requestAnimationFrame","found","removeAttribute","x","y","computePosition","placement","middleware","offset","shift","padding","availableWidth","availableHeight","elements","rects","referenceWidth","reference","width","floating","minWidth","maxWidth","assign","left","top","position","zIndex","overflowY","event","stopPropagation","detail","selectedValues","selectedLabels","announcement","dispatchEvent","CustomEvent","bubbles","composed","selectedOption","selectedLabel","reportValidity","touches","clientY","scrollTop","contentHeight","scrollHeight","offsetHeight","currentY","scrollIntoView","block","render","descriptionId","html","ref","handleInputChange","detailVal","handleTouchStart","preventScroll","color","bgColor","SchmancyTheme","sys","surface","container","__decorateClass","property","type","prototype","reflect","queryAssignedElements","flatten","eventOptions","passive","customElement"],"mappings":"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"}