@expressivecss/expressive 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/commandPalette.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\n\nexport interface CommandPaletteOptions extends BaseOptions {\n /**\n * Letter that toggles the palette together with Command on Apple platforms\n * or Ctrl elsewhere. A key event the page has already handled is left\n * alone. `null` turns the shortcut off. `data-shortcut` on the dialog sets\n * it; an empty `data-shortcut` turns it off.\n * @default 'k'\n */\n shortcut: string | null;\n /**\n * If true, the palette closes after a command runs.\n * @default true\n */\n closeOnRun: boolean;\n}\n\nconst _defaults: CommandPaletteOptions = {\n shortcut: 'k',\n closeOnRun: true\n};\n\n// On Apple platforms Ctrl+letter is text editing (Ctrl+K deletes to the end\n// of the line), so only Command opens the palette there.\nconst APPLE = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.platform);\n\n/** Case- and accent-insensitive text for matching. */\nconst fold = (text: string) =>\n text.normalize('NFD').replace(/\\p{Diacritic}/gu, '').toLowerCase();\n\n/**\n * A command palette: a native modal <dialog class=\"command-palette\"> holding\n * a search input and a list of commands. Typing filters the list; the arrow\n * keys move through what is left and Enter runs it, while focus stays in the\n * input. The dialog owns modality, Escape and returning focus.\n *\n * The input is a combobox and the list a listbox of options, with the active\n * option reported through aria-activedescendant. A command is the link or\n * button inside an option; running it clicks that element, so a page wires\n * commands with ordinary hrefs and click handlers.\n */\nexport class CommandPalette extends Component<CommandPaletteOptions> {\n declare el: HTMLDialogElement;\n /** The search input. */\n input: HTMLInputElement;\n /** The list of commands. */\n list: HTMLElement;\n private _active: HTMLElement | null = null;\n private _generatedIds: HTMLElement[] = [];\n /** Wires and refilters commands the page adds or removes later. */\n private _observer: MutationObserver | null = null;\n\n // HTMLElement, not HTMLDialogElement: init() takes the element type from\n // here, and has always accepted any HTMLElement.\n constructor(el: HTMLElement, options: Partial<CommandPaletteOptions>) {\n const shortcut = el.dataset.shortcut;\n super(el, { ...(shortcut !== undefined ? { shortcut: shortcut || null } : {}), ...options });\n this.input = el.querySelector(':scope > input');\n this.list = el.querySelector(':scope > :is(ul, ol)');\n if (!this.input || !this.list) {\n console.error('CommandPalette needs an <input> and a <ul> as children of the dialog.');\n return;\n }\n this._setupAccessibility();\n this._filter();\n // A page adding commands while the user arrows through the list keeps\n // their place.\n this._observer = new MutationObserver(() => this._filter(true));\n // Also refilter when the page hides, shows, disables or enables a command.\n // Not aria-disabled: _filter writes that itself, which would loop.\n this._observer.observe(this.list, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['hidden', 'disabled']\n });\n const { signal } = this._events;\n this.input.addEventListener('input', this._handleInput, { signal });\n this.input.addEventListener('keydown', this._handleKeydown, { signal });\n this.input.addEventListener('keydown', this._handleEscape, { signal });\n this.list.addEventListener('click', this._handleListClick, { signal });\n this.list.addEventListener('pointermove', this._handlePointerMove, { signal });\n this.el.addEventListener('close', this._handleClose, { signal });\n document.addEventListener('keydown', this._handleShortcut, { signal });\n }\n\n static get defaults(): CommandPaletteOptions {\n return _defaults;\n }\n\n static key = 'Expressive_CommandPalette';\n\n /** If the palette is open. */\n get isOpen() {\n return this.el.open;\n }\n\n /** Opens the palette as a modal dialog with the search input focused. */\n open = () => {\n if (!this.el.open) this.el.showModal();\n this.input?.focus();\n };\n\n /** Closes the palette. The dialog returns focus to where it was. */\n close = () => {\n if (this.el.open) this.el.close();\n };\n\n destroy() {\n this._observer?.disconnect();\n if (this.input && this.list) {\n for (const name of ['role', 'aria-controls', 'aria-expanded', 'aria-autocomplete', 'aria-activedescendant']) {\n this.input.removeAttribute(name);\n }\n this.list.removeAttribute('role');\n for (const item of this._items()) {\n for (const name of ['role', 'aria-selected', 'aria-disabled', 'data-filtered']) item.removeAttribute(name);\n item.classList.remove('active');\n this._action(item)?.removeAttribute('tabindex');\n }\n for (const label of this._labels()) {\n label.removeAttribute('role');\n label.removeAttribute('data-filtered');\n }\n for (const el of this._generatedIds) el.removeAttribute('id');\n const empty = this._empty();\n if (empty) empty.hidden = false;\n }\n super.destroy();\n }\n\n private _items() {\n return Array.from(this.list.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && !child.classList.contains('label')\n );\n }\n\n private _labels() {\n return Array.from(this.list.querySelectorAll<HTMLElement>(':scope > .label'));\n }\n\n private _empty() {\n return this.el.querySelector<HTMLElement>(':scope > .command-palette-empty');\n }\n\n private _action(item: HTMLElement) {\n return item.querySelector<HTMLElement>(':scope > :is(a[href], button)');\n }\n\n private _ensureId(el: HTMLElement, prefix: string) {\n if (!el.id) {\n el.id = `${prefix}-${Utils.guid()}`;\n this._generatedIds.push(el);\n }\n return el.id;\n }\n\n private _setupAccessibility() {\n this.list.setAttribute('role', 'listbox');\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-controls', this._ensureId(this.list, 'command-palette-list'));\n this.input.setAttribute('aria-expanded', 'true');\n this.input.setAttribute('aria-autocomplete', 'list');\n }\n\n /** Every command, including ones added since the last pass, is an option. */\n private _wireItems() {\n for (const item of this._items()) {\n if (item.getAttribute('role') === 'option') continue;\n item.setAttribute('role', 'option');\n this._ensureId(item, 'command-palette-option');\n // Focus stays in the input; the commands are reached with the arrows.\n this._action(item)?.setAttribute('tabindex', '-1');\n }\n // A listbox holds only options; a group heading is a visual divider.\n for (const label of this._labels()) label.setAttribute('role', 'none');\n }\n\n /** Commands on screen: neither hidden by the page nor filtered out. */\n private _shown() {\n return this._items().filter((item) => !item.hidden && !item.hasAttribute('data-filtered'));\n }\n\n /** Shown commands the arrows and Enter can reach: disabled ones are skipped. */\n private _visible() {\n return this._shown().filter((item) => item.getAttribute('aria-disabled') !== 'true');\n }\n\n /** A disabled link or button cannot run, so its option says so. */\n private _isDisabled(item: HTMLElement) {\n const action = this._action(item);\n return !!action && (action.matches(':disabled') || action.getAttribute('aria-disabled') === 'true');\n }\n\n private _setActive(item: HTMLElement | null) {\n if (this._active === item) return;\n this._active?.classList.remove('active');\n this._active?.removeAttribute('aria-selected');\n this._active = item;\n if (item) {\n item.classList.add('active');\n item.setAttribute('aria-selected', 'true');\n this.input.setAttribute('aria-activedescendant', item.id);\n item.scrollIntoView({ block: 'nearest' });\n } else {\n this.input.removeAttribute('aria-activedescendant');\n }\n }\n\n /**\n * Shows the commands matching the query. Filtering marks rows with\n * data-filtered rather than hidden, so a command the page hides stays\n * hidden. `keepActive` holds the active command while it is still\n * reachable, for list changes the user did not make.\n */\n private _filter(keepActive = false) {\n this._wireItems();\n const terms = fold(this.input.value).split(/\\s+/).filter(Boolean);\n for (const item of this._items()) {\n // data-keywords may sit on the row or on its link or button.\n const keywords = item.dataset.keywords ?? this._action(item)?.dataset.keywords ?? '';\n const text = fold(`${item.textContent} ${keywords}`);\n item.toggleAttribute('data-filtered', !terms.every((term) => text.includes(term)));\n if (this._isDisabled(item)) item.setAttribute('aria-disabled', 'true');\n else item.removeAttribute('aria-disabled');\n }\n // A heading stays only while one of the commands under it does.\n for (const label of this._labels()) {\n let next = label.nextElementSibling as HTMLElement | null;\n let any = false;\n while (next && !next.classList.contains('label')) {\n if (!next.hidden && !next.hasAttribute('data-filtered')) any = true;\n next = next.nextElementSibling as HTMLElement | null;\n }\n label.toggleAttribute('data-filtered', !any);\n }\n const visible = this._visible();\n const empty = this._empty();\n if (empty) empty.hidden = this._shown().length > 0;\n this._setActive(keepActive && visible.includes(this._active) ? this._active : visible[0] ?? null);\n }\n\n private _move(step: number) {\n const visible = this._visible();\n if (!visible.length) return;\n const index = visible.indexOf(this._active);\n this._setActive(visible[(index + step + visible.length) % visible.length]);\n }\n\n /** Runs a command by clicking its link or button; the click handler closes. */\n private _run(item: HTMLElement) {\n (this._action(item) ?? item).click();\n }\n\n _handleInput = () => this._filter();\n\n _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n this._move(e.key === 'ArrowDown' ? 1 : -1);\n } else if (e.key === 'Enter' && !Utils.isComposing(e) && this._active) {\n e.preventDefault();\n this._run(this._active);\n }\n };\n\n /**\n * The first Escape clears a typed query and the next closes the palette.\n * Chromium and Firefox clear a search input on their own; WebKit closed at\n * once, and so did every engine for a text input. Escape that cancels an\n * IME composition is left to the IME.\n */\n _handleEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !this.input.value || Utils.isComposing(e)) return;\n e.preventDefault();\n this.input.value = '';\n this.input.dispatchEvent(new Event('input', { bubbles: true }));\n };\n\n _handleListClick = (e: MouseEvent) => {\n const item = (<Element>e.target).closest<HTMLElement>('[role=\"option\"]');\n if (!item || !this.list.contains(item) || item.getAttribute('aria-disabled') === 'true') return;\n const action = this._action(item);\n // A click on the row's padding runs its command; that click comes back\n // through here and closes the palette.\n if (action && !action.contains(<Node>e.target)) {\n action.click();\n return;\n }\n if (this.options.closeOnRun) this.close();\n };\n\n _handlePointerMove = (e: PointerEvent) => {\n const item = (<Element>e.target).closest<HTMLElement>('[role=\"option\"]');\n if (item && this.list.contains(item) && item.getAttribute('aria-disabled') !== 'true') this._setActive(item);\n };\n\n /**\n * Each opening starts from the full list. The close event is queued, so a\n * palette reopened straight away may already be open again; its new search\n * is left alone.\n */\n _handleClose = () => {\n if (this.el.open) return;\n this.input.value = '';\n this._filter();\n };\n\n _handleShortcut = (e: KeyboardEvent) => {\n const { shortcut } = this.options;\n if (!shortcut || e.defaultPrevented || e.altKey || e.shiftKey) return;\n if (!(APPLE ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey)) return;\n // A non-Latin layout reports its own letter in e.key, so fall back to the\n // physical key there. A Latin layout matches on the letter it types.\n const letter = shortcut.toLowerCase();\n const latin = /^[a-z]$/i.test(e.key);\n const hit = e.key.toLowerCase() === letter ||\n (!latin && /^[a-z]$/.test(letter) && e.code === `Key${letter.toUpperCase()}`);\n if (!hit) return;\n e.preventDefault();\n if (this.el.open) this.close();\n else this.open();\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
4
 
5
5
  // src/ts/components/particles.ts
6
6
  var _defaults = {
@@ -12,9 +12,9 @@ var _defaults = {
12
12
  vx: 0,
13
13
  vy: 0
14
14
  };
15
- var Particles = class _Particles extends Component {
15
+ var Particles = class extends Component {
16
16
  constructor(el, options) {
17
- super(el, options, _Particles);
17
+ super(el, options);
18
18
  this._particles = [];
19
19
  this._width = 0;
20
20
  this._height = 0;
@@ -23,53 +23,66 @@ var Particles = class _Particles extends Component {
23
23
  // Pointer offset from the canvas center, kept from its last move inside.
24
24
  this._mouse = { x: 0, y: 0 };
25
25
  this._still = false;
26
+ this._visible = true;
27
+ this._motion = null;
28
+ this._theme = null;
26
29
  this._resizeObserver = null;
27
30
  this._visibility = null;
31
+ this._onMotion = () => {
32
+ this._still = this._motion.matches;
33
+ if (this._still) {
34
+ for (const p of this._particles) p.alpha = p.targetAlpha;
35
+ this._paint();
36
+ }
37
+ this._animate();
38
+ };
39
+ this._repaint = () => {
40
+ if (this._still) this._paint();
41
+ };
28
42
  this._onPointerMove = (e) => {
29
43
  const r = this.el.getBoundingClientRect();
30
44
  const x = e.clientX - r.left - r.width / 2;
31
45
  const y = e.clientY - r.top - r.height / 2;
32
46
  if (Math.abs(x) < r.width / 2 && Math.abs(y) < r.height / 2) this._mouse = { x, y };
33
47
  };
34
- this.el["Expressive_Particles"] = this;
35
- this.options = { ..._Particles.defaults, ...options };
36
48
  this._ctx = this.el.getContext("2d");
37
49
  if (!this._ctx) return;
38
50
  this._style = getComputedStyle(this.el);
39
- this._still = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
51
+ this._motion = matchMedia("(prefers-reduced-motion: reduce)");
52
+ const { signal } = this._events;
53
+ this._motion.addEventListener("change", this._onMotion, { signal });
54
+ matchMedia("(prefers-color-scheme: dark)").addEventListener("change", this._repaint, { signal });
55
+ this._theme = new MutationObserver(this._repaint);
56
+ this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ["theme"], subtree: true });
57
+ this._still = this._motion.matches;
40
58
  this._reset();
41
- if (typeof ResizeObserver !== "undefined") {
42
- this._resizeObserver = new ResizeObserver(() => {
43
- if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();
44
- });
45
- this._resizeObserver.observe(this.el);
46
- }
47
- if (this._still) return;
48
- if (typeof IntersectionObserver === "undefined") {
49
- this._start();
50
- return;
51
- }
52
- this._visibility = new IntersectionObserver(([entry]) => entry.isIntersecting ? this._start() : this._stop());
59
+ this._resizeObserver = new ResizeObserver(() => {
60
+ if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();
61
+ });
62
+ this._resizeObserver.observe(this.el);
63
+ this._visibility = new IntersectionObserver((entries) => {
64
+ this._visible = entries[entries.length - 1].isIntersecting;
65
+ this._animate();
66
+ });
53
67
  this._visibility.observe(this.el);
54
68
  }
55
69
  static get defaults() {
56
70
  return _defaults;
57
71
  }
58
- static init(els, options = {}) {
59
- return super.init(els, options, _Particles);
60
- }
61
- static getInstance(el) {
62
- return el["Expressive_Particles"];
63
- }
64
72
  destroy() {
65
73
  this._stop();
74
+ this._theme?.disconnect();
66
75
  this._resizeObserver?.disconnect();
67
76
  this._visibility?.disconnect();
68
77
  if (this._ctx) {
69
78
  this._ctx.setTransform(1, 0, 0, 1, 0, 0);
70
79
  this._ctx.clearRect(0, 0, this.el.width, this.el.height);
71
80
  }
72
- this.el["Expressive_Particles"] = void 0;
81
+ super.destroy();
82
+ }
83
+ _animate() {
84
+ if (this._visible && !this._still) this._start();
85
+ else this._stop();
73
86
  }
74
87
  _start() {
75
88
  if (this._frame) return;
@@ -147,8 +160,9 @@ var Particles = class _Particles extends Component {
147
160
  ctx.globalAlpha = 1;
148
161
  }
149
162
  };
163
+ Particles.key = "Expressive_Particles";
150
164
 
151
165
  export {
152
166
  Particles
153
167
  };
154
- //# sourceMappingURL=chunk-BG6ZRB5H.mjs.map
168
+ //# sourceMappingURL=chunk-5KIHWJI2.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/particles.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nexport interface ParticlesOptions extends BaseOptions {\n /**\n * Number of particles.\n * @default 100\n */\n quantity: number;\n /**\n * How firmly particles hold their place against the pointer. Lower\n * follows the pointer further.\n * @default 50\n */\n staticity: number;\n /**\n * Frames a particle takes to catch up with the pointer. Higher is slower.\n * @default 50\n */\n ease: number;\n /**\n * Base radius in pixels. Each particle adds 0 or 1 to it.\n * @default 0.4\n */\n size: number;\n /**\n * A CSS color. Empty uses the canvas's CSS `color`, which defaults to the\n * theme's on-surface color.\n * @default ''\n */\n color: string;\n /**\n * Horizontal drift in pixels per frame. Negative drifts left.\n * @default 0\n */\n vx: number;\n /**\n * Vertical drift in pixels per frame. Negative drifts up.\n * @default 0\n */\n vy: number;\n}\n\nconst _defaults: ParticlesOptions = {\n quantity: 100,\n staticity: 50,\n ease: 50,\n size: 0.4,\n color: '',\n vx: 0,\n vy: 0\n};\n\ninterface Particle {\n x: number;\n y: number;\n translateX: number;\n translateY: number;\n size: number;\n alpha: number;\n targetAlpha: number;\n dx: number;\n dy: number;\n magnetism: number;\n}\n\n/**\n * Particles. A `<canvas class=\"particles\">` covers its nearest positioned\n * ancestor with slowly drifting dots that lean toward the pointer. Under\n * reduced motion the dots are drawn once and stay still.\n */\nexport class Particles extends Component<ParticlesOptions> {\n declare el: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D | null;\n private _style: CSSStyleDeclaration;\n private _particles: Particle[] = [];\n private _width = 0;\n private _height = 0;\n private _frame = 0;\n private _last = 0;\n // Pointer offset from the canvas center, kept from its last move inside.\n private _mouse = { x: 0, y: 0 };\n private _still = false;\n private _visible = true;\n private _motion: MediaQueryList | null = null;\n private _theme: MutationObserver | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n private _visibility: IntersectionObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<ParticlesOptions>) {\n super(el, options);\n this._ctx = this.el.getContext('2d');\n if (!this._ctx) return;\n this._style = getComputedStyle(this.el);\n this._motion = matchMedia('(prefers-reduced-motion: reduce)');\n const { signal } = this._events;\n this._motion.addEventListener('change', this._onMotion, { signal });\n // Still dots are painted once, so a theme or color-scheme change\n // repaints them. Moving ones read the color every frame anyway.\n matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this._repaint, { signal });\n this._theme = new MutationObserver(this._repaint);\n this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n this._still = this._motion.matches;\n this._reset();\n this._resizeObserver = new ResizeObserver(() => {\n if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();\n });\n this._resizeObserver.observe(this.el);\n // Animates only while on screen. A canvas scrolled away, hidden or\n // removed without destroy() stops drawing and following the pointer.\n // Entries arrive oldest first, so the last one is the current state.\n this._visibility = new IntersectionObserver((entries) => {\n this._visible = entries[entries.length - 1].isIntersecting;\n this._animate();\n });\n this._visibility.observe(this.el);\n }\n\n static get defaults(): ParticlesOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Particles';\n\n destroy() {\n this._stop();\n this._theme?.disconnect();\n this._resizeObserver?.disconnect();\n this._visibility?.disconnect();\n if (this._ctx) {\n this._ctx.setTransform(1, 0, 0, 1, 0, 0);\n this._ctx.clearRect(0, 0, this.el.width, this.el.height);\n }\n super.destroy();\n }\n\n private _animate() {\n if (this._visible && !this._still) this._start();\n else this._stop();\n }\n\n private _onMotion = () => {\n this._still = this._motion.matches;\n if (this._still) {\n for (const p of this._particles) p.alpha = p.targetAlpha;\n this._paint();\n }\n this._animate();\n };\n\n private _repaint = () => {\n if (this._still) this._paint();\n };\n\n private _start() {\n if (this._frame) return;\n window.addEventListener('pointermove', this._onPointerMove, { passive: true });\n this._frame = requestAnimationFrame((now) => { this._last = now; this._draw(now); });\n }\n\n private _stop() {\n cancelAnimationFrame(this._frame);\n this._frame = 0;\n window.removeEventListener('pointermove', this._onPointerMove);\n }\n\n private _onPointerMove = (e: PointerEvent) => {\n const r = this.el.getBoundingClientRect();\n const x = e.clientX - r.left - r.width / 2;\n const y = e.clientY - r.top - r.height / 2;\n if (Math.abs(x) < r.width / 2 && Math.abs(y) < r.height / 2) this._mouse = { x, y };\n };\n\n // Matches the pixel buffer to the canvas box and scatters a new set.\n private _reset() {\n this._width = this.el.clientWidth;\n this._height = this.el.clientHeight;\n this.el.width = Math.round(this._width * devicePixelRatio);\n this.el.height = Math.round(this._height * devicePixelRatio);\n this._particles = Array.from({ length: this.options.quantity }, () => this._particle());\n if (this._still) {\n for (const p of this._particles) p.alpha = p.targetAlpha;\n this._paint();\n }\n }\n\n private _particle(): Particle {\n return {\n x: Math.floor(Math.random() * this._width),\n y: Math.floor(Math.random() * this._height),\n translateX: 0,\n translateY: 0,\n size: Math.floor(Math.random() * 2) + this.options.size,\n alpha: 0,\n targetAlpha: Math.round((Math.random() * 0.6 + 0.1) * 10) / 10,\n dx: (Math.random() - 0.5) * 0.1,\n dy: (Math.random() - 0.5) * 0.1,\n magnetism: 0.1 + Math.random() * 4\n };\n }\n\n private _draw(now: number) {\n // Frames are counted at 60 per second whatever the display rate.\n const step = Math.min((now - this._last) / (1000 / 60), 4);\n this._last = now;\n const { staticity, ease, vx, vy } = this.options;\n const follow = Math.min(step / ease, 1);\n this._particles = this._particles.map((p) => {\n p.x += (p.dx + vx) * step;\n p.y += (p.dy + vy) * step;\n p.translateX += (this._mouse.x / (staticity / p.magnetism) - p.translateX) * follow;\n p.translateY += (this._mouse.y / (staticity / p.magnetism) - p.translateY) * follow;\n // Fades in, and fades out within 20px of an edge.\n const x = p.x + p.translateX;\n const y = p.y + p.translateY;\n const edge = Math.min(x - p.size, this._width - x - p.size, y - p.size, this._height - y - p.size) / 20;\n p.alpha = edge > 1 ? Math.min(p.alpha + 0.02 * step, p.targetAlpha) : p.targetAlpha * edge;\n const gone = p.x < -p.size || p.x > this._width + p.size || p.y < -p.size || p.y > this._height + p.size;\n return gone ? this._particle() : p;\n });\n this._paint();\n this._frame = requestAnimationFrame((t) => this._draw(t));\n }\n\n private _paint() {\n const ctx = this._ctx!;\n const dpr = devicePixelRatio;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, this.el.width, this.el.height);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Read every frame, so a theme or color-scheme change applies at once.\n ctx.fillStyle = this.options.color || this._style.color;\n for (const p of this._particles) {\n if (p.alpha <= 0) continue;\n ctx.globalAlpha = p.alpha;\n ctx.beginPath();\n ctx.arc(p.x + p.translateX, p.y + p.translateY, p.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n ctx.globalAlpha = 1;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,15 +1,18 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ restoreAttribute
6
+ } from "./chunk-ZVLOUDIJ.mjs";
4
7
 
5
8
  // src/ts/components/buttonGroup.ts
6
9
  var _defaults = {};
7
10
  var VALID_SELECTION_MODES = /* @__PURE__ */ new Set(["single", "multiple"]);
8
11
  var PRESSED_CLASS = "button-group-pressed";
9
12
  var MAX_ICON_COMPRESSION = 0.15;
10
- var ButtonGroup = class _ButtonGroup extends Component {
13
+ var ButtonGroup = class extends Component {
11
14
  constructor(el, options = {}) {
12
- super(el, options, _ButtonGroup);
15
+ super(el, options);
13
16
  this._pressedStyles = /* @__PURE__ */ new Map();
14
17
  this._releaseStyles = /* @__PURE__ */ new Map();
15
18
  this._releaseTimer = null;
@@ -34,6 +37,7 @@ var ButtonGroup = class _ButtonGroup extends Component {
34
37
  });
35
38
  }
36
39
  item.setAttribute("aria-pressed", willSelect ? "true" : "false");
40
+ this._notify("change", null, { detail: { button: item, pressed: willSelect } });
37
41
  };
38
42
  this._handlePointerDown = (event) => {
39
43
  if (event.button !== 0) return;
@@ -69,46 +73,28 @@ var ButtonGroup = class _ButtonGroup extends Component {
69
73
  for (const [item, style] of this._releaseStyles) item.style.width = style.width;
70
74
  this._releaseStyles.clear();
71
75
  };
72
- this.el["Expressive_ButtonGroup"] = this;
73
- this.options = { ..._ButtonGroup.defaults, ...options };
76
+ const { signal } = this._events;
74
77
  if (this._selectionMode) {
75
78
  this._normalizeSelection();
76
- this.el.addEventListener("click", this._handleClick, true);
79
+ this.el.addEventListener("click", this._handleClick, { capture: true, signal });
77
80
  }
78
- this.el.addEventListener("pointerdown", this._handlePointerDown);
79
- this.el.addEventListener("keydown", this._handleKeyDown);
80
- this.el.addEventListener("focusout", this._handleFocusOut);
81
- document.addEventListener("pointerup", this._resetPress);
82
- document.addEventListener("pointercancel", this._resetPress);
83
- document.addEventListener("keyup", this._handleKeyUp);
84
- window.addEventListener("blur", this._resetPress);
81
+ this.el.addEventListener("pointerdown", this._handlePointerDown, { signal });
82
+ this.el.addEventListener("keydown", this._handleKeyDown, { signal });
83
+ this.el.addEventListener("focusout", this._handleFocusOut, { signal });
84
+ document.addEventListener("pointerup", this._resetPress, { signal });
85
+ document.addEventListener("pointercancel", this._resetPress, { signal });
86
+ document.addEventListener("keyup", this._handleKeyUp, { signal });
87
+ window.addEventListener("blur", this._resetPress, { signal });
85
88
  }
86
89
  static get defaults() {
87
90
  return _defaults;
88
91
  }
89
- static init(els, options = {}) {
90
- return super.init(els, options, _ButtonGroup);
91
- }
92
- static getInstance(el) {
93
- return el["Expressive_ButtonGroup"];
94
- }
95
92
  destroy() {
96
93
  this._resetPress();
97
94
  this._finishRelease();
98
- this.el.removeEventListener("click", this._handleClick, true);
99
- this.el.removeEventListener("pointerdown", this._handlePointerDown);
100
- this.el.removeEventListener("keydown", this._handleKeyDown);
101
- this.el.removeEventListener("focusout", this._handleFocusOut);
102
- document.removeEventListener("pointerup", this._resetPress);
103
- document.removeEventListener("pointercancel", this._resetPress);
104
- document.removeEventListener("keyup", this._handleKeyUp);
105
- window.removeEventListener("blur", this._resetPress);
106
- for (const [item, value] of this._originalPressed) {
107
- if (value === null) item.removeAttribute("aria-pressed");
108
- else item.setAttribute("aria-pressed", value);
109
- }
95
+ for (const [item, value] of this._originalPressed) restoreAttribute(item, "aria-pressed", value);
110
96
  this._originalPressed.clear();
111
- this.el["Expressive_ButtonGroup"] = void 0;
97
+ super.destroy();
112
98
  }
113
99
  get _selectionMode() {
114
100
  const mode = this.el.dataset.selection;
@@ -219,8 +205,9 @@ var ButtonGroup = class _ButtonGroup extends Component {
219
205
  return Math.max(0, rect.width - minimumWidth);
220
206
  }
221
207
  };
208
+ ButtonGroup.key = "Expressive_ButtonGroup";
222
209
 
223
210
  export {
224
211
  ButtonGroup
225
212
  };
226
- //# sourceMappingURL=chunk-YDCS5S3J.mjs.map
213
+ //# sourceMappingURL=chunk-67ZPPKXS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/buttonGroup.ts"],
4
+ "sourcesContent": ["import { restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ButtonGroupOptions extends BaseOptions {}\n\ntype SavedItemStyle = {\n width: string;\n baseWidth: number;\n};\n\nconst _defaults: ButtonGroupOptions = {};\nconst VALID_SELECTION_MODES = new Set([\"single\", \"multiple\"]);\nconst PRESSED_CLASS = \"button-group-pressed\";\nconst MAX_ICON_COMPRESSION = 0.15;\n\n/**\n * Coordinates Material button-group press geometry and optional toggle state.\n *\n * Standard groups redistribute the pressed item's 15% width growth from its\n * immediate neighbors. `data-selection=\"single|multiple\"` also enables\n * `aria-pressed` state management.\n */\nexport class ButtonGroup extends Component<ButtonGroupOptions> {\n private _pressedStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseTimer: number | null = null;\n private _originalPressed = new Map<HTMLButtonElement, string | null>();\n private _activeItem: HTMLElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<ButtonGroupOptions> = {}) {\n super(el, options);\n\n const { signal } = this._events;\n if (this._selectionMode) {\n this._normalizeSelection();\n this.el.addEventListener(\"click\", this._handleClick, { capture: true, signal });\n }\n this.el.addEventListener(\"pointerdown\", this._handlePointerDown, { signal });\n this.el.addEventListener(\"keydown\", this._handleKeyDown, { signal });\n this.el.addEventListener(\"focusout\", this._handleFocusOut, { signal });\n document.addEventListener(\"pointerup\", this._resetPress, { signal });\n document.addEventListener(\"pointercancel\", this._resetPress, { signal });\n document.addEventListener(\"keyup\", this._handleKeyUp, { signal });\n window.addEventListener(\"blur\", this._resetPress, { signal });\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static key = 'Expressive_ButtonGroup';\n\n destroy() {\n this._resetPress();\n this._finishRelease();\n for (const [item, value] of this._originalPressed) restoreAttribute(item, \"aria-pressed\", value);\n this._originalPressed.clear();\n super.destroy();\n }\n\n private get _selectionMode(): \"single\" | \"multiple\" | null {\n const mode = this.el.dataset.selection;\n return VALID_SELECTION_MODES.has(mode) ? (mode as \"single\" | \"multiple\") : null;\n }\n\n private get _items(): HTMLElement[] {\n return Array.from(this.el.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLButtonElement ||\n (child instanceof HTMLAnchorElement && child.classList.contains(\"button\")),\n );\n }\n\n private get _toggleItems(): HTMLButtonElement[] {\n return this._items.filter(\n (item): item is HTMLButtonElement => item instanceof HTMLButtonElement,\n );\n }\n\n private _normalizeSelection() {\n const items = this._toggleItems;\n items.forEach((item) => {\n this._rememberPressed(item);\n if (![\"true\", \"false\"].includes(item.getAttribute(\"aria-pressed\") || \"\")) {\n item.setAttribute(\"aria-pressed\", \"false\");\n }\n });\n\n if (this._selectionMode === \"single\") {\n const selected = items.filter((item) => item.getAttribute(\"aria-pressed\") === \"true\");\n selected.slice(1).forEach((item) => item.setAttribute(\"aria-pressed\", \"false\"));\n }\n\n if (\n this.el.hasAttribute(\"data-selection-required\") &&\n !items.some((item) => item.getAttribute(\"aria-pressed\") === \"true\")\n ) {\n items.find((item) => !this._isDisabled(item))?.setAttribute(\"aria-pressed\", \"true\");\n }\n }\n\n private _itemFromEvent(event: Event): HTMLElement | null {\n if (!(event.target instanceof Element)) return null;\n const item = event.target.closest(\"button, a.button\");\n return item instanceof HTMLElement && item.parentElement === this.el ? item : null;\n }\n\n private _isDisabled(item: HTMLElement): boolean {\n return (\n (item instanceof HTMLButtonElement && item.disabled) ||\n item.getAttribute(\"aria-disabled\") === \"true\" ||\n item.classList.contains(\"disabled\")\n );\n }\n\n private _handleClick = (event: MouseEvent) => {\n if (!this._selectionMode) return;\n const item = this._itemFromEvent(event);\n if (!(item instanceof HTMLButtonElement) || this._isDisabled(item)) return;\n this._rememberPressed(item);\n\n const willSelect = item.getAttribute(\"aria-pressed\") !== \"true\";\n const selectedCount = this._toggleItems.filter(\n (button) => button.getAttribute(\"aria-pressed\") === \"true\",\n ).length;\n if (\n !willSelect &&\n this.el.hasAttribute(\"data-selection-required\") &&\n selectedCount === 1\n ) {\n return;\n }\n if (this._selectionMode === \"single\" && willSelect) {\n this._toggleItems.forEach((button) => {\n this._rememberPressed(button);\n button.setAttribute(\"aria-pressed\", \"false\");\n });\n }\n item.setAttribute(\"aria-pressed\", willSelect ? \"true\" : \"false\");\n this._notify(\"change\", null, { detail: { button: item, pressed: willSelect } });\n };\n\n private _rememberPressed(item: HTMLButtonElement) {\n if (!this._originalPressed.has(item)) {\n this._originalPressed.set(item, item.getAttribute(\"aria-pressed\"));\n }\n }\n\n private _handlePointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyDown = (event: KeyboardEvent) => {\n if (event.repeat || (event.key !== \" \" && event.key !== \"Enter\")) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === \" \" || event.key === \"Enter\") this._resetPress();\n };\n\n private _handleFocusOut = (event: FocusEvent) => {\n if (event.target === this._activeItem) this._resetPress();\n };\n\n private _startPress(item: HTMLElement) {\n if (this._activeItem) return;\n this._finishRelease();\n\n const items = this._items;\n const activeIndex = items.indexOf(item);\n if (activeIndex < 0) return;\n\n this._activeItem = item;\n item.classList.add(PRESSED_CLASS);\n if (this.el.classList.contains(\"connected\") || items.length < 2) return;\n\n const rects = items.map((candidate) => candidate.getBoundingClientRect());\n const activeWidth = rects[activeIndex].width;\n if (activeWidth <= 0) return;\n\n const parsedMultiplier = Number.parseFloat(\n getComputedStyle(this.el).getPropertyValue(\n \"--md-comp-button-group-pressed-item-width-multiplier\",\n ),\n );\n const multiplier = Number.isFinite(parsedMultiplier) ? parsedMultiplier : 0.15;\n const desiredGrowth = activeWidth * multiplier;\n const neighborIndexes = [activeIndex - 1, activeIndex + 1].filter(\n (index) => index >= 0 && index < items.length,\n );\n const compression = new Map<number, number>();\n\n if (neighborIndexes.length === 1) {\n const index = neighborIndexes[0];\n compression.set(\n index,\n Math.min(desiredGrowth, this._compressionCapacity(items[index], rects[index])),\n );\n } else {\n const half = desiredGrowth / 2;\n for (const index of neighborIndexes) {\n compression.set(\n index,\n Math.min(half, this._compressionCapacity(items[index], rects[index])),\n );\n }\n let remaining = desiredGrowth - [...compression.values()].reduce((sum, value) => sum + value, 0);\n for (const index of neighborIndexes) {\n if (remaining <= 0) break;\n const capacity =\n this._compressionCapacity(items[index], rects[index]) - compression.get(index);\n const extra = Math.min(remaining, capacity);\n compression.set(index, compression.get(index) + extra);\n remaining -= extra;\n }\n }\n\n const actualGrowth = [...compression.values()].reduce((sum, value) => sum + value, 0);\n if (actualGrowth <= 0) return;\n\n items.forEach((candidate, index) => {\n this._pressedStyles.set(candidate, {\n width: candidate.style.width,\n baseWidth: rects[index].width,\n });\n candidate.style.width = `${rects[index].width}px`;\n });\n void this.el.offsetWidth;\n items.forEach((candidate, index) => {\n const adjustment =\n index === activeIndex ? actualGrowth : -(compression.get(index) || 0);\n candidate.style.width = `${rects[index].width + adjustment}px`;\n });\n }\n\n private _compressionCapacity(item: HTMLElement, rect: DOMRect): number {\n const minimumWidth = item.classList.contains(\"icon-button\")\n ? rect.width * (1 - MAX_ICON_COMPRESSION)\n : rect.height;\n return Math.max(0, rect.width - minimumWidth);\n }\n\n private _resetPress = () => {\n this._activeItem?.classList.remove(PRESSED_CLASS);\n this._activeItem = null;\n if (!this._pressedStyles.size) return;\n this._finishRelease();\n this._releaseStyles = new Map(this._pressedStyles);\n for (const [item, style] of this._releaseStyles) {\n item.style.width = `${style.baseWidth}px`;\n }\n this._pressedStyles.clear();\n this._releaseTimer = window.setTimeout(this._finishRelease, 200);\n };\n\n private _finishRelease = () => {\n if (this._releaseTimer !== null) window.clearTimeout(this._releaseTimer);\n this._releaseTimer = null;\n for (const [item, style] of this._releaseStyles) item.style.width = style.width;\n this._releaseStyles.clear();\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,18 +1,26 @@
1
1
  import {
2
- COLORS,
3
2
  LineChart,
3
+ polarPoint
4
+ } from "./chunk-ZM3XBHWV.mjs";
5
+ import {
4
6
  svgNode
5
- } from "./chunk-O5XPWXIQ.mjs";
7
+ } from "./chunk-ZVLOUDIJ.mjs";
6
8
 
7
9
  // src/ts/components/radarChart.ts
8
10
  var RINGS = 4;
11
+ function runs(values) {
12
+ const list = [[]];
13
+ values.forEach((value, i) => value === null ? list.push([]) : list[list.length - 1].push(i));
14
+ if (list.length > 1) list[0] = [...list.pop(), ...list[0]];
15
+ return list.filter((run) => run.length);
16
+ }
17
+ var closed = (corners) => `M${corners.join("L")}Z`;
18
+ var open = (corners) => `M${corners.join("L")}${corners.length > 1 ? "" : "h0"}`;
19
+ var wedge = (corners) => `M0,0L${corners.join("L")}Z`;
9
20
  var RadarChart = class extends LineChart {
10
21
  get _type() {
11
22
  return "radar-chart";
12
23
  }
13
- get _key() {
14
- return "Expressive_RadarChart";
15
- }
16
24
  /** The scale starts at zero, the middle, so shapes compare by size. */
17
25
  get _fromZero() {
18
26
  return true;
@@ -20,12 +28,6 @@ var RadarChart = class extends LineChart {
20
28
  get _circular() {
21
29
  return true;
22
30
  }
23
- static init(els, options = {}) {
24
- return super.init(els, options);
25
- }
26
- static getInstance(el) {
27
- return el["Expressive_RadarChart"];
28
- }
29
31
  /**
30
32
  * The cursor is a spoke turned by --turn, and the tooltip sits past its
31
33
  * tip. LineChart's points on the spoke keep their top, a share of the
@@ -53,36 +55,44 @@ var RadarChart = class extends LineChart {
53
55
  const [turn] = this._polarAt(e);
54
56
  return Math.round(turn * this.labels.length) % this.labels.length;
55
57
  }
58
+ /** The grid rings' shares of the radius: one per .axis label above zero, or quarters. */
59
+ _rings(share) {
60
+ if (!this._axis) return Array.from({ length: RINGS }, (_, r) => (r + 1) / RINGS);
61
+ return this.series[0].scale.ticks.filter((tick) => tick > 0).map(share);
62
+ }
63
+ /**
64
+ * One series' group: its outline, broken at a gap like a line chart's,
65
+ * its .area fill and its .points.
66
+ */
67
+ _series(series, corner) {
68
+ const group = svgNode("g", {
69
+ class: `radar-chart-series ${series.className}`.trim(),
70
+ "data-series": series.color
71
+ });
72
+ const lines = runs(series.values).map((run) => run.map(corner));
73
+ const [outline, fill] = series.values.includes(null) ? [open, wedge] : [closed, closed];
74
+ group.append(svgNode("path", { class: "radar-chart-shape", d: lines.map(outline).join("") }));
75
+ const list = this.el.classList;
76
+ if (list.contains("area")) group.append(svgNode("path", { class: "radar-chart-area", d: lines.map(fill).join("") }));
77
+ if (list.contains("points")) group.append(svgNode("path", { class: "radar-chart-points", d: lines.flat().map((c) => `M${c}h0`).join("") }));
78
+ return group;
79
+ }
56
80
  /**
57
81
  * An SVG in a -50 to 50 box: the rings and spokes of the grid, then each
58
82
  * series' shape, with its points for .points. The rim is the box's edge;
59
83
  * the labels round it are HTML.
60
84
  */
61
85
  _draw() {
62
- const at = (index, share2) => {
63
- const angle = this._turn(index) * 2 * Math.PI;
64
- return `${(50 * share2 * Math.sin(angle)).toFixed(3)},${(-50 * share2 * Math.cos(angle)).toFixed(3)}`;
65
- };
86
+ const at = (index, share2) => polarPoint(this._turn(index), 50 * share2);
66
87
  const share = (value) => Math.min(1, Math.max(0, 1 - this._y(value) / 100));
67
88
  const rows = this.labels.map((_, i) => i);
68
89
  const ring = (r) => `M${rows.map((i) => at(i, r)).join("L")}Z`;
69
90
  const svg = svgNode("svg", { viewBox: "-50 -50 100 100", "aria-hidden": "true", focusable: "false" });
70
91
  svg.append(svgNode("path", {
71
92
  class: "radar-chart-grid",
72
- d: Array.from({ length: RINGS }, (_, r) => ring((r + 1) / RINGS)).join("") + rows.map((i) => `M0,0L${at(i, 1)}`).join("")
93
+ d: this._rings(share).map(ring).join("") + rows.map((i) => `M0,0L${at(i, 1)}`).join("")
73
94
  }));
74
- const points = this.el.classList.contains("points");
75
- this.series.forEach((series, s) => {
76
- const group = svgNode("g", {
77
- class: `radar-chart-series ${series.className}`.trim(),
78
- "data-series": String(s % COLORS + 1)
79
- });
80
- const drawn = rows.filter((i) => series.values[i] !== null);
81
- const corners = drawn.map((i) => at(i, share(series.values[i])));
82
- group.append(svgNode("path", { class: "radar-chart-shape", d: corners.length ? `M${corners.join("L")}Z` : "" }));
83
- if (points) group.append(svgNode("path", { class: "radar-chart-points", d: corners.map((c) => `M${c}h0`).join("") }));
84
- svg.append(group);
85
- });
95
+ this.series.forEach((series) => svg.append(this._series(series, (i) => at(i, share(series.values[i])))));
86
96
  const labels = document.createElement("ol");
87
97
  labels.className = "radar-chart-axes";
88
98
  labels.setAttribute("aria-hidden", "true");
@@ -98,8 +108,9 @@ var RadarChart = class extends LineChart {
98
108
  return web;
99
109
  }
100
110
  };
111
+ RadarChart.key = "Expressive_RadarChart";
101
112
 
102
113
  export {
103
114
  RadarChart
104
115
  };
105
- //# sourceMappingURL=chunk-3DHK5CZU.mjs.map
116
+ //# sourceMappingURL=chunk-6FSEUFVW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/radarChart.ts"],
4
+ "sourcesContent": ["import { LineChart, LineChartOptions, polarPoint, Series } from './lineChart';\nimport { svgNode as node } from '../core/utils';\n\nexport type RadarChartOptions = LineChartOptions;\n\n/** Grid rings, evenly spaced from the middle to the rim. */\nconst RINGS = 4;\n\n/**\n * A series' rows split at its gaps into runs, the last carrying on round\n * past the top spoke into the first.\n */\nfunction runs(values: (number | null)[]) {\n const list: number[][] = [[]];\n values.forEach((value, i) => (value === null ? list.push([]) : list[list.length - 1].push(i)));\n if (list.length > 1) list[0] = [...list.pop()!, ...list[0]];\n return list.filter((run) => run.length);\n}\n\n// A run of corners as a path: closed round a whole shape; open where a gap\n// breaks it, a dot for a lone corner; and filled as a wedge from the middle.\nconst closed = (corners: string[]) => `M${corners.join('L')}Z`;\nconst open = (corners: string[]) => `M${corners.join('L')}${corners.length > 1 ? '' : 'h0'}`;\nconst wedge = (corners: string[]) => `M0,0L${corners.join('L')}Z`;\n\n/**\n * Radar chart. It reads its <table> like LineChart, but each row is a spoke,\n * clockwise from the top, and each value column is a series drawn as a\n * shape joining its values on the spokes, from zero in the middle to the\n * scale's top at the rim. The row labels sit round the rim.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class RadarChart extends LineChart {\n protected get _type() {\n return 'radar-chart';\n }\n\n /** The scale starts at zero, the middle, so shapes compare by size. */\n protected get _fromZero() {\n return true;\n }\n\n protected get _circular() {\n return true;\n }\n\n static key = 'Expressive_RadarChart';\n\n /**\n * The cursor is a spoke turned by --turn, and the tooltip sits past its\n * tip. LineChart's points on the spoke keep their top, a share of the\n * radius, which stops at the rim and the middle like the shapes.\n */\n protected _place(index: number) {\n for (const dot of this._cursor.children as HTMLCollectionOf<HTMLElement>) {\n dot.style.top = `${Math.min(100, Math.max(0, parseFloat(dot.style.top)))}%`;\n }\n const turn = this._turn(index);\n this._cursor.style.setProperty('--turn', String(turn));\n this._tooltip.style.setProperty('--turn', String(turn));\n // On the right half it opens leftwards, over the chart.\n this._tooltip.classList.toggle('end', turn > 0 && turn < 0.5);\n }\n\n /** A row's spoke as a fraction of a turn clockwise from the top. */\n private _turn(index: number) {\n return index / this.labels.length;\n }\n\n /** Only the legend; the labels go round the rim in _draw. */\n protected _guides(): Element[] {\n return this._legend();\n }\n\n /** The nearest spoke to the pointer, by its angle from the middle. */\n protected _indexAt(e: PointerEvent) {\n const [turn] = this._polarAt(e);\n return Math.round(turn * this.labels.length) % this.labels.length;\n }\n\n /** The grid rings' shares of the radius: one per .axis label above zero, or quarters. */\n private _rings(share: (value: number) => number) {\n if (!this._axis) return Array.from({ length: RINGS }, (_, r) => (r + 1) / RINGS);\n return this.series[0].scale.ticks.filter((tick) => tick > 0).map(share);\n }\n\n /**\n * One series' group: its outline, broken at a gap like a line chart's,\n * its .area fill and its .points.\n */\n private _series(series: Series, corner: (index: number) => string) {\n const group = node('g', {\n class: `radar-chart-series ${series.className}`.trim(),\n 'data-series': series.color\n });\n const lines = runs(series.values).map((run) => run.map(corner));\n const [outline, fill] = series.values.includes(null) ? [open, wedge] : [closed, closed];\n group.append(node('path', { class: 'radar-chart-shape', d: lines.map(outline).join('') }));\n const list = this.el.classList;\n if (list.contains('area')) group.append(node('path', { class: 'radar-chart-area', d: lines.map(fill).join('') }));\n // Round caps on zero-length lines, so CSS sizes the points in pixels.\n if (list.contains('points')) group.append(node('path', { class: 'radar-chart-points', d: lines.flat().map((c) => `M${c}h0`).join('') }));\n return group;\n }\n\n /**\n * An SVG in a -50 to 50 box: the rings and spokes of the grid, then each\n * series' shape, with its points for .points. The rim is the box's edge;\n * the labels round it are HTML.\n */\n protected _draw(): Element {\n const at = (index: number, share: number) => polarPoint(this._turn(index), 50 * share);\n // The rim is the scale's top, so _y is the distance in from the rim.\n const share = (value: number) => Math.min(1, Math.max(0, 1 - this._y(value) / 100));\n const rows = this.labels.map((_, i) => i);\n const ring = (r: number) => `M${rows.map((i) => at(i, r)).join('L')}Z`;\n\n const svg = node('svg', { viewBox: '-50 -50 100 100', 'aria-hidden': 'true', focusable: 'false' });\n svg.append(node('path', {\n class: 'radar-chart-grid',\n d: this._rings(share).map(ring).join('')\n + rows.map((i) => `M0,0L${at(i, 1)}`).join('')\n }));\n this.series.forEach((series) => svg.append(this._series(series, (i) => at(i, share(series.values[i]!)))));\n\n const labels = document.createElement('ol');\n labels.className = 'radar-chart-axes';\n labels.setAttribute('aria-hidden', 'true');\n this.labels.forEach((text, i) => {\n const li = document.createElement('li');\n li.textContent = text;\n li.style.setProperty('--turn', String(this._turn(i)));\n labels.append(li);\n });\n\n const web = document.createElement('div');\n web.className = 'radar-chart-web';\n web.append(svg, labels);\n return web;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["share"]
7
+ }