@expressivecss/expressive 0.14.1 → 0.16.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 (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  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-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/select.ts"],
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n /** Show a separate popup search field for supported select modes. */\n searchable: boolean;\n i18n: Partial<{ searchLabel: string; noResults: string }>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {},\n searchable: false,\n i18n: { searchLabel: 'Search options', noResults: 'No results' }\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n protected _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabels = new Map<HTMLLabelElement, { for: string | null; id: string | null }>();\n private _labelPlaceholder: Comment;\n private _form: HTMLFormElement | null;\n private _resetTimer: ReturnType<typeof setTimeout>;\n private _validationMessage: HTMLElement | null = null;\n nativeTabIndex: number;\n private _searchable: boolean;\n protected _searchInput: HTMLInputElement;\n private _searchResults: HTMLElement;\n private _searchStatus: HTMLElement;\n\n constructor(el: HTMLSelectElement, options: Partial<FormSelectOptions>) {\n super(el, options);\n // A browser-default select stays native, with no instance on it, and a\n // tree select belongs to TreeSelect, which a page's FormSelect.init() on\n // every select must not wrap a second time.\n if (this.el.classList.contains('browser-default') || (new.target === FormSelect && this.el.matches('[data-tree]'))) {\n this.el[new.target.key] = undefined;\n return;\n }\n\n this.isMultiple = this.el.multiple;\n this._searchable = this._canSearch();\n this.nativeTabIndex = this.el.tabIndex;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n static key = 'Expressive_FormSelect';\n\n protected _canSearch() {\n return this.constructor === FormSelect && this.options.searchable;\n }\n\n destroy() {\n this._events.abort();\n // A skipped select built nothing and holds no instance key. The control\n // may belong to a TreeSelect, or to a later instance, so leave it alone.\n if (!this.menuEl) return;\n clearTimeout(this._resetTimer);\n this._clearValidationError();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n super.destroy();\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._bindForm();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = this._values.find(value => value.optionEl.contains(root.activeElement))?.el;\n this.input.disabled = this.el.matches(':disabled');\n this.wrapper.classList.toggle('disabled', this.input.disabled);\n if (this.input.disabled) this.menu?.close();\n else if (!this.menu) this._initMenu();\n this.input.removeAttribute('aria-activedescendant');\n this._rebuildOptions();\n this._handleSelectChange();\n if (this.menu) this.menu.focusedIndex = -1;\n if (this.menu?.isOpen) {\n this.menu.recalculateDimensions();\n this._restoreOptionFocus(focused);\n }\n }\n\n private _restoreOptionFocus(option: HTMLOptionElement) {\n if (!option) return;\n const rows = this._values.filter(({ el, optionEl }) => el === option && optionEl.tabIndex === 0).map(({ optionEl }) => optionEl);\n (rows[0] || this._searchInput || this.input).focus();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange, { signal });\n this.el.addEventListener('invalid', this._handleInvalid, { signal });\n this.el.addEventListener('focus', this._handleNativeFocus, { signal });\n this.input.addEventListener('click', this._handleInputClick, { signal });\n this.menuEl.addEventListener('focusin', this._handleOptionFocus, { signal });\n this._bindForm();\n }\n\n private _bindForm() {\n this._form?.removeEventListener('reset', this._handleReset);\n this._form = this.el.form;\n this._form?.addEventListener('reset', this._handleReset, { signal: this._events.signal });\n }\n\n // A rebuild replaces the rows, and no event reaches the old ones.\n protected _setupOptionHandlers() {\n const { signal } = this._events;\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick, { signal });\n el.addEventListener('keydown', this._handleOptionKeydown, { signal });\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n this._setSelectedStates();\n this._syncValidationError();\n };\n\n private _handleInvalid = (e: Event) => {\n if (e.defaultPrevented) return;\n if (!this._validationMessage) {\n this._validationMessage = document.createElement('small');\n this._validationMessage.id = this.input.id + '-error';\n this._validationMessage.className = 'supporting-text';\n this._validationMessage.style.color = 'var(--md-sys-color-error)';\n this.wrapper.append(this._validationMessage);\n this.input.setAttribute('aria-describedby',\n [this.input.getAttribute('aria-describedby'), this._validationMessage.id].filter(Boolean).join(' '));\n }\n this.input.ariaInvalid = 'true';\n this._syncValidationError();\n };\n\n // Native reporting chooses the control; static checks never focus. Wait until\n // reporting finishes so Firefox dismisses its native popup when focus moves.\n private _handleNativeFocus = () => queueMicrotask(() => {\n // The instance's own class: a TreeSelect sits under its own key.\n if ((this.constructor as typeof FormSelect).getInstance(this.el) === this && this.el.matches(':focus')) this.input.focus();\n });\n\n private _syncValidationError() {\n if (!this._validationMessage) return;\n if (this.el.willValidate && !this.el.validity.valid) {\n this._validationMessage.textContent = this.el.validationMessage;\n } else this._clearValidationError();\n }\n\n private _clearValidationError() {\n if (!this._validationMessage) return;\n const descriptions = this.input.getAttribute('aria-describedby')?.split(/\\s+/)\n .filter(id => id !== this._validationMessage.id).join(' ');\n if (descriptions) this.input.setAttribute('aria-describedby', descriptions);\n else this.input.removeAttribute('aria-describedby');\n this.input.ariaInvalid = this.el.ariaInvalid;\n this._validationMessage.remove();\n this._validationMessage = null;\n }\n\n private _handleReset = (e: Event) => {\n clearTimeout(this._resetTimer);\n this._resetTimer = setTimeout(() => {\n if (!e.defaultPrevented) {\n this._resetSearch();\n this._handleSelectChange();\n this._clearValidationError();\n }\n }, 0);\n };\n\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n // Canceling a click on the multi-select checkbox itself reverts the box\n // after _setSelectedStates has set it, leaving it out of step with the option.\n if (!(e.target as Element).matches('input[type=\"checkbox\"]')) e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n if (this._searchInput) return;\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (virtualOption.hidden) return;\n if (this.el.matches(':disabled')) return;\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value || value.el.matches(':disabled')) return;\n const previousSelectedValues = JSON.stringify(this.getSelectedValues());\n // Selecting one option of a single select deselects the others.\n value.el.selected = !this.isMultiple || !value.el.selected;\n this._handleSelectChange();\n if (JSON.stringify(this.getSelectedValues()) !== previousSelectedValues)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n // Only a real selection closes; a disabled option is inert.\n if (!this.isMultiple) this._closeSingleSelect();\n }\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n private _closeSingleSelect() {\n this.menu?.close();\n if (this._searchInput) this.input.focus();\n }\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n Array.from(this.el.labels ?? []).forEach(label => {\n this._originalLabels.set(label, { for: label.getAttribute('for'), id: label.getAttribute('id') });\n });\n if (this.labelEl && !this.el.closest('label')) {\n this._labelPlaceholder = document.createComment('');\n this.labelEl.before(this._labelPlaceholder);\n }\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.matches(':disabled')) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement(this._searchable ? 'div' : 'menu');\n // Disabled controls skip Menu initialization but must keep their popup hidden.\n this.menuEl.popover = 'manual';\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n if (this._searchable) this._buildSearch();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this._labelPlaceholder) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n hiddenDiv.ariaHidden = 'true';\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n if (this._createdWrapper) this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n // FormSelect owns this Menu. A later AutoInit must not replace it before\n // FormSelect can destroy its own instance during reinitialization.\n this.input.classList.add('menu-trigger', 'no-autoinit');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n this.input.disabled = this.el.matches(':disabled');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n this._originalLabels.forEach((_, label) => { label.htmlFor = this.input.id; });\n // Moving the first label can change DOM order. Preserve the original naming\n // order without overriding an author's explicit accessible name.\n if (this._labelPlaceholder && this._originalLabels.size > 1 && !this.input.getAttribute('aria-label') && !this.input.getAttribute('aria-labelledby')) {\n this.input.setAttribute('aria-labelledby', Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = `${this.input.id}-label-${index}`;\n return label.id;\n }).join(' '));\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _buildSearch() {\n this.menuEl.classList.add('select-search-popup');\n this.menuEl.setAttribute('role', 'dialog');\n this.menuEl.removeAttribute('aria-multiselectable');\n this.menuEl.classList.remove('multiple-select-menu');\n this.input.setAttribute('aria-haspopup', 'dialog');\n this._searchResults = this._searchList();\n this._searchInput = document.createElement('input');\n this._searchInput.type = 'search';\n this._searchInput.placeholder = this.options.i18n.searchLabel;\n this._searchInput.setAttribute('aria-label', this.options.i18n.searchLabel);\n this._searchStatus = document.createElement('div');\n this._searchStatus.setAttribute('role', 'status');\n this.menuEl.append(this._searchInput, this._searchStatus, this._searchResults);\n this._searchInput.addEventListener('input', this._filterOptions, { signal: this._events.signal });\n this.menuEl.addEventListener('keydown', this._handleSearchKeydown, { signal: this._events.signal, capture: true });\n this._nameSearch();\n this._filterOptions();\n }\n\n protected _searchList(): HTMLElement {\n const list = document.createElement('menu');\n list.id = this.menuEl.id + '-list';\n list.setAttribute('role', 'listbox');\n list.ariaMultiSelectable = this.isMultiple.toString();\n list.classList.toggle('multiple-select-menu', this.isMultiple);\n list.append(...this.menuEl.childNodes);\n return list;\n }\n\n private _nameSearch() {\n const labels = Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = this.input.id + '-label-' + index;\n return label.id;\n }).join(' ');\n const attribute = this.input.hasAttribute('aria-labelledby') ? 'aria-labelledby' : 'aria-label';\n const name = this.input.getAttribute(attribute);\n [this.menuEl, this._searchResults].forEach(el => el.setAttribute(name ? attribute : 'aria-labelledby', name || labels));\n }\n\n private _filterOptions = () => {\n const query = this._searchInput.value.trim().toLowerCase();\n this._filterSearch(query);\n this._searchStatus.textContent = this._values.some(({ optionEl }) => !optionEl.hidden) ? '' : this.options.i18n.noResults;\n this.input.removeAttribute('aria-activedescendant');\n this.menu?.recalculateDimensions();\n };\n\n protected _filterSearch(query: string) {\n this._values.forEach(({ el, optionEl }) => {\n optionEl.hidden = !el.textContent.trim().toLowerCase().includes(query);\n optionEl.tabIndex = optionEl.hidden || el.matches(':disabled') ? -1 : 0;\n });\n this._filterGroups();\n }\n\n private _filterGroups() {\n for (const group of this._searchResults.querySelectorAll<HTMLElement>(':scope > li.optgroup')) {\n const ids = new Set(group.getAttribute('aria-owns').split(' '));\n group.hidden = !this._values.some(({ optionEl }) => ids.has(optionEl.id) && !optionEl.hidden);\n }\n }\n\n protected _searchRows() {\n return this._values.map(({ optionEl }) => optionEl).filter(row => row.tabIndex !== -1);\n }\n\n private _handleSearchKeydown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (!Utils.plainKey(e) || Utils.isComposing(e)) return;\n if (this._searchDismissKey(e)) return;\n this._searchNavigate(e);\n };\n\n private _searchDismissKey(e: KeyboardEvent) {\n if (e.key === 'Tab') {\n this._searchTab(e);\n return true;\n }\n if (e.key !== 'Escape') return false;\n e.preventDefault();\n this._closeSingleSelect();\n return true;\n }\n\n private _searchTab(e: KeyboardEvent) {\n if (e.shiftKey) {\n e.preventDefault();\n this._searchBackwardTab(e);\n return;\n }\n const first = this._searchRows()[0];\n if (e.target === this._searchInput && first) {\n e.preventDefault();\n first.focus();\n return;\n }\n // Let the browser advance from the trigger, including across shadow roots.\n this._closeSingleSelect();\n }\n\n private _searchBackwardTab(e: KeyboardEvent) {\n if (e.target === this._searchInput) this._closeSingleSelect();\n else this._searchInput.focus();\n }\n\n protected _searchNavigate(e: KeyboardEvent) {\n if (e.target === this._searchInput) {\n this._searchInputKey(e);\n return;\n }\n this._searchRowKey(e);\n }\n\n private _searchInputKey(e: KeyboardEvent) {\n if (e.key === 'Enter') e.preventDefault();\n if (!['ArrowDown', 'ArrowUp'].includes(e.key)) return;\n e.preventDefault();\n const rows = this._searchRows();\n this._focusSearchRow(rows[e.key === 'ArrowUp' ? rows.length - 1 : 0]);\n }\n\n private _focusSearchRow(row: HTMLElement) {\n if (row) row.focus();\n }\n\n private _searchRowKey(e: KeyboardEvent) {\n if (['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n this._selectOptionElement(e.target as HTMLElement);\n return;\n }\n const target = Utils.focusTarget([this._searchInput, ...this._searchRows()], e, { ArrowDown: 1, ArrowUp: -1 });\n if (!target) return;\n e.preventDefault();\n if (e.key === 'Home') this._searchRows()[0]?.focus();\n else target.focus();\n }\n\n private _clearSearch() {\n if (!this._searchInput) return;\n this._searchInput.value = '';\n this._filterOptions();\n }\n\n private _resetSearch() {\n if (!this._searchInput) return;\n this.menu?.close();\n this._clearSearch();\n }\n\n private _bindSearchClose(options: Partial<MenuOptions>) {\n const onCloseStart = options.onCloseStart;\n options.onCloseStart = () => {\n this._clearSearch();\n return onCloseStart?.call(this.menu, this.el);\n };\n }\n\n private _initMenu() {\n if (this.el.matches(':disabled')) return;\n const menuOptions = { ...this.options.menuOptions };\n if (this._searchInput) this._bindSearchClose(menuOptions);\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n this._focusMenu();\n this.input.ariaExpanded = 'true';\n if (typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _focusMenu() {\n if (!this._searchInput) return this._focusSelected();\n // Opening can finish after the user has already reached a result.\n if (this.menu.options.autoFocus && !Utils.focusIsIn(this.menuEl)) this._searchInput.focus();\n }\n\n /** Moves focus to the selected row of the opened menu, centred when it scrolls. */\n protected _focusSelected() {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (!selectedOption) return;\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n\n protected _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private get _optionList() {\n return this._searchResults ?? this.menuEl;\n }\n\n protected _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._values.push({ el: realOption as HTMLOptionElement, optionEl: virtualOption });\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this._optionList.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._values.push({ el: child, optionEl: virtualOption });\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._optionList.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n if (this._searchInput) this._filterOptions();\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n this._originalLabels.forEach((original, label) => {\n for (const name of ['for', 'id'] as const) restoreAttribute(label, name, original[name]);\n });\n this._labelPlaceholder?.replaceWith(this.labelEl);\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n const disabled = this.el.matches(':disabled') || realOption.matches(':disabled');\n if (disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n let imageUrl: URL | undefined;\n if (iconUrl) {\n try {\n const url = new URL(iconUrl, this.el.ownerDocument.baseURI);\n if (['http:', 'https:', 'blob:'].includes(url.protocol) ||\n /^data:image\\/(?:avif|bmp|gif|jpeg|png|svg\\+xml|webp|x-icon)(?:;|,)/i.test(url.href)) {\n imageUrl = url;\n }\n } catch { /* Invalid icons must not prevent selection. */ }\n }\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (imageUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = imageUrl.href;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this._optionList.append(li);\n return li;\n }\n\n _setValueToInput() {\n this.input.value = Array.from(this.el.selectedOptions, (option) => option.textContent.trim()).join(', ');\n }\n\n /** Shows each option's selection on its row and checkbox. */\n _setSelectedStates() {\n this._values.forEach(({ el, optionEl }) => {\n optionEl.classList.toggle('selected', el.selected);\n optionEl.ariaSelected = String(el.selected);\n const checkbox = optionEl.querySelector<HTMLInputElement>('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = el.selected;\n });\n }\n\n getSelectedValues() {\n return Array.from(this.el.selectedOptions, (option) => option.value);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;AAoBA,IAAM,YAA+B;AAAA,EACnC,SAAS;AAAA,EACT,aAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,MAAM,EAAE,aAAa,kBAAkB,WAAW,aAAa;AACjE;AAOO,IAAM,cAAN,MAAM,oBAAmB,UAA6B;AAAA,EA+B3D,YAAY,IAAuB,SAAqC;AACtE,UAAM,IAAI,OAAO;AAZnB,SAAQ,kBAAkB,oBAAI,IAAiE;AAI/F,SAAQ,qBAAyC;AAgHjD,+BAAsB,MAAM;AAC1B,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AACxB,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAQ,iBAAiB,CAAC,MAAa;AACrC,UAAI,EAAE,iBAAkB;AACxB,UAAI,CAAC,KAAK,oBAAoB;AAC5B,aAAK,qBAAqB,SAAS,cAAc,OAAO;AACxD,aAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK;AAC7C,aAAK,mBAAmB,YAAY;AACpC,aAAK,mBAAmB,MAAM,QAAQ;AACtC,aAAK,QAAQ,OAAO,KAAK,kBAAkB;AAC3C,aAAK,MAAM;AAAA,UAAa;AAAA,UACtB,CAAC,KAAK,MAAM,aAAa,kBAAkB,GAAG,KAAK,mBAAmB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAAC;AAAA,MACvG;AACA,WAAK,MAAM,cAAc;AACzB,WAAK,qBAAqB;AAAA,IAC5B;AAIA;AAAA;AAAA,SAAQ,qBAAqB,MAAM,eAAe,MAAM;AAEtD,UAAK,KAAK,YAAkC,YAAY,KAAK,EAAE,MAAM,QAAQ,KAAK,GAAG,QAAQ,QAAQ,EAAG,MAAK,MAAM,MAAM;AAAA,IAC3H,CAAC;AAoBD,SAAQ,eAAe,CAAC,MAAa;AACnC,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc,WAAW,MAAM;AAClC,YAAI,CAAC,EAAE,kBAAkB;AACvB,eAAK,aAAa;AAClB,eAAK,oBAAoB;AACzB,eAAK,sBAAsB;AAAA,QAC7B;AAAA,MACF,GAAG,CAAC;AAAA,IACN;AAEA,gCAAuB,CAAC,MAAqB;AAC3C,UAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAS,MAAK,mBAAmB,CAAC;AAAA,IACnE;AAEA,8BAAqB,CAAC,MAAkC;AAGtD,UAAI,CAAE,EAAE,OAAmB,QAAQ,wBAAwB,EAAG,GAAE,eAAe;AAC/E,YAAM,gBAAiB,EAAE,OAAyB,QAAQ,IAAI;AAC9D,WAAK,qBAAqB,aAAa;AACvC,QAAE,gBAAgB;AAAA,IACpB;AAEA,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,UAAI,KAAK,aAAc;AACvB,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAU;AAClC,YAAM,KAAK,OAAO,QAAQ,mBAAmB;AAC7C,UAAI,GAAI,MAAK,MAAM,aAAa,yBAAyB,GAAG,EAAE;AAAA,IAChE;AAwBA,6BAAoB,MAAM;AACxB,UAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ;AACjC,aAAK,iBAAiB;AACtB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AA+JA,SAAQ,iBAAiB,MAAM;AAC7B,YAAM,QAAQ,KAAK,aAAa,MAAM,KAAK,EAAE,YAAY;AACzD,WAAK,cAAc,KAAK;AACxB,WAAK,cAAc,cAAc,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,MAAM,CAAC,SAAS,MAAM,IAAI,KAAK,KAAK,QAAQ,KAAK;AAChH,WAAK,MAAM,gBAAgB,uBAAuB;AAClD,WAAK,MAAM,sBAAsB;AAAA,IACnC;AAqBA,SAAQ,uBAAuB,CAAC,MAAqB;AACnD,QAAE,gBAAgB;AAClB,UAAI,CAAC,MAAM,SAAS,CAAC,KAAK,MAAM,YAAY,CAAC,EAAG;AAChD,UAAI,KAAK,kBAAkB,CAAC,EAAG;AAC/B,WAAK,gBAAgB,CAAC;AAAA,IACxB;AA5YE,QAAI,KAAK,GAAG,UAAU,SAAS,iBAAiB,KAAM,eAAe,eAAc,KAAK,GAAG,QAAQ,aAAa,GAAI;AAClH,WAAK,GAAG,WAAW,GAAG,IAAI;AAC1B;AAAA,IACF;AAEA,SAAK,aAAa,KAAK,GAAG;AAC1B,SAAK,cAAc,KAAK,WAAW;AACnC,SAAK,iBAAiB,KAAK,GAAG;AAC9B,SAAK,GAAG,WAAW;AACnB,SAAK,UAAU,CAAC;AAChB,SAAK,kBAAkB;AACvB,SAAK,WAAW;AAChB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAO;AAAA,EACT;AAAA,EAIU,aAAa;AACrB,WAAO,KAAK,gBAAgB,eAAc,KAAK,QAAQ;AAAA,EACzD;AAAA,EAEA,UAAU;AACR,SAAK,QAAQ,MAAM;AAGnB,QAAI,CAAC,KAAK,OAAQ;AAClB,iBAAa,KAAK,WAAW;AAC7B,SAAK,sBAAsB;AAI3B,SAAK,MAAM,QAAQ;AACnB,SAAK,YAAY;AACjB,SAAK,GAAG,WAAW,KAAK;AACxB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU;AACR,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,UAAU;AACf,UAAM,OAAO,KAAK,OAAO,YAAY;AACrC,UAAM,UAAU,KAAK,QAAQ,KAAK,WAAS,MAAM,SAAS,SAAS,KAAK,aAAa,CAAC,GAAG;AACzF,SAAK,MAAM,WAAW,KAAK,GAAG,QAAQ,WAAW;AACjD,SAAK,QAAQ,UAAU,OAAO,YAAY,KAAK,MAAM,QAAQ;AAC7D,QAAI,KAAK,MAAM,SAAU,MAAK,MAAM,MAAM;AAAA,aACjC,CAAC,KAAK,KAAM,MAAK,UAAU;AACpC,SAAK,MAAM,gBAAgB,uBAAuB;AAClD,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,QAAI,KAAK,KAAM,MAAK,KAAK,eAAe;AACxC,QAAI,KAAK,MAAM,QAAQ;AACrB,WAAK,KAAK,sBAAsB;AAChC,WAAK,oBAAoB,OAAO;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,oBAAoB,QAA2B;AACrD,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,SAAS,MAAM,OAAO,UAAU,SAAS,aAAa,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ;AAC/H,KAAC,KAAK,CAAC,KAAK,KAAK,gBAAgB,KAAK,OAAO,MAAM;AAAA,EACrD;AAAA,EAEA,sBAAsB;AACpB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,iBAAiB,UAAU,KAAK,qBAAqB,EAAE,OAAO,CAAC;AACvE,SAAK,GAAG,iBAAiB,WAAW,KAAK,gBAAgB,EAAE,OAAO,CAAC;AACnE,SAAK,GAAG,iBAAiB,SAAS,KAAK,oBAAoB,EAAE,OAAO,CAAC;AACrE,SAAK,MAAM,iBAAiB,SAAS,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACvE,SAAK,OAAO,iBAAiB,WAAW,KAAK,oBAAoB,EAAE,OAAO,CAAC;AAC3E,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,YAAY;AAClB,SAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,SAAK,QAAQ,KAAK,GAAG;AACrB,SAAK,OAAO,iBAAiB,SAAS,KAAK,cAAc,EAAE,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGU,uBAAuB;AAC/B,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,OAAO,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AAChE,SAAG,iBAAiB,SAAS,KAAK,oBAAoB,EAAE,OAAO,CAAC;AAChE,SAAG,iBAAiB,WAAW,KAAK,sBAAsB,EAAE,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EA8BQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,QAAI,KAAK,GAAG,gBAAgB,CAAC,KAAK,GAAG,SAAS,OAAO;AACnD,WAAK,mBAAmB,cAAc,KAAK,GAAG;AAAA,IAChD,MAAO,MAAK,sBAAsB;AAAA,EACpC;AAAA,EAEQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,UAAM,eAAe,KAAK,MAAM,aAAa,kBAAkB,GAAG,MAAM,KAAK,EAC1E,OAAO,QAAM,OAAO,KAAK,mBAAmB,EAAE,EAAE,KAAK,GAAG;AAC3D,QAAI,aAAc,MAAK,MAAM,aAAa,oBAAoB,YAAY;AAAA,QACrE,MAAK,MAAM,gBAAgB,kBAAkB;AAClD,SAAK,MAAM,cAAc,KAAK,GAAG;AACjC,SAAK,mBAAmB,OAAO;AAC/B,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAkCA,qBAAqB,eAA4B;AAC/C,QAAI,cAAc,OAAQ;AAC1B,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG;AAClC,QACE,CAAC,cAAc,UAAU,SAAS,UAAU,KAC5C,CAAC,cAAc,UAAU,SAAS,UAAU,GAC5C;AACA,YAAM,QAAQ,KAAK,QAAQ,KAAK,CAACA,WAAUA,OAAM,aAAa,aAAa;AAC3E,UAAI,CAAC,SAAS,MAAM,GAAG,QAAQ,WAAW,EAAG;AAC7C,YAAM,yBAAyB,KAAK,UAAU,KAAK,kBAAkB,CAAC;AAEtE,YAAM,GAAG,WAAW,CAAC,KAAK,cAAc,CAAC,MAAM,GAAG;AAClD,WAAK,oBAAoB;AACzB,UAAI,KAAK,UAAU,KAAK,kBAAkB,CAAC,MAAM;AAC/C,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAEF,UAAI,CAAC,KAAK,WAAY,MAAK,mBAAmB;AAAA,IAChD;AAAA,EACF;AAAA,EASQ,qBAAqB;AAC3B,SAAK,MAAM,MAAM;AACjB,QAAI,KAAK,aAAc,MAAK,MAAM,MAAM;AAAA,EAC1C;AAAA,EAEA,aAAa;AAIX,SAAK,UAAU,KAAK,GAAG,SAAS,CAAC,KAAK;AACtC,UAAM,KAAK,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,WAAS;AAChD,WAAK,gBAAgB,IAAI,OAAO,EAAE,KAAK,MAAM,aAAa,KAAK,GAAG,IAAI,MAAM,aAAa,IAAI,EAAE,CAAC;AAAA,IAClG,CAAC;AACD,QAAI,KAAK,WAAW,CAAC,KAAK,GAAG,QAAQ,OAAO,GAAG;AAC7C,WAAK,oBAAoB,SAAS,cAAc,EAAE;AAClD,WAAK,QAAQ,OAAO,KAAK,iBAAiB;AAAA,IAC5C;AAEA,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG,MAAK,QAAQ,UAAU,IAAI,UAAU;AAEvE,SAAK,SAAS,SAAS,cAAc,KAAK,cAAc,QAAQ,MAAM;AAEtE,SAAK,OAAO,UAAU;AACtB,SAAK,OAAO,KAAK,kBAAkB,MAAM,KAAK,CAAC;AAC/C,SAAK,OAAO,aAAa,QAAQ,SAAS;AAC1C,SAAK,OAAO,sBAAsB,KAAK,WAAW,SAAS;AAC3D,QAAI,KAAK,WAAY,MAAK,OAAO,UAAU,IAAI,sBAAsB;AACrE,SAAK,cAAc;AACnB,SAAK,QAAQ,OAAO,KAAK,MAAM;AAE/B,SAAK,YAAY;AACjB,QAAI,KAAK,YAAa,MAAK,aAAa;AACxC,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,QAAI,KAAK,kBAAmB,MAAK,MAAM,MAAM,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEQ,gBAAgB;AACtB,UAAM,SAAS,KAAK,GAAG;AACvB,UAAM,QACJ,UACA,OAAO,QAAQ,QAAQ,KACvB,CAAC,OAAO,cAAc,uBAAuB,KAC7C,CAAC,OAAO,cAAc,mCAAmC;AAC3D,QAAI,OAAO;AACT,WAAK,UAAU;AACf,WAAK,kBAAkB;AAAA,IACzB,OAAO;AACL,WAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,WAAK,QAAQ,UAAU,IAAI,OAAO;AAClC,WAAK,kBAAkB;AACvB,WAAK,GAAG,OAAO,KAAK,OAAO;AAAA,IAC7B;AACA,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,WAAK,QAAQ,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,aAAa;AACrC,cAAU,aAAa;AACvB,SAAK,GAAG,OAAO,SAAS;AACxB,cAAU,YAAY,KAAK,EAAE;AAC7B,QAAI,KAAK,gBAAiB,MAAK,QAAQ,OAAO,SAAS;AAAA,EACzD;AAAA,EAEQ,cAAc;AACpB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,KAAK,kBAAkB,MAAM,KAAK;AAG7C,SAAK,MAAM,UAAU,IAAI,gBAAgB,aAAa;AACtD,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,aAAa,eAAe,KAAK,OAAO,EAAE;AACrD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe,KAAK,GAAG,aAAa,UAAU,EAAE,SAAS;AACpE,SAAK,MAAM,WAAW,KAAK,GAAG,QAAQ,WAAW;AACjD,SAAK,MAAM,aAAa,YAAY,KAAK,eAAe,SAAS,CAAC;AAElE,UAAM,QAAQ,KAAK,GAAG;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,KAAK,WAAW,OAAO,EAAG,MAAK,MAAM,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAClF;AAEA,SAAK,MAAM,aAAa,QAAQ,UAAU;AAC1C,SAAK,MAAM,aAAa,iBAAiB,SAAS;AAClD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,aAAa,iBAAiB,KAAK,OAAO,EAAE;AACvD,SAAK,MAAM,cAAc;AAEzB,SAAK,gBAAgB,QAAQ,CAAC,GAAG,UAAU;AAAE,YAAM,UAAU,KAAK,MAAM;AAAA,IAAI,CAAC;AAG7E,QAAI,KAAK,qBAAqB,KAAK,gBAAgB,OAAO,KAAK,CAAC,KAAK,MAAM,aAAa,YAAY,KAAK,CAAC,KAAK,MAAM,aAAa,iBAAiB,GAAG;AACpJ,WAAK,MAAM,aAAa,mBAAmB,MAAM,KAAK,KAAK,gBAAgB,KAAK,GAAG,CAAC,OAAO,UAAU;AACnG,YAAI,CAAC,MAAM,GAAI,OAAM,KAAK,GAAG,KAAK,MAAM,EAAE,UAAU,KAAK;AACzD,eAAO,MAAM;AAAA,MACf,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACd;AAEA,SAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,cAAc;AACpB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,UAAU,IAAI,OAAO;AAC3B,UAAM,aAAa,eAAe,MAAM;AACxC,SAAK,QAAQ,QAAQ,KAAK;AAAA,EAC5B;AAAA,EAEQ,eAAe;AACrB,SAAK,OAAO,UAAU,IAAI,qBAAqB;AAC/C,SAAK,OAAO,aAAa,QAAQ,QAAQ;AACzC,SAAK,OAAO,gBAAgB,sBAAsB;AAClD,SAAK,OAAO,UAAU,OAAO,sBAAsB;AACnD,SAAK,MAAM,aAAa,iBAAiB,QAAQ;AACjD,SAAK,iBAAiB,KAAK,YAAY;AACvC,SAAK,eAAe,SAAS,cAAc,OAAO;AAClD,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,cAAc,KAAK,QAAQ,KAAK;AAClD,SAAK,aAAa,aAAa,cAAc,KAAK,QAAQ,KAAK,WAAW;AAC1E,SAAK,gBAAgB,SAAS,cAAc,KAAK;AACjD,SAAK,cAAc,aAAa,QAAQ,QAAQ;AAChD,SAAK,OAAO,OAAO,KAAK,cAAc,KAAK,eAAe,KAAK,cAAc;AAC7E,SAAK,aAAa,iBAAiB,SAAS,KAAK,gBAAgB,EAAE,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAChG,SAAK,OAAO,iBAAiB,WAAW,KAAK,sBAAsB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,SAAS,KAAK,CAAC;AACjH,SAAK,YAAY;AACjB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEU,cAA2B;AACnC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,KAAK,KAAK,OAAO,KAAK;AAC3B,SAAK,aAAa,QAAQ,SAAS;AACnC,SAAK,sBAAsB,KAAK,WAAW,SAAS;AACpD,SAAK,UAAU,OAAO,wBAAwB,KAAK,UAAU;AAC7D,SAAK,OAAO,GAAG,KAAK,OAAO,UAAU;AACrC,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc;AACpB,UAAM,SAAS,MAAM,KAAK,KAAK,gBAAgB,KAAK,GAAG,CAAC,OAAO,UAAU;AACvE,UAAI,CAAC,MAAM,GAAI,OAAM,KAAK,KAAK,MAAM,KAAK,YAAY;AACtD,aAAO,MAAM;AAAA,IACf,CAAC,EAAE,KAAK,GAAG;AACX,UAAM,YAAY,KAAK,MAAM,aAAa,iBAAiB,IAAI,oBAAoB;AACnF,UAAM,OAAO,KAAK,MAAM,aAAa,SAAS;AAC9C,KAAC,KAAK,QAAQ,KAAK,cAAc,EAAE,QAAQ,QAAM,GAAG,aAAa,OAAO,YAAY,mBAAmB,QAAQ,MAAM,CAAC;AAAA,EACxH;AAAA,EAUU,cAAc,OAAe;AACrC,SAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,SAAS,MAAM;AACzC,eAAS,SAAS,CAAC,GAAG,YAAY,KAAK,EAAE,YAAY,EAAE,SAAS,KAAK;AACrE,eAAS,WAAW,SAAS,UAAU,GAAG,QAAQ,WAAW,IAAI,KAAK;AAAA,IACxE,CAAC;AACD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB;AACtB,eAAW,SAAS,KAAK,eAAe,iBAA8B,sBAAsB,GAAG;AAC7F,YAAM,MAAM,IAAI,IAAI,MAAM,aAAa,WAAW,EAAE,MAAM,GAAG,CAAC;AAC9D,YAAM,SAAS,CAAC,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,MAAM,IAAI,IAAI,SAAS,EAAE,KAAK,CAAC,SAAS,MAAM;AAAA,IAC9F;AAAA,EACF;AAAA,EAEU,cAAc;AACtB,WAAO,KAAK,QAAQ,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ,EAAE,OAAO,SAAO,IAAI,aAAa,EAAE;AAAA,EACvF;AAAA,EASQ,kBAAkB,GAAkB;AAC1C,QAAI,EAAE,QAAQ,OAAO;AACnB,WAAK,WAAW,CAAC;AACjB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,SAAU,QAAO;AAC/B,MAAE,eAAe;AACjB,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,GAAkB;AACnC,QAAI,EAAE,UAAU;AACd,QAAE,eAAe;AACjB,WAAK,mBAAmB,CAAC;AACzB;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,YAAY,EAAE,CAAC;AAClC,QAAI,EAAE,WAAW,KAAK,gBAAgB,OAAO;AAC3C,QAAE,eAAe;AACjB,YAAM,MAAM;AACZ;AAAA,IACF;AAEA,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,mBAAmB,GAAkB;AAC3C,QAAI,EAAE,WAAW,KAAK,aAAc,MAAK,mBAAmB;AAAA,QACvD,MAAK,aAAa,MAAM;AAAA,EAC/B;AAAA,EAEU,gBAAgB,GAAkB;AAC1C,QAAI,EAAE,WAAW,KAAK,cAAc;AAClC,WAAK,gBAAgB,CAAC;AACtB;AAAA,IACF;AACA,SAAK,cAAc,CAAC;AAAA,EACtB;AAAA,EAEQ,gBAAgB,GAAkB;AACxC,QAAI,EAAE,QAAQ,QAAS,GAAE,eAAe;AACxC,QAAI,CAAC,CAAC,aAAa,SAAS,EAAE,SAAS,EAAE,GAAG,EAAG;AAC/C,MAAE,eAAe;AACjB,UAAM,OAAO,KAAK,YAAY;AAC9B,SAAK,gBAAgB,KAAK,EAAE,QAAQ,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,EACtE;AAAA,EAEQ,gBAAgB,KAAkB;AACxC,QAAI,IAAK,KAAI,MAAM;AAAA,EACrB;AAAA,EAEQ,cAAc,GAAkB;AACtC,QAAI,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG;AAClC,QAAE,eAAe;AACjB,WAAK,qBAAqB,EAAE,MAAqB;AACjD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,YAAY,CAAC,KAAK,cAAc,GAAG,KAAK,YAAY,CAAC,GAAG,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,CAAC;AAC7G,QAAI,CAAC,OAAQ;AACb,MAAE,eAAe;AACjB,QAAI,EAAE,QAAQ,OAAQ,MAAK,YAAY,EAAE,CAAC,GAAG,MAAM;AAAA,QAC9C,QAAO,MAAM;AAAA,EACpB;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,aAAc;AACxB,SAAK,aAAa,QAAQ;AAC1B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,aAAc;AACxB,SAAK,MAAM,MAAM;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,iBAAiB,SAA+B;AACtD,UAAM,eAAe,QAAQ;AAC7B,YAAQ,eAAe,MAAM;AAC3B,WAAK,aAAa;AAClB,aAAO,cAAc,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,YAAY;AAClB,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG;AAClC,UAAM,cAAc,EAAE,GAAG,KAAK,QAAQ,YAAY;AAClD,QAAI,KAAK,aAAc,MAAK,iBAAiB,WAAW;AACxD,gBAAY,eAAe;AAC3B,UAAM,gBAAgB,YAAY;AAClC,UAAM,iBAAiB,YAAY;AACnC,gBAAY,YAAY,MAAM;AAC5B,WAAK,WAAW;AAChB,WAAK,MAAM,eAAe;AAC1B,UAAI,OAAO,kBAAkB;AAC3B,sBAAc,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IACzC;AACA,gBAAY,aAAa,MAAM;AAC7B,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM,gBAAgB,uBAAuB;AAClD,UAAI,OAAO,mBAAmB;AAC5B,uBAAe,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IAC1C;AACA,gBAAY,eAAe;AAC3B,SAAK,OAAO,KAAK,KAAK,KAAK,OAAO,WAAW;AAAA,EAC/C;AAAA,EAEQ,aAAa;AACnB,QAAI,CAAC,KAAK,aAAc,QAAO,KAAK,eAAe;AAEnD,QAAI,KAAK,KAAK,QAAQ,aAAa,CAAC,MAAM,UAAU,KAAK,MAAM,EAAG,MAAK,aAAa,MAAM;AAAA,EAC5F;AAAA;AAAA,EAGU,iBAAiB;AACzB,UAAM,iBAAiB,KAAK,OAAO,cAAc,WAAW;AAC5D,QAAI,CAAC,eAAgB;AACrB,SAAK,KAAK,eAAe,CAAC,GAAG,eAAe,WAAW,QAAQ,EAAE,QAAQ,cAAc;AACvF,SAAK,KAAK,kBAAkB;AAC5B,QAAI,KAAK,KAAK,cAAc;AAC1B,UAAI,eACF,eAAe,sBAAsB,EAAE,MACvC,KAAK,OAAO,sBAAsB,EAAE;AACtC,sBAAgB,KAAK,OAAO,eAAe;AAC3C,WAAK,OAAO,YAAY;AAAA,IAC1B;AACA,QAAI,eAAe,GAAI,MAAK,MAAM,aAAa,yBAAyB,eAAe,EAAE;AAAA,EAC3F;AAAA,EAEU,iBAA8D;AACtE,WACE,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;AAAA,EAE3F;AAAA,EAEA,IAAY,cAAc;AACxB,WAAO,KAAK,kBAAkB,KAAK;AAAA,EACrC;AAAA,EAEU,gBAAgB;AACxB,SAAK,gBAAgB,KAAK,eAAe;AACzC,SAAK,UAAU,CAAC;AAChB,SAAK,cAAc,QAAQ,CAAC,eAAe;AACzC,UAAI,WAAW,YAAY,UAAU;AACnC,cAAM,gBAAgB,KAAK;AAAA,UACzB;AAAA,UACA,KAAK,aAAa,aAAa;AAAA,QACjC;AACA,aAAK,QAAQ,KAAK,EAAE,IAAI,YAAiC,UAAU,cAAc,CAAC;AAAA,MACpF,WAAW,WAAW,YAAY,YAAY;AAC5C,cAAM,UAAU,eAAe,MAAM,KAAK;AAC1C,cAAM,cAAc,SAAS,cAAc,IAAI;AAC/C,oBAAY,UAAU,IAAI,UAAU;AACpC,oBAAY,WAAW;AACvB,oBAAY,aAAa,QAAQ,OAAO;AACxC,oBAAY,aAAa,mBAAmB,OAAO;AAInD,cAAM,aAAa,SAAS,cAAc,MAAM;AAChD,mBAAW,KAAK;AAChB,mBAAW,aAAa,QAAQ,cAAc;AAC9C,mBAAW,cAAc,WAAW,aAAa,OAAO,KAAK;AAC7D,oBAAY,gBAAgB,UAAU;AACtC,aAAK,YAAY,OAAO,WAAW;AAEnC,cAAM,gBAAgB,CAAC;AACvB,cAAM,gBACJ,MAAM,KAAK,WAAW,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,YAAY,QAAQ;AAExE,sBAAc,QAAQ,CAAC,UAAU;AAC/B,gBAAM,gBAAgB,KAAK,+BAA+B,OAAO,iBAAiB;AAClF,wBAAc,KAAK,cAAc,EAAE;AACnC,eAAK,QAAQ,KAAK,EAAE,IAAI,OAAO,UAAU,cAAc,CAAC;AAAA,QAC1D,CAAC;AACD,oBAAY,aAAa,aAAa,cAAc,KAAK,GAAG,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB;AACxB,SAAK,YAAY,gBAAgB;AACjC,SAAK,cAAc;AACnB,SAAK,qBAAqB;AAC1B,SAAK,MAAM,mBAAmB;AAC9B,QAAI,KAAK,aAAc,MAAK,eAAe;AAAA,EAC7C;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,cAAc,iBAAiB,GAAG,OAAO;AACvD,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ,OAAO;AACpB,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,MAAM,UAAU,SAAS,aAAa,EAAG,MAAK,YAAY,KAAK,EAAE;AACrE,SAAK,gBAAgB,QAAQ,CAAC,UAAU,UAAU;AAChD,iBAAW,QAAQ,CAAC,OAAO,IAAI,EAAY,kBAAiB,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,IACzF,CAAC;AACD,SAAK,mBAAmB,YAAY,KAAK,OAAO;AAChD,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,iBAAiB;AACxB,WAAK,QAAQ,YAAY,KAAK,EAAE;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,UAAU,OAAO,UAAU;AACxC,UAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,aAAK,QAAQ,UAAU,OAAO,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,+BACE,YACA,MACA;AACA,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,KAAK,mBAAmB,MAAM,KAAK;AACtC,OAAG,aAAa,QAAQ,QAAQ;AAChC,OAAG,WAAW;AACd,UAAM,WAAW,KAAK,GAAG,QAAQ,WAAW,KAAK,WAAW,QAAQ,WAAW;AAC/E,QAAI,UAAU;AACZ,SAAG,UAAU,IAAI,UAAU;AAC3B,SAAG,eAAe;AAClB,SAAG,WAAW;AAAA,IAChB;AACA,QAAI,SAAS,kBAAmB,IAAG,UAAU,IAAI,IAAI;AAKrD,UAAM,aAAa,WAAW;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,KAAK,cAAc,CAAC,UAAU;AAChC,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,eAAS,WAAW;AACpB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,cAAc;AACxB,YAAM,OAAO,UAAU,SAAS;AAChC,WAAK,YAAY,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AACA,OAAG,YAAY,IAAI;AAEnB,UAAM,UAAU,WAAW,aAAa,WAAW;AACnD,QAAI;AACJ,QAAI,SAAS;AACX,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,SAAS,KAAK,GAAG,cAAc,OAAO;AAC1D,YAAI,CAAC,SAAS,UAAU,OAAO,EAAE,SAAS,IAAI,QAAQ,KACpD,sEAAsE,KAAK,IAAI,IAAI,GAAG;AACtF,qBAAW;AAAA,QACb;AAAA,MACF,QAAQ;AAAA,MAAkD;AAAA,IAC5D;AAGA,UAAM,UAAU,WAAW,aAAa,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3E,QAAI,UAAU;AACZ,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,SAAS,OAAQ,KAAI,UAAU,IAAI,GAAG,OAAO;AACjD,UAAI,MAAM,SAAS;AACnB,UAAI,aAAa;AACjB,SAAG,QAAQ,GAAG;AAAA,IAChB;AACA,SAAK,YAAY,OAAO,EAAE;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB;AACjB,SAAK,MAAM,QAAQ,MAAM,KAAK,KAAK,GAAG,iBAAiB,CAAC,WAAW,OAAO,YAAY,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EACzG;AAAA;AAAA,EAGA,qBAAqB;AACnB,SAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,SAAS,MAAM;AACzC,eAAS,UAAU,OAAO,YAAY,GAAG,QAAQ;AACjD,eAAS,eAAe,OAAO,GAAG,QAAQ;AAC1C,YAAM,WAAW,SAAS,cAAgC,wBAAwB;AAClF,UAAI,SAAU,UAAS,UAAU,GAAG;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB;AAClB,WAAO,MAAM,KAAK,KAAK,GAAG,iBAAiB,CAAC,WAAW,OAAO,KAAK;AAAA,EACrE;AACF;AAjtBa,YAuDJ,MAAM;AAvDR,IAAM,aAAN;",
6
+ "names": ["value"]
7
+ }
@@ -0,0 +1,445 @@
1
+ import {
2
+ Component
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ restoreAttribute
7
+ } from "./chunk-ZVLOUDIJ.mjs";
8
+
9
+ // src/ts/components/tooltip.ts
10
+ var anchorSupported = typeof CSS !== "undefined" && !!CSS.supports?.("anchor-name: --a");
11
+ var ANCHOR_PLACEMENT = {
12
+ top: ["top", "justify-self"],
13
+ right: ["right", "align-self"],
14
+ left: ["left", "align-self"],
15
+ bottom: ["bottom", "justify-self"]
16
+ };
17
+ var LONG_PRESS = 500;
18
+ var TOUCH_LINGER = 1500;
19
+ var TOUCH_ECHO = 800;
20
+ var PRESS_CLICK = 400;
21
+ var SKIP_DELAY_WINDOW = 300;
22
+ var skipDelayFrom = -Infinity;
23
+ var skipDelayUntil = -Infinity;
24
+ var skippingDelay = (now) => now >= skipDelayFrom && now < skipDelayUntil;
25
+ function startSkipDelay(exitDelay) {
26
+ const now = Date.now();
27
+ const end = now + exitDelay + SKIP_DELAY_WINDOW;
28
+ skipDelayUntil = skippingDelay(now) ? Math.max(skipDelayUntil, end) : end;
29
+ skipDelayFrom = now;
30
+ }
31
+ var _defaults = {
32
+ exitDelay: 200,
33
+ enterDelay: 0,
34
+ text: "",
35
+ margin: 4,
36
+ inDuration: 250,
37
+ outDuration: 200,
38
+ position: "bottom",
39
+ transitionMovement: 10,
40
+ opacity: 1,
41
+ openOnClick: false
42
+ };
43
+ var _Tooltip = class _Tooltip extends Component {
44
+ constructor(el, options) {
45
+ super(el, options);
46
+ /** The last click on the trigger or inside the tooltip, which the document listener leaves alone. */
47
+ this._insideClick = null;
48
+ /** When the last touch began or ended, to tell its mouse events from a mouse. */
49
+ this._lastTouch = -Infinity;
50
+ /** Whether a long press showed the tooltip, until it closes or a mouse hovers. */
51
+ this._touchShown = false;
52
+ /** Until when a click is the release of a long press, not a tap. */
53
+ this._swallowClickUntil = -Infinity;
54
+ // Whether the last animation showed the tooltip, so each change is reported once.
55
+ this._shown = false;
56
+ /**
57
+ * Show tooltip.
58
+ */
59
+ this.open = (isManual = true) => {
60
+ if (this.isOpen) return;
61
+ clearTimeout(this._exitDelayTimeout);
62
+ clearTimeout(this._animationTimeout);
63
+ this.isOpen = true;
64
+ const { signal } = this._events;
65
+ this.el.ownerDocument.addEventListener("keydown", this._handleKeydown, { capture: true, signal });
66
+ if (this.options.openOnClick) {
67
+ this._outsideTimeout = setTimeout(() => this.el.ownerDocument.addEventListener("click", this._handleDocumentClick, { signal }));
68
+ }
69
+ this.options = { ...this.options, ...this._getAttributeOptions() };
70
+ this._updateTooltipContent();
71
+ this._setEnterDelayTimeout(isManual);
72
+ };
73
+ /**
74
+ * Hide tooltip.
75
+ */
76
+ this.close = () => {
77
+ clearTimeout(this._pressTimeout);
78
+ clearTimeout(this._lingerTimeout);
79
+ this._touchShown = false;
80
+ if (!this.isOpen) return;
81
+ if (this._shown) startSkipDelay(this.options.exitDelay);
82
+ this.isHovered = false;
83
+ this.isFocused = false;
84
+ this.isOpen = false;
85
+ this.el.ownerDocument.removeEventListener("keydown", this._handleKeydown, true);
86
+ clearTimeout(this._outsideTimeout);
87
+ this.el.ownerDocument.removeEventListener("click", this._handleDocumentClick);
88
+ clearTimeout(this._enterDelayTimeout);
89
+ this._setExitDelayTimeout();
90
+ };
91
+ this._handleMouseEnter = () => {
92
+ if (this.options.openOnClick || performance.now() - this._lastTouch < TOUCH_ECHO) return;
93
+ this._touchShown = false;
94
+ this.isHovered = true;
95
+ this.open(false);
96
+ };
97
+ // pointerenter comes before any compatibility mouseenter, in whatever order
98
+ // a browser sends those, so the touch is known before its mouse events.
99
+ this._handlePointerEnter = (e) => {
100
+ this._touched(e);
101
+ };
102
+ /** A touch held for LONG_PRESS shows the tooltip, unless it turns into a scroll first. */
103
+ this._handlePointerDown = (e) => {
104
+ if (!this._longPress(e)) return;
105
+ clearTimeout(this._lingerTimeout);
106
+ clearTimeout(this._pressTimeout);
107
+ this._pressTimeout = setTimeout(() => {
108
+ this.isHovered = true;
109
+ this._showNow();
110
+ this._touchShown = true;
111
+ }, LONG_PRESS);
112
+ };
113
+ /** The finger lifted: a press too short stays a tap, and a tooltip it showed lingers for TOUCH_LINGER. */
114
+ this._handlePointerEnd = (e) => {
115
+ if (!this._longPress(e)) return;
116
+ clearTimeout(this._pressTimeout);
117
+ if (this._touchShown) this._swallowClickUntil = performance.now() + PRESS_CLICK;
118
+ if (!this.isOpen) return;
119
+ this.isHovered = false;
120
+ this._lingerTimeout = setTimeout(() => this.isHovered || this.isFocused || this.close(), TOUCH_LINGER);
121
+ };
122
+ /**
123
+ * A click tooltip toggles. Otherwise the click a long press's release sends
124
+ * would press the button or follow the link, so it is consumed.
125
+ */
126
+ this._handleClick = (e) => {
127
+ if (this.options.openOnClick) return this._toggle(e);
128
+ if (performance.now() > this._swallowClickUntil) return;
129
+ this._swallowClickUntil = -Infinity;
130
+ e.preventDefault();
131
+ e.stopImmediatePropagation();
132
+ };
133
+ // Marked rather than found on the composed path, which a document listener
134
+ // cannot see into when the tooltip sits in a closed shadow root.
135
+ this._handleTooltipClick = (e) => {
136
+ this._insideClick = e;
137
+ };
138
+ this._handleDocumentClick = (e) => {
139
+ if (e !== this._insideClick) this._hideNow();
140
+ };
141
+ /**
142
+ * The browser took the touch to scroll: no tooltip opens, not even one
143
+ * waiting out enterDelay, and one the touch showed closes at once.
144
+ */
145
+ this._handlePointerCancel = (e) => {
146
+ if (!this._longPress(e)) return;
147
+ clearTimeout(this._pressTimeout);
148
+ if (!this._touchShown) return;
149
+ this.isHovered = false;
150
+ if (!this.isFocused) this.close();
151
+ };
152
+ this._handleMouseLeave = (event) => {
153
+ if (this.options.openOnClick || this._holds(event.relatedTarget)) return;
154
+ this.isHovered = false;
155
+ if (!this.isFocused) this.close();
156
+ };
157
+ this._handleKeydown = (event) => {
158
+ if (event.key !== "Escape" || !this.isOpen) return;
159
+ if (Utils.focusIsIn(this.el, this.tooltipEl)) {
160
+ event.preventDefault();
161
+ event.stopPropagation();
162
+ }
163
+ this._hideNow();
164
+ };
165
+ // Focus opens the tooltip only when it arrived by keyboard: a pointer press
166
+ // on the trigger also focuses it, and _handleMouseEnter already covers that.
167
+ this._handleFocus = (event) => {
168
+ if (!this.options.openOnClick && event.target.matches(":focus-visible")) {
169
+ this.isFocused = true;
170
+ this.open(false);
171
+ }
172
+ };
173
+ this._handleBlur = (event) => {
174
+ const next = event.relatedTarget;
175
+ if (this._holds(next)) return;
176
+ if (this.options.openOnClick) return this._blurClickTooltip(next);
177
+ this.isFocused = false;
178
+ if (!this.isHovered) this.close();
179
+ };
180
+ this.options = {
181
+ ..._Tooltip.defaults,
182
+ ...this._getAttributeOptions(),
183
+ ...options
184
+ };
185
+ this.isOpen = false;
186
+ this.isHovered = false;
187
+ this.isFocused = false;
188
+ this._appendTooltipEl();
189
+ this._setupEventHandlers();
190
+ }
191
+ static get defaults() {
192
+ return _defaults;
193
+ }
194
+ destroy() {
195
+ clearTimeout(this._enterDelayTimeout);
196
+ clearTimeout(this._exitDelayTimeout);
197
+ clearTimeout(this._animationTimeout);
198
+ clearTimeout(this._pressTimeout);
199
+ clearTimeout(this._lingerTimeout);
200
+ clearTimeout(this._outsideTimeout);
201
+ this.isOpen = false;
202
+ this.isHovered = false;
203
+ this.isFocused = false;
204
+ const descriptions = this.el.getAttribute("aria-describedby")?.split(/\s+/);
205
+ if (descriptions?.includes(this.tooltipEl.id)) {
206
+ const remaining = descriptions.filter((id) => id && id !== this.tooltipEl.id).join(" ");
207
+ if (remaining) this.el.setAttribute("aria-describedby", remaining);
208
+ else this.el.removeAttribute("aria-describedby");
209
+ }
210
+ if (this._originalContent) {
211
+ const { el, marker, display, priority, hidden, contentClass } = this._originalContent;
212
+ el.style.setProperty("display", display, priority);
213
+ restoreAttribute(el, "hidden", hidden);
214
+ el.classList.toggle("tooltip-content", contentClass);
215
+ if (!el.className) el.removeAttribute("class");
216
+ marker.replaceWith(el);
217
+ this._originalContent = null;
218
+ }
219
+ this.tooltipEl.remove();
220
+ Utils.setAnchorName(this.el, `--${this.tooltipEl.id}`, false);
221
+ super.destroy();
222
+ }
223
+ _appendTooltipEl() {
224
+ this.tooltipEl = document.createElement("div");
225
+ this.tooltipEl.classList.add("tooltip");
226
+ this.tooltipEl.id = `tooltip-${Utils.guid()}`;
227
+ this.tooltipEl.setAttribute("role", "tooltip");
228
+ this.el.setAttribute("aria-describedby", [this.el.getAttribute("aria-describedby"), this.tooltipEl.id].filter(Boolean).join(" "));
229
+ const richContentEl = this.options.tooltipId ? Utils.getElementById(this.el, this.options.tooltipId) : null;
230
+ if (this.options.tooltipId && !richContentEl) {
231
+ console.error(`Tooltip: no element with id "${this.options.tooltipId}"; showing the text tooltip instead.`);
232
+ }
233
+ const tooltipContentEl = richContentEl ?? document.createElement("div");
234
+ if (richContentEl) {
235
+ this.tooltipEl.classList.add("rich");
236
+ const marker = document.createComment("");
237
+ tooltipContentEl.before(marker);
238
+ this._originalContent = {
239
+ el: tooltipContentEl,
240
+ marker,
241
+ display: tooltipContentEl.style.display,
242
+ priority: tooltipContentEl.style.getPropertyPriority("display"),
243
+ hidden: tooltipContentEl.getAttribute("hidden"),
244
+ contentClass: tooltipContentEl.classList.contains("tooltip-content")
245
+ };
246
+ tooltipContentEl.removeAttribute("hidden");
247
+ }
248
+ tooltipContentEl.style.display = "";
249
+ tooltipContentEl.classList.add("tooltip-content");
250
+ this._setTooltipContent(tooltipContentEl);
251
+ this.tooltipEl.appendChild(tooltipContentEl);
252
+ Utils.portalRoot(this.el).appendChild(this.tooltipEl);
253
+ }
254
+ _setTooltipContent(tooltipContentEl) {
255
+ if (this._originalContent) return;
256
+ tooltipContentEl.innerText = this.options.text;
257
+ }
258
+ _updateTooltipContent() {
259
+ this._setTooltipContent(this.tooltipEl.querySelector(".tooltip-content"));
260
+ }
261
+ _setupEventHandlers() {
262
+ const { signal } = this._events;
263
+ const capture = { capture: true, signal };
264
+ for (const el of [this.el, this.tooltipEl]) {
265
+ el.addEventListener("mouseenter", this._handleMouseEnter, { signal });
266
+ el.addEventListener("mouseleave", this._handleMouseLeave, { signal });
267
+ el.addEventListener("focus", this._handleFocus, capture);
268
+ el.addEventListener("blur", this._handleBlur, capture);
269
+ }
270
+ this.el.addEventListener("pointerenter", this._handlePointerEnter, { signal });
271
+ this.el.addEventListener("pointerdown", this._handlePointerDown, { signal });
272
+ this.el.addEventListener("pointerup", this._handlePointerEnd, { signal });
273
+ this.el.addEventListener("pointercancel", this._handlePointerCancel, { signal });
274
+ this.el.addEventListener("click", this._handleClick, capture);
275
+ this.tooltipEl.addEventListener("click", this._handleTooltipClick, capture);
276
+ }
277
+ /** Show at once, without enterDelay, for a request that is its own delay: a long press or a click. */
278
+ _showNow() {
279
+ this.open();
280
+ clearTimeout(this._enterDelayTimeout);
281
+ this._animateIn();
282
+ }
283
+ /** Hide at once, without exitDelay, for an explicit dismissal. */
284
+ _hideNow() {
285
+ this.close();
286
+ clearTimeout(this._exitDelayTimeout);
287
+ this._animateOut();
288
+ }
289
+ _setExitDelayTimeout() {
290
+ clearTimeout(this._exitDelayTimeout);
291
+ this._exitDelayTimeout = setTimeout(() => {
292
+ if (this.isHovered || this.isFocused) return;
293
+ this._animateOut();
294
+ }, this.options.exitDelay);
295
+ }
296
+ _setEnterDelayTimeout(isManual) {
297
+ clearTimeout(this._enterDelayTimeout);
298
+ const skipDelay = skippingDelay(Date.now());
299
+ this._enterDelayTimeout = setTimeout(() => {
300
+ if (!this.isHovered && !this.isFocused && !isManual) return;
301
+ this._animateIn();
302
+ }, skipDelay ? 0 : this.options.enterDelay);
303
+ }
304
+ _positionTooltip() {
305
+ const tooltip = this.tooltipEl;
306
+ const origin = this.el, originHeight = origin.offsetHeight, originWidth = origin.offsetWidth, tooltipHeight = tooltip.offsetHeight, tooltipWidth = tooltip.offsetWidth, margin = this.options.margin;
307
+ this.xMovement = 0;
308
+ this.yMovement = 0;
309
+ const originRect = origin.getBoundingClientRect();
310
+ let targetTop = originRect.top + window.scrollY;
311
+ let targetLeft = originRect.left + window.scrollX;
312
+ if (this.options.position === "top") {
313
+ targetTop += -tooltipHeight - margin;
314
+ targetLeft += originWidth / 2 - tooltipWidth / 2;
315
+ this.yMovement = -this.options.transitionMovement;
316
+ } else if (this.options.position === "right") {
317
+ targetTop += originHeight / 2 - tooltipHeight / 2;
318
+ targetLeft += originWidth + margin;
319
+ this.xMovement = this.options.transitionMovement;
320
+ } else if (this.options.position === "left") {
321
+ targetTop += originHeight / 2 - tooltipHeight / 2;
322
+ targetLeft += -tooltipWidth - margin;
323
+ this.xMovement = -this.options.transitionMovement;
324
+ } else {
325
+ targetTop += originHeight + margin;
326
+ targetLeft += originWidth / 2 - tooltipWidth / 2;
327
+ this.yMovement = this.options.transitionMovement;
328
+ }
329
+ const newCoordinates = Utils._repositionWithinScreen(
330
+ targetLeft,
331
+ targetTop,
332
+ tooltipWidth,
333
+ tooltipHeight,
334
+ margin,
335
+ this.options.transitionMovement,
336
+ "center"
337
+ );
338
+ tooltip.style.setProperty("--md-comp-tooltip-anchor-gap", `${Math.max(0, margin) + Math.abs(this.options.transitionMovement)}px`);
339
+ Utils._placeInOffsetParent(tooltip, newCoordinates);
340
+ }
341
+ _place() {
342
+ if (anchorSupported) this._anchorTooltip();
343
+ else this._positionTooltip();
344
+ }
345
+ // Anchored to the trigger in CSS: position-area places the tooltip on the
346
+ // chosen side, centered, and position-try-fallbacks flips it to the other
347
+ // side when that one would leave the viewport. Script cannot tell which
348
+ // side won, so an anchored tooltip fades in without sliding, and the
349
+ // slide's distance joins the gap instead.
350
+ _anchorTooltip() {
351
+ const [area, alignment] = ANCHOR_PLACEMENT[this.options.position] ?? ANCHOR_PLACEMENT.bottom;
352
+ const name = `--${this.tooltipEl.id}`;
353
+ this.xMovement = 0;
354
+ this.yMovement = 0;
355
+ Utils.setAnchorName(this.el, name, true);
356
+ const style = this.tooltipEl.style;
357
+ style.position = "fixed";
358
+ style.inset = "auto";
359
+ style.margin = `${Math.max(0, this.options.margin) + Math.abs(this.options.transitionMovement)}px`;
360
+ style.setProperty("position-anchor", name);
361
+ style.setProperty("position-area", area);
362
+ style.setProperty(alignment, "anchor-center");
363
+ style.setProperty("position-try-fallbacks", "flip-block, flip-inline");
364
+ }
365
+ _animateIn() {
366
+ this._animate(true);
367
+ }
368
+ _animateOut() {
369
+ this._animate(false);
370
+ }
371
+ _animate(show) {
372
+ const style = this.tooltipEl.style;
373
+ const reduce = this.el.ownerDocument.defaultView.matchMedia("(prefers-reduced-motion: reduce)").matches;
374
+ const duration = reduce ? 0 : show ? this.options.inDuration : this.options.outDuration;
375
+ if (show) {
376
+ this._place();
377
+ style.visibility = "visible";
378
+ style.overflow = "visible";
379
+ }
380
+ style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`;
381
+ clearTimeout(this._animationTimeout);
382
+ this._animationTimeout = setTimeout(() => {
383
+ style.transform = show && !reduce ? `translateX(${this.xMovement}px) translateY(${this.yMovement}px)` : "none";
384
+ style.opacity = show ? (this.options.opacity || 1).toString() : "0";
385
+ if (!show) this._animationTimeout = setTimeout(() => {
386
+ style.visibility = "hidden";
387
+ style.overflow = "";
388
+ }, duration);
389
+ }, 1);
390
+ this._reportShown(show);
391
+ }
392
+ _reportShown(show) {
393
+ if (show === this._shown) return;
394
+ this._shown = show;
395
+ this._notify(show ? "open" : "close");
396
+ }
397
+ /** Whether an event is a touch, noting when, so the mouse events that echo it are ignored. */
398
+ _touched(e) {
399
+ if (e.pointerType !== "touch") return false;
400
+ this._lastTouch = performance.now();
401
+ return true;
402
+ }
403
+ /** Whether an event is a touch for the long press, which a click tooltip does without. */
404
+ _longPress(e) {
405
+ return !this.options.openOnClick && this._touched(e);
406
+ }
407
+ /** A click tooltip toggles on what shows: one open() still holds back for enterDelay shows at once. */
408
+ _toggle(e) {
409
+ this._insideClick = e;
410
+ if (this._shown) this._hideNow();
411
+ else this._showNow();
412
+ }
413
+ /** Whether a node is the trigger or the tooltip, or inside either. */
414
+ _holds(node) {
415
+ return !!node && (this.el.contains(node) || this.tooltipEl.contains(node));
416
+ }
417
+ // A press on a rich tooltip's text blurs to nothing, so only focus that
418
+ // lands on another element closes a click tooltip.
419
+ _blurClickTooltip(next) {
420
+ if (next && (this.isOpen || this._shown)) this._hideNow();
421
+ }
422
+ _getAttributeOptions() {
423
+ const attributeOptions = {};
424
+ const tooltipTextOption = this.el.getAttribute("data-tooltip");
425
+ const tooltipId = this.el.getAttribute("data-tooltip-id");
426
+ const positionOption = this.el.getAttribute("data-position");
427
+ if (tooltipTextOption) {
428
+ attributeOptions.text = tooltipTextOption;
429
+ }
430
+ if (positionOption) {
431
+ attributeOptions.position = positionOption;
432
+ }
433
+ if (tooltipId) {
434
+ attributeOptions.tooltipId = tooltipId;
435
+ }
436
+ return attributeOptions;
437
+ }
438
+ };
439
+ _Tooltip.key = "Expressive_Tooltip";
440
+ var Tooltip = _Tooltip;
441
+
442
+ export {
443
+ Tooltip
444
+ };
445
+ //# sourceMappingURL=chunk-FCNF4GRJ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/tooltip.ts"],
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\n\n// CSS anchor positioning, where the browser has it: the tooltip follows its\n// trigger through scrolling and flips at the viewport edge without script\n// measuring anything. Elsewhere the coordinate path below still runs.\nconst anchorSupported = typeof CSS !== 'undefined' && !!CSS.supports?.('anchor-name: --a');\n\n// Per position: the position-area and the self-alignment that centers the\n// tooltip on its trigger.\nconst ANCHOR_PLACEMENT: Record<string, [string, string]> = {\n top: ['top', 'justify-self'],\n right: ['right', 'align-self'],\n left: ['left', 'align-self'],\n bottom: ['bottom', 'justify-self'],\n};\n\n/**\n * On touch, a press held this long shows the tooltip, as Android's long\n * press does, and the tooltip stays this long after the finger lifts.\n */\nconst LONG_PRESS = 500;\nconst TOUCH_LINGER = 1500;\n// After a touch the browser fires mouse events for compatibility; within\n// this long of one they are the touch again, not a mouse.\nconst TOUCH_ECHO = 800;\n// A long press that showed the tooltip was asking about the control, so the\n// click its release sends, within this long, does not activate it.\nconst PRESS_CLICK = 400;\n// A tooltip that opens while a tooltip is closing, or this long after that\n// one's exitDelay ends, shows without enterDelay, as tooltips along a toolbar\n// do. The window is shared by every tooltip; a clock earlier than its start,\n// after the system clock went back, is outside it.\nconst SKIP_DELAY_WINDOW = 300;\nlet skipDelayFrom = -Infinity;\nlet skipDelayUntil = -Infinity;\n\nconst skippingDelay = (now: number) => now >= skipDelayFrom && now < skipDelayUntil;\n\n/** A showing tooltip is closing: open the window, or extend it while an earlier one is still closing. */\nfunction startSkipDelay(exitDelay: number) {\n const now = Date.now();\n const end = now + exitDelay + SKIP_DELAY_WINDOW;\n skipDelayUntil = skippingDelay(now) ? Math.max(skipDelayUntil, end) : end;\n skipDelayFrom = now;\n}\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears. Skipped while a tooltip is closing\n * and for 300ms after its exitDelay ends.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n /**\n * Open on a click instead of hover and focus. A second click, Escape, a\n * click elsewhere or focus on another element closes it. On touch a tap\n * is the click, so the long press is off.\n * @default false\n */\n openOnClick: boolean;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom',\n transitionMovement: 10,\n opacity: 1,\n openOnClick: false\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n private _animationTimeout: ReturnType<typeof setTimeout>;\n private _pressTimeout: ReturnType<typeof setTimeout>;\n private _lingerTimeout: ReturnType<typeof setTimeout>;\n private _outsideTimeout: ReturnType<typeof setTimeout>;\n /** The last click on the trigger or inside the tooltip, which the document listener leaves alone. */\n private _insideClick: Event | null = null;\n /** When the last touch began or ended, to tell its mouse events from a mouse. */\n private _lastTouch = -Infinity;\n /** Whether a long press showed the tooltip, until it closes or a mouse hovers. */\n private _touchShown = false;\n /** Until when a click is the release of a long press, not a tap. */\n private _swallowClickUntil = -Infinity;\n // Whether the last animation showed the tooltip, so each change is reported once.\n private _shown = false;\n private _originalContent: {\n el: HTMLElement;\n marker: Comment;\n display: string;\n priority: string;\n hidden: string | null;\n contentClass: boolean;\n };\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options);\n\n // Again, so the data-* options sit between the defaults and the options.\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Tooltip';\n\n destroy() {\n clearTimeout(this._enterDelayTimeout);\n clearTimeout(this._exitDelayTimeout);\n clearTimeout(this._animationTimeout);\n clearTimeout(this._pressTimeout);\n clearTimeout(this._lingerTimeout);\n clearTimeout(this._outsideTimeout);\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n const descriptions = this.el.getAttribute('aria-describedby')?.split(/\\s+/);\n if (descriptions?.includes(this.tooltipEl.id)) {\n const remaining = descriptions.filter(id => id && id !== this.tooltipEl.id).join(' ');\n if (remaining) this.el.setAttribute('aria-describedby', remaining);\n else this.el.removeAttribute('aria-describedby');\n }\n if (this._originalContent) {\n const { el, marker, display, priority, hidden, contentClass } = this._originalContent;\n el.style.setProperty('display', display, priority);\n restoreAttribute(el, 'hidden', hidden);\n el.classList.toggle('tooltip-content', contentClass);\n if (!el.className) el.removeAttribute('class');\n marker.replaceWith(el);\n this._originalContent = null;\n }\n this.tooltipEl.remove();\n Utils.setAnchorName(this.el, `--${this.tooltipEl.id}`, false);\n super.destroy();\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', [this.el.getAttribute('aria-describedby'), this.tooltipEl.id].filter(Boolean).join(' '));\n\n const richContentEl = this.options.tooltipId\n ? Utils.getElementById(this.el, this.options.tooltipId)\n : null;\n if (this.options.tooltipId && !richContentEl) {\n console.error(`Tooltip: no element with id \"${this.options.tooltipId}\"; showing the text tooltip instead.`);\n }\n const tooltipContentEl = richContentEl ?? document.createElement('div');\n if (richContentEl) {\n this.tooltipEl.classList.add('rich');\n const marker = document.createComment('');\n tooltipContentEl.before(marker);\n this._originalContent = {\n el: tooltipContentEl, marker,\n display: tooltipContentEl.style.display,\n priority: tooltipContentEl.style.getPropertyPriority('display'),\n hidden: tooltipContentEl.getAttribute('hidden'),\n contentClass: tooltipContentEl.classList.contains('tooltip-content')\n };\n tooltipContentEl.removeAttribute('hidden');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n Utils.portalRoot(this.el).appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this._originalContent) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n const capture = { capture: true, signal };\n for (const el of [this.el, this.tooltipEl]) {\n el.addEventListener('mouseenter', this._handleMouseEnter, { signal });\n el.addEventListener('mouseleave', this._handleMouseLeave, { signal });\n el.addEventListener('focus', this._handleFocus, capture);\n el.addEventListener('blur', this._handleBlur, capture);\n }\n this.el.addEventListener('pointerenter', this._handlePointerEnter, { signal });\n this.el.addEventListener('pointerdown', this._handlePointerDown, { signal });\n this.el.addEventListener('pointerup', this._handlePointerEnd, { signal });\n this.el.addEventListener('pointercancel', this._handlePointerCancel, { signal });\n this.el.addEventListener('click', this._handleClick, capture);\n this.tooltipEl.addEventListener('click', this._handleTooltipClick, capture);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean = true) => {\n if (this.isOpen) return;\n clearTimeout(this._exitDelayTimeout);\n clearTimeout(this._animationTimeout);\n this.isOpen = true;\n // Escape and outside clicks are only listened for while open. close()\n // removes them, and destroy() through the signal.\n const { signal } = this._events;\n this.el.ownerDocument.addEventListener('keydown', this._handleKeydown, { capture: true, signal });\n // A task later, so the click that opened it, on the trigger or on a page\n // button that called open(), does not reach the listener and close it.\n if (this.options.openOnClick) {\n this._outsideTimeout = setTimeout(() => this.el.ownerDocument.addEventListener('click', this._handleDocumentClick, { signal }));\n }\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n // A press or linger from an earlier touch has no say over a later opening.\n clearTimeout(this._pressTimeout);\n clearTimeout(this._lingerTimeout);\n this._touchShown = false;\n if (!this.isOpen) return;\n if (this._shown) startSkipDelay(this.options.exitDelay);\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this.el.ownerDocument.removeEventListener('keydown', this._handleKeydown, true);\n clearTimeout(this._outsideTimeout);\n this.el.ownerDocument.removeEventListener('click', this._handleDocumentClick);\n clearTimeout(this._enterDelayTimeout);\n this._setExitDelayTimeout();\n };\n\n /** Show at once, without enterDelay, for a request that is its own delay: a long press or a click. */\n private _showNow() {\n this.open();\n clearTimeout(this._enterDelayTimeout);\n this._animateIn();\n }\n\n /** Hide at once, without exitDelay, for an explicit dismissal. */\n private _hideNow() {\n this.close();\n clearTimeout(this._exitDelayTimeout);\n this._animateOut();\n }\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n const skipDelay = skippingDelay(Date.now());\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, skipDelay ? 0 : this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + window.scrollY;\n let targetLeft = originRect.left + window.scrollX;\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = Utils._repositionWithinScreen(\n targetLeft, targetTop, tooltipWidth, tooltipHeight, margin, this.options.transitionMovement, 'center'\n );\n\n tooltip.style.setProperty('--md-comp-tooltip-anchor-gap', `${Math.max(0, margin) + Math.abs(this.options.transitionMovement)}px`);\n Utils._placeInOffsetParent(tooltip, newCoordinates);\n }\n\n _place() {\n if (anchorSupported) this._anchorTooltip();\n else this._positionTooltip();\n }\n\n // Anchored to the trigger in CSS: position-area places the tooltip on the\n // chosen side, centered, and position-try-fallbacks flips it to the other\n // side when that one would leave the viewport. Script cannot tell which\n // side won, so an anchored tooltip fades in without sliding, and the\n // slide's distance joins the gap instead.\n _anchorTooltip() {\n const [area, alignment] = ANCHOR_PLACEMENT[this.options.position] ?? ANCHOR_PLACEMENT.bottom;\n const name = `--${this.tooltipEl.id}`;\n this.xMovement = 0;\n this.yMovement = 0;\n Utils.setAnchorName(this.el, name, true);\n const style = this.tooltipEl.style;\n style.position = 'fixed';\n style.inset = 'auto';\n style.margin = `${Math.max(0, this.options.margin) + Math.abs(this.options.transitionMovement)}px`;\n style.setProperty('position-anchor', name);\n style.setProperty('position-area', area);\n style.setProperty(alignment, 'anchor-center');\n style.setProperty('position-try-fallbacks', 'flip-block, flip-inline');\n }\n\n _animateIn() { this._animate(true); }\n\n _animateOut() { this._animate(false); }\n\n _animate(show: boolean) {\n const style = this.tooltipEl.style;\n const reduce = this.el.ownerDocument.defaultView.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduce ? 0 : show ? this.options.inDuration : this.options.outDuration;\n if (show) {\n this._place();\n style.visibility = 'visible';\n style.overflow = 'visible';\n }\n style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`;\n clearTimeout(this._animationTimeout);\n this._animationTimeout = setTimeout(() => {\n style.transform = show && !reduce ? `translateX(${this.xMovement}px) translateY(${this.yMovement}px)` : 'none';\n style.opacity = show ? (this.options.opacity || 1).toString() : '0';\n if (!show) this._animationTimeout = setTimeout(() => {\n style.visibility = 'hidden';\n style.overflow = '';\n }, duration);\n }, 1);\n this._reportShown(show);\n }\n\n private _reportShown(show: boolean) {\n if (show === this._shown) return;\n this._shown = show;\n this._notify(show ? 'open' : 'close');\n }\n\n _handleMouseEnter = () => {\n // A tap's mouse events are not a hover; touch shows the tooltip on a long press.\n if (this.options.openOnClick || performance.now() - this._lastTouch < TOUCH_ECHO) return;\n this._touchShown = false;\n this.isHovered = true;\n this.open(false);\n };\n\n /** Whether an event is a touch, noting when, so the mouse events that echo it are ignored. */\n private _touched(e: PointerEvent) {\n if (e.pointerType !== 'touch') return false;\n this._lastTouch = performance.now();\n return true;\n }\n\n /** Whether an event is a touch for the long press, which a click tooltip does without. */\n private _longPress(e: PointerEvent) {\n return !this.options.openOnClick && this._touched(e);\n }\n\n // pointerenter comes before any compatibility mouseenter, in whatever order\n // a browser sends those, so the touch is known before its mouse events.\n _handlePointerEnter = (e: PointerEvent) => {\n this._touched(e);\n };\n\n /** A touch held for LONG_PRESS shows the tooltip, unless it turns into a scroll first. */\n _handlePointerDown = (e: PointerEvent) => {\n if (!this._longPress(e)) return;\n clearTimeout(this._lingerTimeout);\n clearTimeout(this._pressTimeout);\n // The long press is the delay, so it shows at once rather than after\n // enterDelay, and the linger after the finger lifts always follows a\n // tooltip that is showing.\n this._pressTimeout = setTimeout(() => {\n this.isHovered = true;\n this._showNow();\n this._touchShown = true;\n }, LONG_PRESS);\n };\n\n /** The finger lifted: a press too short stays a tap, and a tooltip it showed lingers for TOUCH_LINGER. */\n _handlePointerEnd = (e: PointerEvent) => {\n if (!this._longPress(e)) return;\n clearTimeout(this._pressTimeout);\n if (this._touchShown) this._swallowClickUntil = performance.now() + PRESS_CLICK;\n // Any release while it shows, even a second tap during the linger, starts the linger again.\n if (!this.isOpen) return;\n this.isHovered = false;\n // A mouse that hovers in the meantime keeps it, as focus does.\n this._lingerTimeout = setTimeout(() => this.isHovered || this.isFocused || this.close(), TOUCH_LINGER);\n };\n\n /**\n * A click tooltip toggles. Otherwise the click a long press's release sends\n * would press the button or follow the link, so it is consumed.\n */\n _handleClick = (e: MouseEvent) => {\n if (this.options.openOnClick) return this._toggle(e);\n if (performance.now() > this._swallowClickUntil) return;\n this._swallowClickUntil = -Infinity;\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n\n /** A click tooltip toggles on what shows: one open() still holds back for enterDelay shows at once. */\n private _toggle(e: MouseEvent) {\n this._insideClick = e;\n if (this._shown) this._hideNow();\n else this._showNow();\n }\n\n // Marked rather than found on the composed path, which a document listener\n // cannot see into when the tooltip sits in a closed shadow root.\n _handleTooltipClick = (e: MouseEvent) => {\n this._insideClick = e;\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n if (e !== this._insideClick) this._hideNow();\n };\n\n /**\n * The browser took the touch to scroll: no tooltip opens, not even one\n * waiting out enterDelay, and one the touch showed closes at once.\n */\n _handlePointerCancel = (e: PointerEvent) => {\n if (!this._longPress(e)) return;\n clearTimeout(this._pressTimeout);\n // Lingering after an earlier press too; a mouse hover or focus keeps it.\n if (!this._touchShown) return;\n this.isHovered = false;\n if (!this.isFocused) this.close();\n };\n\n /** Whether a node is the trigger or the tooltip, or inside either. */\n private _holds(node: Node | null) {\n return !!node && (this.el.contains(node) || this.tooltipEl.contains(node));\n }\n\n _handleMouseLeave = (event: MouseEvent) => {\n if (this.options.openOnClick || this._holds(event.relatedTarget as Node | null)) return;\n this.isHovered = false;\n if (!this.isFocused) this.close();\n };\n\n _handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !this.isOpen) return;\n // Escape always dismisses the tooltip, but it is only the tooltip's key\n // when focus is on its trigger. A tooltip left open by hover must not\n // swallow the Escape meant for the dialog or menu that has focus.\n if (Utils.focusIsIn(this.el, this.tooltipEl)) {\n event.preventDefault();\n event.stopPropagation();\n }\n this._hideNow();\n };\n\n // Focus opens the tooltip only when it arrived by keyboard: a pointer press\n // on the trigger also focuses it, and _handleMouseEnter already covers that.\n _handleFocus = (event: FocusEvent) => {\n // A click tooltip opens on the click that Enter or Space sends instead.\n if (!this.options.openOnClick && (event.target as HTMLElement).matches(':focus-visible')) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null;\n if (this._holds(next)) return;\n if (this.options.openOnClick) return this._blurClickTooltip(next);\n this.isFocused = false;\n if (!this.isHovered) this.close();\n };\n\n // A press on a rich tooltip's text blurs to nothing, so only focus that\n // lands on another element closes a click tooltip.\n private _blurClickTooltip(next: Node | null) {\n if (next && (this.isOpen || this._shown)) this._hideNow();\n }\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }