@expressivecss/expressive 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/CHANGELOG.md +1807 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19176 -11958
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-26VUH75M.mjs +102 -0
  64. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2LFCOGC3.mjs +233 -0
  66. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  67. package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-36GELQGX.mjs} +29 -46
  68. package/dist/js/chunks/chunk-36GELQGX.mjs.map +7 -0
  69. package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-3FKWIRHW.mjs} +15 -29
  70. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-3KF65KGL.mjs +209 -0
  72. package/dist/js/chunks/chunk-3KF65KGL.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-3KLZRQZI.mjs} +88 -116
  74. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-3XORNED5.mjs} +3 -11
  76. package/dist/js/chunks/chunk-3XORNED5.mjs.map +7 -0
  77. package/dist/js/chunks/chunk-4WBGAQN3.mjs +113 -0
  78. package/dist/js/chunks/chunk-4WBGAQN3.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-5F4URJHL.mjs} +19 -30
  80. package/dist/js/chunks/chunk-5F4URJHL.mjs.map +7 -0
  81. package/dist/js/chunks/chunk-67UNY7RH.mjs +299 -0
  82. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  83. package/dist/js/chunks/chunk-7CXNATJS.mjs +97 -0
  84. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  85. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-7X44MKEQ.mjs} +43 -48
  86. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  87. package/dist/js/chunks/chunk-7ZAMOMGY.mjs +440 -0
  88. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  89. package/dist/js/chunks/chunk-AEG6LOAJ.mjs +54 -0
  90. package/dist/js/chunks/chunk-AEG6LOAJ.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-AQNFCJJ5.mjs +135 -0
  92. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-B55LWKBM.mjs +75 -0
  94. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-BB5VXYXT.mjs +28 -0
  96. package/dist/js/chunks/chunk-BB5VXYXT.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-BDATLH3H.mjs +108 -0
  98. package/dist/js/chunks/chunk-BDATLH3H.mjs.map +7 -0
  99. package/dist/js/chunks/chunk-CWMQOT4O.mjs +232 -0
  100. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  101. package/dist/js/chunks/chunk-CY2CTOVM.mjs +81 -0
  102. package/dist/js/chunks/chunk-CY2CTOVM.mjs.map +7 -0
  103. package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-DWA5UYLJ.mjs} +363 -218
  104. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  105. package/dist/js/chunks/chunk-EB2V4OKL.mjs +79 -0
  106. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-EWO662ZC.mjs +188 -0
  108. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-F7LAKFMX.mjs} +320 -141
  110. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  111. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-FNIIH2LU.mjs} +20 -33
  112. package/dist/js/chunks/chunk-FNIIH2LU.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  114. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  115. package/dist/js/chunks/chunk-GFWYMWYN.mjs +125 -0
  116. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  117. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  118. package/dist/js/chunks/chunk-H5ISU45X.mjs +87 -0
  119. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  120. package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-H6YIKFAQ.mjs} +311 -186
  121. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  122. package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-HEH7E3KO.mjs} +155 -35
  123. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  124. package/dist/js/chunks/chunk-HQRLBTNM.mjs +152 -0
  125. package/dist/js/chunks/chunk-HQRLBTNM.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-I2F7MLUU.mjs +137 -0
  127. package/dist/js/chunks/chunk-I2F7MLUU.mjs.map +7 -0
  128. package/dist/js/chunks/chunk-IQOTGGHX.mjs +797 -0
  129. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-JH3YWKA6.mjs +225 -0
  131. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  133. package/dist/js/chunks/chunk-JOLJAYIJ.mjs.map +7 -0
  134. package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-KOTGMCMI.mjs} +116 -24
  135. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-LC4O5LFS.mjs} +21 -45
  137. package/dist/js/chunks/chunk-LC4O5LFS.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LEF33SCP.mjs +127 -0
  139. package/dist/js/chunks/chunk-LEF33SCP.mjs.map +7 -0
  140. package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-LFORZRPH.mjs} +21 -23
  141. package/dist/js/chunks/chunk-LFORZRPH.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-LWLNV5EC.mjs +451 -0
  143. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-LXRHUQAX.mjs +491 -0
  145. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  146. package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-MA2SZZFB.mjs} +82 -111
  147. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  148. package/dist/js/chunks/chunk-MDBZAMIV.mjs +121 -0
  149. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-NODZ5VAD.mjs +75 -0
  151. package/dist/js/chunks/chunk-NODZ5VAD.mjs.map +7 -0
  152. package/dist/js/chunks/chunk-O2WJB6TH.mjs +365 -0
  153. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  154. package/dist/js/chunks/chunk-PCABY5BN.mjs +35 -0
  155. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PWKYVMND.mjs +120 -0
  157. package/dist/js/chunks/chunk-PWKYVMND.mjs.map +7 -0
  158. package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-QHZZT7YO.mjs} +66 -38
  159. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  160. package/dist/js/chunks/chunk-QND56EW2.mjs +439 -0
  161. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  162. package/dist/js/chunks/chunk-QNODAANY.mjs +376 -0
  163. package/dist/js/chunks/chunk-QNODAANY.mjs.map +7 -0
  164. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-QRO5FV3I.mjs} +156 -73
  165. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  166. package/dist/js/chunks/chunk-R7A7JRC5.mjs +440 -0
  167. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-RKG2CBFE.mjs +74 -0
  169. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  170. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-RSNS5OYS.mjs} +38 -25
  171. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  172. package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-RUDYMEJ3.mjs} +7 -6
  173. package/dist/js/chunks/chunk-RUDYMEJ3.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-STJR62SU.mjs +161 -0
  175. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-SUSD4UTN.mjs +220 -0
  177. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-SYBOA5HC.mjs} +26 -48
  179. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-T4MOBP3J.mjs +108 -0
  181. package/dist/js/chunks/chunk-T4MOBP3J.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-TM7HPGTV.mjs +342 -0
  183. package/dist/js/chunks/chunk-TM7HPGTV.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-TMQDZSDC.mjs} +71 -35
  185. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  186. package/dist/js/chunks/chunk-TVSX5YA2.mjs +48 -0
  187. package/dist/js/chunks/chunk-TVSX5YA2.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-UHO5CV6K.mjs +80 -0
  189. package/dist/js/chunks/chunk-UHO5CV6K.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-UKCNELUN.mjs +223 -0
  191. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-UKQK5GWR.mjs +167 -0
  193. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  194. package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-UTSLYQ65.mjs} +21 -48
  195. package/dist/js/chunks/chunk-UTSLYQ65.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-VS5OJBOD.mjs +108 -0
  197. package/dist/js/chunks/chunk-VS5OJBOD.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-VZMROW5A.mjs +759 -0
  199. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  201. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  202. package/dist/js/chunks/chunk-XB6Y7P5W.mjs +69 -0
  203. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-XDAMOMVD.mjs +226 -0
  205. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  206. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-XJPMW5SP.mjs} +247 -172
  207. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  208. package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-YKANQILZ.mjs} +16 -21
  209. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-YLZOJLDI.mjs +175 -0
  211. package/dist/js/chunks/chunk-YLZOJLDI.mjs.map +7 -0
  212. package/dist/js/chunks/chunk-ZK7YY322.mjs +514 -0
  213. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  214. package/dist/js/expressive.cjs +10266 -3628
  215. package/dist/js/expressive.cjs.map +4 -4
  216. package/dist/js/expressive.js +10266 -3628
  217. package/dist/js/expressive.js.map +4 -4
  218. package/dist/js/expressive.min.js +23 -22
  219. package/dist/js/expressive.min.js.map +4 -4
  220. package/dist/js/expressive.mjs +181 -69
  221. package/dist/js/expressive.mjs.map +2 -2
  222. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  223. package/dist/js/internal/behaviors/copy.mjs +9 -0
  224. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dataTables.mjs +8 -0
  226. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  227. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  228. package/dist/js/internal/behaviors/forms.mjs +2 -2
  229. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  230. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/lists.mjs +8 -0
  232. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  234. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  235. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  236. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  237. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  238. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/theme.mjs +8 -0
  240. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/tour.mjs +8 -0
  242. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  243. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  244. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  245. package/dist/js/internal/components/appBar.mjs +3 -2
  246. package/dist/js/internal/components/autocomplete.mjs +5 -4
  247. package/dist/js/internal/components/backToTop.mjs +9 -0
  248. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  249. package/dist/js/internal/components/barChart.mjs +5 -4
  250. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  251. package/dist/js/internal/components/buttons.mjs +3 -3
  252. package/dist/js/internal/components/cards.mjs +3 -3
  253. package/dist/js/internal/components/carousel.mjs +3 -3
  254. package/dist/js/internal/components/cascader.mjs +10 -0
  255. package/dist/js/internal/components/cascader.mjs.map +7 -0
  256. package/dist/js/internal/components/characterCounter.mjs +3 -2
  257. package/dist/js/internal/components/chips.mjs +7 -5
  258. package/dist/js/internal/components/colorPicker.mjs +9 -0
  259. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  260. package/dist/js/internal/components/columnChart.mjs +4 -3
  261. package/dist/js/internal/components/commandPalette.mjs +3 -3
  262. package/dist/js/internal/components/confetti.mjs +3 -2
  263. package/dist/js/internal/components/currencyInput.mjs +9 -0
  264. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  265. package/dist/js/internal/components/datepicker.mjs +12 -8
  266. package/dist/js/internal/components/expandingCard.mjs +3 -3
  267. package/dist/js/internal/components/funnelChart.mjs +10 -0
  268. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  269. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  270. package/dist/js/internal/components/hoverCard.mjs +9 -0
  271. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  272. package/dist/js/internal/components/index.mjs +131 -65
  273. package/dist/js/internal/components/inputMask.mjs +9 -0
  274. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  275. package/dist/js/internal/components/keypad.mjs +3 -3
  276. package/dist/js/internal/components/lightbox.mjs +3 -3
  277. package/dist/js/internal/components/lineChart.mjs +41 -4
  278. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  279. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  280. package/dist/js/internal/components/mapView.mjs +3 -3
  281. package/dist/js/internal/components/menu.mjs +3 -3
  282. package/dist/js/internal/components/menubar.mjs +10 -0
  283. package/dist/js/internal/components/menubar.mjs.map +7 -0
  284. package/dist/js/internal/components/messageScroller.mjs +3 -3
  285. package/dist/js/internal/components/mixedChart.mjs +5 -4
  286. package/dist/js/internal/components/navigationRail.mjs +3 -2
  287. package/dist/js/internal/components/particles.mjs +3 -2
  288. package/dist/js/internal/components/pieChart.mjs +4 -3
  289. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  290. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  291. package/dist/js/internal/components/questionnaire.mjs +3 -3
  292. package/dist/js/internal/components/radarChart.mjs +4 -3
  293. package/dist/js/internal/components/radialChart.mjs +4 -3
  294. package/dist/js/internal/components/registry.mjs +60 -41
  295. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  296. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  297. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scatterChart.mjs +10 -0
  299. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  300. package/dist/js/internal/components/scrollspy.mjs +3 -2
  301. package/dist/js/internal/components/select.mjs +5 -4
  302. package/dist/js/internal/components/showMore.mjs +9 -0
  303. package/dist/js/internal/components/showMore.mjs.map +7 -0
  304. package/dist/js/internal/components/slider.mjs +3 -3
  305. package/dist/js/internal/components/snackbar.mjs +2 -2
  306. package/dist/js/internal/components/swipeActions.mjs +9 -0
  307. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  308. package/dist/js/internal/components/tabs.mjs +3 -4
  309. package/dist/js/internal/components/timepicker.mjs +5 -4
  310. package/dist/js/internal/components/tooltip.mjs +3 -3
  311. package/dist/js/internal/components/treeSelect.mjs +14 -0
  312. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  313. package/dist/js/internal/components/treemapChart.mjs +10 -0
  314. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  315. package/dist/js/internal/core/component.mjs +6 -3
  316. package/dist/js/internal/core/formControl.mjs +12 -0
  317. package/dist/js/internal/core/formControl.mjs.map +7 -0
  318. package/dist/js/internal/core/imageURL.mjs +7 -0
  319. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  320. package/dist/js/internal/core/spring.mjs +11 -0
  321. package/dist/js/internal/core/spring.mjs.map +7 -0
  322. package/dist/js/internal/core/utils.mjs +21 -3
  323. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  324. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  325. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  326. package/dist/js/modular.mjs +172 -69
  327. package/dist/types/behaviors/bottomSheets.d.ts +23 -5
  328. package/dist/types/behaviors/copy.d.ts +18 -0
  329. package/dist/types/behaviors/dataTables.d.ts +125 -0
  330. package/dist/types/behaviors/dialogs.d.ts +27 -1
  331. package/dist/types/behaviors/forms.d.ts +70 -4
  332. package/dist/types/behaviors/imageCompare.d.ts +13 -0
  333. package/dist/types/behaviors/lists.d.ts +12 -0
  334. package/dist/types/behaviors/paneResize.d.ts +29 -0
  335. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  336. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  337. package/dist/types/behaviors/sortable.d.ts +28 -0
  338. package/dist/types/behaviors/theme.d.ts +22 -0
  339. package/dist/types/behaviors/tour.d.ts +36 -0
  340. package/dist/types/behaviors/transferList.d.ts +53 -0
  341. package/dist/types/components/appBar.d.ts +5 -6
  342. package/dist/types/components/autocomplete.d.ts +105 -20
  343. package/dist/types/components/backToTop.d.ts +36 -0
  344. package/dist/types/components/barChart.d.ts +3 -6
  345. package/dist/types/components/buttonGroup.d.ts +2 -4
  346. package/dist/types/components/buttons.d.ts +5 -5
  347. package/dist/types/components/cards.d.ts +3 -16
  348. package/dist/types/components/carousel.d.ts +16 -15
  349. package/dist/types/components/cascader.d.ts +130 -0
  350. package/dist/types/components/characterCounter.d.ts +2 -15
  351. package/dist/types/components/chips.d.ts +80 -19
  352. package/dist/types/components/colorPicker.d.ts +56 -0
  353. package/dist/types/components/columnChart.d.ts +23 -10
  354. package/dist/types/components/commandPalette.d.ts +11 -16
  355. package/dist/types/components/confetti.d.ts +2 -4
  356. package/dist/types/components/currencyInput.d.ts +60 -0
  357. package/dist/types/components/datepicker.d.ts +107 -56
  358. package/dist/types/components/expandingCard.d.ts +4 -6
  359. package/dist/types/components/funnelChart.d.ts +35 -0
  360. package/dist/types/components/heatmapChart.d.ts +42 -8
  361. package/dist/types/components/hoverCard.d.ts +59 -0
  362. package/dist/types/components/index.d.ts +16 -1
  363. package/dist/types/components/inputMask.d.ts +28 -0
  364. package/dist/types/components/keypad.d.ts +38 -6
  365. package/dist/types/components/lightbox.d.ts +14 -20
  366. package/dist/types/components/lineChart.d.ts +212 -12
  367. package/dist/types/components/loadingOverlay.d.ts +42 -0
  368. package/dist/types/components/mapView.d.ts +138 -27
  369. package/dist/types/components/menu.d.ts +74 -22
  370. package/dist/types/components/menubar.d.ts +37 -0
  371. package/dist/types/components/messageScroller.d.ts +2 -14
  372. package/dist/types/components/mixedChart.d.ts +15 -6
  373. package/dist/types/components/navigationRail.d.ts +16 -5
  374. package/dist/types/components/particles.d.ts +22 -5
  375. package/dist/types/components/pieChart.d.ts +33 -9
  376. package/dist/types/components/pullToRefresh.d.ts +80 -0
  377. package/dist/types/components/questionnaire.d.ts +58 -16
  378. package/dist/types/components/radarChart.d.ts +10 -6
  379. package/dist/types/components/radialChart.d.ts +58 -7
  380. package/dist/types/components/registry.d.ts +73 -3
  381. package/dist/types/components/richTextEditor.d.ts +45 -22
  382. package/dist/types/components/sankeyChart.d.ts +72 -0
  383. package/dist/types/components/scatterChart.d.ts +102 -0
  384. package/dist/types/components/scrollspy.d.ts +3 -5
  385. package/dist/types/components/select.d.ts +44 -33
  386. package/dist/types/components/showMore.d.ts +53 -0
  387. package/dist/types/components/slider.d.ts +2 -15
  388. package/dist/types/components/snackbar.d.ts +68 -1
  389. package/dist/types/components/swipeActions.d.ts +81 -0
  390. package/dist/types/components/tabs.d.ts +92 -30
  391. package/dist/types/components/timepicker.d.ts +128 -27
  392. package/dist/types/components/tooltip.d.ts +57 -21
  393. package/dist/types/components/treeSelect.d.ts +106 -0
  394. package/dist/types/components/treemapChart.d.ts +56 -0
  395. package/dist/types/core/component.d.ts +49 -25
  396. package/dist/types/core/formControl.d.ts +21 -0
  397. package/dist/types/core/imageURL.d.ts +2 -0
  398. package/dist/types/core/spring.d.ts +20 -0
  399. package/dist/types/core/utils.d.ts +123 -72
  400. package/dist/types/modular.d.ts +33 -1
  401. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  402. package/dist/types/plugins/modalDisplayPlugin.d.ts +39 -0
  403. package/package.json +17 -13
  404. package/src/sass/README.md +27 -18
  405. package/src/sass/abstracts/_elevation.scss +13 -7
  406. package/src/sass/abstracts/_index.scss +1 -0
  407. package/src/sass/abstracts/_mixins.scss +864 -78
  408. package/src/sass/abstracts/_spring.scss +63 -0
  409. package/src/sass/abstracts/_variables.scss +64 -21
  410. package/src/sass/base/_fonts.scss +61 -48
  411. package/src/sass/base/_global.scss +104 -24
  412. package/src/sass/base/_index.scss +2 -0
  413. package/src/sass/base/_normalize.scss +59 -114
  414. package/src/sass/base/_print.scss +21 -0
  415. package/src/sass/base/_prose.scss +68 -0
  416. package/src/sass/base/_typography.scss +9 -5
  417. package/src/sass/components/_accordion.scss +10 -19
  418. package/src/sass/components/_alert.scss +102 -0
  419. package/src/sass/components/_aura.scss +9 -3
  420. package/src/sass/components/_avatar.scss +3 -3
  421. package/src/sass/components/_back-to-top.scss +38 -0
  422. package/src/sass/components/_badges.scss +6 -5
  423. package/src/sass/components/_bar-chart.scss +31 -90
  424. package/src/sass/components/_bottom-sheet.scss +51 -16
  425. package/src/sass/components/_breadcrumb.scss +8 -7
  426. package/src/sass/components/_button-groups.scss +30 -63
  427. package/src/sass/components/_buttons.scss +137 -94
  428. package/src/sass/components/_calendar.scss +244 -0
  429. package/src/sass/components/_cards.scss +36 -44
  430. package/src/sass/components/_carousel.scss +37 -113
  431. package/src/sass/components/_cascader.scss +131 -0
  432. package/src/sass/components/_chips.scss +36 -46
  433. package/src/sass/components/_column-chart.scss +15 -26
  434. package/src/sass/components/_command-palette.scss +4 -7
  435. package/src/sass/components/_confetti.scss +1 -4
  436. package/src/sass/components/_countdown.scss +1 -1
  437. package/src/sass/components/_data-table.scss +172 -25
  438. package/src/sass/components/_datepicker.scss +54 -40
  439. package/src/sass/components/_description-list.scss +85 -0
  440. package/src/sass/components/_dialog.scss +48 -55
  441. package/src/sass/components/_docked-display.scss +1 -3
  442. package/src/sass/components/_drag-handle.scss +16 -20
  443. package/src/sass/components/_expanding-card.scss +21 -14
  444. package/src/sass/components/_fab-menu.scss +43 -39
  445. package/src/sass/components/_funnel-chart.scss +63 -0
  446. package/src/sass/components/_heatmap-chart.scss +114 -29
  447. package/src/sass/components/_icon-buttons.scss +8 -11
  448. package/src/sass/components/_icons-material-design.scss +2 -2
  449. package/src/sass/components/_image-compare.scss +108 -0
  450. package/src/sass/components/_index.scss +20 -0
  451. package/src/sass/components/_keypad.scss +39 -19
  452. package/src/sass/components/_kpi.scss +6 -11
  453. package/src/sass/components/_lightbox.scss +24 -13
  454. package/src/sass/components/_line-chart.scss +9 -63
  455. package/src/sass/components/_list.scss +59 -14
  456. package/src/sass/components/_loading-indicator.scss +1 -0
  457. package/src/sass/components/_loading-overlay.scss +105 -0
  458. package/src/sass/components/_map.scss +37 -11
  459. package/src/sass/components/_marquee.scss +4 -3
  460. package/src/sass/components/_mega-menu.scss +128 -0
  461. package/src/sass/components/_menu.scss +146 -127
  462. package/src/sass/components/_menubar.scss +47 -0
  463. package/src/sass/components/_message-scroller.scss +2 -2
  464. package/src/sass/components/_message.scss +3 -3
  465. package/src/sass/components/_mixed-chart.scss +27 -35
  466. package/src/sass/components/_modal-display.scss +21 -0
  467. package/src/sass/components/_navbar.scss +45 -36
  468. package/src/sass/components/_navigation-bar.scss +12 -77
  469. package/src/sass/components/_navigation-rail.scss +161 -92
  470. package/src/sass/components/_org-chart.scss +192 -0
  471. package/src/sass/components/_page-footer.scss +2 -4
  472. package/src/sass/components/_pagination.scss +9 -27
  473. package/src/sass/components/_panes.scss +35 -42
  474. package/src/sass/components/_particles.scss +1 -4
  475. package/src/sass/components/_pie-chart.scss +86 -68
  476. package/src/sass/components/_popover.scss +18 -5
  477. package/src/sass/components/_progress.scss +183 -44
  478. package/src/sass/components/_pull-to-refresh.scss +90 -0
  479. package/src/sass/components/_questionnaire.scss +74 -3
  480. package/src/sass/components/_radar-chart.scss +40 -42
  481. package/src/sass/components/_radial-chart.scss +108 -46
  482. package/src/sass/components/_rich-text-editor.scss +2 -2
  483. package/src/sass/components/_sankey-chart.scss +91 -0
  484. package/src/sass/components/_scatter-chart.scss +144 -0
  485. package/src/sass/components/_scrim.scss +0 -2
  486. package/src/sass/components/_scrollspy.scss +0 -2
  487. package/src/sass/components/_search.scss +27 -26
  488. package/src/sass/components/_show-more.scss +8 -0
  489. package/src/sass/components/_side-sheet.scss +32 -51
  490. package/src/sass/components/_skeleton.scss +26 -19
  491. package/src/sass/components/_snackbar.scss +25 -21
  492. package/src/sass/components/_split-button.scss +5 -5
  493. package/src/sass/components/_stat.scss +3 -8
  494. package/src/sass/components/_stepper.scss +1 -1
  495. package/src/sass/components/_swipe-actions.scss +71 -0
  496. package/src/sass/components/_table_of_contents.scss +1 -3
  497. package/src/sass/components/_tabs.scss +49 -46
  498. package/src/sass/components/_timeline.scss +12 -12
  499. package/src/sass/components/_timepicker.scss +111 -79
  500. package/src/sass/components/_toolbar.scss +36 -47
  501. package/src/sass/components/_tooltip.scss +25 -12
  502. package/src/sass/components/_tour.scss +89 -0
  503. package/src/sass/components/_transfer-list.scss +73 -0
  504. package/src/sass/components/_transitions.scss +4 -4
  505. package/src/sass/components/_tree.scss +7 -32
  506. package/src/sass/components/_treemap-chart.scss +98 -0
  507. package/src/sass/components/forms/_checkboxes.scss +107 -44
  508. package/src/sass/components/forms/_color-picker.scss +135 -0
  509. package/src/sass/components/forms/_color-swatches.scss +85 -0
  510. package/src/sass/components/forms/_drop-zone.scss +16 -13
  511. package/src/sass/components/forms/_fieldset.scss +4 -7
  512. package/src/sass/components/forms/_file-input.scss +12 -8
  513. package/src/sass/components/forms/_index.scss +3 -1
  514. package/src/sass/components/forms/_input-fields.scss +271 -90
  515. package/src/sass/components/forms/_radio-buttons.scss +34 -117
  516. package/src/sass/components/forms/_rating.scss +2 -32
  517. package/src/sass/components/forms/_select.scss +198 -20
  518. package/src/sass/components/forms/_slider.scss +92 -98
  519. package/src/sass/components/forms/_switches.scss +62 -180
  520. package/src/sass/custom.scss +10 -1
  521. package/src/sass/expressive.scss +3 -63
  522. package/src/sass/tokens/_contrast.scss +94 -0
  523. package/src/sass/tokens/_elevation.scss +16 -0
  524. package/src/sass/tokens/_index.scss +5 -0
  525. package/src/sass/tokens/_motion.scss +109 -0
  526. package/src/sass/tokens/_reference.scss +72 -141
  527. package/src/sass/tokens/_shape.scss +38 -0
  528. package/src/sass/tokens/_stacking.scss +27 -0
  529. package/src/sass/tokens/_state.scss +0 -2
  530. package/src/sass/tokens/_theme.scss +10 -1
  531. package/src/sass/tokens/_vibrant.scss +2 -5
  532. package/src/sass/utilities/_defer-render.scss +17 -0
  533. package/src/sass/utilities/_helpers.scss +184 -27
  534. package/src/sass/utilities/_index.scss +1 -0
  535. package/src/sass/utilities/_scroll-area.scss +0 -2
  536. package/src/sass/utilities/_spacing.scss +52 -34
  537. package/src/sass/utilities/_typescale.scss +8 -1
  538. package/src/sass/utilities/_visibility.scss +46 -77
  539. package/src/sass/utilities/_z-depth.scss +7 -4
  540. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  541. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  543. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  546. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  549. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  554. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  559. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  562. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  568. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  570. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  572. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  573. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  574. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  575. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  578. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  580. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  582. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  584. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UAZSDUVP.mjs +0 -90
  587. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  589. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  591. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  594. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  596. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  597. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  599. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  600. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  603. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  604. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  605. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  606. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  607. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  608. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  609. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -1,20 +1,26 @@
1
1
  import {
2
- Menu
3
- } from "./chunk-NUHMOAOY.mjs";
2
+ imageURL
3
+ } from "./chunk-GE3YMFS6.mjs";
4
4
  import {
5
- Utils
6
- } from "./chunk-M372EDXD.mjs";
5
+ Menu
6
+ } from "./chunk-DWA5UYLJ.mjs";
7
7
  import {
8
8
  Component
9
- } from "./chunk-PD6HYHAE.mjs";
9
+ } from "./chunk-EB2V4OKL.mjs";
10
+ import {
11
+ Utils,
12
+ afterFormReset
13
+ } from "./chunk-67UNY7RH.mjs";
10
14
 
11
15
  // src/ts/components/autocomplete.ts
16
+ var isListKey = (e) => (e.key === "ArrowUp" || e.key === "ArrowDown") && Utils.plainKey(e);
12
17
  var _defaults = {
13
18
  i18n: {
14
19
  loading: "Loading results.",
15
20
  noResults: "No results.",
16
21
  results: (count) => `${count} ${count === 1 ? "result" : "results"} available.`,
17
- selected: (count) => `${count} ${count === 1 ? "item" : "items"} selected.`
22
+ selected: (count) => `${count} ${count === 1 ? "item" : "items"} selected.`,
23
+ create: (text) => `Add "${text}"`
18
24
  },
19
25
  data: [],
20
26
  // Autocomplete data set
@@ -28,6 +34,9 @@ var _defaults = {
28
34
  },
29
35
  minLength: 1,
30
36
  // Min characters before autocomplete starts
37
+ searchDelay: 0,
38
+ allowCreate: false,
39
+ onCreate: null,
31
40
  isMultiSelect: false,
32
41
  onSearch: (text, autocomplete) => {
33
42
  const normSearch = text.toLocaleLowerCase();
@@ -38,81 +47,103 @@ var _defaults = {
38
47
  );
39
48
  },
40
49
  maxMenuHeight: "300px",
50
+ maxResults: Infinity,
41
51
  allowUnsafeHTML: false,
42
52
  selected: []
43
53
  };
44
54
  var _Autocomplete = class _Autocomplete extends Component {
45
55
  constructor(el, options) {
46
- super(el, options, _Autocomplete);
56
+ super(el, options);
57
+ /**
58
+ * Whether the user left or dismissed the field since the last search, so
59
+ * late results must not reopen it. A field nobody has focused yet counts.
60
+ */
61
+ this._left = true;
62
+ // Counts selections, so a callback that selects again silences the stale event.
63
+ this._selection = 0;
64
+ /** The last search returned no suggestions. A text change clears it until the next one returns. */
65
+ this._noResults = false;
66
+ /** The form restored the input's text. The selection follows it, with no change event, as a native reset fires none. */
67
+ this._handleReset = () => {
68
+ this._cancelPendingSearch();
69
+ this._searchAbort?.abort();
70
+ this._selection++;
71
+ this.selectedValues = [...this._startingSelection];
72
+ if (!this.options.isMultiSelect) this._refreshInputText();
73
+ this._updateSelectedInfo();
74
+ this._resetAutocomplete();
75
+ this.close();
76
+ };
47
77
  this._handleInputBlur = () => {
48
78
  if (!this._pointerDown) {
79
+ this._left = true;
80
+ this._cancelPendingSearch();
49
81
  this.close();
50
82
  this._resetAutocomplete();
51
83
  }
52
84
  };
53
- this._handleInputKeyup = () => {
54
- _Autocomplete._keydown = false;
55
- };
56
85
  this._handleInput = () => {
86
+ this._left = false;
57
87
  this.count = 0;
58
88
  const actualValue = this.el.value.toLocaleLowerCase();
59
89
  if (this.oldVal !== actualValue) {
60
90
  this._resetCurrentElementPosition();
91
+ this._noResults = false;
61
92
  if (this.el.matches(":focus-visible") && (!this.menu.isOpen || actualValue.length < this.options.minLength)) this.open();
62
93
  }
63
- this._inputChangeDetection(actualValue);
94
+ this._inputChangeDetection(actualValue, true);
64
95
  };
65
96
  this._handleInputFocus = () => {
97
+ this._left = false;
66
98
  this.count = 0;
67
99
  const actualValue = this.el.value.toLocaleLowerCase();
68
100
  this._inputChangeDetection(actualValue);
69
101
  };
70
- this._inputChangeDetection = (value) => {
102
+ this._inputChangeDetection = (value, typed) => {
71
103
  const deselected = !this.options.isMultiSelect && this.selectedValues.length > 0 && this.el.value !== (this.selectedValues[0].text || String(this.selectedValues[0].id));
72
104
  if (deselected) this.selectedValues = [];
73
105
  if (this.oldVal !== value) {
74
- this._setStatusLoading();
75
- this.options.onSearch(this.el.value, this);
106
+ this._noResults = false;
107
+ this._startSearch(typed);
76
108
  }
77
109
  if (deselected) this._triggerChanged();
78
110
  this.oldVal = value;
79
111
  };
80
- this._handleInputKeydown = (e) => {
81
- _Autocomplete._keydown = true;
82
- if (e.key === Utils.keys.ESC || e.key === "Tab") {
83
- this.close();
84
- this._resetCurrentElementPosition();
112
+ this._handleInputKeydown = Utils.ignoringComposition((e) => {
113
+ if (e.key === "Escape" || e.key === "Tab") {
114
+ this._dismiss(e);
85
115
  return;
86
116
  }
87
- const numItems = this.container.querySelectorAll("li").length;
88
- if (e.key === Utils.keys.ENTER && this.activeIndex >= 0) {
89
- const liElement = this.container.querySelectorAll("li")[this.activeIndex];
117
+ const options = this._options();
118
+ const numItems = options.length;
119
+ if (e.key === "Enter" && this.activeIndex >= 0) {
120
+ const liElement = options[this.activeIndex];
90
121
  if (liElement) {
91
- this.selectOption(liElement.getAttribute("data-id"));
122
+ this._choose(liElement);
92
123
  e.preventDefault();
93
124
  }
94
125
  return;
95
126
  }
96
- if (e.key === Utils.keys.ARROW_UP || e.key === Utils.keys.ARROW_DOWN) {
127
+ if (isListKey(e)) {
97
128
  e.preventDefault();
98
129
  if (!this.menu.isOpen && this._openTimer === void 0) {
99
130
  this.open();
100
131
  return;
101
132
  }
102
- if (e.key === Utils.keys.ARROW_UP && this.activeIndex > 0) this.activeIndex--;
103
- if (e.key === Utils.keys.ARROW_DOWN && this.activeIndex < numItems - 1)
133
+ if (e.key === "ArrowUp" && this.activeIndex > 0) this.activeIndex--;
134
+ if (e.key === "ArrowDown" && this.activeIndex < numItems - 1)
104
135
  this.activeIndex++;
105
136
  this._setActive(null);
106
137
  if (this.activeIndex >= 0) {
107
- this._setActive(this.container.querySelectorAll("li")[this.activeIndex]);
108
- this.container.children[this.activeIndex].scrollIntoView({
138
+ this._setActive(options[this.activeIndex]);
139
+ options[this.activeIndex].scrollIntoView({
109
140
  behavior: "smooth",
110
141
  block: "nearest",
111
142
  inline: "nearest"
112
143
  });
113
144
  }
114
145
  }
115
- };
146
+ });
116
147
  this._handleInputClick = () => {
117
148
  this.open();
118
149
  };
@@ -124,10 +155,21 @@ var _Autocomplete = class _Autocomplete extends Component {
124
155
  if (!e.isPrimary) return;
125
156
  if (e.pointerType === "mouse" && e.button !== 0) return;
126
157
  this._pointerDown = true;
158
+ const listen = { capture: true, once: true, signal: this._events.signal };
159
+ this.el.ownerDocument.addEventListener("pointerup", this._handleContainerPointerUp, listen);
160
+ this.el.ownerDocument.addEventListener("pointercancel", this._handleContainerPointerUp, listen);
127
161
  };
128
162
  this._handleContainerPointerUp = () => {
129
163
  this._pointerDown = false;
130
164
  };
165
+ // The no-results row and group headings are not options, and a disabled row
166
+ // cannot be chosen. A press on any of them would move focus to the list,
167
+ // which nothing hands back, and Menu would report the row as chosen.
168
+ this._handleInertRowPress = (e) => {
169
+ if (!(e.target instanceof Element) || !e.target.closest('.autocomplete-no-results, .autocomplete-group-label, [aria-disabled="true"]')) return;
170
+ e.preventDefault();
171
+ e.stopPropagation();
172
+ };
131
173
  /**
132
174
  * Show autocomplete.
133
175
  */
@@ -136,7 +178,7 @@ var _Autocomplete = class _Autocomplete extends Component {
136
178
  this._resetAutocomplete();
137
179
  if (inputText.length >= this.options.minLength) {
138
180
  this._renderMenu();
139
- this._announce(this._resultsMessage(this.menuItems.length));
181
+ this._announce(this._resultsMessage());
140
182
  }
141
183
  if (!this.menu.isOpen) {
142
184
  if (this._openTimer !== void 0) clearTimeout(this._openTimer);
@@ -158,21 +200,18 @@ var _Autocomplete = class _Autocomplete extends Component {
158
200
  this.isOpen = false;
159
201
  this.menu.close();
160
202
  };
161
- this.el["Expressive_Autocomplete"] = this;
162
- this.options = {
163
- ..._Autocomplete.defaults,
164
- ...options,
165
- i18n: { ..._Autocomplete.defaults.i18n, ...options?.i18n }
166
- };
167
203
  this.isOpen = false;
168
204
  this.count = 0;
169
205
  this.activeIndex = -1;
170
206
  this.oldVal = "";
171
- this.selectedValues = this.options.selected.map((id) => this.options.data.find((entry) => entry.id === id) ?? { id });
207
+ const byId = /* @__PURE__ */ new Map();
208
+ this.options.data.forEach((entry) => byId.has(entry.id) || byId.set(entry.id, entry));
209
+ this.selectedValues = this.options.selected.map((id) => byId.get(id) ?? { id });
172
210
  this.menuItems = this.options.data || [];
173
211
  this.$active = null;
174
212
  this._pointerDown = false;
175
213
  this._setupMenu();
214
+ this._startingSelection = [...this.selectedValues];
176
215
  this._setupEventHandlers();
177
216
  }
178
217
  /**
@@ -198,17 +237,6 @@ var _Autocomplete = class _Autocomplete extends Component {
198
237
  static get defaults() {
199
238
  return _defaults;
200
239
  }
201
- /**
202
- * Initializes instances of Autocomplete.
203
- * @param els HTML elements.
204
- * @param options Component options.
205
- */
206
- static init(els, options = {}) {
207
- return super.init(els, options, _Autocomplete);
208
- }
209
- static getInstance(el) {
210
- return el["Expressive_Autocomplete"];
211
- }
212
240
  static _loadingIndicator() {
213
241
  if (!_Autocomplete._loadingTemplate) {
214
242
  const template = document.createElement("template");
@@ -226,35 +254,30 @@ var _Autocomplete = class _Autocomplete extends Component {
226
254
  clearTimeout(this._openTimer);
227
255
  this._openTimer = void 0;
228
256
  }
229
- this._removeEventHandlers();
257
+ this._cancelPendingSearch();
258
+ this._searchAbort?.abort();
259
+ this._events.abort();
230
260
  this.menu.destroy();
231
261
  this.isOpen = false;
232
262
  this._removeMenu();
263
+ for (const name of ["role", "aria-autocomplete", "aria-controls", "data-target", "aria-haspopup", "aria-expanded", "aria-activedescendant"]) {
264
+ this.el.removeAttribute(name);
265
+ }
233
266
  this._statusInfo.remove();
234
267
  this._announcer.remove();
235
- this.el["Expressive_Autocomplete"] = void 0;
268
+ super.destroy();
236
269
  }
237
270
  _setupEventHandlers() {
238
- this.el.addEventListener("blur", this._handleInputBlur);
239
- this.el.addEventListener("input", this._handleInput);
240
- this.el.addEventListener("keyup", this._handleInputKeyup);
241
- this.el.addEventListener("focus", this._handleInputFocus);
242
- this.el.addEventListener("keydown", this._handleInputKeydown);
243
- this.el.addEventListener("click", this._handleInputClick);
244
- this.container.addEventListener("pointerdown", this._handleContainerPointerDown);
245
- this.container.addEventListener("pointerup", this._handleContainerPointerUp);
246
- this.container.addEventListener("pointercancel", this._handleContainerPointerUp);
247
- }
248
- _removeEventHandlers() {
249
- this.el.removeEventListener("blur", this._handleInputBlur);
250
- this.el.removeEventListener("input", this._handleInput);
251
- this.el.removeEventListener("keyup", this._handleInputKeyup);
252
- this.el.removeEventListener("focus", this._handleInputFocus);
253
- this.el.removeEventListener("keydown", this._handleInputKeydown);
254
- this.el.removeEventListener("click", this._handleInputClick);
255
- this.container.removeEventListener("pointerdown", this._handleContainerPointerDown);
256
- this.container.removeEventListener("pointerup", this._handleContainerPointerUp);
257
- this.container.removeEventListener("pointercancel", this._handleContainerPointerUp);
271
+ const { signal } = this._events;
272
+ this.el.addEventListener("blur", this._handleInputBlur, { signal });
273
+ this.el.addEventListener("input", this._handleInput, { signal });
274
+ this.el.addEventListener("focus", this._handleInputFocus, { signal });
275
+ this.el.addEventListener("keydown", this._handleInputKeydown, { signal });
276
+ this.el.addEventListener("click", this._handleInputClick, { signal });
277
+ this.container.addEventListener("pointerdown", this._handleContainerPointerDown, { signal });
278
+ this.container.addEventListener("mousedown", this._handleInertRowPress, { capture: true, signal });
279
+ this.container.addEventListener("click", this._handleInertRowPress, { capture: true, signal });
280
+ afterFormReset(this.el, this._handleReset, signal);
258
281
  }
259
282
  _setupMenu() {
260
283
  this.container = document.createElement("menu");
@@ -267,10 +290,8 @@ var _Autocomplete = class _Autocomplete extends Component {
267
290
  this.el.setAttribute("aria-autocomplete", "list");
268
291
  this.el.setAttribute("aria-controls", this.container.id);
269
292
  this.el.setAttribute("data-target", this.container.id);
270
- this.menuItems.forEach((menuItem) => {
271
- const itemElement = this._createMenuItem(menuItem);
272
- this.container.append(itemElement);
273
- });
293
+ this._renderMenu();
294
+ this.oldVal = "";
274
295
  this.el.parentElement.appendChild(this.container);
275
296
  const menuOptions = {
276
297
  ..._Autocomplete.defaults.menuOptions,
@@ -289,8 +310,7 @@ var _Autocomplete = class _Autocomplete extends Component {
289
310
  const userOnItemClick = menuOptions.onItemClick;
290
311
  menuOptions.onItemClick = (li) => {
291
312
  if (!li) return;
292
- const entryID = li.getAttribute("data-id");
293
- this.selectOption(entryID);
313
+ this._choose(li);
294
314
  if (typeof userOnItemClick === "function") userOnItemClick.call(this.menu, li);
295
315
  };
296
316
  this.menu = Menu.init(this.el, menuOptions);
@@ -319,6 +339,55 @@ var _Autocomplete = class _Autocomplete extends Component {
319
339
  this.container.ariaExpanded = "false";
320
340
  this.container.parentNode.removeChild(this.container);
321
341
  }
342
+ /**
343
+ * Searches for text of at least `minLength` characters. Shorter text drops
344
+ * the pending and running searches and the old results: it used to reach
345
+ * onSearch too, so a remote search fetched on every first keystroke.
346
+ */
347
+ _startSearch(typed) {
348
+ if (this.el.value.length >= this.options.minLength) {
349
+ this._setStatusLoading();
350
+ return this._queueSearch(typed);
351
+ }
352
+ this._cancelPendingSearch();
353
+ this._searchAbort?.abort();
354
+ this.menuItems = [];
355
+ this._updateSelectedInfo();
356
+ this._announce("");
357
+ }
358
+ /** Searches now, or once typing pauses for `searchDelay`. Focus never waits. */
359
+ _queueSearch(typed) {
360
+ this._cancelPendingSearch();
361
+ const delay = this.options.searchDelay;
362
+ if (!typed || !(delay > 0 && delay < Infinity)) return this._search(this.el.value);
363
+ this._searchAbort?.abort();
364
+ this._searchTimer = setTimeout(() => {
365
+ this._searchTimer = void 0;
366
+ this._search(this.el.value);
367
+ }, delay);
368
+ }
369
+ _cancelPendingSearch() {
370
+ clearTimeout(this._searchTimer);
371
+ this._searchTimer = void 0;
372
+ }
373
+ /** Starts a search and aborts the one before, whose response is now stale. */
374
+ _search(text) {
375
+ this._searchAbort?.abort();
376
+ this._searchAbort = new AbortController();
377
+ this.options.onSearch(text, this, this._searchAbort.signal);
378
+ }
379
+ _dismiss(e) {
380
+ if (e.key === "Escape") {
381
+ if (this.menu.isOpen || this._openTimer !== void 0) e.preventDefault();
382
+ this._left = true;
383
+ }
384
+ this.close();
385
+ this._resetCurrentElementPosition();
386
+ }
387
+ /** The rows that can be chosen. The no-results row and disabled rows are not. */
388
+ _options() {
389
+ return this.container.querySelectorAll('li[role="option"]:not([aria-disabled="true"])');
390
+ }
322
391
  _resetCurrentElementPosition() {
323
392
  this.activeIndex = -1;
324
393
  this._setActive(null);
@@ -337,13 +406,14 @@ var _Autocomplete = class _Autocomplete extends Component {
337
406
  }
338
407
  return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];
339
408
  }
340
- _createMenuItem(entry) {
409
+ _createMenuItem(entry, selectedIds = new Set(this.selectedValues.map((entry2) => entry2.id))) {
341
410
  const item = document.createElement("li");
342
411
  item.id = `autocomplete-option-${Utils.guid()}`;
343
412
  item.setAttribute("role", "option");
344
- const isSelected = this.selectedValues.some((sel) => sel.id === entry.id);
413
+ const isSelected = selectedIds.has(entry.id);
345
414
  item.setAttribute("aria-selected", isSelected ? "true" : "false");
346
415
  item.setAttribute("data-id", entry.id);
416
+ _Autocomplete._markDisabled(item, entry);
347
417
  item.setAttribute(
348
418
  "style",
349
419
  "display:grid; grid-auto-flow: column; user-select: none; align-items: center;"
@@ -357,46 +427,20 @@ var _Autocomplete = class _Autocomplete extends Component {
357
427
  checkbox.type = "checkbox";
358
428
  checkbox.tabIndex = -1;
359
429
  checkbox.checked = isSelected;
430
+ checkbox.disabled = entry.disabled === true;
360
431
  const spacer = document.createElement("span");
361
432
  spacer.style.paddingLeft = "21px";
362
433
  selection.append(checkbox, spacer);
363
434
  item.appendChild(selection);
364
435
  }
365
- if (entry.image) {
436
+ const image = imageURL(entry.image, this.el.ownerDocument.baseURI);
437
+ if (image) {
366
438
  const img = document.createElement("img");
367
439
  img.classList.add("circle");
368
- img.src = entry.image;
440
+ img.src = image;
369
441
  item.appendChild(img);
370
442
  }
371
- const inputText = this.el.value.toLocaleLowerCase();
372
- const label = (entry.text || entry.id).toString();
373
- const parts = this._highlightPartialText(inputText, label);
374
- const div = document.createElement("div");
375
- div.setAttribute("style", "line-height:1.2;font-weight:500;");
376
- if (this.options.allowUnsafeHTML) {
377
- div.innerHTML = label;
378
- const walker = document.createTreeWalker(div, NodeFilter.SHOW_TEXT);
379
- for (let node = walker.nextNode(); node; node = walker.nextNode()) {
380
- const [before, match] = this._highlightPartialText(inputText, node.data);
381
- if (!match) continue;
382
- const matched = node.splitText(before.length);
383
- matched.splitText(match.length);
384
- const highlight = document.createElement("span");
385
- highlight.classList.add("highlight");
386
- matched.replaceWith(highlight);
387
- highlight.append(matched);
388
- break;
389
- }
390
- } else {
391
- div.appendChild(document.createTextNode(parts[0]));
392
- if (parts[1]) {
393
- const highlight = document.createElement("span");
394
- highlight.textContent = parts[1];
395
- highlight.classList.add("highlight");
396
- div.appendChild(highlight);
397
- div.appendChild(document.createTextNode(parts[2]));
398
- }
399
- }
443
+ const div = this._createLabel(entry);
400
444
  const itemText = document.createElement("div");
401
445
  itemText.classList.add("item-text");
402
446
  itemText.setAttribute("style", "padding:5px;overflow:hidden;");
@@ -422,16 +466,122 @@ var _Autocomplete = class _Autocomplete extends Component {
422
466
  item.style.gridTemplateColumns = getGridConfig();
423
467
  return item;
424
468
  }
425
- _renderMenu() {
426
- this._resetAutocomplete();
427
- if (this.menuItems.length === 0) {
428
- this.menuItems = this.selectedValues;
469
+ /** Menu already ignores a click on an aria-disabled row. */
470
+ static _markDisabled(item, entry) {
471
+ if (entry.disabled === true) item.setAttribute("aria-disabled", "true");
472
+ }
473
+ _createLabel(entry) {
474
+ const inputText = this.el.value.toLocaleLowerCase();
475
+ const label = (entry.text || entry.id).toString();
476
+ const div = document.createElement("div");
477
+ div.setAttribute("style", "line-height:1.2;font-weight:500;");
478
+ if (this.options.allowUnsafeHTML && entry.text) this._highlightHTML(div, label, inputText);
479
+ else this._highlightText(div, this._highlightPartialText(inputText, label));
480
+ return div;
481
+ }
482
+ _highlightHTML(div, label, inputText) {
483
+ div.innerHTML = label;
484
+ const walker = document.createTreeWalker(div, NodeFilter.SHOW_TEXT);
485
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
486
+ const [before, match] = this._highlightPartialText(inputText, node.data);
487
+ if (!match) continue;
488
+ const matched = node.splitText(before.length);
489
+ matched.splitText(match.length);
490
+ const highlight = document.createElement("span");
491
+ highlight.classList.add("highlight");
492
+ matched.replaceWith(highlight);
493
+ highlight.append(matched);
494
+ break;
429
495
  }
430
- for (let i = 0; i < this.menuItems.length; i++) {
431
- const item = this._createMenuItem(this.menuItems[i]);
432
- this.container.append(item);
496
+ }
497
+ _highlightText(div, parts) {
498
+ div.appendChild(document.createTextNode(parts[0]));
499
+ if (parts[1]) {
500
+ const highlight = document.createElement("span");
501
+ highlight.textContent = parts[1];
502
+ highlight.classList.add("highlight");
503
+ div.appendChild(highlight);
504
+ div.appendChild(document.createTextNode(parts[2]));
433
505
  }
434
506
  }
507
+ _visibleEntries() {
508
+ const limit = this.options.maxResults;
509
+ return Number.isFinite(limit) && limit >= 0 ? this.menuItems.slice(0, Math.floor(limit)) : this.menuItems;
510
+ }
511
+ _renderMenu() {
512
+ this._resetAutocomplete();
513
+ if (this._noResults) this.container.append(this._createNoResultsRow());
514
+ if (this.menuItems.length === 0) this.menuItems = [...this.selectedValues];
515
+ const groups = /* @__PURE__ */ new Map();
516
+ const selectedIds = new Set(this.selectedValues.map((entry) => entry.id));
517
+ this._visibleEntries().forEach((entry) => this._groupList(entry.group, groups).append(this._createMenuItem(entry, selectedIds)));
518
+ const createText = this._createText();
519
+ if (createText) this.container.append(this._createRow(createText));
520
+ }
521
+ /** The list a row goes in: the listbox, or its group's list, made where the group first appears. */
522
+ _groupList(name, groups) {
523
+ if (!name) return this.container;
524
+ if (!groups.has(name)) groups.set(name, this._createGroup(name));
525
+ return groups.get(name);
526
+ }
527
+ /**
528
+ * A labelled group of options, as the APG grouped listbox nests it. The
529
+ * heading is not an option, so the arrow keys and the count pass over it.
530
+ * Its name is set as text: only an entry's own `text` may be HTML.
531
+ */
532
+ _createGroup(name) {
533
+ const heading = document.createElement("li");
534
+ heading.id = `autocomplete-group-${Utils.guid()}`;
535
+ heading.setAttribute("role", "presentation");
536
+ heading.classList.add("label", "autocomplete-group-label");
537
+ heading.textContent = name;
538
+ const list = document.createElement("ul");
539
+ list.setAttribute("role", "group");
540
+ list.setAttribute("aria-labelledby", heading.id);
541
+ list.append(heading);
542
+ const wrapper = document.createElement("li");
543
+ wrapper.setAttribute("role", "none");
544
+ wrapper.append(list);
545
+ this.container.append(wrapper);
546
+ return list;
547
+ }
548
+ /** The typed text to offer as a new value, or '' when the option is off, the text is short or a suggestion matches it. */
549
+ _createText() {
550
+ const text = this.el.value.trim();
551
+ if (!this.options.allowCreate || text.length < this.options.minLength) return "";
552
+ const typed = text.toLocaleLowerCase();
553
+ return this.menuItems.some((entry) => (entry.text || String(entry.id)).toLocaleLowerCase() === typed) ? "" : text;
554
+ }
555
+ /** The "Add" row. Its label is what the person typed, so it is set as text, never as HTML. */
556
+ _createRow(text) {
557
+ const item = document.createElement("li");
558
+ item.id = `autocomplete-option-${Utils.guid()}`;
559
+ item.setAttribute("role", "option");
560
+ item.setAttribute("aria-selected", "false");
561
+ item.setAttribute("data-create", text);
562
+ item.classList.add("autocomplete-create");
563
+ item.setAttribute("style", "display:grid; user-select: none; align-items: center;");
564
+ item.tabIndex = -1;
565
+ const label = document.createElement("div");
566
+ label.classList.add("item-text");
567
+ label.setAttribute("style", "padding:5px;overflow:hidden;line-height:1.2;font-weight:500;");
568
+ label.textContent = this.options.i18n.create(text);
569
+ item.append(label);
570
+ return item;
571
+ }
572
+ /**
573
+ * Shows sighted users the `i18n.noResults` that the live region announces.
574
+ * Screen readers already hear that, and a listbox may only own options, so
575
+ * the row is hidden from them.
576
+ */
577
+ _createNoResultsRow() {
578
+ const row = document.createElement("li");
579
+ row.classList.add("autocomplete-no-results");
580
+ row.setAttribute("role", "none");
581
+ row.setAttribute("aria-hidden", "true");
582
+ row.textContent = this.options.i18n.noResults;
583
+ return row;
584
+ }
435
585
  _setStatusLoading() {
436
586
  const statusElement = this._statusInfo;
437
587
  if (statusElement) statusElement.replaceChildren(_Autocomplete._loadingIndicator());
@@ -442,7 +592,9 @@ var _Autocomplete = class _Autocomplete extends Component {
442
592
  const text = this.el.matches(":focus") && this.el.value.length >= this.options.minLength ? message : "";
443
593
  if (this._announcer.textContent !== text) this._announcer.textContent = text;
444
594
  }
445
- _resultsMessage(count) {
595
+ /** Announces the entries a person can choose. Disabled ones are shown, not counted. */
596
+ _resultsMessage() {
597
+ const count = this._noResults ? 0 : this._visibleEntries().filter((entry) => entry.disabled !== true).length;
446
598
  return count ? this.options.i18n.results(count) : this.options.i18n.noResults;
447
599
  }
448
600
  _updateSelectedInfo() {
@@ -460,9 +612,11 @@ var _Autocomplete = class _Autocomplete extends Component {
460
612
  }
461
613
  }
462
614
  _triggerChanged() {
615
+ const values = this.selectedValues;
616
+ const selection = ++this._selection;
463
617
  this.el.dispatchEvent(new Event("change", { bubbles: true, cancelable: true, composed: true }));
464
- if (typeof this.options.onAutocomplete === "function")
465
- this.options.onAutocomplete.call(this, this.selectedValues);
618
+ if (selection !== this._selection) return;
619
+ this._notify("autocomplete", this.options.onAutocomplete, { args: [values], detail: { values }, current: () => selection === this._selection });
466
620
  }
467
621
  /**
468
622
  * Updates the visible or selectable items shown in the menu.
@@ -471,13 +625,13 @@ var _Autocomplete = class _Autocomplete extends Component {
471
625
  * @param open Option to conditionally open menu
472
626
  */
473
627
  setMenuItems(menuItems, selected = null, open = true) {
474
- if (this.el["Expressive_Autocomplete"] !== this) return;
475
- const resultCount = menuItems.length;
628
+ if (_Autocomplete.getInstance(this.el) !== this) return;
629
+ open && (open = !this._left);
630
+ this._noResults = menuItems.length === 0;
476
631
  this.menuItems = menuItems;
477
632
  if (selected) {
478
- this.selectedValues = this.menuItems.filter(
479
- (item) => !(selected.indexOf(item.id) === -1)
480
- );
633
+ const ids = new Set(selected);
634
+ this.selectedValues = this.menuItems.filter((item) => ids.has(item.id));
481
635
  }
482
636
  if (this.options.isMultiSelect) {
483
637
  if (!open) this._renderMenu();
@@ -486,35 +640,60 @@ var _Autocomplete = class _Autocomplete extends Component {
486
640
  }
487
641
  if (open) this.open();
488
642
  this._updateSelectedInfo();
489
- this._announce(open ? this._resultsMessage(resultCount) : "");
643
+ this._announce(open ? this._resultsMessage() : "");
490
644
  if (selected) this._triggerChanged();
491
645
  }
646
+ _toggleOption(entry) {
647
+ const selected = !this.selectedValues.some((selectedEntry) => selectedEntry.id === entry.id);
648
+ if (selected) this.selectedValues.push(entry);
649
+ else this.selectedValues = this.selectedValues.filter((selectedEntry) => selectedEntry.id !== entry.id);
650
+ const row = Array.from(this.container.querySelectorAll("li[data-id]")).find((li) => li.getAttribute("data-id") === String(entry.id));
651
+ if (row) {
652
+ row.setAttribute("aria-selected", String(selected));
653
+ row.querySelector("input").checked = selected;
654
+ }
655
+ this.el.focus();
656
+ }
657
+ _selectSingle(entry) {
658
+ const refocus = Utils.focusIsIn(this.container);
659
+ this._cancelPendingSearch();
660
+ this.selectedValues = [entry];
661
+ this._refreshInputText();
662
+ this._resetAutocomplete();
663
+ this.close();
664
+ if (refocus) {
665
+ this.oldVal = this.el.value.toLocaleLowerCase();
666
+ this.el.focus();
667
+ }
668
+ }
669
+ /** Commits a row chosen by Enter or a click. */
670
+ _choose(li) {
671
+ if (li.hasAttribute("data-create")) this._create(li.getAttribute("data-create"));
672
+ else this.selectOption(li.getAttribute("data-id"));
673
+ }
674
+ _create(text) {
675
+ const refocus = Utils.focusIsIn(this.container);
676
+ this._cancelPendingSearch();
677
+ this.oldVal = this.el.value.toLocaleLowerCase();
678
+ this.close();
679
+ if (refocus) this.el.focus();
680
+ this._notify("create", this.options.onCreate, { args: [text, this], detail: { text } });
681
+ }
492
682
  /**
493
683
  * Select a specific autocomplete option via id-property.
494
684
  * @param id The id of a data-entry.
495
685
  */
496
686
  selectOption(id) {
497
- const entry = this.menuItems.find((item) => item.id == id);
687
+ const entry = this.menuItems.find((item) => String(item.id) === String(id) && item.disabled !== true);
498
688
  if (!entry) return;
499
- if (this.options.isMultiSelect) {
500
- if (!this.selectedValues.some((selectedEntry) => selectedEntry.id === entry.id))
501
- this.selectedValues.push(entry);
502
- else this.selectedValues = this.selectedValues.filter(
503
- (selectedEntry) => selectedEntry.id !== entry.id
504
- );
505
- this._renderMenu();
506
- this.el.focus();
507
- } else {
508
- this.selectedValues = [entry];
509
- this._refreshInputText();
510
- this._resetAutocomplete();
511
- this.close();
512
- }
689
+ if (this.options.isMultiSelect) this._toggleOption(entry);
690
+ else this._selectSingle(entry);
513
691
  this._updateSelectedInfo();
514
692
  if (this.options.isMultiSelect) this._announce(this.options.i18n.selected(this.selectedValues.length));
515
693
  this._triggerChanged();
516
694
  }
517
695
  };
696
+ _Autocomplete.key = "Expressive_Autocomplete";
518
697
  /**
519
698
  * The three-dot loading indicator, parsed once and cloned thereafter.
520
699
  *
@@ -528,4 +707,4 @@ var Autocomplete = _Autocomplete;
528
707
  export {
529
708
  Autocomplete
530
709
  };
531
- //# sourceMappingURL=chunk-ZX6M7SWO.mjs.map
710
+ //# sourceMappingURL=chunk-F7LAKFMX.mjs.map