@expressivecss/expressive 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/CHANGELOG.md +306 -1
  2. package/README.md +1 -1
  3. package/dist/css/expressive.css +540 -646
  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/js/chunks/{chunk-PA7NU5AK.mjs → chunk-26VUH75M.mjs} +6 -3
  8. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  9. package/dist/js/chunks/{chunk-NBJAUGPP.mjs → chunk-2LFCOGC3.mjs} +12 -23
  10. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  11. package/dist/js/chunks/{chunk-OP43LLIC.mjs → chunk-36GELQGX.mjs} +4 -4
  12. package/dist/js/chunks/{chunk-OP43LLIC.mjs.map → chunk-36GELQGX.mjs.map} +2 -2
  13. package/dist/js/chunks/{chunk-EC26RU2D.mjs → chunk-3FKWIRHW.mjs} +6 -2
  14. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  15. package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs → chunk-3KF65KGL.mjs} +3 -3
  16. package/dist/js/chunks/{chunk-4QUCNFSD.mjs → chunk-3KLZRQZI.mjs} +31 -10
  17. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  18. package/dist/js/chunks/{chunk-75E5EDJF.mjs → chunk-3XORNED5.mjs} +2 -2
  19. package/dist/js/chunks/{chunk-NNHVANQA.mjs → chunk-4WBGAQN3.mjs} +3 -3
  20. package/dist/js/chunks/{chunk-ZJNLAGY5.mjs → chunk-5F4URJHL.mjs} +2 -2
  21. package/dist/js/chunks/{chunk-ZVLOUDIJ.mjs → chunk-67UNY7RH.mjs} +50 -2
  22. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-P6DRQ6KS.mjs → chunk-7CXNATJS.mjs} +6 -5
  24. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  25. package/dist/js/chunks/{chunk-4TRZ2AER.mjs → chunk-7X44MKEQ.mjs} +15 -14
  26. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  27. package/dist/js/chunks/{chunk-GWZ76SR4.mjs → chunk-7ZAMOMGY.mjs} +12 -7
  28. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  29. package/dist/js/chunks/{chunk-GVZQH2H5.mjs → chunk-AEG6LOAJ.mjs} +2 -2
  30. package/dist/js/chunks/{chunk-Y6TLRA3U.mjs → chunk-AQNFCJJ5.mjs} +27 -21
  31. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  32. package/dist/js/chunks/{chunk-OUCHKSAW.mjs → chunk-B55LWKBM.mjs} +16 -4
  33. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  34. package/dist/js/chunks/{chunk-AI73GJKG.mjs → chunk-BB5VXYXT.mjs} +2 -2
  35. package/dist/js/chunks/{chunk-2RLBDFH4.mjs → chunk-BDATLH3H.mjs} +4 -4
  36. package/dist/js/chunks/{chunk-2CS6TITK.mjs → chunk-CWMQOT4O.mjs} +23 -10
  37. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-ZKWUWBUB.mjs → chunk-CY2CTOVM.mjs} +2 -2
  39. package/dist/js/chunks/{chunk-CSYWKEK3.mjs → chunk-DWA5UYLJ.mjs} +58 -27
  40. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  41. package/dist/js/chunks/{chunk-CMGXGYUC.mjs → chunk-EB2V4OKL.mjs} +14 -9
  42. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  43. package/dist/js/chunks/{chunk-Z4GICXR2.mjs → chunk-EWO662ZC.mjs} +5 -7
  44. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  45. package/dist/js/chunks/{chunk-VGY4M57S.mjs → chunk-F7LAKFMX.mjs} +67 -34
  46. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  47. package/dist/js/chunks/{chunk-67ZPPKXS.mjs → chunk-FNIIH2LU.mjs} +3 -3
  48. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  49. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-DZYVU75J.mjs → chunk-GFWYMWYN.mjs} +18 -14
  51. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-3L3QIYLC.mjs → chunk-H5ISU45X.mjs} +8 -6
  53. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  54. package/dist/js/chunks/{chunk-QXKWVHBD.mjs → chunk-H6YIKFAQ.mjs} +67 -46
  55. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  56. package/dist/js/chunks/{chunk-KZPSAXIU.mjs → chunk-HEH7E3KO.mjs} +22 -12
  57. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  58. package/dist/js/chunks/{chunk-T3BNSRP3.mjs → chunk-HQRLBTNM.mjs} +3 -3
  59. package/dist/js/chunks/{chunk-NAC72P7R.mjs → chunk-I2F7MLUU.mjs} +2 -2
  60. package/dist/js/chunks/{chunk-ZM3XBHWV.mjs → chunk-IQOTGGHX.mjs} +86 -35
  61. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  62. package/dist/js/chunks/{chunk-QACZ6TUP.mjs → chunk-JH3YWKA6.mjs} +5 -4
  63. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  64. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  65. package/dist/js/chunks/{chunk-4IKVPCSU.mjs.map → chunk-JOLJAYIJ.mjs.map} +1 -1
  66. package/dist/js/chunks/{chunk-BPF3I2MN.mjs → chunk-KOTGMCMI.mjs} +9 -2
  67. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-ANKFWNWT.mjs → chunk-LC4O5LFS.mjs} +3 -3
  69. package/dist/js/chunks/{chunk-4PIXLDNJ.mjs → chunk-LEF33SCP.mjs} +2 -2
  70. package/dist/js/chunks/{chunk-ILDRRG7T.mjs → chunk-LFORZRPH.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-Z4OARDZ7.mjs → chunk-LWLNV5EC.mjs} +26 -17
  72. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-WU7XJ4RR.mjs → chunk-LXRHUQAX.mjs} +66 -25
  74. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-VMY55K2X.mjs → chunk-MA2SZZFB.mjs} +11 -7
  76. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-VJVQIXHC.mjs → chunk-MDBZAMIV.mjs} +8 -10
  78. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-4EWGD4V2.mjs → chunk-NODZ5VAD.mjs} +2 -2
  80. package/dist/js/chunks/{chunk-UGJHCHXG.mjs → chunk-O2WJB6TH.mjs} +79 -55
  81. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  82. package/dist/js/chunks/{chunk-7YZ5CN3V.mjs → chunk-PCABY5BN.mjs} +5 -3
  83. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  84. package/dist/js/chunks/{chunk-X7SDA2J5.mjs → chunk-PWKYVMND.mjs} +9 -5
  85. package/dist/js/chunks/{chunk-X7SDA2J5.mjs.map → chunk-PWKYVMND.mjs.map} +2 -2
  86. package/dist/js/chunks/{chunk-SPPHF7YZ.mjs → chunk-QHZZT7YO.mjs} +35 -14
  87. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  88. package/dist/js/chunks/{chunk-LDXCC2L3.mjs → chunk-QND56EW2.mjs} +5 -4
  89. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  90. package/dist/js/chunks/{chunk-NVQ5EHCU.mjs → chunk-QNODAANY.mjs} +4 -4
  91. package/dist/js/chunks/{chunk-7NLUI3RR.mjs → chunk-QRO5FV3I.mjs} +23 -13
  92. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  93. package/dist/js/chunks/{chunk-FCNF4GRJ.mjs → chunk-R7A7JRC5.mjs} +6 -11
  94. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  95. package/dist/js/chunks/{chunk-S23RJ3XY.mjs → chunk-RKG2CBFE.mjs} +4 -16
  96. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  97. package/dist/js/chunks/{chunk-6FSEUFVW.mjs → chunk-RSNS5OYS.mjs} +6 -6
  98. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-ROH2HDB4.mjs → chunk-RUDYMEJ3.mjs} +2 -2
  100. package/dist/js/chunks/{chunk-BIGU5RCJ.mjs → chunk-STJR62SU.mjs} +13 -5
  101. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  102. package/dist/js/chunks/{chunk-752ADW4M.mjs → chunk-SUSD4UTN.mjs} +27 -32
  103. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  104. package/dist/js/chunks/{chunk-B7DQFHA5.mjs → chunk-SYBOA5HC.mjs} +7 -12
  105. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  106. package/dist/js/chunks/{chunk-TFABTUAZ.mjs → chunk-T4MOBP3J.mjs} +2 -2
  107. package/dist/js/chunks/{chunk-GCWWEZKO.mjs → chunk-TM7HPGTV.mjs} +3 -3
  108. package/dist/js/chunks/{chunk-5KIHWJI2.mjs → chunk-TMQDZSDC.mjs} +34 -12
  109. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  110. package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs → chunk-TVSX5YA2.mjs} +3 -3
  111. package/dist/js/chunks/{chunk-INLZWHLY.mjs → chunk-UHO5CV6K.mjs} +2 -2
  112. package/dist/js/chunks/{chunk-INLZWHLY.mjs.map → chunk-UHO5CV6K.mjs.map} +2 -2
  113. package/dist/js/chunks/{chunk-7YQBHTK3.mjs → chunk-UKCNELUN.mjs} +6 -8
  114. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-VH4BMAZS.mjs → chunk-UKQK5GWR.mjs} +13 -13
  116. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-OYNUDOHR.mjs → chunk-UTSLYQ65.mjs} +7 -6
  118. package/dist/js/chunks/{chunk-OYNUDOHR.mjs.map → chunk-UTSLYQ65.mjs.map} +2 -2
  119. package/dist/js/chunks/{chunk-7W7TV6NY.mjs → chunk-VS5OJBOD.mjs} +2 -2
  120. package/dist/js/chunks/{chunk-7W7TV6NY.mjs.map → chunk-VS5OJBOD.mjs.map} +2 -2
  121. package/dist/js/chunks/{chunk-KYIEG4U3.mjs → chunk-VZMROW5A.mjs} +43 -14
  122. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  123. package/dist/js/chunks/{chunk-VFV75DHF.mjs → chunk-XB6Y7P5W.mjs} +11 -12
  124. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  125. package/dist/js/chunks/{chunk-CZSQHXEV.mjs → chunk-XDAMOMVD.mjs} +20 -21
  126. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  127. package/dist/js/chunks/{chunk-EVCVFEV3.mjs → chunk-XJPMW5SP.mjs} +21 -35
  128. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  129. package/dist/js/chunks/{chunk-VR3L2WN5.mjs → chunk-YKANQILZ.mjs} +7 -6
  130. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  131. package/dist/js/chunks/{chunk-JUKBBN6P.mjs → chunk-YLZOJLDI.mjs} +2 -2
  132. package/dist/js/chunks/{chunk-U4B3VHFS.mjs → chunk-ZK7YY322.mjs} +28 -21
  133. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  134. package/dist/js/expressive.cjs +2739 -2387
  135. package/dist/js/expressive.cjs.map +4 -4
  136. package/dist/js/expressive.js +2739 -2387
  137. package/dist/js/expressive.js.map +4 -4
  138. package/dist/js/expressive.min.js +7 -7
  139. package/dist/js/expressive.min.js.map +4 -4
  140. package/dist/js/expressive.mjs +76 -75
  141. package/dist/js/expressive.mjs.map +1 -1
  142. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  143. package/dist/js/internal/behaviors/copy.mjs +3 -3
  144. package/dist/js/internal/behaviors/dataTables.mjs +2 -4
  145. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  146. package/dist/js/internal/behaviors/forms.mjs +2 -2
  147. package/dist/js/internal/behaviors/imageCompare.mjs +2 -2
  148. package/dist/js/internal/behaviors/lists.mjs +2 -2
  149. package/dist/js/internal/behaviors/paneResize.mjs +2 -2
  150. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  151. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  152. package/dist/js/internal/behaviors/sortable.mjs +2 -2
  153. package/dist/js/internal/behaviors/theme.mjs +2 -2
  154. package/dist/js/internal/behaviors/tour.mjs +2 -2
  155. package/dist/js/internal/behaviors/transferList.mjs +2 -2
  156. package/dist/js/internal/components/appBar.mjs +3 -3
  157. package/dist/js/internal/components/autocomplete.mjs +5 -4
  158. package/dist/js/internal/components/backToTop.mjs +3 -3
  159. package/dist/js/internal/components/barChart.mjs +5 -5
  160. package/dist/js/internal/components/buttonGroup.mjs +3 -3
  161. package/dist/js/internal/components/buttons.mjs +3 -3
  162. package/dist/js/internal/components/cards.mjs +3 -3
  163. package/dist/js/internal/components/carousel.mjs +3 -3
  164. package/dist/js/internal/components/cascader.mjs +4 -4
  165. package/dist/js/internal/components/characterCounter.mjs +3 -3
  166. package/dist/js/internal/components/chips.mjs +7 -6
  167. package/dist/js/internal/components/colorPicker.mjs +3 -3
  168. package/dist/js/internal/components/columnChart.mjs +4 -4
  169. package/dist/js/internal/components/commandPalette.mjs +3 -3
  170. package/dist/js/internal/components/confetti.mjs +3 -3
  171. package/dist/js/internal/components/currencyInput.mjs +3 -3
  172. package/dist/js/internal/components/datepicker.mjs +8 -7
  173. package/dist/js/internal/components/expandingCard.mjs +3 -3
  174. package/dist/js/internal/components/funnelChart.mjs +4 -4
  175. package/dist/js/internal/components/heatmapChart.mjs +4 -4
  176. package/dist/js/internal/components/hoverCard.mjs +3 -3
  177. package/dist/js/internal/components/index.mjs +60 -59
  178. package/dist/js/internal/components/inputMask.mjs +3 -3
  179. package/dist/js/internal/components/keypad.mjs +3 -3
  180. package/dist/js/internal/components/lightbox.mjs +3 -3
  181. package/dist/js/internal/components/lineChart.mjs +23 -7
  182. package/dist/js/internal/components/loadingOverlay.mjs +3 -3
  183. package/dist/js/internal/components/mapView.mjs +3 -3
  184. package/dist/js/internal/components/menu.mjs +3 -3
  185. package/dist/js/internal/components/menubar.mjs +4 -4
  186. package/dist/js/internal/components/messageScroller.mjs +3 -3
  187. package/dist/js/internal/components/mixedChart.mjs +5 -5
  188. package/dist/js/internal/components/navigationRail.mjs +3 -3
  189. package/dist/js/internal/components/particles.mjs +3 -3
  190. package/dist/js/internal/components/pieChart.mjs +4 -4
  191. package/dist/js/internal/components/pullToRefresh.mjs +3 -3
  192. package/dist/js/internal/components/questionnaire.mjs +3 -3
  193. package/dist/js/internal/components/radarChart.mjs +4 -4
  194. package/dist/js/internal/components/radialChart.mjs +4 -4
  195. package/dist/js/internal/components/registry.mjs +59 -58
  196. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  197. package/dist/js/internal/components/sankeyChart.mjs +4 -4
  198. package/dist/js/internal/components/scatterChart.mjs +4 -4
  199. package/dist/js/internal/components/scrollspy.mjs +3 -3
  200. package/dist/js/internal/components/select.mjs +5 -4
  201. package/dist/js/internal/components/showMore.mjs +3 -3
  202. package/dist/js/internal/components/slider.mjs +3 -3
  203. package/dist/js/internal/components/snackbar.mjs +2 -2
  204. package/dist/js/internal/components/swipeActions.mjs +3 -3
  205. package/dist/js/internal/components/tabs.mjs +3 -3
  206. package/dist/js/internal/components/timepicker.mjs +5 -5
  207. package/dist/js/internal/components/tooltip.mjs +3 -3
  208. package/dist/js/internal/components/treeSelect.mjs +6 -5
  209. package/dist/js/internal/components/treemapChart.mjs +4 -4
  210. package/dist/js/internal/core/component.mjs +6 -4
  211. package/dist/js/internal/core/formControl.mjs +2 -2
  212. package/dist/js/internal/core/imageURL.mjs +7 -0
  213. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  214. package/dist/js/internal/core/utils.mjs +11 -1
  215. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  216. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +3 -3
  217. package/dist/js/modular.mjs +76 -75
  218. package/dist/types/behaviors/bottomSheets.d.ts +5 -3
  219. package/dist/types/behaviors/dataTables.d.ts +2 -6
  220. package/dist/types/behaviors/forms.d.ts +7 -7
  221. package/dist/types/behaviors/imageCompare.d.ts +2 -1
  222. package/dist/types/behaviors/transferList.d.ts +2 -0
  223. package/dist/types/components/autocomplete.d.ts +14 -3
  224. package/dist/types/components/carousel.d.ts +7 -0
  225. package/dist/types/components/chips.d.ts +15 -0
  226. package/dist/types/components/colorPicker.d.ts +14 -0
  227. package/dist/types/components/currencyInput.d.ts +5 -4
  228. package/dist/types/components/datepicker.d.ts +54 -27
  229. package/dist/types/components/funnelChart.d.ts +1 -4
  230. package/dist/types/components/heatmapChart.d.ts +3 -0
  231. package/dist/types/components/hoverCard.d.ts +1 -0
  232. package/dist/types/components/inputMask.d.ts +0 -2
  233. package/dist/types/components/lineChart.d.ts +43 -5
  234. package/dist/types/components/mapView.d.ts +113 -11
  235. package/dist/types/components/menu.d.ts +14 -0
  236. package/dist/types/components/particles.d.ts +14 -1
  237. package/dist/types/components/pieChart.d.ts +1 -2
  238. package/dist/types/components/richTextEditor.d.ts +40 -9
  239. package/dist/types/components/select.d.ts +1 -3
  240. package/dist/types/components/showMore.d.ts +2 -0
  241. package/dist/types/components/slider.d.ts +0 -1
  242. package/dist/types/components/snackbar.d.ts +7 -1
  243. package/dist/types/components/tabs.d.ts +3 -3
  244. package/dist/types/components/timepicker.d.ts +15 -6
  245. package/dist/types/components/tooltip.d.ts +1 -1
  246. package/dist/types/components/treemapChart.d.ts +2 -2
  247. package/dist/types/core/component.d.ts +9 -3
  248. package/dist/types/core/imageURL.d.ts +2 -0
  249. package/dist/types/core/utils.d.ts +39 -1
  250. package/dist/types/modular.d.ts +1 -1
  251. package/dist/types/plugins/modalDisplayPlugin.d.ts +8 -1
  252. package/package.json +8 -6
  253. package/src/sass/abstracts/_mixins.scss +459 -59
  254. package/src/sass/abstracts/_variables.scss +25 -0
  255. package/src/sass/components/_accordion.scss +1 -3
  256. package/src/sass/components/_aura.scss +1 -0
  257. package/src/sass/components/_back-to-top.scss +3 -3
  258. package/src/sass/components/_bar-chart.scss +2 -83
  259. package/src/sass/components/_bottom-sheet.scss +7 -0
  260. package/src/sass/components/_breadcrumb.scss +1 -7
  261. package/src/sass/components/_button-groups.scss +15 -38
  262. package/src/sass/components/_buttons.scss +24 -74
  263. package/src/sass/components/_calendar.scss +1 -3
  264. package/src/sass/components/_carousel.scss +10 -10
  265. package/src/sass/components/_cascader.scss +3 -14
  266. package/src/sass/components/_column-chart.scss +1 -19
  267. package/src/sass/components/_confetti.scss +3 -4
  268. package/src/sass/components/_data-table.scss +10 -0
  269. package/src/sass/components/_dialog.scss +10 -18
  270. package/src/sass/components/_expanding-card.scss +1 -5
  271. package/src/sass/components/_fab-menu.scss +4 -12
  272. package/src/sass/components/_funnel-chart.scss +1 -62
  273. package/src/sass/components/_heatmap-chart.scss +2 -6
  274. package/src/sass/components/_icon-buttons.scss +1 -4
  275. package/src/sass/components/_line-chart.scss +2 -70
  276. package/src/sass/components/_map.scss +4 -0
  277. package/src/sass/components/_marquee.scss +3 -3
  278. package/src/sass/components/_mega-menu.scss +8 -17
  279. package/src/sass/components/_menu.scss +10 -11
  280. package/src/sass/components/_menubar.scss +1 -13
  281. package/src/sass/components/_mixed-chart.scss +1 -37
  282. package/src/sass/components/_navbar.scss +11 -16
  283. package/src/sass/components/_navigation-bar.scss +2 -5
  284. package/src/sass/components/_navigation-rail.scss +25 -15
  285. package/src/sass/components/_page-footer.scss +1 -3
  286. package/src/sass/components/_pagination.scss +3 -14
  287. package/src/sass/components/_panes.scss +3 -16
  288. package/src/sass/components/_particles.scss +3 -4
  289. package/src/sass/components/_pie-chart.scss +8 -70
  290. package/src/sass/components/_progress.scss +31 -13
  291. package/src/sass/components/_radar-chart.scss +2 -32
  292. package/src/sass/components/_radial-chart.scss +2 -48
  293. package/src/sass/components/_sankey-chart.scss +5 -28
  294. package/src/sass/components/_scatter-chart.scss +2 -11
  295. package/src/sass/components/_search.scss +1 -4
  296. package/src/sass/components/_side-sheet.scss +9 -14
  297. package/src/sass/components/_skeleton.scss +24 -15
  298. package/src/sass/components/_snackbar.scss +11 -13
  299. package/src/sass/components/_table_of_contents.scss +1 -3
  300. package/src/sass/components/_tabs.scss +4 -20
  301. package/src/sass/components/_timepicker.scss +2 -1
  302. package/src/sass/components/_toolbar.scss +1 -4
  303. package/src/sass/components/_tooltip.scss +9 -5
  304. package/src/sass/components/_tree.scss +5 -17
  305. package/src/sass/components/_treemap-chart.scss +2 -26
  306. package/src/sass/components/forms/_checkboxes.scss +2 -21
  307. package/src/sass/components/forms/_drop-zone.scss +1 -4
  308. package/src/sass/components/forms/_fieldset.scss +1 -4
  309. package/src/sass/components/forms/_file-input.scss +6 -0
  310. package/src/sass/components/forms/_input-fields.scss +21 -4
  311. package/src/sass/components/forms/_radio-buttons.scss +2 -24
  312. package/src/sass/components/forms/_select.scss +6 -7
  313. package/src/sass/components/forms/_slider.scss +1 -4
  314. package/src/sass/components/forms/_switches.scss +14 -21
  315. package/src/sass/utilities/_helpers.scss +1 -1
  316. package/src/sass/utilities/_visibility.scss +1 -3
  317. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +0 -7
  318. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +0 -7
  319. package/dist/js/chunks/chunk-4IKVPCSU.mjs +0 -7
  320. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +0 -7
  321. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +0 -7
  322. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +0 -7
  323. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +0 -7
  324. package/dist/js/chunks/chunk-752ADW4M.mjs.map +0 -7
  325. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +0 -7
  326. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +0 -7
  327. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +0 -7
  328. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +0 -7
  329. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +0 -7
  330. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +0 -7
  331. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +0 -7
  332. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +0 -7
  333. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +0 -7
  334. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +0 -7
  335. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +0 -7
  336. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +0 -7
  337. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +0 -7
  338. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +0 -7
  339. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +0 -7
  340. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +0 -7
  341. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +0 -7
  342. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +0 -7
  343. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +0 -7
  344. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +0 -7
  345. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +0 -7
  346. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +0 -7
  347. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +0 -7
  348. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +0 -7
  349. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +0 -7
  350. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +0 -7
  351. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +0 -7
  352. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +0 -7
  353. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +0 -7
  354. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +0 -7
  355. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +0 -7
  356. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +0 -7
  357. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +0 -7
  358. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +0 -7
  359. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +0 -7
  360. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +0 -7
  361. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +0 -7
  362. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +0 -7
  363. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +0 -7
  364. /package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs.map → chunk-3KF65KGL.mjs.map} +0 -0
  365. /package/dist/js/chunks/{chunk-75E5EDJF.mjs.map → chunk-3XORNED5.mjs.map} +0 -0
  366. /package/dist/js/chunks/{chunk-NNHVANQA.mjs.map → chunk-4WBGAQN3.mjs.map} +0 -0
  367. /package/dist/js/chunks/{chunk-ZJNLAGY5.mjs.map → chunk-5F4URJHL.mjs.map} +0 -0
  368. /package/dist/js/chunks/{chunk-GVZQH2H5.mjs.map → chunk-AEG6LOAJ.mjs.map} +0 -0
  369. /package/dist/js/chunks/{chunk-AI73GJKG.mjs.map → chunk-BB5VXYXT.mjs.map} +0 -0
  370. /package/dist/js/chunks/{chunk-2RLBDFH4.mjs.map → chunk-BDATLH3H.mjs.map} +0 -0
  371. /package/dist/js/chunks/{chunk-ZKWUWBUB.mjs.map → chunk-CY2CTOVM.mjs.map} +0 -0
  372. /package/dist/js/chunks/{chunk-67ZPPKXS.mjs.map → chunk-FNIIH2LU.mjs.map} +0 -0
  373. /package/dist/js/chunks/{chunk-T3BNSRP3.mjs.map → chunk-HQRLBTNM.mjs.map} +0 -0
  374. /package/dist/js/chunks/{chunk-NAC72P7R.mjs.map → chunk-I2F7MLUU.mjs.map} +0 -0
  375. /package/dist/js/chunks/{chunk-ANKFWNWT.mjs.map → chunk-LC4O5LFS.mjs.map} +0 -0
  376. /package/dist/js/chunks/{chunk-4PIXLDNJ.mjs.map → chunk-LEF33SCP.mjs.map} +0 -0
  377. /package/dist/js/chunks/{chunk-ILDRRG7T.mjs.map → chunk-LFORZRPH.mjs.map} +0 -0
  378. /package/dist/js/chunks/{chunk-4EWGD4V2.mjs.map → chunk-NODZ5VAD.mjs.map} +0 -0
  379. /package/dist/js/chunks/{chunk-NVQ5EHCU.mjs.map → chunk-QNODAANY.mjs.map} +0 -0
  380. /package/dist/js/chunks/{chunk-ROH2HDB4.mjs.map → chunk-RUDYMEJ3.mjs.map} +0 -0
  381. /package/dist/js/chunks/{chunk-TFABTUAZ.mjs.map → chunk-T4MOBP3J.mjs.map} +0 -0
  382. /package/dist/js/chunks/{chunk-GCWWEZKO.mjs.map → chunk-TM7HPGTV.mjs.map} +0 -0
  383. /package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs.map → chunk-TVSX5YA2.mjs.map} +0 -0
  384. /package/dist/js/chunks/{chunk-JUKBBN6P.mjs.map → chunk-YLZOJLDI.mjs.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/heatmapChart.ts"],
4
- "sourcesContent": ["import { LineChart, LineChartOptions } from './lineChart';\n\nexport type HeatmapChartOptions = LineChartOptions;\n\n/**\n * A shade in one of `steps` bands, each side of zero on a diverging scale:\n * the lowest band is the empty color, and the highest is the full color.\n */\nfunction band(level: number, steps: number) {\n return (Math.sign(level) * Math.min(steps - 1, Math.floor(Math.abs(level) * steps))) / (steps - 1);\n}\n\n/**\n * Heatmap chart. It reads its <table> like LineChart, but draws every cell\n * as a square of the grid, shaded from the lowest value to the highest, with\n * the row headers beside it and the column headers below. A `data-label` on\n * a header cell replaces its text on the grid; an empty one hides it. The\n * tooltip shows one cell, and the arrow keys move round the grid. With\n * `data-mid` the scale diverges either side of that value, and with\n * `data-steps` the shades fall into that many bands.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class HeatmapChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Every cell, row by row. */\n private _cells: HTMLElement[];\n /** Each cell's shade from 0 to 1, or -1 to 1 on a diverging scale, or null for a gap. */\n private _levels: (number | null)[];\n /** The text of the lowest and highest cells, for the legend. */\n private _ends: [string, string];\n /** The shades of the lowest and highest cells, where the legend's gradient runs. */\n private _endLevels: [number, number];\n /** The box the cells scroll in, beside the row labels. */\n private _scroll: HTMLElement;\n\n protected get _type() {\n return 'heatmap-chart';\n }\n\n /** Color carries the value, so there is no value axis. */\n protected get _axis() {\n return false;\n }\n\n static key = 'Expressive_HeatmapChart';\n\n protected get _count() {\n return this.labels.length * this.series.length;\n }\n\n /** Redraws the grid, scrolled where it was. */\n update() {\n const left = this._scroll?.scrollLeft;\n super.update();\n if (this._scroll && left) this._scroll.scrollLeft = left;\n }\n\n /** Highlights one cell, numbered row by row. Pass -1 to hide the tooltip. */\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n this._activate(this._cells[index], index);\n }\n\n private _activate(cell: HTMLElement | undefined, index: number) {\n // Measure before the writes below, which would otherwise force a layout.\n const box = cell ? this._box(cell) : null;\n this._cells[this.activeIndex]?.classList.remove('active');\n this.activeIndex = index;\n this._tooltip.hidden = !box;\n if (box) this._fill(cell!, index, box);\n }\n\n /**\n * A cell's left, top and width in the plot, past any scrolling of the\n * grid, and the plot's width. A key can move to a cell scrolled out of a\n * wide grid, so it scrolls into view first.\n */\n private _box(cell: HTMLElement) {\n if (this._plot.matches(':focus-visible')) cell.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n return this._measure(cell);\n }\n\n private _measure(cell: HTMLElement) {\n const [box, plot] = [cell.getBoundingClientRect(), this._plot.getBoundingClientRect()];\n return [box.left - plot.left, box.top - plot.top, box.width, this._plot.clientWidth];\n }\n\n /** Keeps the tooltip on its cell as the grid scrolls, and hides it once the cell scrolls out. */\n private _follow(scroll: HTMLElement) {\n const cell = this._cells[this.activeIndex];\n if (!cell) return;\n const [view, box] = [scroll.getBoundingClientRect(), cell.getBoundingClientRect()];\n if (box.right <= view.left || box.left >= view.right) this.show(-1);\n else this._position(this._measure(cell));\n }\n\n /** Marks the cell and fills the tooltip beside it, on the side with more room. */\n private _fill(cell: HTMLElement, index: number, [left, top, width, plotWidth]: number[]) {\n cell.classList.add('active');\n const columns = this.series.length;\n const [row, series] = [Math.floor(index / columns), this.series[index % columns]];\n const title = document.createElement('strong');\n title.textContent = this.labels[row];\n const [name, text] = [document.createElement('span'), document.createElement('span')];\n name.textContent = series.name;\n // A gap's swatch is outlined like its cell.\n if (this._levels[index] === null) name.className = 'gap';\n else name.style.setProperty('--level', String(this._levels[index]));\n text.textContent = series.text[row];\n this._tooltip.replaceChildren(title, name, text);\n this._position([left, top, width, plotWidth]);\n }\n\n private _position([left, top, width, plotWidth]: number[]) {\n const end = left + width / 2 > plotWidth / 2;\n this._tooltip.classList.toggle('end', end);\n this._tooltip.style.left = `${left + (end ? 0 : width)}px`;\n this._tooltip.style.top = `${top}px`;\n }\n\n /** Arrows move the way they point, so left and right swap in RTL. */\n protected _keyTarget(key: string): number | undefined {\n // With nothing shown, Escape is left to a dialog or sheet around the chart.\n if (key === 'Escape') return this.activeIndex < 0 ? undefined : -1;\n const [columns, last] = [this.series.length, this.labels.length - 1];\n const index = Math.max(0, this.activeIndex);\n const [row, column] = [Math.floor(index / columns), index % columns];\n const [next, back] = this._reversed ? ['ArrowLeft', 'ArrowRight'] : ['ArrowRight', 'ArrowLeft'];\n const to = {\n [next]: [row, column + 1],\n [back]: [row, column - 1],\n ArrowDown: [row + 1, column],\n ArrowUp: [row - 1, column],\n Home: [row, 0],\n End: [row, columns - 1]\n }[key];\n if (!to) return undefined;\n // The first key after focus or Escape shows the first cell.\n if (this.activeIndex < 0) return 0;\n const clamp = (value: number, max: number) => Math.min(max, Math.max(0, value));\n return clamp(to[0], last) * columns + clamp(to[1], columns - 1);\n }\n\n /**\n * The cell under the pointer by its position, or -1 off the grid. A touch\n * keeps its first target while it drags, so the target cannot be used. The\n * cells and gaps are even, so each band's edge falls in a gap and a gap\n * counts as the nearer cell.\n */\n protected _indexAt(e: PointerEvent) {\n const [columns, rows] = [this.series.length, this.labels.length];\n const first = this._cells[0].getBoundingClientRect();\n const last = this._cells[this._cells.length - 1].getBoundingClientRect();\n const [left, right] = [Math.min(first.left, last.left), Math.max(first.right, last.right)];\n const [x, y] = [e.clientX, e.clientY];\n if (this._off(x, y, [left, right, first.top, last.bottom])) return -1;\n const band = (offset: number, size: number, count: number) =>\n Math.min(count - 1, Math.floor((offset / (size || 1)) * count));\n const column = band(x - left, right - left, columns);\n return band(y - first.top, last.bottom - first.top, rows) * columns + (this._reversed ? columns - 1 - column : column);\n }\n\n /** Whether a point is off the cells, or on cells scrolled out of view under the row labels. */\n private _off(x: number, y: number, [left, right, top, bottom]: number[]) {\n const view = this._scroll.getBoundingClientRect();\n return x < Math.max(left, view.left) || x > Math.min(right, view.right) || y < top || y > bottom;\n }\n\n /**\n * The legend: a gradient from the lowest cell's shade to the highest's,\n * labelled with their text. A fixed scale wider than the data shows only\n * the part the data uses.\n */\n protected _guides(): Element[] {\n const legend = document.createElement('div');\n legend.className = 'heatmap-chart-legend';\n legend.setAttribute('aria-hidden', 'true');\n const [low, scale, high] = ['span', 'span', 'span'].map((tag) => document.createElement(tag));\n [low.textContent, high.textContent] = this._ends;\n scale.className = 'heatmap-chart-scale';\n if (this._reversed) scale.style.setProperty('--heatmap-chart-to', 'left');\n const [from, to] = this._endLevels;\n scale.style.setProperty('--low', String(from));\n scale.style.setProperty('--high', String(to));\n // A diverging scale whose data crosses the midpoint passes its empty color.\n scale.classList.toggle('diverging', from < 0 && to > 0);\n scale.style.setProperty('--mid', `${(-from / (to - from || 1)) * 100}%`);\n scale.append(...this._bands().filter((level) => level >= from && level <= to).map((level) => {\n const swatch = document.createElement('span');\n swatch.style.setProperty('--level', String(level));\n return swatch;\n }));\n legend.append(low, scale, high);\n return [legend];\n }\n\n /** With data-steps, every band's shade from the lowest to the highest; otherwise none. */\n private _bands() {\n const steps = this._steps;\n if (!steps) return [];\n return Array.from({ length: 2 * steps - 1 }, (_, k) => (k - steps + 1) / (steps - 1));\n }\n\n /** The number of bands data-steps asks for, or 0 for a smooth scale. */\n private get _steps() {\n const steps = Math.round(this._number('steps') ?? 0);\n return steps > 1 ? steps : 0;\n }\n\n /**\n * How a value shades its cell: from 0 at the scale's low end to 1 at its\n * high end, or with data-mid from -1 to 1 either side of that midpoint,\n * as far as the further end. With data-steps the shades fall into bands.\n */\n private _shade(low: number, high: number) {\n const option = (name: 'min' | 'max', fallback: number) => this._number(name) ?? this.options[name] ?? fallback;\n const [min, max, mid] = [option('min', low), option('max', high), this._number('mid')];\n const clamp = (value: number, floor: number) => Math.min(1, Math.max(floor, value));\n const level = mid === null\n ? (value: number) => clamp((value - min) / (max - min || 1), 0)\n : (value: number) => clamp((Math.min(max, Math.max(min, value)) - mid) / (Math.max(max - mid, mid - min) || 1), -1);\n const steps = this._steps;\n return steps ? (value: number) => band(level(value), steps) : level;\n }\n\n /**\n * A grid of the row headers and cells, row by row, with the column headers\n * below. Each cell's --level shades it in CSS.\n */\n protected _draw(): Element {\n const columns = this.series.length;\n let [low, high] = [Infinity, -Infinity];\n this._ends = ['', ''];\n this.series.forEach((series) => series.values.forEach((value, row) => {\n if (value === null) return;\n if (value < low) [low, this._ends[0]] = [value, series.text[row]];\n if (value > high) [high, this._ends[1]] = [value, series.text[row]];\n }));\n const shade = this._shade(low, high);\n this._endLevels = [shade(low), shade(high)];\n\n const grid = document.createElement('div');\n grid.className = 'heatmap-chart-grid';\n grid.setAttribute('aria-hidden', 'true');\n grid.style.setProperty('--columns', String(columns));\n grid.style.setProperty('--rows', String(this.labels.length));\n const span = (className: string, text = '') => {\n const element = document.createElement('span');\n element.className = className;\n element.textContent = text;\n return element;\n };\n const label = (cell: HTMLTableCellElement | undefined) =>\n cell?.dataset.label ?? cell?.textContent.trim() ?? '';\n const values = this.el.classList.contains('values');\n\n this._cells = [];\n this._levels = [];\n // The row labels stay put beside the cells, which scroll when they are too narrow.\n const [rows, cells] = [document.createElement('div'), document.createElement('div')];\n rows.className = 'heatmap-chart-rows';\n cells.className = 'heatmap-chart-cells';\n this.labels.forEach((_, row) => {\n rows.append(span('heatmap-chart-row', label(this._rows[row].cells[0])));\n this.series.forEach((series) => {\n const value = series.values[row];\n const level = value === null ? null : shade(value);\n const cell = span('heatmap-chart-cell', values ? series.text[row] : '');\n if (level === null) cell.classList.add('gap');\n else cell.style.setProperty('--level', String(level));\n this._cells.push(cell);\n this._levels.push(level);\n cells.append(cell);\n });\n });\n\n // A column label runs on over the empty labels after it.\n const labels = this._header.slice(1, columns + 1).map(label);\n const columnLabels: HTMLElement[] = [];\n labels.forEach((text, column) => {\n if (!text) return;\n let end = column + 1;\n while (end < columns && !labels[end]) end++;\n const element = span('heatmap-chart-column', text);\n element.classList.toggle('run', end > column + 1);\n element.style.gridArea = `${this.labels.length + 1} / ${column + 1} / auto / ${end + 1}`;\n cells.append(element);\n columnLabels.push(element);\n });\n // Labels the author already spaced out with empty ones are left as written.\n this._observeLabels(cells, columnLabels.some((element) => element.classList.contains('run')) ? [] : columnLabels);\n\n // The plot is the one Tab stop, so the scroll box is not another, and a\n // press that focuses it hands focus on to the plot.\n const scroll = (this._scroll = document.createElement('div'));\n scroll.className = 'heatmap-chart-scroll';\n scroll.tabIndex = -1;\n scroll.addEventListener('focus', () => this._plot.focus());\n scroll.addEventListener('scroll', () => this._follow(scroll), { passive: true });\n scroll.append(cells);\n grid.append(rows, scroll);\n return grid;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["band"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/core/component.ts"],
4
- "sourcesContent": ["import { Utils, controllerFor } from './utils';\n\n/**\n * Base options for component initialization.\n */\nexport interface BaseOptions {}\n\nexport type InitElement = HTMLElement | Element;\nexport type InitElements<T extends InitElement> = NodeListOf<T> | HTMLCollectionOf<T>;\n/** Any component class; `init` reads its element, options and instance types. */\ntype ComponentClass = (new (el: never, options: never) => Component<BaseOptions>) & { key: string };\n/** The element a component class is constructed on. */\ntype ElementOf<C extends ComponentClass> = C extends new (el: infer E, options: never) => unknown ? E : never;\n/** The options `init` accepts for a component class. */\ntype InitOptions<C extends ComponentClass> = Partial<InstanceType<C>['options']>;\n\nexport interface I18nOptions {\n cancel: string;\n clear: string;\n done: string;\n}\n\n/** What {@link Component._notify} passes on, and when it stops. */\nexport interface NotifyOptions {\n args?: unknown[];\n detail?: unknown;\n current?: () => boolean;\n}\n\n/**\n * Base class implementation for Expressive components.\n */\nexport class Component<O extends BaseOptions> {\n /**\n * The element property that holds an instance, `Expressive_<Name>`, so page\n * code can read `el.Expressive_Tabs` as well as call `Tabs.getInstance(el)`.\n */\n static key: string;\n /**\n * The DOM element the plugin was initialized with.\n */\n el: HTMLElement;\n /**\n * The options the instance was initialized with.\n */\n options: O;\n /** Aborted by destroy(), which removes every listener added with its signal. */\n protected _events: AbortController;\n\n /**\n * Destroys any instance already on `el`, then spreads `options` over the\n * class defaults, and `options.i18n` over the default strings, so passing\n * one string keeps the rest. A subclass passes options it reads from\n * markup in `options`.\n */\n constructor(el: HTMLElement, options: Partial<O>) {\n // Display error if el is not a valid HTML Element\n if (!(el instanceof HTMLElement)) {\n console.error(Error(el + ' is not an HTML Element'));\n }\n new.target.getInstance(el)?.destroy();\n this.el = el;\n const defaults: Partial<O> & { i18n?: object } = new.target.defaults;\n const i18n: object = defaults.i18n && { i18n: { ...defaults.i18n, ...(options as typeof defaults)?.i18n } };\n this.options = { ...defaults, ...options, ...i18n } as O;\n this._events = controllerFor(el);\n el[new.target.key] = this;\n }\n\n /**\n * Initializes an instance of the class it is called on.\n * @param el HTML element.\n * @param options Component options.\n */\n static init<C extends ComponentClass>(this: C, el: ElementOf<C>, options?: InitOptions<C>): InstanceType<C>;\n /**\n * Initializes an instance of the class it is called on for each element.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init<C extends ComponentClass>(\n this: C,\n els: InitElements<InitElement>,\n options?: InitOptions<C>\n ): InstanceType<C>[];\n static init<C extends ComponentClass>(\n this: C,\n els: ElementOf<C> | InitElements<InitElement>,\n options: InitOptions<C> = {}\n ): InstanceType<C> | InstanceType<C>[] {\n const create = (el: unknown) => new this(el as never, options as never) as InstanceType<C>;\n if (els instanceof Element) return create(els);\n return els ? Array.from(els as InitElements<InitElement>, create) : null;\n }\n\n /**\n * @returns default options for component instance.\n */\n static get defaults(): BaseOptions {\n return {};\n }\n\n /**\n * Retrieves the instance of the class it is called on for the given element.\n * @param el Associated HTML Element.\n */\n static getInstance<C extends ComponentClass>(this: C, el: HTMLElement): InstanceType<C> {\n return el[this.key];\n }\n\n /**\n * Runs an `on\u2026` option callback, then fires `expressive:<type>` from the\n * element, so pages can listen instead of passing options. The callback gets\n * `args` (the element by default) and the event carries `detail`.\n *\n * A callback or listener may close, reopen or destroy the component. Pass\n * `current` to tell whether the state `type` names still holds; the event\n * is skipped once it does not, or once the instance is destroyed, and the\n * result says whether to carry on.\n */\n protected _notify(\n type: string,\n callback?: Function | null,\n { args = [this.el], detail, current = () => true }: NotifyOptions = {}\n ): boolean {\n const live = () => (this.constructor as typeof Component).getInstance(this.el) === this && current();\n if (typeof callback === 'function') callback.apply(this, args);\n if (!live()) return false;\n Utils.emit(this.el, type, detail);\n return live();\n }\n\n /**\n * Destroy plugin instance and teardown. A subclass tears down its own state\n * and calls this to remove its listeners and release the element.\n */\n destroy(): void {\n this._events.abort();\n this.el[(this.constructor as typeof Component).key] = undefined;\n }\n}\n"],
5
- "mappings": ";;;;;;AAgCO,IAAM,YAAN,MAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuB5C,YAAY,IAAiB,SAAqB;AAEhD,QAAI,EAAE,cAAc,cAAc;AAChC,cAAQ,MAAM,MAAM,KAAK,yBAAyB,CAAC;AAAA,IACrD;AACA,eAAW,YAAY,EAAE,GAAG,QAAQ;AACpC,SAAK,KAAK;AACV,UAAM,WAA2C,WAAW;AAC5D,UAAM,OAAe,SAAS,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,GAAI,SAA6B,KAAK,EAAE;AAC1G,SAAK,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK;AAClD,SAAK,UAAU,cAAc,EAAE;AAC/B,OAAG,WAAW,GAAG,IAAI;AAAA,EACvB;AAAA,EAkBA,OAAO,KAEL,KACA,UAA0B,CAAC,GACU;AACrC,UAAM,SAAS,CAAC,OAAgB,IAAI,KAAK,IAAa,OAAgB;AACtE,QAAI,eAAe,QAAS,QAAO,OAAO,GAAG;AAC7C,WAAO,MAAM,MAAM,KAAK,KAAkC,MAAM,IAAI;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAwB;AACjC,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAA+C,IAAkC;AACtF,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYU,QACR,MACA,UACA,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,UAAU,MAAM,KAAK,IAAmB,CAAC,GAC5D;AACT,UAAM,OAAO,MAAO,KAAK,YAAiC,YAAY,KAAK,EAAE,MAAM,QAAQ,QAAQ;AACnG,QAAI,OAAO,aAAa,WAAY,UAAS,MAAM,MAAM,IAAI;AAC7D,QAAI,CAAC,KAAK,EAAG,QAAO;AACpB,UAAM,KAAK,KAAK,IAAI,MAAM,MAAM;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACd,SAAK,QAAQ,MAAM;AACnB,SAAK,GAAI,KAAK,YAAiC,GAAG,IAAI;AAAA,EACxD;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/menu.ts"],
4
- "sourcesContent": ["import { Utils, controllerFor, restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\n\n// CSS anchor positioning, where the browser has it. A menu opened from its\n// trigger is anchored there and flips at the viewport edges in CSS; context\n// menus open at a point and cover-trigger menus overlap their trigger, so\n// both keep the measured placement, as do menus under a transformed\n// ancestor and every browser without anchors.\n// Either way the open menu is a manual popover in the top layer, so no\n// ancestor clips it or contains it, and its bounds are the viewport's.\n\n/** An element's parent, or its shadow root's host. */\nconst parentOf = (el: Element): Element | null => el.parentElement ?? ((el.getRootNode() as ShadowRoot).host || null);\n\n/**\n * Whether an ancestor of `el`, across shadow roots, moves it with a\n * transform. Firefox anchors a top-layer menu to the trigger's box as laid\n * out, before transforms, so a menu under one is measured instead, as in a\n * floating toolbar centred with `translateX(-50%)`.\n */\n// Computed values of the individual transform properties that move nothing,\n// such as a side sheet's resting `translate: 0px`.\nconst IDENTITY = { translate: /^(none|0px( 0px){0,2})$/, rotate: /^(none|(\\S+ )*0deg)$/, scale: /^(none|1( 1){0,2})$/ };\n\nfunction transformed(el: Element) {\n for (let node = parentOf(el); node; node = parentOf(node)) {\n const style = getComputedStyle(node);\n // An identity transform, often a translateZ(0) layer hint, moves nothing.\n if (!new DOMMatrixReadOnly(style.transform).isIdentity) return true;\n if (Object.entries(IDENTITY).some(([property, identity]) => !identity.test(style.getPropertyValue(property)))) return true;\n }\n return false;\n}\n\n/** The shadow roots an element sits in, nearest first. */\nfunction shadowRoots(el: Element) {\n const roots: ShadowRoot[] = [];\n for (let root = el.getRootNode(); 'host' in root; root = (root as ShadowRoot).host.getRootNode()) roots.push(root as ShadowRoot);\n return roots;\n}\n\n/**\n * The room a measured menu has in the viewport when aligned at each edge of\n * its trigger `el`. Aligned at `top` it starts `offset` below the trigger's\n * top edge, and at `bottom` it ends `offset` above its bottom edge. Negative\n * room means the menu does not fit that way.\n */\nfunction room(el: HTMLElement, menu: Pick<DOMRect, 'width' | 'height'>, offset: number) {\n const rect = el.getBoundingClientRect();\n return {\n left: window.innerWidth - (rect.left + menu.width),\n right: rect.right - menu.width,\n top: window.innerHeight - (rect.top + menu.height + offset),\n bottom: rect.bottom - (menu.height + offset)\n };\n}\n\n/** The keys that move between rows. Home and End go to the ends. */\nconst STEPS = { ArrowUp: -1, ArrowDown: 1 };\n// A list's rows: its own items, and the items of each <li role=\"none\"><ul\n// role=\"group\"> inside it.\nconst ROWS = ':scope > li, :scope > li > ul[role=\"group\"] > li';\n\nconst anchorSupported = typeof CSS !== 'undefined' && !!CSS.supports?.('anchor-name: --a');\n\n// The anchored inline properties, cleared together when the menu is reset.\nconst ANCHOR_STYLES = ['position', 'inset', 'max-height', 'position-anchor', 'position-area', 'position-try-fallbacks'];\n\nexport interface MenuOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus menu el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the menu activator.\n *\n * A trigger narrower than the surface's own 112dp minimum cannot be\n * honoured, so such a menu is sized to its content instead - see\n * MIN_SURFACE_WIDTH.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the menu.\n * @default null\n */\n container: Element | ShadowRoot;\n /**\n * If false, the menu will show below the trigger.\n * That is the M3 placement. Pass `true` to cover the trigger.\n * @default false\n */\n coverTrigger: boolean;\n /**\n * The side of the trigger the menu opens on when there is room, such as\n * 'top' for a trigger in a bottom bar. It flips when there is not.\n * @default 'bottom'\n */\n placement: 'bottom' | 'top';\n /**\n * If true, close menu on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the menu will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * If true, the trigger is a region and the menu is its context menu: it\n * opens at the pointer on right-click, long-press or the keyboard context\n * menu key instead of on click. `data-context-menu` on the trigger sets it.\n * @default false\n */\n contextMenu: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when menu starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when menu starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\n// The menu surface's own width bounds, stated in `components/_menu.scss` and\n// restated here because the constraint below has to reason about them.\nconst MIN_SURFACE_WIDTH = 112;\nconst MAX_SURFACE_WIDTH = 280;\n\nconst _defaults: MenuOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: false,\n placement: 'bottom',\n closeOnClick: true,\n hover: false,\n contextMenu: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nconst SPACE = ' ';\n\nexport class Menu extends Component<MenuOptions> {\n static _menus: Menu[] = [];\n /** ID of the menu element. */\n id: string;\n /** The DOM element of the menu. */\n menuEl: HTMLElement;\n /** If the menu is open. */\n isOpen: boolean;\n /** If the menu content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n private _pendingTimers = new Set<ReturnType<typeof setTimeout>>();\n private _transition = 0;\n /** Removes the listeners an open menu adds. */\n private _openEvents: AbortController | undefined;\n private _originalInert: string | null;\n private _menuClickTargets = new WeakMap<Event, HTMLElement>();\n // True while Space activates a row, so the click it sends can keep a radio\n // menu open.\n private _spaceActivation = false;\n /** Whether the pointer opened the menu, so opening leaves focus where it was. */\n private _openedByHover = false;\n /**\n * Viewport point the open context menu belongs to. Null outside a\n * right-click, so a keyboard or programmatic open uses the region's corner\n * rather than an old pointer position.\n */\n private _contextPoint: { x: number; y: number } | null = null;\n /** What had focus when a context menu opened; focus goes back there. */\n private _contextReturn: HTMLElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<MenuOptions>) {\n super(el, { contextMenu: el.hasAttribute('data-context-menu'), ...options });\n\n Menu._menus.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.menuEl = Utils.getElementById(el, this.id);\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n // A context region is content, not a button: expanded, haspopup and\n // controls are not valid on it, and the menu key is how it is discovered.\n if (!this.options.contextMenu) {\n this.el.ariaExpanded = 'false';\n if (!this.el.hasAttribute('aria-haspopup')) this.el.setAttribute('aria-haspopup', 'menu');\n if (this.id && !this.el.hasAttribute('aria-controls'))\n this.el.setAttribute('aria-controls', this.id);\n }\n\n // Without a menu, moving it inserts a literal \"null\" text node and the\n // trigger's handlers would cancel its own clicks and keys to open nothing.\n if (!this.menuEl) {\n console.warn(`Menu skipped: no element matches target \"${this.id}\".`, el);\n return;\n }\n this._originalInert = this.menuEl.getAttribute('inert');\n // Keep the menu next to the trigger so positioning stays local.\n this._moveMenuToElement();\n this._setupAccessibility();\n this._makeMenuFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): MenuOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Menu';\n\n destroy() {\n this._clearPendingTimers();\n this.isOpen = false;\n this._setExpanded(false);\n if (this.menuEl) Utils.setAnchorName(this.el, `--menu-${this.menuEl.id}`, false);\n clearTimeout(this.filterTimeout);\n this._resetMenuStyles();\n this._restoreInert();\n this._events.abort();\n this._openEvents?.abort();\n const index = Menu._menus.indexOf(this);\n if (index >= 0) Menu._menus.splice(index, 1);\n super.destroy();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown, { signal });\n // Item click handler\n this.menuEl?.addEventListener('click', this._handleMenuClick, { signal });\n if (this.menuEl?.querySelector(':scope > li > menu')) {\n this.menuEl.addEventListener('mouseover', this._handleSubmenuAlign, { signal });\n }\n if (this.options.contextMenu) {\n this.el.addEventListener('contextmenu', this._handleContextMenu, { signal });\n } else if (this.options.hover) {\n // Hover event handlers\n this.el.addEventListener('mouseenter', this._handleMouseEnter, { signal });\n this.el.addEventListener('mouseleave', this._handleMouseLeave, { signal });\n this.menuEl.addEventListener('mouseleave', this._handleMouseLeave, { signal });\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick, { signal });\n }\n }\n\n _setupTemporaryEventHandlers() {\n this._openEvents?.abort();\n this._openEvents = controllerFor(this.el);\n const { signal } = this._openEvents;\n const passive = { passive: true, signal };\n document.addEventListener('click', this._handleDocumentClick, { signal });\n this.menuEl?.addEventListener('pointerdown', this._handleMenuPointerdown, passive);\n this.menuEl?.addEventListener('touchmove', this._handleDocumentTouchmove, passive);\n document.addEventListener('touchmove', this._handleDocumentTouchmove, passive);\n this.menuEl?.addEventListener('keydown', this._handleMenuKeydown, { signal });\n document.addEventListener('keydown', this._handleDocumentKeydown, { signal });\n window.addEventListener('resize', this._handleWindowResize, { signal });\n // A scroll inside a shadow root stays there, so each root around the\n // trigger is heard as well as the window.\n for (const target of [window, ...shadowRoots(this.el)]) {\n target.addEventListener('scroll', this._reanchor, { capture: true, passive: true, signal });\n }\n // A right-click elsewhere fires no click, so it would leave the menu open.\n if (this.options.contextMenu) document.addEventListener('contextmenu', this._handleDocumentContextMenu, { signal });\n }\n\n _handleContextMenu = (e: MouseEvent) => {\n // A nested region already answered this right-click; this one closes so\n // two menus never stack.\n if (e.defaultPrevented) {\n this.close();\n return;\n }\n // A right-click on another open menu inside this region belongs to that\n // menu, which keeps itself open.\n const path = e.composedPath();\n if (Menu._menus.some((menu) => menu !== this && menu.isOpen && path.includes(menu.menuEl))) return;\n e.preventDefault();\n if (!this.isOpen) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n this._contextReturn = root.activeElement instanceof HTMLElement ? root.activeElement : null;\n }\n // The menu key and Shift+F10 fire this too, with a point that may sit\n // outside the region (0, 0 in some engines). Those leave the point unset\n // and open at the region's start corner.\n const rect = this.el.getBoundingClientRect();\n const fromPointer =\n (e.clientX !== 0 || e.clientY !== 0) &&\n e.clientX >= rect.left && e.clientX <= rect.right &&\n e.clientY >= rect.top && e.clientY <= rect.bottom;\n this._contextPoint = fromPointer ? { x: e.clientX, y: e.clientY } : null;\n if (this.isOpen) this.recalculateDimensions();\n else this.open();\n };\n\n _handleDocumentContextMenu = (e: MouseEvent) => {\n const path = e.composedPath();\n // A right-click on the menu itself keeps it open and the browser's own\n // menu shut.\n if (path.includes(this.menuEl)) {\n e.preventDefault();\n return;\n }\n if (!path.includes(this.el)) this.close();\n };\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n if (this.isOpen) return;\n // A pointer passing over the trigger must not pull focus out of whatever\n // the user is typing in, so a hover-opened menu leaves focus alone.\n this._openedByHover = true;\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n // Close hover menu if mouse did not leave to either active menu-trigger or menu-content\n const leaveToActiveMenuTrigger = toEl.closest('.menu-trigger')?.['Expressive_Menu']?.isOpen;\n if (!leaveToActiveMenuTrigger && !this.menuEl?.contains(toEl)) this.close();\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath();\n const menuTarget = this._menuClickTargets.get(e);\n this._menuClickTargets.delete(e);\n // A click on the trigger belongs to the trigger's own click handler (which\n // toggles), not to outside dismissal: an Autocomplete input has no toggle,\n // so moving the caret closed its list. A context region still closes on a\n // left click, since that is how its menu is dismissed.\n if (!menuTarget && !this.options.contextMenu && path.includes(this.el)) {\n this.isTouchMoving = false;\n return;\n }\n const target = menuTarget ?? <HTMLElement>(path[0] || e.target);\n const inside = !!menuTarget || path.includes(this.menuEl) || this.menuEl?.contains(target);\n if (this._isSubmenuTriggerClick(target)) return;\n if (inside && this._closesOnClick(target)) {\n this.close();\n } else if (!inside) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the menu\n this._schedule(() => this.close(), 0);\n }\n this.isTouchMoving = false;\n };\n\n // A hover-opened menu does not hold focus, so its own keydown handler never\n // sees Escape. Close it from wherever focus is, without moving focus, and\n // take the key only when it was pressed on the trigger.\n _handleDocumentKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !this._openedByHover) return;\n if (Utils.focusIsIn(this.el)) e.preventDefault();\n this.close();\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // A context region keeps its keys for its own content; the browser turns\n // the menu key and Shift+F10 into a contextmenu event.\n if (this.options.contextMenu) return;\n // Opening focus is delayed, so Escape must work while the trigger still owns it.\n if (e.key === 'Escape' && this.isOpen && Utils.plainKey(e) && !Utils.isComposing(e)) {\n e.preventDefault();\n this.close();\n return;\n }\n // M3: Space, Enter, Arrow Down, and Arrow Up open a closed menu.\n const opensMenu = [SPACE, 'Enter', 'ArrowDown', 'ArrowUp'].includes(e.key);\n if (!opensMenu) return;\n if (!this.isOpen) {\n e.preventDefault();\n this.open();\n } else if (this._openedByHover) {\n // The keyboard takes over a menu the pointer opened.\n e.preventDefault();\n this._openedByHover = false;\n this._focusInitialItem();\n }\n };\n\n // A scroll ends without a click, which is the only other place the flag is\n // cleared, so a new gesture has to clear it or the next tap is ignored.\n _handleMenuPointerdown = () => {\n this.isTouchMoving = false;\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (e.composedPath().includes(this.menuEl) || this.menuEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleMenuClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n // Closed shadow roots hide the original target from document listeners.\n this._menuClickTargets.set(e, target);\n const li = target.closest('li');\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (li && this._isSubmenuTriggerClick(target)) {\n e.preventDefault();\n e.stopPropagation();\n this._toggleSubmenu(li);\n return;\n }\n if (li) this._activateItem(li);\n };\n\n private _activateItem(li: HTMLLIElement) {\n const checked = this._toggleChecked(li);\n if (!this._notify('select', this.options.onItemClick, { args: [li], detail: { item: li } })) return;\n if (checked !== null) this._notify('change', null, { detail: { item: li, checked } });\n }\n\n // A menuitemcheckbox flips aria-checked, and a menuitemradio checks itself\n // and unchecks its group, before anyone hears of the click. Any other row,\n // or a radio that was already checked, returns null.\n private _toggleChecked(li: HTMLElement): boolean | null {\n const role = li.getAttribute('role');\n if (role === 'menuitemradio') return this._checkRadio(li);\n if (role !== 'menuitemcheckbox') return null;\n const checked = li.getAttribute('aria-checked') !== 'true';\n li.setAttribute('aria-checked', String(checked));\n return checked;\n }\n\n // A radio's group is its parent list: a <ul role=\"group\">, or for radio\n // rows outside any group, their menu.\n private _checkRadio(li: HTMLElement): true | null {\n if (li.getAttribute('aria-checked') === 'true') return null;\n li.parentElement.querySelectorAll(':scope > li[role=\"menuitemradio\"]').forEach((radio) => {\n radio.setAttribute('aria-checked', String(radio === li));\n });\n return true;\n }\n\n private _isCheckboxRow(el: Element | null | undefined) {\n return el?.closest('li')?.getAttribute('role') === 'menuitemcheckbox';\n }\n\n // isTouchMoving: a scroll on mobile is not a choice.\n private _closesOnClick(target: HTMLElement) {\n return this.options.closeOnClick && !this.isTouchMoving && !this._keepsOpen(target);\n }\n\n // Click and Space keep a checkbox menu open so several items can be\n // toggled. Space keeps a radio menu open too; a click on a radio closes it.\n private _keepsOpen(target: HTMLElement) {\n const role = target.closest('li')?.getAttribute('role');\n if (role === 'menuitemcheckbox') return true;\n return this._spaceActivation && role === 'menuitemradio';\n }\n\n // Enter toggles a checkbox item and then closes, as it does on any item.\n private _closeAfterEnter(e: KeyboardEvent, row: Element | undefined) {\n if (e.key === 'Enter' && this.options.closeOnClick && this._isCheckboxRow(row)) this.close();\n }\n\n private _setupAccessibility() {\n if (!this.menuEl) return;\n if (!this.menuEl.hasAttribute('role')) this.menuEl.setAttribute('role', 'menu');\n\n const menus = [this.menuEl, ...this.menuEl.querySelectorAll('menu')];\n menus.forEach((menu) => {\n if (!menu.hasAttribute('role')) menu.setAttribute('role', 'menu');\n if (menu.getAttribute('role') !== 'menu') return;\n\n menu.querySelectorAll(ROWS).forEach((li) => {\n if (li.classList.contains('divider')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'separator');\n return;\n }\n if (li.classList.contains('gap')) {\n li.setAttribute('aria-hidden', 'true');\n return;\n }\n if (li.classList.contains('label') || li.classList.contains('optgroup')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'presentation');\n return;\n }\n if (!li.hasAttribute('role')) li.setAttribute('role', 'menuitem');\n if (li.classList.contains('disabled') && !li.hasAttribute('aria-disabled')) {\n li.setAttribute('aria-disabled', 'true');\n }\n });\n });\n }\n\n private _isSubmenuTriggerClick(target: HTMLElement) {\n if (!this.menuEl) return false;\n const li = target.closest('li');\n if (!li || !this.menuEl.contains(li)) return false;\n const submenu = li.querySelector(':scope > menu');\n if (!submenu) return false;\n return !submenu.contains(target);\n }\n\n private _setupSubmenus() {\n this.menuEl?.querySelectorAll('li').forEach((li) => {\n if (!li.querySelector(':scope > menu')) return;\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n });\n }\n\n private _toggleSubmenu(li: HTMLElement) {\n const open = !li.classList.contains('open');\n li.parentElement?.querySelectorAll(':scope > li.open').forEach((other) => {\n if (other !== li) this._closeSubmenu(other as HTMLElement);\n });\n li.classList.toggle('open', open);\n if (open) this._alignSubmenu(li);\n this._syncSubmenuAria(li, open);\n }\n\n private _syncSubmenuAria(li: HTMLElement, open: boolean) {\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n\n private _handleSubmenuAlign = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li');\n if (li?.querySelector(':scope > menu') && this.menuEl?.contains(li)) {\n this._alignSubmenu(li as HTMLElement);\n }\n };\n\n private _alignSubmenu(li: HTMLElement) {\n const menu = li.querySelector(':scope > menu') as HTMLElement | null;\n if (!menu) return;\n // Flyouts stay `display: block` (visibility/opacity hide them) so the\n // rect is readable without temporarily painting the menu.\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.left < 8 || rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n }\n\n private _closeSubmenu(li: HTMLElement) {\n li.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(li, false);\n }\n\n private _closeSubmenus() {\n this.menuEl?.querySelectorAll('li.open').forEach((li) => this._closeSubmenu(li as HTMLElement));\n }\n\n private _containingSubmenu(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const submenu = target.closest('li > menu');\n if (submenu instanceof HTMLElement && this.menuEl?.contains(submenu)) return submenu;\n return null;\n }\n\n private _focusedRow(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const li = target.closest('li');\n if (li instanceof HTMLElement && this.menuEl?.contains(li)) return li;\n return null;\n }\n\n _handleMenuKeydown = (e: KeyboardEvent) => {\n if (!this.isOpen || !Utils.plainKey(e) || Utils.isComposing(e)) return;\n const list = this._containingSubmenu(e) ?? this.menuEl;\n const rtl = getComputedStyle(list).direction === 'rtl';\n const openKey = rtl ? 'ArrowLeft' : 'ArrowRight';\n const backKey = rtl ? 'ArrowRight' : 'ArrowLeft';\n if ([openKey, backKey, 'ArrowUp', 'ArrowDown', 'Escape', 'Tab'].includes(e.key)) {\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n this.close();\n } else if (e.key === openKey) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu') && !li.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n li.classList.add('open');\n this._alignSubmenu(li);\n this._syncSubmenuAria(li, true);\n const first = Array.from(li.querySelector(':scope > menu').children).find(\n child => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (first) this._focusRow(first);\n }\n } else if (e.key === backKey) {\n const submenu = this._containingSubmenu(e);\n if (submenu) {\n e.preventDefault();\n const parentLi = submenu.parentElement as HTMLElement;\n this._closeSubmenu(parentLi);\n this._focusRow(parentLi);\n }\n }\n // Up and Down move a row, Home and End to the ends.\n else if (this._moveFocus(list, e)) {\n e.preventDefault();\n }\n // SPACE OR ENTER selects the focused item.\n else if (e.key === 'Enter' || e.key === SPACE) {\n const li = this._focusedRow(e);\n e.preventDefault();\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) return;\n if (li?.querySelector(':scope > menu')) {\n this._toggleSubmenu(li);\n return;\n }\n const focusedElement = li ?? this.menuEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector(':scope > a, :scope > button');\n this._spaceActivation = e.key === SPACE;\n if (!!activatableElement) {\n activatableElement.click();\n } else if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n this._spaceActivation = false;\n this._closeAfterEnter(e, focusedElement);\n }\n // Close menu on ESC\n else if (e.key === 'Escape') {\n e.preventDefault();\n const openSub = this._containingSubmenu(e)?.parentElement ??\n Array.from(this.menuEl.querySelectorAll('li.open')).reverse()[0];\n if (openSub) {\n this._closeSubmenu(openSub as HTMLElement);\n this._focusRow(openSub as HTMLElement);\n } else {\n this.close();\n }\n }\n\n const keyText = e.key.toLowerCase();\n if (e.key.length === 1 && e.key !== SPACE) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const newOptionEl = this._rows(list).find(\n (el) => !el.matches('.disabled, [aria-disabled=\"true\"]') &&\n Array.from(el.childNodes).filter(node => !(node instanceof Element && node.matches('menu')))\n .map(node => node.textContent).join('').trim().toLowerCase().startsWith(string)\n );\n if (newOptionEl) {\n this._focusRow(newOptionEl as HTMLElement);\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n }\n };\n\n _handleWindowResize = () => {\n // Only re-place the menu if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n private _restoreInert() {\n if (this.menuEl) restoreAttribute(this.menuEl, 'inert', this._originalInert);\n }\n\n // focusedIndex is reset on close and only covers one list, so clearing by\n // index left an old highlight behind after reopening or a typeahead jump.\n private _clearActive() {\n this.menuEl?.querySelectorAll('li.active').forEach((li) => li.classList.remove('active'));\n }\n\n private _focusRow(item: HTMLElement) {\n this._clearActive();\n this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);\n item.focus({ preventScroll: true });\n item.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n _resetMenuStyles() {\n // destroy() runs this even when the menu target was never found.\n if (!this.menuEl) return;\n // A no-op unless open, so a removed menu does not throw.\n this.menuEl.hidePopover();\n this._resetMenuPositioningStyles();\n this.menuEl.style.transform = '';\n this.menuEl.style.opacity = '';\n }\n\n _resetMenuPositioningStyles() {\n this.menuEl.style.width = '';\n this.menuEl.style.height = '';\n this.menuEl.style.left = '';\n this.menuEl.style.top = '';\n this.menuEl.style.transformOrigin = '';\n for (const property of ANCHOR_STYLES) this.menuEl.style.removeProperty(property);\n this._stopReanchoring();\n }\n\n _moveMenuToElement() {\n if (this.options.container) this.options.container.append(this.menuEl);\n else this.el.after(this.menuEl);\n }\n\n _makeMenuFocusable() {\n if (!this.menuEl) return;\n // Manual: Menu keeps its own light dismiss and Escape. An auto popover\n // would close an Autocomplete list when its input is clicked, close any\n // other open popover, and leave the top layer before the exit fade where\n // `overlay` is missing (Firefox, WebKit).\n this.menuEl.popover = 'manual';\n // Focus moves directly to menu items; the surface itself is not a stop.\n this.menuEl.tabIndex = -1;\n // Only set tabindex if it hasn't been set by user\n this.menuEl.querySelectorAll(':scope li').forEach((el) => {\n if (el.matches('.divider, .gap, .label, .optgroup, [role=\"none\"]')) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n /**\n * Moves focus for Up, Down, Home or End among the list's focusable rows,\n * without wrapping, and says whether the key was one of those.\n */\n private _moveFocus(list: Element, e: KeyboardEvent) {\n const rows = this._rows(list);\n const from = this._focusedRow(e) ?? list.children[this.focusedIndex];\n const index = Utils._keyIndex(e.key, rows.indexOf(from as HTMLElement), rows.length, STEPS);\n if (Number.isNaN(index)) return false;\n const row = rows[index];\n if (row) {\n this._focusRow(row);\n row.classList.add('active');\n }\n return true;\n }\n\n /** The list's rows that take focus, in document order. */\n private _rows(list: Element) {\n return Array.from(list.querySelectorAll(ROWS)).filter(\n (row): row is HTMLElement => row instanceof HTMLElement && row.tabIndex !== -1\n );\n }\n\n private _focusInitialItem() {\n if (!this.menuEl || !this.options.autoFocus) return;\n const first = this._rows(this.menuEl)[0];\n if (!first) return;\n this._clearActive();\n this.focusedIndex = Array.from(first.parentElement.children).indexOf(first);\n first.focus({ preventScroll: true });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.menuEl.children.length &&\n this.options.autoFocus\n ) {\n (this.menuEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.menuEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n /**\n * Whether a measured menu opens upward: when there is no room below, or\n * when placement 'top' asks for it and there is room above.\n */\n private _opensUp(space: { top: number; bottom: number }) {\n return space.top < 0 || (this.options.placement === 'top' && space.bottom >= 0);\n }\n\n _getMenuPosition() {\n const triggerBRect = this.el.getBoundingClientRect();\n const menuBRect = this.menuEl.getBoundingClientRect();\n\n let idealHeight = menuBRect.height;\n let idealWidth = menuBRect.width;\n let idealXPos = triggerBRect.left - menuBRect.left;\n let idealYPos = triggerBRect.top - menuBRect.top;\n\n const space = room(this.el, menuBRect, this.options.coverTrigger ? 0 : triggerBRect.height);\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (this._opensUp(space)) {\n if (space.bottom >= 0) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (space.bottom > space.top) {\n verticalAlignment = 'bottom';\n idealHeight += space.bottom;\n idealYPos -= this.options.coverTrigger\n ? space.bottom - 20\n : space.bottom - 20 + triggerBRect.height;\n } else {\n idealHeight += space.top;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (space[horizontalAlignment] < 0) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (space[oppositeAlignment] >= 0) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (space.right > space.left) {\n horizontalAlignment = 'right';\n idealWidth += space.right;\n idealXPos -= space.right;\n } else {\n horizontalAlignment = 'left';\n idealWidth += space.left;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - menuBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - menuBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n private _schedule(callback: () => void, delay: number) {\n const timer = setTimeout(() => {\n this._pendingTimers.delete(timer);\n callback();\n }, delay);\n this._pendingTimers.add(timer);\n }\n\n private _clearPendingTimers() {\n for (const timer of this._pendingTimers) clearTimeout(timer);\n this._pendingTimers.clear();\n return ++this._transition;\n }\n\n _animateIn() {\n const transition = this._transition;\n // Decided now: a hover open leaves focus alone, and if the keyboard takes\n // the menu over before the animation ends it has already placed focus,\n // so the delayed call must not pull it back to the first item.\n const focusOnOpen = !this._openedByHover;\n const duration = this.options.inDuration;\n this.menuEl.style.transition = 'none';\n // from\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n this.menuEl.style.opacity = '1';\n this.menuEl.style.transform = 'scale(1)';\n }, 1);\n this._schedule(() => {\n if (focusOnOpen) this._focusInitialItem();\n if (transition !== this._transition) return;\n this._notify('opened', this.options.onOpenEnd, { current: () => transition === this._transition });\n }, duration);\n }\n\n _animateOut() {\n const transition = this._transition;\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this._resetMenuStyles();\n this._notify('closed', this.options.onCloseEnd, { current: () => transition === this._transition });\n }, duration);\n }\n\n _placeMenu() {\n // Set width before calculating positionInfo. Both callers reset the\n // positioning styles first, so this reads the surface's natural width.\n const natural = this.menuEl.getBoundingClientRect().width;\n // A trigger narrower than the surface's own minimum is not a constraint\n // the menu can honour: the width is written and `min-width` overrides it,\n // leaving the surface at the floor with every item inside it wrapped. So\n // constrain only to a trigger wide enough to mean something, and size by\n // content otherwise. An icon button and a split button's chevron are both\n // that case - 40dp and 48dp against a 112dp floor.\n const triggerWidth = this.el.getBoundingClientRect().width;\n const idealWidth =\n this.options.constrainWidth && !this.options.contextMenu && triggerWidth >= MIN_SURFACE_WIDTH\n ? triggerWidth\n : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));\n this.menuEl.style.width = idealWidth + 'px';\n\n if (this.options.contextMenu) {\n this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner());\n return;\n }\n\n if (anchorSupported && !this.options.coverTrigger && !transformed(this.el)) this._anchorMenu();\n else this._placeByCoordinates();\n }\n\n /**\n * The side an anchored menu opens on: the one asked for when the whole\n * menu fits there, or else the roomier one. The anchored height is capped\n * to its side, so a menu that would only shrink never sets off the\n * flip-block fallback, and the choice is made here.\n */\n private _side(): 'top' | 'bottom' {\n const rect = this.el.getBoundingClientRect();\n const room = { top: rect.top, bottom: window.innerHeight - rect.bottom };\n const [asked, other] = this.options.placement === 'top' ? ['top', 'bottom'] as const : ['bottom', 'top'] as const;\n return room[asked] >= this.menuEl.scrollHeight || room[asked] >= room[other] ? asked : other;\n }\n\n // Below the trigger, or above it for placement 'top', starting at its left\n // edge for alignment 'left' or its right edge for 'right', with the flips\n // position-try-fallbacks offers.\n // The height is capped to the room on the chosen side, so a long menu\n // scrolls there, as in the measured path.\n private _reanchorFrame = 0;\n\n private _anchorMenu() {\n const name = `--menu-${this.menuEl.id}`;\n Utils.setAnchorName(this.el, name, true);\n const style = this.menuEl.style;\n style.position = 'fixed';\n style.inset = 'auto';\n style.maxHeight = '100%';\n style.setProperty('position-anchor', name);\n this._placeAnchored();\n }\n\n /**\n * At most once a frame while the menu is open and something outside it\n * scrolls, an anchored menu chooses its side again and a measured one\n * follows its trigger, keeping its own scroll position. A context menu\n * stays where it opened, and the menu's own scrolling moves nothing.\n */\n private _reanchor = (event: Event) => {\n if (this._reanchorFrame || this.options.contextMenu || this.menuEl.contains(event.target as Node)) return;\n this._reanchorFrame = requestAnimationFrame(() => {\n this._reanchorFrame = 0;\n if (!this.isOpen) return;\n if (this.menuEl.style.getPropertyValue('position-anchor')) return this._placeAnchored();\n // Re-measuring clears the height, which would reset the scroll position.\n const { scrollTop } = this.menuEl;\n this.recalculateDimensions();\n this.menuEl.scrollTop = scrollTop;\n });\n };\n\n private _stopReanchoring() {\n cancelAnimationFrame(this._reanchorFrame);\n this._reanchorFrame = 0;\n }\n\n /** The anchored menu's side, the edge it starts from and its growth origin. */\n private _placeAnchored() {\n const style = this.menuEl.style;\n const [side, edge] = [this._side(), this.options.alignment === 'right' ? 'left' : 'right'];\n style.setProperty('position-area', `${side} span-${edge}`);\n style.setProperty('position-try-fallbacks', 'flip-block, flip-inline, flip-block flip-inline');\n style.transformOrigin = `${edge === 'left' ? '100%' : '0'} ${side === 'top' ? '100%' : '0'}`;\n this.isScrollable = this.menuEl.scrollHeight > this.menuEl.clientHeight;\n }\n\n private _placeByCoordinates() {\n const positionInfo = this._getMenuPosition();\n this.menuEl.style.left = positionInfo.x + 'px';\n this.menuEl.style.top = positionInfo.y + 'px';\n this.menuEl.style.height = positionInfo.height + 'px';\n this.menuEl.style.width = positionInfo.width + 'px';\n this.menuEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /** Where a context menu opens without a pointer: the region's start corner. */\n private _regionCorner() {\n const rect = this.el.getBoundingClientRect();\n const rtl = getComputedStyle(this.el).direction === 'rtl';\n return { x: rtl ? rect.right : rect.left, y: rect.bottom };\n }\n\n /**\n * Places a context menu with its start corner on the point, flipping to\n * the other side of the point where it would not fit. The bounds are the\n * viewport; a menu taller than it gets its height and scrolls.\n *\n * The menu rests at left/top 0 of its containing block, so its rect is the\n * offset to subtract - the same trick _getMenuPosition uses. It is measured\n * without the entry animation's scale, which a second right-click can catch.\n */\n private _placeMenuAtPoint({ x, y }: { x: number; y: number }) {\n // A running transition would still report the interpolated scale, so it\n // is suspended for the read; the target transform is unchanged after.\n const { transform, transition } = this.menuEl.style;\n this.menuEl.style.transition = 'none';\n this.menuEl.style.transform = 'none';\n const menu = this.menuEl.getBoundingClientRect();\n this.menuEl.style.transform = transform;\n this.menuEl.style.transition = transition;\n\n const bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };\n const width = menu.width;\n const height = Math.min(menu.height, bounds.bottom - bounds.top);\n this.isScrollable = height < menu.height;\n if (this.isScrollable) this.menuEl.style.height = height + 'px';\n\n const rtl = getComputedStyle(this.el).direction === 'rtl';\n const fitsRight = x + width <= bounds.right;\n const fitsLeft = x - width >= bounds.left;\n const leftward = rtl ? fitsLeft || !fitsRight : !fitsRight && fitsLeft;\n const upward = y + height > bounds.bottom && y - height >= bounds.top;\n const clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max));\n const left = clamp(leftward ? x - width : x, bounds.left, bounds.right - width);\n const top = clamp(upward ? y - height : y, bounds.top, bounds.bottom - height);\n this.menuEl.style.left = left - menu.left + 'px';\n this.menuEl.style.top = top - menu.top + 'px';\n this.menuEl.style.transformOrigin = `${leftward ? '100%' : '0'} ${upward ? '100%' : '0'}`;\n }\n\n private _setExpanded(expanded: boolean) {\n if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);\n }\n\n // A trigger whose target never resolved has no menu to open.\n private get _canOpen() {\n return !this.isOpen && !!this.menuEl && this.el['Expressive_Menu'] === this;\n }\n\n /**\n * Open menu.\n */\n open = () => {\n if (!this._canOpen) return;\n const transition = this._clearPendingTimers();\n this.isOpen = true;\n // onOpenStart callback\n if (!this._notify('open', this.options.onOpenStart, { current: () => transition === this._transition })) return;\n // Reset styles\n this._resetMenuStyles();\n // The top layer: no ancestor clips or contains the open menu.\n if (this.menuEl.isConnected) this.menuEl.showPopover();\n this._restoreInert();\n this._placeMenu();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the menu\n this._schedule(() => this._setupTemporaryEventHandlers(), 0);\n // Queue handlers before initial focus, including zero-duration entry.\n this._animateIn();\n this._setExpanded(true);\n };\n\n /**\n * Close menu.\n */\n close = () => {\n if (!this.isOpen) return;\n const transition = this._clearPendingTimers();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = root.activeElement;\n this.isOpen = false;\n this._openedByHover = false;\n this.menuEl.setAttribute('inert', '');\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n this.focusedIndex = -1;\n this._clearActive();\n this._closeSubmenus();\n // onCloseStart callback\n if (!this._notify('close', this.options.onCloseStart, { current: () => transition === this._transition })) return;\n this._animateOut();\n this._openEvents?.abort();\n this._setExpanded(false);\n if (this.options.autoFocus && this.menuEl.contains(focused) &&\n (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {\n // A context region may not take focus itself; return to what had it.\n const back = this._contextReturn;\n (back?.isConnected && back !== this.el.ownerDocument.body ? back : this.el).focus();\n }\n this._contextReturn = null;\n this._contextPoint = null;\n };\n\n /**\n * While menu is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetMenuPositioningStyles();\n this._placeMenu();\n }\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["room"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/sankeyChart.ts"],
4
- "sourcesContent": ["import { svgNode } from '../core/utils';\nimport { LineChart, LineChartOptions, cellValue, morph, pace } from './lineChart';\n\nexport type SankeyChartOptions = LineChartOptions;\n\n// ponytail: fixed shares of the plot; tokens if authors ask to tune them.\n/** A node's width, in hundredths of the plot's width. */\nconst NODE_WIDTH = 2;\n/** The gap between nodes in a column, in hundredths of the plot's height. */\nconst NODE_GAP = 4;\n// ponytail: nodes past six repeat the colors, as pie chart rows do.\nconst COLORS = 6;\n\n/** A row that draws a link: its index, its source and target names, and its value. */\ninterface Flow {\n row: number;\n source: string;\n target: string;\n value: number;\n}\n\n/** A node: its name, color, column and size in value units, and where it sits, in hundredths of the plot. */\ninterface Node {\n name: string;\n color: string;\n column: number;\n size: number;\n x: number;\n top: number;\n height: number;\n}\n\n/** A drawn link: its flow, its ends' nodes, its top at each end and its thickness, in hundredths of the plot. */\ninterface Link {\n flow: Flow;\n source: Node;\n target: Node;\n from: number;\n to: number;\n size: number;\n}\n\n/** A tooltip line part. */\nconst span = (text: string) => Object.assign(document.createElement('span'), { textContent: text });\n\n/** A cell's trimmed text, or '' without the cell. */\nconst text = (row: HTMLTableRowElement, column: number) => row.cells[column]?.textContent.trim() ?? '';\n\nconst sum = (flows: Flow[]) => flows.reduce((total, flow) => total + flow.value, 0);\n\n/** A row's flow, or null for a row without both names or a positive value. */\nfunction flowOf(row: HTMLTableRowElement, index: number): Flow | null {\n // A gap's null becomes 0, which draws nothing.\n const [source, target, value] = [text(row, 0), text(row, 1), Number(cellValue(row.cells[2]))];\n return source && target && value > 0 ? { row: index, source, target, value } : null;\n}\n\n/** Whether `from` reaches `to` along the flows, so a flow from `to` to `from` would close a cycle. */\nfunction reaches(flows: Flow[], from: string, to: string, seen = new Set<string>()): boolean {\n if (from === to) return true;\n seen.add(from);\n return flows.some((flow) => flow.source === from && !seen.has(flow.target) && reaches(flows, flow.target, to, seen));\n}\n\n/** The rows' flows in table order, leaving out rows without one and any that would close a cycle. */\nfunction flowsOf(rows: HTMLTableRowElement[]) {\n const flows: Flow[] = [];\n rows.forEach((row, index) => {\n const flow = flowOf(row, index);\n if (flow && !reaches(flows, flow.target, flow.source)) flows.push(flow);\n });\n return flows;\n}\n\n/** A node's column: 0 without incoming flows, otherwise one past the furthest of its sources. */\nfunction columnOf(name: string, flows: Flow[], columns: Map<string, number>): number {\n if (!columns.has(name)) {\n const sources = flows.filter((flow) => flow.target === name).map((flow) => columnOf(flow.source, flows, columns) + 1);\n columns.set(name, Math.max(0, ...sources));\n }\n return columns.get(name)!;\n}\n\n/**\n * The nodes in the order their names first appear, each sized by the larger\n * of its in and out totals, and colored in that order.\n */\nfunction nodesOf(flows: Flow[]): Node[] {\n const columns = new Map<string, number>();\n return [...new Set(flows.flatMap((flow) => [flow.source, flow.target]))].map((name, i) => ({\n name,\n color: String((i % COLORS) + 1),\n column: columnOf(name, flows, columns),\n size: Math.max(sum(flows.filter((flow) => flow.target === name)), sum(flows.filter((flow) => flow.source === name))),\n x: 0,\n top: 0,\n height: 0\n }));\n}\n\n/** Sets each node's place: columns spread across the plot, each centred down it, on one scale. */\nfunction place(nodes: Node[]) {\n const count = Math.max(...nodes.map((node) => node.column)) + 1;\n const columns = Array.from({ length: count }, (_, c) => nodes.filter((node) => node.column === c));\n // Gaps take at most half the height, however many nodes a column has.\n const gap = Math.min(NODE_GAP, 50 / Math.max(...columns.map((column) => column.length)));\n const room = (column: Node[]) => 100 - (column.length - 1) * gap;\n const total = (column: Node[]) => column.reduce((height, node) => height + node.size, 0);\n // The tallest column, nodes and gaps, fills the plot.\n const scale = Math.min(...columns.map((column) => room(column) / total(column)));\n columns.forEach((column, c) => {\n let top = (room(column) - total(column) * scale) / 2;\n for (const node of column) {\n Object.assign(node, { x: (c / (count - 1)) * (100 - NODE_WIDTH), top, height: node.size * scale });\n top += node.height + gap;\n }\n });\n return scale;\n}\n\n/** Each flow's link, stacked in table order down its source's outgoing edge and its target's incoming one. */\nfunction linksOf(flows: Flow[], nodes: Node[], scale: number): Link[] {\n const byName = new Map(nodes.map((node) => [node.name, node]));\n const [out, into] = [new Map<Node, number>(), new Map<Node, number>()];\n const next = (used: Map<Node, number>, node: Node, size: number) => {\n const top = node.top + (used.get(node) ?? 0);\n used.set(node, top - node.top + size);\n return top;\n };\n return flows.map((flow) => {\n const [source, target, size] = [byName.get(flow.source)!, byName.get(flow.target)!, flow.value * scale];\n return { flow, source, target, from: next(out, source, size), to: next(into, target, size), size };\n });\n}\n\n/**\n * Sankey chart. Each row of its <table> is a flow: the first cell names the\n * source node, the second the target node, and the third holds the value.\n * Nodes stand in columns, a node with no incoming flow in the first and any\n * other one column past the furthest of its sources, and stack in the order\n * their names first appear. Each link is as thick as its value, and each\n * node as tall as the larger of its in and out totals, on one scale. A row\n * without both names or a positive value, or whose link would close a\n * cycle, draws nothing.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class SankeyChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n private _nodes: Node[];\n /** The drawn links, in table order. */\n private _links: Link[];\n /** The links' paths, in the same order. */\n private _paths: SVGPathElement[];\n /** Each drawn shape's path data, by its link's source and target names or its node's name, which update() moves from. */\n private _shapes: Map<string, string>;\n\n protected get _type() {\n return 'sankey-chart';\n }\n\n /** The value column is the one series; the target column is read on its own. */\n protected get _seriesFrom() {\n return 2;\n }\n\n protected get _seriesTo() {\n return 3;\n }\n\n /** The links carry the values, so there is no value axis. */\n protected get _axis() {\n return false;\n }\n\n static key = 'Expressive_SankeyChart';\n\n /** The links the keys and pointer reach. */\n protected get _count() {\n return this._links?.length ?? 0;\n }\n\n /** Highlights one link, numbered in table order among those drawn. Pass -1 to hide the tooltip. */\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n this.activeIndex = index;\n const link = this._links[index];\n this._paths.forEach((path, i) => path.classList.toggle('active', i === index));\n this._tooltip.hidden = !link;\n if (link) this._fill(link);\n }\n\n /**\n * Fills the tooltip beside the link's middle: its source and target under\n * their column headers, with their nodes' colors, and the value cell's\n * text, as the author wrote them. Past the middle it opens back over the plot.\n */\n private _fill({ flow, source, target, from, to, size }: Link) {\n const x = this._across((source.x + NODE_WIDTH + target.x) / 2);\n Object.assign(this._tooltip.style, { left: `${x}%`, top: `${(from + to + size) / 2}%` });\n this._tooltip.classList.toggle('end', x > 50);\n const header = this._header.map((cell) => cell.textContent.trim());\n const [sourceName, targetName, value] = [span(header[0]), span(header[1]), span(header[2])];\n sourceName.dataset.series = source.color;\n targetName.dataset.series = target.color;\n value.className = 'value';\n this._tooltip.replaceChildren(sourceName, span(source.name), targetName, span(target.name), value, span(text(this._rows[flow.row], 2)));\n }\n\n /** The link under the pointer, or -1 off every link. By position, since a touch keeps its first target as it drags. */\n protected _indexAt(e: PointerEvent) {\n const hits = (this.el.getRootNode() as Document | ShadowRoot).elementsFromPoint(e.clientX, e.clientY);\n const link = hits.find((hit) => this._paths.includes(hit as SVGPathElement));\n return this._paths.indexOf(link as SVGPathElement);\n }\n\n /**\n * Steps through the links in table order. The arrows keep their meaning\n * in a right-to-left chart, since table order is no direction on screen.\n */\n protected _keyTarget(key: string): number | undefined {\n // With nothing shown, Escape is left to a dialog or sheet around the chart.\n if (key === 'Escape') return this.activeIndex < 0 ? undefined : -1;\n const last = this._links.length - 1;\n const step = ({ ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 } as Record<string, number>)[key];\n if (step) return Math.min(last, Math.max(0, this.activeIndex + step));\n return ({ Home: 0, End: last } as Record<string, number>)[key];\n }\n\n /** Reads the flows and lays out their nodes and links. Without a link to draw, the chart draws nothing. */\n protected _read() {\n super._read();\n const flows = flowsOf(this._rows);\n if (!flows.length) {\n [this.series, this._nodes, this._links] = [[], [], []];\n return;\n }\n this._nodes = nodesOf(flows);\n this._links = linksOf(flows, this._nodes, place(this._nodes));\n }\n\n /** An x position in hundredths of the plot, mirrored in a right-to-left chart. */\n private _across(x: number) {\n return this._reversed ? 100 - x : x;\n }\n\n /** A node as path data: a rectangle. */\n private _nodePath({ x, top, height }: Node) {\n const [start, end] = [this._across(x), this._across(x + NODE_WIDTH)];\n return `M${start},${top}H${end}V${top + height}H${start}Z`;\n }\n\n /** A link as path data: two curves from the source's edge to the target's, closed between them. */\n private _linkPath({ source, target, from, to, size }: Link) {\n const [x0, x1] = [source.x + NODE_WIDTH, target.x];\n const [start, middle, end] = [this._across(x0), this._across((x0 + x1) / 2), this._across(x1)];\n return `M${start},${from}C${middle},${from} ${middle},${to} ${end},${to}`\n + `V${to + size}C${middle},${to + size} ${middle},${from + size} ${start},${from + size}Z`;\n }\n\n /**\n * The links, then the nodes over their ends. Neither has a stroke, so the\n * stretched SVG keeps their sizes. After update(), each shape still in the\n * table moves from where it was: a link found by its source and target\n * names, a node by its name.\n */\n protected _draw(): Element {\n const svg = svgNode('svg', {\n viewBox: '0 0 100 100',\n preserveAspectRatio: 'none',\n 'aria-hidden': 'true',\n focusable: 'false'\n });\n const [was, timing] = [this._shapes ?? new Map<string, string>(), this._before.length ? pace(this.el) : null];\n this._shapes = new Map();\n const shape = (className: string, key: string, color: string, d: string) => {\n const path = svgNode('path', { class: className, 'data-series': color, d }) as SVGPathElement;\n if (timing && was.has(key)) morph(path, was.get(key)!, timing);\n this._shapes.set(key, d);\n return path;\n };\n this._paths = this._links.map((link) =>\n shape('sankey-chart-link', JSON.stringify([link.source.name, link.target.name]), link.source.color, this._linkPath(link)));\n const nodes = this._nodes.map((node) => shape('sankey-chart-node', JSON.stringify(node.name), node.color, this._nodePath(node)));\n svg.append(...this._paths, ...nodes);\n return svg;\n }\n\n /**\n * The node names, over the drawing, each level with its node and toward\n * the plot's middle: after the node, or before it in the last column.\n * They are placed from the inline start, so they need no mirroring.\n */\n protected _axes(): Element[] {\n const names = document.createElement('div');\n names.className = 'sankey-chart-names';\n names.setAttribute('aria-hidden', 'true');\n const last = Math.max(...this._nodes.map((node) => node.column));\n names.append(...this._nodes.map((node) => this._name(node, node.column === last)));\n return [names];\n }\n\n private _name({ name, x, top, height }: Node, last: boolean) {\n const span = document.createElement('span');\n span.className = last ? 'sankey-chart-name end' : 'sankey-chart-name';\n span.textContent = name;\n span.style.setProperty('--sankey-chart-x', `${last ? x : x + NODE_WIDTH}%`);\n span.style.setProperty('--sankey-chart-y', `${top + height / 2}%`);\n return span;\n }\n\n /** No row labels or legend: the nodes carry the names. */\n protected _guides(): Element[] {\n return [];\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["text", "span"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/behaviors/transferList.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\n\nconst AVAILABLE = '.transfer-available';\nconst CHOSEN = '.transfer-chosen';\n\n/** Each button's source list, destination list, and whether it moves every row or only the checked ones. */\nconst MOVES = new Map([\n ['add', { from: AVAILABLE, to: CHOSEN, all: false }],\n ['add-all', { from: AVAILABLE, to: CHOSEN, all: true }],\n ['remove', { from: CHOSEN, to: AVAILABLE, all: false }],\n ['remove-all', { from: CHOSEN, to: AVAILABLE, all: true }]\n]);\n\n/** The rows of both lists as they stood before a container's first move. */\ninterface Start {\n available: Element[];\n chosen: Element[];\n}\n\n/**\n * Transfer lists. A `.transfer-list` holds a `.transfer-available` and a\n * `.transfer-chosen` list of checkbox rows, with `[data-transfer]` buttons\n * between them. `add` and `remove` move the checked rows to the other list,\n * `add-all` and `remove-all` every row, skipping rows whose box is disabled.\n * Moved rows arrive unchecked. The chosen list keeps the order rows arrived\n * in; a row moved back returns to its slot in the order the lists had before\n * the first move. A form reset puts every row back there.\n *\n * After each move the container fires a bubbling `expressive:transfer` event\n * whose `detail` is `{ rows, from, to }`, and a polite live region beside it\n * announces the move. `TransferList.i18n.moved` holds that text.\n *\n * The checkboxes carry no name. When the form builds its data, each row of\n * the chosen list adds its checkbox value under the container's `data-name`,\n * in the chosen list's order. The listeners are on the document, so a list\n * added later needs no call, but a form inside a shadow root gets no entries.\n */\nexport class TransferList {\n static i18n = { moved: 'Moved {count} to {list}' };\n private static _starts = new WeakMap<Element, Start>();\n private static _regions = new WeakMap<Element, HTMLElement>();\n\n // A second Init adds nothing: addEventListener ignores a listener it has.\n static Init() {\n if (typeof document === 'undefined') return;\n document.addEventListener('click', TransferList._onClick);\n document.addEventListener('formdata', TransferList._onFormData, { capture: true });\n document.addEventListener('reset', TransferList._onReset, { capture: true });\n }\n\n private static _onClick(e: MouseEvent) {\n // A click on a disabled button's icon still reaches the document, so the selector skips it.\n const button = Utils.closestInPath(e, '.transfer-list [data-transfer]:not(:disabled, [aria-disabled=\"true\"])');\n const move = MOVES.get(button?.getAttribute('data-transfer'));\n if (move) TransferList._move(button.closest('.transfer-list'), move);\n }\n\n private static _move(container: Element, move: { from: string; to: string; all: boolean }) {\n const [from, to] = [move.from, move.to].map((list) => container.querySelector(`:scope > ${list}`));\n const boxes = TransferList._boxes(container, move.from).filter((box) => !box.disabled && (move.all || box.checked));\n if (!to || !boxes.length) return;\n TransferList._record(container);\n const moved: Element[] = boxes.map((box) => box.closest('li'));\n for (const [i, row] of moved.entries()) {\n boxes[i].checked = false;\n to.insertBefore(row, TransferList._slot(container, row, to));\n }\n const rows = [...to.children].filter((row) => moved.includes(row));\n TransferList._announce(container, rows.length, to);\n container.dispatchEvent(new CustomEvent('expressive:transfer', { bubbles: true, detail: { rows, from, to } }));\n }\n\n /** The row checkboxes of one of a container's lists, in order. Only a row's own label counts, so a list nested in a row keeps its boxes. */\n private static _boxes(container: Element, list: string) {\n return [...container.querySelectorAll<HTMLInputElement>(`:scope > ${list} > li > label > input[type=\"checkbox\"]`)];\n }\n\n /** Keeps the rows of both lists as they stand before a container's first move. */\n private static _record(container: Element) {\n if (TransferList._starts.has(container)) return;\n const rows = (list: string) => [...container.querySelectorAll(`:scope > ${list} > li`)];\n TransferList._starts.set(container, { available: rows(AVAILABLE), chosen: rows(CHOSEN) });\n }\n\n /**\n * The row a moved row goes before. In the available list that is the first\n * row that came after it before the first move; elsewhere, or for a row the\n * page added since, none, so it goes last.\n */\n private static _slot(container: Element, row: Element, to: Element) {\n const start = TransferList._starts.get(container);\n const order = [...start.available, ...start.chosen];\n const index = order.indexOf(row);\n if (!to.matches(AVAILABLE) || index < 0) return null;\n return [...to.children].find((other) => order.indexOf(other) > index) ?? null;\n }\n\n private static _announce(container: Element, count: number, to: Element) {\n let region = TransferList._regions.get(container);\n if (!region) {\n region = document.createElement('div');\n region.className = 'visually-hidden';\n region.setAttribute('aria-live', 'polite');\n container.after(region);\n TransferList._regions.set(container, region);\n }\n region.textContent = TransferList.i18n.moved.replace('{count}', String(count)).replace('{list}', TransferList._name(to));\n }\n\n /** A list's `aria-label`, or the text of the elements its `aria-labelledby` names. */\n private static _name(list: Element) {\n const label = list.getAttribute('aria-label');\n if (label !== null) return label;\n const root = list.getRootNode() as Document | ShadowRoot;\n const ids = (list.getAttribute('aria-labelledby') ?? '').split(/\\s+/);\n return ids.map((id) => root.getElementById(id)?.textContent.trim()).filter(Boolean).join(' ');\n }\n\n private static _onFormData(e: FormDataEvent) {\n const containers = (e.target as HTMLFormElement).querySelectorAll<HTMLElement>('.transfer-list:not([data-name=\"\"])[data-name]');\n for (const container of containers) {\n for (const box of TransferList._boxes(container, CHOSEN).filter(TransferList._submits)) {\n e.formData.append(container.dataset.name, box.value);\n }\n }\n }\n\n /**\n * Whether a chosen row submits. A disabled fieldset leaves it out, as it\n * does its own fields outside the first legend. A row's own disabled box\n * only keeps the row in place, so it still submits.\n */\n private static _submits(box: HTMLInputElement) {\n return !box.matches('fieldset[disabled] > :not(legend:first-of-type) *');\n }\n\n private static _onReset(e: Event) {\n const containers = [...(e.target as HTMLFormElement).querySelectorAll('.transfer-list')];\n // The form resets its fields after the event, and the page may cancel it,\n // so the rows go back a task later.\n setTimeout(() => {\n if (!e.defaultPrevented) containers.forEach(TransferList._restore);\n });\n }\n\n /** Puts every row a container had before its first move back in its list and order. */\n private static _restore(container: Element) {\n const start = TransferList._starts.get(container);\n if (!start) return;\n const kept = (rows: Element[]) => rows.filter((row) => container.contains(row));\n container.querySelector(`:scope > ${AVAILABLE}`)?.append(...kept(start.available));\n container.querySelector(`:scope > ${CHOSEN}`)?.append(...kept(start.chosen));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/characterCounter.ts"],
4
- "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, options);\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n // A prefilled field shows its count and over-length state before focus.\n this.updateCounter();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n static key = 'Expressive_CharacterCounter';\n\n destroy() {\n super.destroy();\n this._removeCounter();\n if (this.isInvalid) this.el.classList.remove('invalid');\n }\n\n _setupEventHandlers() {\n const options = { capture: true, signal: this._events.signal };\n this.el.addEventListener('focus', this.updateCounter, options);\n this.el.addEventListener('input', this.updateCounter, options);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n // The count is the whole point of the component and it changes as the\n // user types, so it has to be a live region - otherwise a screen reader\n // user reaches the limit without ever being told one existed. Polite so\n // it waits for a pause instead of interrupting every keystroke, and\n // atomic so \"18/20\" is read as one figure rather than a changed digit.\n this.counterEl.setAttribute('aria-live', 'polite');\n this.counterEl.setAttribute('aria-atomic', 'true');\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = this.el.value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n"],
5
- "mappings": ";;;;;AAEA,IAAM,YAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,cAA+B,UAAuB;AAAA,EAS3D,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,OAAO;AAgDnB,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAe,KAAK,GAAG,MAAM;AAE/B,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AAzDE,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAEzB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAO;AAAA,EACT;AAAA,EAIA,UAAU;AACR,UAAM,QAAQ;AACd,SAAK,eAAe;AACpB,QAAI,KAAK,UAAW,MAAK,GAAG,UAAU,OAAO,SAAS;AAAA,EACxD;AAAA,EAEA,sBAAsB;AACpB,UAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,KAAK,QAAQ,OAAO;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,OAAO;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,OAAO;AAAA,EAC/D;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAMhD,SAAK,UAAU,aAAa,aAAa,QAAQ;AACjD,SAAK,UAAU,aAAa,eAAe,MAAM;AACjD,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;AAjFa,iBAyBJ,MAAM;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
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": "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",
6
- "names": ["value"]
7
- }
@@ -1,7 +0,0 @@
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": ";;;;;;;;;AASA,IAAM,kBAAkB,OAAO,QAAQ,eAAe,CAAC,CAAC,IAAI,WAAW,kBAAkB;AAIzF,IAAM,mBAAqD;AAAA,EACzD,KAAK,CAAC,OAAO,cAAc;AAAA,EAC3B,OAAO,CAAC,SAAS,YAAY;AAAA,EAC7B,MAAM,CAAC,QAAQ,YAAY;AAAA,EAC3B,QAAQ,CAAC,UAAU,cAAc;AACnC;AAMA,IAAM,aAAa;AACnB,IAAM,eAAe;AAGrB,IAAM,aAAa;AAGnB,IAAM,cAAc;AAKpB,IAAM,oBAAoB;AAC1B,IAAI,gBAAgB;AACpB,IAAI,iBAAiB;AAErB,IAAM,gBAAgB,CAAC,QAAgB,OAAO,iBAAiB,MAAM;AAGrE,SAAS,eAAe,WAAmB;AACzC,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,MAAM,MAAM,YAAY;AAC9B,mBAAiB,cAAc,GAAG,IAAI,KAAK,IAAI,gBAAgB,GAAG,IAAI;AACtE,kBAAgB;AAClB;AAgEA,IAAM,YAA4B;AAAA,EAChC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,aAAa;AACf;AAEO,IAAM,WAAN,MAAM,iBAAgB,UAA0B;AAAA,EAyCrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,OAAO;AArBnB;AAAA,SAAQ,eAA6B;AAErC;AAAA,SAAQ,aAAa;AAErB;AAAA,SAAQ,cAAc;AAEtB;AAAA,SAAQ,qBAAqB;AAE7B;AAAA,SAAQ,SAAS;AAgIjB;AAAA;AAAA;AAAA,gBAAO,CAAC,WAAoB,SAAS;AACnC,UAAI,KAAK,OAAQ;AACjB,mBAAa,KAAK,iBAAiB;AACnC,mBAAa,KAAK,iBAAiB;AACnC,WAAK,SAAS;AAGd,YAAM,EAAE,OAAO,IAAI,KAAK;AACxB,WAAK,GAAG,cAAc,iBAAiB,WAAW,KAAK,gBAAgB,EAAE,SAAS,MAAM,OAAO,CAAC;AAGhG,UAAI,KAAK,QAAQ,aAAa;AAC5B,aAAK,kBAAkB,WAAW,MAAM,KAAK,GAAG,cAAc,iBAAiB,SAAS,KAAK,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAAA,MAChI;AAEA,WAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK,qBAAqB,EAAE;AACjE,WAAK,sBAAsB;AAC3B,WAAK,sBAAsB,QAAQ;AAAA,IACrC;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AAEZ,mBAAa,KAAK,aAAa;AAC/B,mBAAa,KAAK,cAAc;AAChC,WAAK,cAAc;AACnB,UAAI,CAAC,KAAK,OAAQ;AAClB,UAAI,KAAK,OAAQ,gBAAe,KAAK,QAAQ,SAAS;AACtD,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,SAAS;AACd,WAAK,GAAG,cAAc,oBAAoB,WAAW,KAAK,gBAAgB,IAAI;AAC9E,mBAAa,KAAK,eAAe;AACjC,WAAK,GAAG,cAAc,oBAAoB,SAAS,KAAK,oBAAoB;AAC5E,mBAAa,KAAK,kBAAkB;AACpC,WAAK,qBAAqB;AAAA,IAC5B;AAoIA,6BAAoB,MAAM;AAExB,UAAI,KAAK,QAAQ,eAAe,YAAY,IAAI,IAAI,KAAK,aAAa,WAAY;AAClF,WAAK,cAAc;AACnB,WAAK,YAAY;AACjB,WAAK,KAAK,KAAK;AAAA,IACjB;AAgBA;AAAA;AAAA,+BAAsB,CAAC,MAAoB;AACzC,WAAK,SAAS,CAAC;AAAA,IACjB;AAGA;AAAA,8BAAqB,CAAC,MAAoB;AACxC,UAAI,CAAC,KAAK,WAAW,CAAC,EAAG;AACzB,mBAAa,KAAK,cAAc;AAChC,mBAAa,KAAK,aAAa;AAI/B,WAAK,gBAAgB,WAAW,MAAM;AACpC,aAAK,YAAY;AACjB,aAAK,SAAS;AACd,aAAK,cAAc;AAAA,MACrB,GAAG,UAAU;AAAA,IACf;AAGA;AAAA,6BAAoB,CAAC,MAAoB;AACvC,UAAI,CAAC,KAAK,WAAW,CAAC,EAAG;AACzB,mBAAa,KAAK,aAAa;AAC/B,UAAI,KAAK,YAAa,MAAK,qBAAqB,YAAY,IAAI,IAAI;AAEpE,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,YAAY;AAEjB,WAAK,iBAAiB,WAAW,MAAM,KAAK,aAAa,KAAK,aAAa,KAAK,MAAM,GAAG,YAAY;AAAA,IACvG;AAMA;AAAA;AAAA;AAAA;AAAA,wBAAe,CAAC,MAAkB;AAChC,UAAI,KAAK,QAAQ,YAAa,QAAO,KAAK,QAAQ,CAAC;AACnD,UAAI,YAAY,IAAI,IAAI,KAAK,mBAAoB;AACjD,WAAK,qBAAqB;AAC1B,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAAA,IAC7B;AAWA;AAAA;AAAA,+BAAsB,CAAC,MAAkB;AACvC,WAAK,eAAe;AAAA,IACtB;AAEA,gCAAuB,CAAC,MAAkB;AACxC,UAAI,MAAM,KAAK,aAAc,MAAK,SAAS;AAAA,IAC7C;AAMA;AAAA;AAAA;AAAA;AAAA,gCAAuB,CAAC,MAAoB;AAC1C,UAAI,CAAC,KAAK,WAAW,CAAC,EAAG;AACzB,mBAAa,KAAK,aAAa;AAE/B,UAAI,CAAC,KAAK,YAAa;AACvB,WAAK,YAAY;AACjB,UAAI,CAAC,KAAK,UAAW,MAAK,MAAM;AAAA,IAClC;AAOA,6BAAoB,CAAC,UAAsB;AACzC,UAAI,KAAK,QAAQ,eAAe,KAAK,OAAO,MAAM,aAA4B,EAAG;AACjF,WAAK,YAAY;AACjB,UAAI,CAAC,KAAK,UAAW,MAAK,MAAM;AAAA,IAClC;AAEA,0BAAiB,CAAC,UAAyB;AACzC,UAAI,MAAM,QAAQ,YAAY,CAAC,KAAK,OAAQ;AAI5C,UAAI,MAAM,UAAU,KAAK,IAAI,KAAK,SAAS,GAAG;AAC5C,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MACxB;AACA,WAAK,SAAS;AAAA,IAChB;AAIA;AAAA;AAAA,wBAAe,CAAC,UAAsB;AAEpC,UAAI,CAAC,KAAK,QAAQ,eAAgB,MAAM,OAAuB,QAAQ,gBAAgB,GAAG;AACxF,aAAK,YAAY;AACjB,aAAK,KAAK,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,uBAAc,CAAC,UAAsB;AACnC,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,OAAO,IAAI,EAAG;AACvB,UAAI,KAAK,QAAQ,YAAa,QAAO,KAAK,kBAAkB,IAAI;AAChE,WAAK,YAAY;AACjB,UAAI,CAAC,KAAK,UAAW,MAAK,MAAM;AAAA,IAClC;AAhaE,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG,KAAK,qBAAqB;AAAA,MAC7B,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAO;AAAA,EACT;AAAA,EAIA,UAAU;AACR,iBAAa,KAAK,kBAAkB;AACpC,iBAAa,KAAK,iBAAiB;AACnC,iBAAa,KAAK,iBAAiB;AACnC,iBAAa,KAAK,aAAa;AAC/B,iBAAa,KAAK,cAAc;AAChC,iBAAa,KAAK,eAAe;AACjC,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,UAAM,eAAe,KAAK,GAAG,aAAa,kBAAkB,GAAG,MAAM,KAAK;AAC1E,QAAI,cAAc,SAAS,KAAK,UAAU,EAAE,GAAG;AAC7C,YAAM,YAAY,aAAa,OAAO,QAAM,MAAM,OAAO,KAAK,UAAU,EAAE,EAAE,KAAK,GAAG;AACpF,UAAI,UAAW,MAAK,GAAG,aAAa,oBAAoB,SAAS;AAAA,UAC5D,MAAK,GAAG,gBAAgB,kBAAkB;AAAA,IACjD;AACA,QAAI,KAAK,kBAAkB;AACzB,YAAM,EAAE,IAAI,QAAQ,SAAS,UAAU,QAAQ,aAAa,IAAI,KAAK;AACrE,SAAG,MAAM,YAAY,WAAW,SAAS,QAAQ;AACjD,uBAAiB,IAAI,UAAU,MAAM;AACrC,SAAG,UAAU,OAAO,mBAAmB,YAAY;AACnD,UAAI,CAAC,GAAG,UAAW,IAAG,gBAAgB,OAAO;AAC7C,aAAO,YAAY,EAAE;AACrB,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,UAAU,OAAO;AACtB,UAAM,cAAc,KAAK,IAAI,KAAK,KAAK,UAAU,EAAE,IAAI,KAAK;AAC5D,UAAM,QAAQ;AAAA,EAChB;AAAA,EAEA,mBAAmB;AACjB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,UAAU,IAAI,SAAS;AACtC,SAAK,UAAU,KAAK,WAAW,MAAM,KAAK,CAAC;AAC3C,SAAK,UAAU,aAAa,QAAQ,SAAS;AAC7C,SAAK,GAAG,aAAa,oBAAoB,CAAC,KAAK,GAAG,aAAa,kBAAkB,GAAG,KAAK,UAAU,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC;AAEhI,UAAM,gBAAgB,KAAK,QAAQ,YAC/B,MAAM,eAAe,KAAK,IAAI,KAAK,QAAQ,SAAS,IACpD;AACJ,QAAI,KAAK,QAAQ,aAAa,CAAC,eAAe;AAC5C,cAAQ,MAAM,gCAAgC,KAAK,QAAQ,SAAS,sCAAsC;AAAA,IAC5G;AACA,UAAM,mBAAmB,iBAAiB,SAAS,cAAc,KAAK;AACtE,QAAI,eAAe;AACjB,WAAK,UAAU,UAAU,IAAI,MAAM;AACnC,YAAM,SAAS,SAAS,cAAc,EAAE;AACxC,uBAAiB,OAAO,MAAM;AAC9B,WAAK,mBAAmB;AAAA,QACtB,IAAI;AAAA,QAAkB;AAAA,QACtB,SAAS,iBAAiB,MAAM;AAAA,QAChC,UAAU,iBAAiB,MAAM,oBAAoB,SAAS;AAAA,QAC9D,QAAQ,iBAAiB,aAAa,QAAQ;AAAA,QAC9C,cAAc,iBAAiB,UAAU,SAAS,iBAAiB;AAAA,MACrE;AACA,uBAAiB,gBAAgB,QAAQ;AAAA,IAC3C;AACA,qBAAiB,MAAM,UAAU;AACjC,qBAAiB,UAAU,IAAI,iBAAiB;AAChD,SAAK,mBAAmB,gBAAgB;AACxC,SAAK,UAAU,YAAY,gBAAgB;AAC3C,UAAM,WAAW,KAAK,EAAE,EAAE,YAAY,KAAK,SAAS;AAAA,EACtD;AAAA,EAEA,mBAAmB,kBAA+B;AAChD,QAAI,KAAK,iBAAkB;AAC3B,qBAAiB,YAAY,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,wBAAwB;AACtB,SAAK,mBAAmB,KAAK,UAAU,cAAc,kBAAkB,CAAC;AAAA,EAC1E;AAAA,EAEA,sBAAsB;AACpB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,UAAU,EAAE,SAAS,MAAM,OAAO;AACxC,eAAW,MAAM,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG;AAC1C,SAAG,iBAAiB,cAAc,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACpE,SAAG,iBAAiB,cAAc,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACpE,SAAG,iBAAiB,SAAS,KAAK,cAAc,OAAO;AACvD,SAAG,iBAAiB,QAAQ,KAAK,aAAa,OAAO;AAAA,IACvD;AACA,SAAK,GAAG,iBAAiB,gBAAgB,KAAK,qBAAqB,EAAE,OAAO,CAAC;AAC7E,SAAK,GAAG,iBAAiB,eAAe,KAAK,oBAAoB,EAAE,OAAO,CAAC;AAC3E,SAAK,GAAG,iBAAiB,aAAa,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACxE,SAAK,GAAG,iBAAiB,iBAAiB,KAAK,sBAAsB,EAAE,OAAO,CAAC;AAC/E,SAAK,GAAG,iBAAiB,SAAS,KAAK,cAAc,OAAO;AAC5D,SAAK,UAAU,iBAAiB,SAAS,KAAK,qBAAqB,OAAO;AAAA,EAC5E;AAAA;AAAA,EA8CQ,WAAW;AACjB,SAAK,KAAK;AACV,iBAAa,KAAK,kBAAkB;AACpC,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGQ,WAAW;AACjB,SAAK,MAAM;AACX,iBAAa,KAAK,iBAAiB;AACnC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,uBAAuB;AACrB,iBAAa,KAAK,iBAAiB;AACnC,SAAK,oBAAoB,WAAW,MAAM;AACxC,UAAI,KAAK,aAAa,KAAK,UAAW;AACtC,WAAK,YAAY;AAAA,IACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,EAC3B;AAAA,EAEA,sBAAsB,UAAU;AAC9B,iBAAa,KAAK,kBAAkB;AACpC,UAAM,YAAY,cAAc,KAAK,IAAI,CAAC;AAC1C,SAAK,qBAAqB,WAAW,MAAM;AACzC,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa,CAAC,SAAU;AACrD,WAAK,WAAW;AAAA,IAClB,GAAG,YAAY,IAAI,KAAK,QAAQ,UAAU;AAAA,EAC5C;AAAA,EAEA,mBAAmB;AACjB,UAAM,UAAuB,KAAK;AAClC,UAAM,SAAS,KAAK,IAClB,eAAe,OAAO,cACtB,cAAc,OAAO,aACrB,gBAAgB,QAAQ,cACxB,eAAe,QAAQ,aACvB,SAAS,KAAK,QAAQ;AAExB,SAAK,YAAY;AACjB,SAAK,YAAY;AAEjB,UAAM,aAAa,OAAO,sBAAsB;AAChD,QAAI,YAAY,WAAW,MAAM,OAAO;AACxC,QAAI,aAAa,WAAW,OAAO,OAAO;AAC1C,QAAI,KAAK,QAAQ,aAAa,OAAO;AACnC,mBAAa,CAAC,gBAAgB;AAC9B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,WAAW,KAAK,QAAQ,aAAa,SAAS;AAC5C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,cAAc;AAC5B,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC,WAAW,KAAK,QAAQ,aAAa,QAAQ;AAC3C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,CAAC,eAAe;AAC9B,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,OAAO;AACL,mBAAa,eAAe;AAC5B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC;AAEA,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MAAY;AAAA,MAAW;AAAA,MAAc;AAAA,MAAe;AAAA,MAAQ,KAAK,QAAQ;AAAA,MAAoB;AAAA,IAC/F;AAEA,YAAQ,MAAM,YAAY,gCAAgC,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,kBAAkB,CAAC,IAAI;AAChI,UAAM,qBAAqB,SAAS,cAAc;AAAA,EACpD;AAAA,EAEA,SAAS;AACP,QAAI,gBAAiB,MAAK,eAAe;AAAA,QACpC,MAAK,iBAAiB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB;AACf,UAAM,CAAC,MAAM,SAAS,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,iBAAiB;AACtF,UAAM,OAAO,KAAK,KAAK,UAAU,EAAE;AACnC,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,UAAM,cAAc,KAAK,IAAI,MAAM,IAAI;AACvC,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,WAAW;AACjB,UAAM,QAAQ;AACd,UAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,kBAAkB,CAAC;AAC9F,UAAM,YAAY,mBAAmB,IAAI;AACzC,UAAM,YAAY,iBAAiB,IAAI;AACvC,UAAM,YAAY,WAAW,eAAe;AAC5C,UAAM,YAAY,0BAA0B,yBAAyB;AAAA,EACvE;AAAA,EAEA,aAAa;AAAE,SAAK,SAAS,IAAI;AAAA,EAAG;AAAA,EAEpC,cAAc;AAAE,SAAK,SAAS,KAAK;AAAA,EAAG;AAAA,EAEtC,SAAS,MAAe;AACtB,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,SAAS,KAAK,GAAG,cAAc,YAAY,WAAW,kCAAkC,EAAE;AAChG,UAAM,WAAW,SAAS,IAAI,OAAO,KAAK,QAAQ,aAAa,KAAK,QAAQ;AAC5E,QAAI,MAAM;AACR,WAAK,OAAO;AACZ,YAAM,aAAa;AACnB,YAAM,WAAW;AAAA,IACnB;AACA,UAAM,aAAa,aAAa,QAAQ,wBAAwB,QAAQ;AACxE,iBAAa,KAAK,iBAAiB;AACnC,SAAK,oBAAoB,WAAW,MAAM;AACxC,YAAM,YAAY,QAAQ,CAAC,SAAS,cAAc,KAAK,SAAS,kBAAkB,KAAK,SAAS,QAAQ;AACxG,YAAM,UAAU,QAAQ,KAAK,QAAQ,WAAW,GAAG,SAAS,IAAI;AAChE,UAAI,CAAC,KAAM,MAAK,oBAAoB,WAAW,MAAM;AACnD,cAAM,aAAa;AACnB,cAAM,WAAW;AAAA,MACnB,GAAG,QAAQ;AAAA,IACb,GAAG,CAAC;AACJ,SAAK,aAAa,IAAI;AAAA,EACxB;AAAA,EAEQ,aAAa,MAAe;AAClC,QAAI,SAAS,KAAK,OAAQ;AAC1B,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO,SAAS,OAAO;AAAA,EACtC;AAAA;AAAA,EAWQ,SAAS,GAAiB;AAChC,QAAI,EAAE,gBAAgB,QAAS,QAAO;AACtC,SAAK,aAAa,YAAY,IAAI;AAClC,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,WAAW,GAAiB;AAClC,WAAO,CAAC,KAAK,QAAQ,eAAe,KAAK,SAAS,CAAC;AAAA,EACrD;AAAA;AAAA,EAgDQ,QAAQ,GAAe;AAC7B,SAAK,eAAe;AACpB,QAAI,KAAK,OAAQ,MAAK,SAAS;AAAA,QAC1B,MAAK,SAAS;AAAA,EACrB;AAAA;AAAA,EA0BQ,OAAO,MAAmB;AAChC,WAAO,CAAC,CAAC,SAAS,KAAK,GAAG,SAAS,IAAI,KAAK,KAAK,UAAU,SAAS,IAAI;AAAA,EAC1E;AAAA;AAAA;AAAA,EAwCQ,kBAAkB,MAAmB;AAC3C,QAAI,SAAS,KAAK,UAAU,KAAK,QAAS,MAAK,SAAS;AAAA,EAC1D;AAAA,EAEA,uBAAgD;AAC9C,UAAM,mBAA4C,CAAC;AACnD,UAAM,oBAAoB,KAAK,GAAG,aAAa,cAAc;AAC7D,UAAM,YAAY,KAAK,GAAG,aAAa,iBAAiB;AACxD,UAAM,iBAAiB,KAAK,GAAG,aAAa,eAAe;AAC3D,QAAI,mBAAmB;AACrB,uBAAiB,OAAO;AAAA,IAC1B;AACA,QAAI,gBAAgB;AAClB,uBAAiB,WAAW;AAAA,IAC9B;AACA,QAAI,WAAW;AACb,uBAAiB,YAAY;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT;AACF;AAtea,SA8DJ,MAAM;AA9DR,IAAM,UAAN;",
6
- "names": []
7
- }