@expressivecss/expressive 0.15.0 → 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 (602) hide show
  1. package/CHANGELOG.md +1502 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19247 -11923
  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-KVJAVDBC.mjs → chunk-4QUCNFSD.mjs} +64 -113
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-6FSEUFVW.mjs} +39 -26
  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-CK2XCICY.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-7NLUI3RR.mjs} +139 -66
  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-LQWUDNHZ.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-B7DQFHA5.mjs} +30 -47
  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-VGNYF6FB.mjs → chunk-BPF3I2MN.mjs} +109 -24
  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-NUHMOAOY.mjs → chunk-CSYWKEK3.mjs} +310 -196
  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-74MXKKLN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-EVCVFEV3.mjs} +235 -146
  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-PDG64UHF.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-BGZLF6JZ.mjs → chunk-KZPSAXIU.mjs} +142 -32
  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-DXGRXYYL.mjs → chunk-OP43LLIC.mjs} +28 -45
  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-TSZYSW7F.mjs → chunk-OYNUDOHR.mjs} +19 -47
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UAZSDUVP.mjs → chunk-P6DRQ6KS.mjs} +36 -30
  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-GJL6GCIU.mjs → chunk-QXKWVHBD.mjs} +265 -161
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-X4ISMKE2.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-SMY7GJSS.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-ZX6M7SWO.mjs → chunk-VGY4M57S.mjs} +266 -120
  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-SFI2U4YW.mjs → chunk-VMY55K2X.mjs} +76 -109
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-KUFHW3DS.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-FM5CZOUB.mjs → chunk-ZJNLAGY5.mjs} +19 -30
  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 +10613 -4327
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10613 -4327
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -22
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +182 -71
  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 +131 -66
  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 +3 -3
  274. package/dist/js/internal/components/lightbox.mjs +3 -3
  275. package/dist/js/internal/components/lineChart.mjs +25 -4
  276. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  277. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  278. package/dist/js/internal/components/mapView.mjs +3 -3
  279. package/dist/js/internal/components/menu.mjs +3 -3
  280. package/dist/js/internal/components/menubar.mjs +10 -0
  281. package/dist/js/internal/components/menubar.mjs.map +7 -0
  282. package/dist/js/internal/components/messageScroller.mjs +3 -3
  283. package/dist/js/internal/components/mixedChart.mjs +5 -4
  284. package/dist/js/internal/components/navigationRail.mjs +3 -2
  285. package/dist/js/internal/components/particles.mjs +3 -2
  286. package/dist/js/internal/components/pieChart.mjs +4 -3
  287. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  288. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  289. package/dist/js/internal/components/questionnaire.mjs +3 -3
  290. package/dist/js/internal/components/radarChart.mjs +4 -3
  291. package/dist/js/internal/components/radialChart.mjs +4 -3
  292. package/dist/js/internal/components/registry.mjs +59 -41
  293. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  294. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  295. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  296. package/dist/js/internal/components/scatterChart.mjs +10 -0
  297. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scrollspy.mjs +3 -2
  299. package/dist/js/internal/components/select.mjs +4 -4
  300. package/dist/js/internal/components/showMore.mjs +9 -0
  301. package/dist/js/internal/components/showMore.mjs.map +7 -0
  302. package/dist/js/internal/components/slider.mjs +3 -3
  303. package/dist/js/internal/components/snackbar.mjs +2 -2
  304. package/dist/js/internal/components/swipeActions.mjs +9 -0
  305. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  306. package/dist/js/internal/components/tabs.mjs +3 -4
  307. package/dist/js/internal/components/timepicker.mjs +5 -4
  308. package/dist/js/internal/components/tooltip.mjs +3 -3
  309. package/dist/js/internal/components/treeSelect.mjs +13 -0
  310. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  311. package/dist/js/internal/components/treemapChart.mjs +10 -0
  312. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  313. package/dist/js/internal/core/component.mjs +2 -1
  314. package/dist/js/internal/core/formControl.mjs +12 -0
  315. package/dist/js/internal/core/formControl.mjs.map +7 -0
  316. package/dist/js/internal/core/spring.mjs +11 -0
  317. package/dist/js/internal/core/spring.mjs.map +7 -0
  318. package/dist/js/internal/core/utils.mjs +11 -3
  319. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  320. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  322. package/dist/js/modular.mjs +173 -71
  323. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  324. package/dist/types/behaviors/copy.d.ts +18 -0
  325. package/dist/types/behaviors/dataTables.d.ts +129 -0
  326. package/dist/types/behaviors/dialogs.d.ts +27 -1
  327. package/dist/types/behaviors/forms.d.ts +68 -2
  328. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  329. package/dist/types/behaviors/lists.d.ts +12 -0
  330. package/dist/types/behaviors/paneResize.d.ts +29 -0
  331. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  332. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  333. package/dist/types/behaviors/sortable.d.ts +28 -0
  334. package/dist/types/behaviors/theme.d.ts +22 -0
  335. package/dist/types/behaviors/tour.d.ts +36 -0
  336. package/dist/types/behaviors/transferList.d.ts +51 -0
  337. package/dist/types/components/appBar.d.ts +5 -6
  338. package/dist/types/components/autocomplete.d.ts +91 -17
  339. package/dist/types/components/backToTop.d.ts +36 -0
  340. package/dist/types/components/barChart.d.ts +3 -6
  341. package/dist/types/components/buttonGroup.d.ts +2 -4
  342. package/dist/types/components/buttons.d.ts +5 -5
  343. package/dist/types/components/cards.d.ts +3 -16
  344. package/dist/types/components/carousel.d.ts +9 -15
  345. package/dist/types/components/cascader.d.ts +130 -0
  346. package/dist/types/components/characterCounter.d.ts +2 -15
  347. package/dist/types/components/chips.d.ts +65 -19
  348. package/dist/types/components/colorPicker.d.ts +42 -0
  349. package/dist/types/components/columnChart.d.ts +23 -10
  350. package/dist/types/components/commandPalette.d.ts +11 -16
  351. package/dist/types/components/confetti.d.ts +2 -4
  352. package/dist/types/components/currencyInput.d.ts +59 -0
  353. package/dist/types/components/datepicker.d.ts +56 -32
  354. package/dist/types/components/expandingCard.d.ts +4 -6
  355. package/dist/types/components/funnelChart.d.ts +38 -0
  356. package/dist/types/components/heatmapChart.d.ts +39 -8
  357. package/dist/types/components/hoverCard.d.ts +58 -0
  358. package/dist/types/components/index.d.ts +16 -1
  359. package/dist/types/components/inputMask.d.ts +30 -0
  360. package/dist/types/components/keypad.d.ts +38 -6
  361. package/dist/types/components/lightbox.d.ts +14 -20
  362. package/dist/types/components/lineChart.d.ts +172 -10
  363. package/dist/types/components/loadingOverlay.d.ts +42 -0
  364. package/dist/types/components/mapView.d.ts +26 -17
  365. package/dist/types/components/menu.d.ts +60 -22
  366. package/dist/types/components/menubar.d.ts +37 -0
  367. package/dist/types/components/messageScroller.d.ts +2 -14
  368. package/dist/types/components/mixedChart.d.ts +15 -6
  369. package/dist/types/components/navigationRail.d.ts +16 -5
  370. package/dist/types/components/particles.d.ts +8 -4
  371. package/dist/types/components/pieChart.d.ts +32 -7
  372. package/dist/types/components/pullToRefresh.d.ts +80 -0
  373. package/dist/types/components/questionnaire.d.ts +58 -16
  374. package/dist/types/components/radarChart.d.ts +10 -6
  375. package/dist/types/components/radialChart.d.ts +58 -7
  376. package/dist/types/components/registry.d.ts +73 -3
  377. package/dist/types/components/richTextEditor.d.ts +6 -14
  378. package/dist/types/components/sankeyChart.d.ts +72 -0
  379. package/dist/types/components/scatterChart.d.ts +102 -0
  380. package/dist/types/components/scrollspy.d.ts +3 -5
  381. package/dist/types/components/select.d.ts +43 -30
  382. package/dist/types/components/showMore.d.ts +51 -0
  383. package/dist/types/components/slider.d.ts +3 -15
  384. package/dist/types/components/snackbar.d.ts +61 -0
  385. package/dist/types/components/swipeActions.d.ts +81 -0
  386. package/dist/types/components/tabs.d.ts +89 -27
  387. package/dist/types/components/timepicker.d.ts +113 -21
  388. package/dist/types/components/tooltip.d.ts +56 -20
  389. package/dist/types/components/treeSelect.d.ts +106 -0
  390. package/dist/types/components/treemapChart.d.ts +56 -0
  391. package/dist/types/core/component.d.ts +43 -25
  392. package/dist/types/core/formControl.d.ts +21 -0
  393. package/dist/types/core/spring.d.ts +20 -0
  394. package/dist/types/core/utils.d.ts +85 -72
  395. package/dist/types/modular.d.ts +33 -1
  396. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  397. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  398. package/package.json +10 -8
  399. package/src/sass/README.md +27 -18
  400. package/src/sass/abstracts/_elevation.scss +13 -7
  401. package/src/sass/abstracts/_index.scss +1 -0
  402. package/src/sass/abstracts/_mixins.scss +422 -36
  403. package/src/sass/abstracts/_spring.scss +63 -0
  404. package/src/sass/abstracts/_variables.scss +39 -21
  405. package/src/sass/base/_fonts.scss +61 -48
  406. package/src/sass/base/_global.scss +104 -24
  407. package/src/sass/base/_index.scss +2 -0
  408. package/src/sass/base/_normalize.scss +59 -114
  409. package/src/sass/base/_print.scss +21 -0
  410. package/src/sass/base/_prose.scss +68 -0
  411. package/src/sass/base/_typography.scss +9 -5
  412. package/src/sass/components/_accordion.scss +9 -16
  413. package/src/sass/components/_alert.scss +102 -0
  414. package/src/sass/components/_aura.scss +8 -3
  415. package/src/sass/components/_avatar.scss +3 -3
  416. package/src/sass/components/_back-to-top.scss +38 -0
  417. package/src/sass/components/_badges.scss +6 -5
  418. package/src/sass/components/_bar-chart.scss +41 -19
  419. package/src/sass/components/_bottom-sheet.scss +44 -16
  420. package/src/sass/components/_breadcrumb.scss +8 -1
  421. package/src/sass/components/_button-groups.scss +15 -25
  422. package/src/sass/components/_buttons.scss +156 -63
  423. package/src/sass/components/_calendar.scss +246 -0
  424. package/src/sass/components/_cards.scss +36 -44
  425. package/src/sass/components/_carousel.scss +27 -103
  426. package/src/sass/components/_cascader.scss +142 -0
  427. package/src/sass/components/_chips.scss +36 -46
  428. package/src/sass/components/_column-chart.scss +19 -12
  429. package/src/sass/components/_command-palette.scss +4 -7
  430. package/src/sass/components/_confetti.scss +0 -2
  431. package/src/sass/components/_countdown.scss +1 -1
  432. package/src/sass/components/_data-table.scss +162 -25
  433. package/src/sass/components/_datepicker.scss +54 -40
  434. package/src/sass/components/_description-list.scss +85 -0
  435. package/src/sass/components/_dialog.scss +42 -41
  436. package/src/sass/components/_docked-display.scss +1 -3
  437. package/src/sass/components/_drag-handle.scss +16 -20
  438. package/src/sass/components/_expanding-card.scss +20 -9
  439. package/src/sass/components/_fab-menu.scss +44 -32
  440. package/src/sass/components/_funnel-chart.scss +124 -0
  441. package/src/sass/components/_heatmap-chart.scss +111 -22
  442. package/src/sass/components/_icon-buttons.scss +7 -7
  443. package/src/sass/components/_icons-material-design.scss +2 -2
  444. package/src/sass/components/_image-compare.scss +108 -0
  445. package/src/sass/components/_index.scss +20 -0
  446. package/src/sass/components/_keypad.scss +39 -19
  447. package/src/sass/components/_kpi.scss +6 -11
  448. package/src/sass/components/_lightbox.scss +24 -13
  449. package/src/sass/components/_line-chart.scss +16 -2
  450. package/src/sass/components/_list.scss +59 -14
  451. package/src/sass/components/_loading-indicator.scss +1 -0
  452. package/src/sass/components/_loading-overlay.scss +105 -0
  453. package/src/sass/components/_map.scss +33 -11
  454. package/src/sass/components/_marquee.scss +3 -2
  455. package/src/sass/components/_mega-menu.scss +137 -0
  456. package/src/sass/components/_menu.scss +143 -123
  457. package/src/sass/components/_menubar.scss +59 -0
  458. package/src/sass/components/_message-scroller.scss +2 -2
  459. package/src/sass/components/_message.scss +3 -3
  460. package/src/sass/components/_mixed-chart.scss +37 -9
  461. package/src/sass/components/_modal-display.scss +21 -0
  462. package/src/sass/components/_navbar.scss +34 -20
  463. package/src/sass/components/_navigation-bar.scss +15 -77
  464. package/src/sass/components/_navigation-rail.scss +151 -92
  465. package/src/sass/components/_org-chart.scss +192 -0
  466. package/src/sass/components/_page-footer.scss +1 -1
  467. package/src/sass/components/_pagination.scss +6 -13
  468. package/src/sass/components/_panes.scss +32 -26
  469. package/src/sass/components/_particles.scss +0 -2
  470. package/src/sass/components/_pie-chart.scss +91 -11
  471. package/src/sass/components/_popover.scss +18 -5
  472. package/src/sass/components/_progress.scss +152 -31
  473. package/src/sass/components/_pull-to-refresh.scss +90 -0
  474. package/src/sass/components/_questionnaire.scss +74 -3
  475. package/src/sass/components/_radar-chart.scss +38 -10
  476. package/src/sass/components/_radial-chart.scss +113 -5
  477. package/src/sass/components/_rich-text-editor.scss +2 -2
  478. package/src/sass/components/_sankey-chart.scss +114 -0
  479. package/src/sass/components/_scatter-chart.scss +153 -0
  480. package/src/sass/components/_scrim.scss +0 -2
  481. package/src/sass/components/_scrollspy.scss +0 -2
  482. package/src/sass/components/_search.scss +26 -22
  483. package/src/sass/components/_show-more.scss +8 -0
  484. package/src/sass/components/_side-sheet.scss +23 -37
  485. package/src/sass/components/_skeleton.scss +2 -4
  486. package/src/sass/components/_snackbar.scss +27 -21
  487. package/src/sass/components/_split-button.scss +5 -5
  488. package/src/sass/components/_stat.scss +3 -8
  489. package/src/sass/components/_stepper.scss +1 -1
  490. package/src/sass/components/_swipe-actions.scss +71 -0
  491. package/src/sass/components/_tabs.scss +51 -32
  492. package/src/sass/components/_timeline.scss +12 -12
  493. package/src/sass/components/_timepicker.scss +109 -78
  494. package/src/sass/components/_toolbar.scss +35 -43
  495. package/src/sass/components/_tooltip.scss +21 -12
  496. package/src/sass/components/_tour.scss +89 -0
  497. package/src/sass/components/_transfer-list.scss +73 -0
  498. package/src/sass/components/_transitions.scss +4 -4
  499. package/src/sass/components/_tree.scss +3 -16
  500. package/src/sass/components/_treemap-chart.scss +122 -0
  501. package/src/sass/components/forms/_checkboxes.scss +106 -24
  502. package/src/sass/components/forms/_color-picker.scss +135 -0
  503. package/src/sass/components/forms/_color-swatches.scss +85 -0
  504. package/src/sass/components/forms/_drop-zone.scss +15 -9
  505. package/src/sass/components/forms/_fieldset.scss +7 -7
  506. package/src/sass/components/forms/_file-input.scss +6 -8
  507. package/src/sass/components/forms/_index.scss +3 -1
  508. package/src/sass/components/forms/_input-fields.scss +254 -90
  509. package/src/sass/components/forms/_radio-buttons.scss +33 -94
  510. package/src/sass/components/forms/_rating.scss +2 -32
  511. package/src/sass/components/forms/_select.scss +199 -20
  512. package/src/sass/components/forms/_slider.scss +91 -94
  513. package/src/sass/components/forms/_switches.scss +53 -164
  514. package/src/sass/custom.scss +10 -1
  515. package/src/sass/expressive.scss +3 -63
  516. package/src/sass/tokens/_contrast.scss +94 -0
  517. package/src/sass/tokens/_elevation.scss +16 -0
  518. package/src/sass/tokens/_index.scss +5 -0
  519. package/src/sass/tokens/_motion.scss +109 -0
  520. package/src/sass/tokens/_reference.scss +72 -141
  521. package/src/sass/tokens/_shape.scss +38 -0
  522. package/src/sass/tokens/_stacking.scss +27 -0
  523. package/src/sass/tokens/_state.scss +0 -2
  524. package/src/sass/tokens/_theme.scss +10 -1
  525. package/src/sass/tokens/_vibrant.scss +2 -5
  526. package/src/sass/utilities/_defer-render.scss +17 -0
  527. package/src/sass/utilities/_helpers.scss +183 -26
  528. package/src/sass/utilities/_index.scss +1 -0
  529. package/src/sass/utilities/_scroll-area.scss +0 -2
  530. package/src/sass/utilities/_spacing.scss +52 -34
  531. package/src/sass/utilities/_typescale.scss +8 -1
  532. package/src/sass/utilities/_visibility.scss +47 -76
  533. package/src/sass/utilities/_z-depth.scss +7 -4
  534. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  535. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  536. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  537. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  540. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  541. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  543. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  548. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  553. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  556. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  562. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  564. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  567. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  568. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  569. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  570. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  572. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  574. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  578. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  582. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  584. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  587. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  589. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  590. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  592. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  593. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  594. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  596. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  598. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  599. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  602. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,746 @@
1
+ import {
2
+ Component
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ svgNode
7
+ } from "./chunk-ZVLOUDIJ.mjs";
8
+
9
+ // src/ts/components/lineChart.ts
10
+ var _defaults = {
11
+ min: null,
12
+ max: null,
13
+ watch: false
14
+ };
15
+ var COLORS = 4;
16
+ var LABEL_GAP = 4;
17
+ function labelBoxes(items, rtl) {
18
+ const range = document.createRange();
19
+ return items.map((item) => {
20
+ range.selectNodeContents(item);
21
+ const width = range.getBoundingClientRect().width;
22
+ const { left, right } = item.getBoundingClientRect();
23
+ return rtl ? { width, start: -right, end: -left } : { width, start: left, end: right };
24
+ });
25
+ }
26
+ function labelStart(boxes, index) {
27
+ const box = boxes[index];
28
+ if (index === 0) return box.start;
29
+ if (index === boxes.length - 1) return box.end - box.width;
30
+ return (box.start + box.end - box.width) / 2;
31
+ }
32
+ function labelsFit(boxes, step) {
33
+ const edge = boxes[boxes.length - 1].end;
34
+ let previous = -Infinity;
35
+ for (let index = 0; index < boxes.length; index += step) {
36
+ const start = labelStart(boxes, index);
37
+ if (start < previous + LABEL_GAP || start + boxes[index].width > edge) return false;
38
+ previous = start + boxes[index].width;
39
+ }
40
+ return true;
41
+ }
42
+ function labelStep(boxes) {
43
+ if (boxes.every((box) => box.width + LABEL_GAP <= box.end - box.start)) return 1;
44
+ for (let step = 2; step <= boxes.length; step++) {
45
+ if (labelsFit(boxes, step)) return step;
46
+ }
47
+ return 1;
48
+ }
49
+ function thinLabels(container, items) {
50
+ const step = labelStep(labelBoxes(items, getComputedStyle(container).direction === "rtl"));
51
+ container.toggleAttribute("data-thinned", step > 1);
52
+ items.forEach((item, index) => item.toggleAttribute("data-skip", index % step > 0));
53
+ }
54
+ function tableChanged(records, el) {
55
+ const isTable = (node) => node.nodeName === "TABLE";
56
+ return records.some((record) => record.target !== el || [...record.addedNodes, ...record.removedNodes].some(isTable));
57
+ }
58
+ function rowLegend(className, colors, rows) {
59
+ const legend = document.createElement("ul");
60
+ legend.className = className;
61
+ legend.setAttribute("aria-hidden", "true");
62
+ legend.append(...rows.map((cells, i) => {
63
+ const li = document.createElement("li");
64
+ if (colors[i]) li.dataset.series = colors[i];
65
+ li.append(...cells.map((content) => Object.assign(document.createElement("span"), { textContent: content })));
66
+ return li;
67
+ }));
68
+ return legend;
69
+ }
70
+ function polarPoint(turn, r) {
71
+ const angle = turn * 2 * Math.PI;
72
+ return `${(r * Math.sin(angle)).toFixed(3)},${(-r * Math.cos(angle)).toFixed(3)}`;
73
+ }
74
+ var seriesColor = (i) => String(i % COLORS + 1);
75
+ var _gradientId = 0;
76
+ var startsFrom = (series) => matchMedia("(prefers-reduced-motion: reduce)").matches ? [] : series;
77
+ var splines = (easing) => /cubic-bezier\(([^)]*)\)/.exec(easing)?.[1] ?? "0.2, 0, 0, 1";
78
+ function pace(el) {
79
+ const style = getComputedStyle(el);
80
+ const dur = style.getPropertyValue("--md-sys-motion-duration-medium4").trim() || "400ms";
81
+ return parseFloat(dur) > 0 ? { dur, keySplines: splines(style.getPropertyValue("--md-sys-motion-easing-standard")) } : null;
82
+ }
83
+ function morph(path, from, timing) {
84
+ const to = path.getAttribute("d");
85
+ if (from === to) return;
86
+ path.append(svgNode("animate", { attributeName: "d", from, to, ...timing, calcMode: "spline", keyTimes: "0;1", fill: "remove" }));
87
+ }
88
+ var buttons = (nodes) => nodes.flatMap((node) => Array.from(node.querySelectorAll("button")));
89
+ var drawable = (series) => series.values.some((value) => value !== null);
90
+ var NICE = [1, 2, 2.5, 5, 10];
91
+ function niceStep(span, parts = 4) {
92
+ const raw = span / parts || 1;
93
+ const power = 10 ** Math.floor(Math.log10(raw));
94
+ return power * NICE.find((multiple) => multiple * power >= raw * (1 - 1e-9));
95
+ }
96
+ function steps(low, high, step) {
97
+ const values = [];
98
+ for (let i = Math.ceil(low / step - 1e-9); i * step <= high + step * 1e-9; i++) {
99
+ values.push(Number((i * step).toPrecision(12)));
100
+ }
101
+ return values;
102
+ }
103
+ function numberFormat(el, options) {
104
+ return new Intl.NumberFormat(Utils.locale(el), options);
105
+ }
106
+ function cellValue(cell) {
107
+ if (!cell) return null;
108
+ return numberValue(cell.dataset.value ?? cell.textContent);
109
+ }
110
+ function numberValue(raw) {
111
+ const text = raw.replace(/\u2212/g, "-").replace(/[\s%\p{Sc}]/gu, "");
112
+ if (!/^[+-]?(\d{1,3}(,\d{3})+|\d+)?(\.\d+)?(e[+-]?\d+)?$/i.test(text)) return null;
113
+ const value = parseFloat(text.replace(/,/g, ""));
114
+ return Number.isFinite(value) ? value : null;
115
+ }
116
+ function tickText(format, tick, [prefix, suffix]) {
117
+ return format.format(tick).replace(/^[-\u2212]?/, (sign) => sign + prefix) + suffix;
118
+ }
119
+ function signs(text) {
120
+ const prefix = /^[\s\p{Sc}]*/u.exec(text)[0];
121
+ const end = (chars) => [...chars].reverse().join("");
122
+ return [prefix, end(/^[\s%\p{Sc}]*/u.exec(end(text.slice(prefix.length)))[0])];
123
+ }
124
+ function affix(cells) {
125
+ const cell = cells.find((each) => !each?.dataset.value && cellValue(each) !== null);
126
+ return signs(cell?.textContent.trim() ?? "");
127
+ }
128
+ function straightPath(points) {
129
+ return `M${points.join("L")}${points.length > 1 ? "" : "h0"}`;
130
+ }
131
+ function monotonePath(points) {
132
+ const n = points.length;
133
+ if (n === 0) return "";
134
+ if (n === 1) return `M${points[0][0]},${points[0][1]}h0`;
135
+ const slopes = [];
136
+ for (let i = 0; i < n - 1; i++) {
137
+ slopes.push((points[i + 1][1] - points[i][1]) / (points[i + 1][0] - points[i][0]));
138
+ }
139
+ const tangents = points.map((_, i) => {
140
+ if (i === 0) return slopes[0];
141
+ if (i === n - 1) return slopes[n - 2];
142
+ const [a, b] = [slopes[i - 1], slopes[i]];
143
+ return a * b <= 0 ? 0 : 2 / (1 / a + 1 / b);
144
+ });
145
+ let d = `M${points[0][0]},${points[0][1]}`;
146
+ for (let i = 0; i < n - 1; i++) {
147
+ const [[x0, y0], [x1, y1]] = [points[i], points[i + 1]];
148
+ const h = (x1 - x0) / 3;
149
+ d += `C${x0 + h},${y0 + tangents[i] * h} ${x1 - h},${y1 - tangents[i + 1] * h} ${x1},${y1}`;
150
+ }
151
+ return d;
152
+ }
153
+ var LineChart = class extends Component {
154
+ constructor(el, options) {
155
+ super(el, options);
156
+ /** The values' x positions and series, read from the table. */
157
+ this.labels = [];
158
+ this.series = [];
159
+ /** The highlighted row, or -1. */
160
+ this.activeIndex = -1;
161
+ this._generated = [];
162
+ /** Watches the row labels' width, to thin them on a narrow chart. */
163
+ this._labelSizes = null;
164
+ /** With `watch`, redraws the chart when its table changes. */
165
+ this._tableWatch = null;
166
+ /** Every series in the table, shown or not, as the legend lists them. */
167
+ this._all = [];
168
+ /**
169
+ * During update(), the series drawn before it, which the new marks move
170
+ * from. Empty otherwise, and when the reader prefers less motion.
171
+ */
172
+ this._before = [];
173
+ /** The columns of the series a .toggle legend hid, kept through update(). */
174
+ this._hidden = /* @__PURE__ */ new Set();
175
+ /** The table's header cells and body rows, as read. */
176
+ this._header = [];
177
+ this._rows = [];
178
+ /**
179
+ * Whether the rows run right to left: a horizontal row axis in a
180
+ * right-to-left context, like the labels. Bar chart rows keep their order.
181
+ */
182
+ this._reversed = false;
183
+ this._onPointerMove = (e) => {
184
+ this.show(this._indexAt(e));
185
+ };
186
+ this._onFocus = () => {
187
+ if (this.activeIndex < 0 && this._plot.matches(":focus-visible")) this.show(0);
188
+ };
189
+ this._onLeave = (e) => {
190
+ if (e.pointerType === "touch" || this._plot.matches(":focus-visible")) return;
191
+ this.show(-1);
192
+ };
193
+ /** The browser took the touch to scroll the page. */
194
+ this._onCancel = () => {
195
+ this.show(-1);
196
+ };
197
+ this._onKeyDown = (e) => {
198
+ const next = this._keyTarget(e.key);
199
+ if (next === void 0) return;
200
+ e.preventDefault();
201
+ this.show(next);
202
+ };
203
+ this._build();
204
+ this._listen();
205
+ if (this.options.watch || this.el.hasAttribute("data-watch")) {
206
+ this._tableWatch = new MutationObserver((records) => tableChanged(records, this.el) && this.update());
207
+ }
208
+ this._watch();
209
+ }
210
+ /** The class prefix of the generated parts; ColumnChart reuses this class. */
211
+ get _type() {
212
+ return "line-chart";
213
+ }
214
+ /** The column the series start at; a scatter chart's first value column is its x axis. */
215
+ get _seriesFrom() {
216
+ return 1;
217
+ }
218
+ /** The column the series end before, as slice() takes it; a bubble chart's last column holds sizes. */
219
+ get _seriesTo() {
220
+ return void 0;
221
+ }
222
+ /** Whether the y axis always includes zero, as columns grow from it. */
223
+ get _fromZero() {
224
+ return false;
225
+ }
226
+ /**
227
+ * Whether the rows run down the plot and the values across it, as in a
228
+ * bar chart. The rows then keep their order in a right-to-left context.
229
+ */
230
+ get _horizontal() {
231
+ return false;
232
+ }
233
+ /**
234
+ * Whether the rows go round a circle, as in a pie or radar chart. The
235
+ * arrows then step round it, wrapping from the last row to the first.
236
+ */
237
+ get _circular() {
238
+ return false;
239
+ }
240
+ /** Whether .axis labels the value scale, which a sparkline never does. */
241
+ get _axis() {
242
+ return this.el.classList.contains("axis") && !this.el.classList.contains("sparkline");
243
+ }
244
+ /** Whether the cursor marks each series with a point. */
245
+ get _points() {
246
+ return true;
247
+ }
248
+ /** How many rows `show()` can highlight. */
249
+ get _count() {
250
+ return this.labels.length;
251
+ }
252
+ /**
253
+ * Observes the table as it is now, and the chart for a table added or
254
+ * replaced. Reconnecting drops the changes already queued, which the
255
+ * caller has just drawn.
256
+ */
257
+ _watch() {
258
+ if (!this._tableWatch) return;
259
+ this._tableWatch.disconnect();
260
+ this._tableWatch.observe(this.el, { childList: true });
261
+ const table = this.el.querySelector(":scope > table");
262
+ if (table) {
263
+ this._tableWatch.observe(table, {
264
+ subtree: true,
265
+ childList: true,
266
+ characterData: true,
267
+ attributeFilter: ["data-value", "class", "data-label"]
268
+ });
269
+ }
270
+ }
271
+ /** Reads the table and draws it, when it has data. */
272
+ _build() {
273
+ this._read();
274
+ if (!this.labels.length || !this.series.length) return;
275
+ this._reversed = !this._horizontal && getComputedStyle(this.el).direction === "rtl";
276
+ this._render();
277
+ }
278
+ /** Whether the pointer and keys pick rows, which a sparkline's do not. */
279
+ get _interactive() {
280
+ return !this.el.classList.contains("sparkline");
281
+ }
282
+ /** Lets the pointer and keys pick rows on the plot. */
283
+ _listen() {
284
+ if (this._plot && this._interactive) {
285
+ this._plot.addEventListener("pointerdown", this._onPointerMove);
286
+ this._plot.addEventListener("pointermove", this._onPointerMove);
287
+ this._plot.addEventListener("pointerleave", this._onLeave);
288
+ this._plot.addEventListener("pointercancel", this._onCancel);
289
+ this._plot.addEventListener("keydown", this._onKeyDown);
290
+ this._plot.addEventListener("focus", this._onFocus);
291
+ this._plot.addEventListener("blur", this._onLeave);
292
+ }
293
+ }
294
+ static get defaults() {
295
+ return _defaults;
296
+ }
297
+ destroy() {
298
+ this._generated.forEach((node) => node.remove());
299
+ this._generated = [];
300
+ this._labelSizes?.disconnect();
301
+ this._tableWatch?.disconnect();
302
+ super.destroy();
303
+ }
304
+ /**
305
+ * Redraws the chart from its table as it is now. Focus stays on the chart,
306
+ * on the same legend button when one had it, and the highlighted row stays
307
+ * where the table still has it.
308
+ */
309
+ update() {
310
+ if (this.constructor.getInstance(this.el) !== this) return;
311
+ const old = this._generated;
312
+ const active = this.el.getRootNode().activeElement;
313
+ const [index, focused] = [this.activeIndex, old.some((node) => node.contains(active))];
314
+ const button = buttons(old).indexOf(active);
315
+ this._generated = [];
316
+ this.activeIndex = -1;
317
+ this._plot = this._cursor = this._tooltip = void 0;
318
+ this._before = startsFrom(this.series);
319
+ this._build();
320
+ this._before = [];
321
+ if (focused) (buttons(this._generated)[button] ?? this._plot)?.focus({ preventScroll: true });
322
+ old.forEach((node) => node.remove());
323
+ this._listen();
324
+ this.show(Math.min(index, this._count - 1));
325
+ this._watch();
326
+ }
327
+ /**
328
+ * Highlights one row: moves the cursor and fills the tooltip.
329
+ * Pass -1 to hide them. Does nothing for a chart without data.
330
+ */
331
+ show(index) {
332
+ if (!this._tooltip || index === this.activeIndex) return;
333
+ this.activeIndex = index;
334
+ const hidden = index < 0 || index >= this.labels.length;
335
+ this._cursor.hidden = this._tooltip.hidden = hidden;
336
+ if (hidden) return;
337
+ this._cursor.replaceChildren();
338
+ const title = document.createElement("strong");
339
+ title.textContent = this.labels[index];
340
+ this._tooltip.replaceChildren(title);
341
+ this.series.forEach((series) => {
342
+ const value = series.values[index];
343
+ if (value === null) return;
344
+ const color = series.color;
345
+ const top = series.tops[index];
346
+ if (top !== null && this._points) {
347
+ const dot = document.createElement("span");
348
+ dot.className = series.className;
349
+ dot.dataset.series = color;
350
+ dot.style.top = `${series.y(top)}%`;
351
+ this._cursor.append(dot);
352
+ }
353
+ const name = document.createElement("span");
354
+ name.dataset.series = color;
355
+ name.textContent = series.name;
356
+ const text = document.createElement("span");
357
+ text.textContent = series.text[index];
358
+ this._tooltip.append(name, text);
359
+ });
360
+ this._place(index);
361
+ }
362
+ /**
363
+ * Moves the filled cursor and tooltip to a row: beside its band, with the
364
+ * tooltip opening back over the plot past the middle.
365
+ */
366
+ _place(index) {
367
+ const x = this._x(index);
368
+ const side = this._horizontal ? "top" : "left";
369
+ this._cursor.style[side] = this._tooltip.style[side] = `${x}%`;
370
+ this._tooltip.classList.toggle("end", x > 50);
371
+ }
372
+ _read() {
373
+ const table = this.el.querySelector(":scope > table");
374
+ if (!table) return;
375
+ const headerRow = table.tHead?.rows[0] ?? table.rows[0];
376
+ const header = Array.from(headerRow?.cells ?? []);
377
+ const rows = Array.from(table.tBodies).flatMap((body) => Array.from(body.rows)).filter((row) => row !== headerRow);
378
+ [this._header, this._rows] = [header, rows];
379
+ this.labels = rows.map((row) => row.cells[0]?.textContent.trim() ?? "");
380
+ const from = this._seriesFrom;
381
+ this.series = header.slice(from, this._seriesTo).map((cell, i) => {
382
+ const values = rows.map((row) => cellValue(row.cells[i + from]));
383
+ return {
384
+ name: cell.textContent.trim(),
385
+ className: cell.className,
386
+ column: i + from,
387
+ color: seriesColor(i),
388
+ text: rows.map((row) => row.cells[i + from]?.textContent.trim() ?? ""),
389
+ values,
390
+ tops: values,
391
+ y: void 0,
392
+ scale: void 0,
393
+ affix: affix(rows.map((row) => row.cells[i + from]))
394
+ };
395
+ });
396
+ this._all = this.series;
397
+ this.series = this._shown(this._all);
398
+ const option = (name) => this._number(name) ?? this.options[name];
399
+ this._y = this._scale(this.series, option("min"), option("max"));
400
+ }
401
+ /**
402
+ * The series to draw, arranged: those the legend has not hidden, or none
403
+ * without data. When the ones shown hold no data, as after the table
404
+ * changed, the hidden ones come back, so the legend never hides the only
405
+ * data there is.
406
+ */
407
+ _shown(all) {
408
+ const shown = all.filter((series) => !this._hidden.has(series.column));
409
+ this._arrange(shown);
410
+ if (shown.some(drawable)) return shown;
411
+ if (!this._hidden.size) return [];
412
+ this._hidden.clear();
413
+ return this._shown(all);
414
+ }
415
+ /** Turns the values read into what is drawn: with .stacked, running totals. */
416
+ _arrange(series) {
417
+ if (this.el.classList.contains("stacked")) this._stack(series);
418
+ }
419
+ /**
420
+ * Stacks each series on the ones before it: its tops become running
421
+ * totals and its base the total below. A gap leaves the total unknown, so
422
+ * the series above break there too.
423
+ */
424
+ _stack(series) {
425
+ const totals = this.labels.map(() => 0);
426
+ for (const each of series) {
427
+ each.base = [...totals];
428
+ each.tops = each.values.map((value, i) => totals[i] = value === null || totals[i] === null ? null : totals[i] + value);
429
+ }
430
+ }
431
+ /** A number from one of the chart's data attributes, or null. */
432
+ _number(name) {
433
+ const value = parseFloat(this.el.dataset[name] ?? "");
434
+ return Number.isFinite(value) ? value : null;
435
+ }
436
+ /**
437
+ * Fits a y scale to the series' tops, between `min` and `max` where they
438
+ * are set, and gives it to each series.
439
+ */
440
+ _scale(series, min, max, fromZero = this._fromZero) {
441
+ const fixed = [min !== null, max !== null];
442
+ const stacked = this.el.classList.contains("stacked");
443
+ let [low, high] = [Infinity, -Infinity];
444
+ for (const { tops, base = [] } of series) {
445
+ for (const value of [...tops, ...base]) {
446
+ if (value === null) continue;
447
+ low = Math.min(low, value);
448
+ high = Math.max(high, value);
449
+ }
450
+ }
451
+ if (low > high) low = high = 0;
452
+ if (fromZero) {
453
+ const [bottom, top] = [Math.min(0, low), Math.max(0, high)];
454
+ const room = (top - (min ?? bottom)) * 0.1 || 1;
455
+ min ?? (min = bottom < 0 ? bottom - room : 0);
456
+ max ?? (max = top + room);
457
+ } else {
458
+ const pad = (high - low) * 0.1 || 1;
459
+ min ?? (min = stacked ? Math.min(0, low) : low - pad);
460
+ max ?? (max = high + (stacked ? (high - min) * 0.1 || 1 : pad));
461
+ }
462
+ return this._apply(series, this._fit(min, max, fixed));
463
+ }
464
+ /**
465
+ * With .axis, widens each end the chart chose to a round step and lists
466
+ * the steps for the labels. An end set by the author stays where it is.
467
+ */
468
+ _fit(min, max, [fixedMin, fixedMax]) {
469
+ if (!this._axis) return { min, max, ticks: [] };
470
+ const step = niceStep(max - min);
471
+ const low = fixedMin ? min : Math.floor(min / step + 1e-9) * step;
472
+ const high = fixedMax ? max : Math.ceil(max / step - 1e-9) * step;
473
+ return { min: low, max: high, ticks: steps(low, high, step) };
474
+ }
475
+ /** Gives the series a scale and the y function it draws with. */
476
+ _apply(series, scale) {
477
+ const y = (value) => 100 - (value - scale.min) / (scale.max - scale.min || 1) * 100;
478
+ for (const each of series) Object.assign(each, { y, scale });
479
+ return y;
480
+ }
481
+ /** Each row sits in the middle of an equal band, beside its label. */
482
+ _x(index) {
483
+ const x = (index + 0.5) / this.labels.length * 100;
484
+ return this._reversed ? 100 - x : x;
485
+ }
486
+ _render() {
487
+ const type = this._type;
488
+ this._plot = document.createElement("div");
489
+ this._plot.className = `${type}-plot`;
490
+ const caption = this.el.querySelector(":scope > figcaption")?.textContent.trim();
491
+ this._plot.setAttribute("role", "group");
492
+ this._plot.setAttribute("aria-roledescription", type.replace(/-/g, " "));
493
+ if (caption) this._plot.setAttribute("aria-label", caption);
494
+ if (this._interactive) this._plot.tabIndex = 0;
495
+ this._cursor = document.createElement("div");
496
+ this._cursor.className = `${type}-cursor`;
497
+ this._cursor.hidden = true;
498
+ this._tooltip = document.createElement("div");
499
+ this._tooltip.className = `${type}-tooltip`;
500
+ this._tooltip.hidden = true;
501
+ this._tooltip.setAttribute("aria-live", "polite");
502
+ this._plot.append(...this._axes(), this._draw(), this._cursor, this._tooltip);
503
+ this._generated = [this._plot, ...this._guides()];
504
+ this.el.append(...this._generated);
505
+ }
506
+ /**
507
+ * The <tfoot> row as a total to show over the plot, its value over its
508
+ * label, or null without one.
509
+ */
510
+ _total(className) {
511
+ const footer = this.el.querySelector(":scope > table")?.tFoot?.rows[0];
512
+ if (!footer) return null;
513
+ const total = document.createElement("div");
514
+ total.className = className;
515
+ const [label, value] = [document.createElement("span"), document.createElement("strong")];
516
+ label.textContent = footer.cells[0]?.textContent.trim() ?? "";
517
+ value.textContent = footer.cells[1]?.textContent.trim() ?? "";
518
+ total.append(value, label);
519
+ return total;
520
+ }
521
+ /** The parts below the plot: the row labels and the legend. */
522
+ _guides() {
523
+ const labels = document.createElement("ol");
524
+ labels.className = `${this._type}-labels`;
525
+ labels.setAttribute("aria-hidden", "true");
526
+ for (const text of this.labels) {
527
+ const li = document.createElement("li");
528
+ li.append(document.createElement("span"));
529
+ li.firstChild.textContent = text;
530
+ labels.append(li);
531
+ }
532
+ this._observeLabels(labels, Array.from(labels.children));
533
+ return [labels, ...this._legend()];
534
+ }
535
+ /**
536
+ * Thins the column labels in container whenever its width changes. A bar
537
+ * chart's labels run down instead, and no labels leaves nothing to watch.
538
+ */
539
+ _observeLabels(container, items) {
540
+ this._labelSizes?.disconnect();
541
+ if (this._horizontal || !items.length) return;
542
+ this._labelSizes = new ResizeObserver(() => thinLabels(container, items));
543
+ this._labelSizes.observe(container);
544
+ }
545
+ /**
546
+ * With .axis, the value labels, behind the marks: the start scale's with
547
+ * a grid line at each, and a mixed chart's end scale on the far side.
548
+ */
549
+ _axes() {
550
+ if (!this._axis) return [];
551
+ const isEnd = (series) => series.className.split(/\s+/).includes("end");
552
+ const start = this.series.find((series) => !isEnd(series)) ?? this.series[0];
553
+ const end = this.series.find((series) => series.y !== start.y);
554
+ return [start, end].filter(Boolean).map((series, i) => this._valueAxis(series, i > 0));
555
+ }
556
+ /** One scale's labels, each placed by --at, its value's distance down the plot. */
557
+ _valueAxis(series, end) {
558
+ const axis = document.createElement("ol");
559
+ axis.className = `${this._type}-axis${end ? " end" : ""}`;
560
+ axis.setAttribute("aria-hidden", "true");
561
+ const number = numberFormat(this.el, { notation: "compact", maximumSignificantDigits: 3 });
562
+ for (const tick of series.scale.ticks) {
563
+ const li = document.createElement("li");
564
+ const label = document.createElement("span");
565
+ label.textContent = tickText(number, tick, series.affix);
566
+ li.style.setProperty("--at", `${series.y(tick)}%`);
567
+ li.append(label);
568
+ axis.append(li);
569
+ }
570
+ return axis;
571
+ }
572
+ /**
573
+ * The series legend, for more than one series. With .toggle each item is
574
+ * a button that shows or hides its series, and the scale refits.
575
+ */
576
+ _legend() {
577
+ if (this._all.length < 2) return [];
578
+ const toggle = this.el.classList.contains("toggle");
579
+ const legend = document.createElement("ul");
580
+ legend.className = `${this._type}-legend`;
581
+ if (!toggle) legend.setAttribute("aria-hidden", "true");
582
+ legend.append(...this._all.map((series) => {
583
+ const li = document.createElement("li");
584
+ li.dataset.series = series.color;
585
+ li.append(toggle ? this._toggle(series) : series.name);
586
+ return li;
587
+ }));
588
+ return [legend];
589
+ }
590
+ /** A button that shows or hides a series, though never the last one shown. */
591
+ _toggle(series) {
592
+ const button = document.createElement("button");
593
+ const shown = this.series.includes(series);
594
+ button.type = "button";
595
+ button.className = "chart-toggle";
596
+ button.textContent = series.name;
597
+ button.setAttribute("aria-pressed", String(shown));
598
+ if (shown && drawable(series) && this.series.filter(drawable).length < 2) button.setAttribute("aria-disabled", "true");
599
+ button.addEventListener("click", () => {
600
+ if (button.hasAttribute("aria-disabled")) return;
601
+ if (shown) this._hidden.add(series.column);
602
+ else this._hidden.delete(series.column);
603
+ this.update();
604
+ });
605
+ return button;
606
+ }
607
+ /** Draws the series, which fill the plot. */
608
+ _draw(drawn = this.series) {
609
+ const svg = svgNode("svg", {
610
+ viewBox: "0 0 100 100",
611
+ preserveAspectRatio: "none",
612
+ "aria-hidden": "true",
613
+ focusable: "false"
614
+ });
615
+ const timing = this._before.length ? pace(this.el) : null;
616
+ const starts = timing ? this._starts(drawn) : [];
617
+ svg.append(...drawn.map((series, i) => this._line(series, starts[i], timing)));
618
+ return svg;
619
+ }
620
+ /**
621
+ * After update(), the shape each series moves from: where it was drawn,
622
+ * and for a row it had no value at, its base. That is the plot bottom,
623
+ * or in a stack where the series below starts, so the stack stays joined.
624
+ */
625
+ _starts(drawn) {
626
+ let below;
627
+ return drawn.map((series) => {
628
+ const base = !series.base ? () => 100 : below ?? this._baseY(series);
629
+ below = this._was(series, base);
630
+ return this._shape(series, below, base);
631
+ });
632
+ }
633
+ /** Where a series drew each row before update(), or its base for a row it had no value at. */
634
+ _was(series, base) {
635
+ const old = this._before.find((each) => each.column === series.column);
636
+ return (index) => {
637
+ const top = old?.tops[index] ?? null;
638
+ return top === null ? base(index) : old.y(top);
639
+ };
640
+ }
641
+ /** Where a stacked area's base runs: the series below, or the plot bottom when zero is off the scale. */
642
+ _baseY(series) {
643
+ return (index) => Math.min(100, series.y(series.base[index]));
644
+ }
645
+ /**
646
+ * A series' paths, with its rows at `top` and a stacked area's base at
647
+ * `base`. The line is smooth, or with .straight straight, and a gap in the
648
+ * data breaks it into runs.
649
+ */
650
+ _shape(series, top, base) {
651
+ const runs = [[]];
652
+ series.tops.forEach((value, index) => {
653
+ if (value === null) runs.push([]);
654
+ else runs[runs.length - 1].push(index);
655
+ });
656
+ const filled = runs.filter((run) => run.length);
657
+ const points = (run, y) => run.map((index) => [this._x(index), y(index)]);
658
+ const curve = this.el.classList.contains("straight") ? straightPath : monotonePath;
659
+ const tops = filled.map((run) => curve(points(run, top)));
660
+ return {
661
+ line: tops.join(""),
662
+ // A stacked area runs back along the series below; the reversed curve
663
+ // is the same curve.
664
+ area: filled.map((run, r) => series.base ? `${tops[r]}L${curve(points(run, base).reverse()).slice(1)}Z` : `${tops[r]}V100H${this._x(run[0])}Z`).join(""),
665
+ // Round caps on zero-length lines, so CSS sizes the dots in pixels.
666
+ dots: filled.flatMap((run) => points(run, top)).map(([x, y]) => `M${x},${y}h0`).join("")
667
+ };
668
+ }
669
+ /**
670
+ * One series' group: its line, the fill under it, and with .points a dot
671
+ * at each value. After update() each path moves from its `from` shape.
672
+ */
673
+ _line(series, from, timing) {
674
+ const group = svgNode("g", {
675
+ class: `${this._type}-series ${series.className}`.trim(),
676
+ "data-series": series.color
677
+ });
678
+ const shape = this._shape(series, (index) => series.y(series.tops[index]), this._baseY(series));
679
+ const id = `line-chart-gradient-${++_gradientId}`;
680
+ const gradient = svgNode("linearGradient", { id, x2: "0", y2: "1" });
681
+ gradient.append(svgNode("stop"), svgNode("stop", { offset: "1" }));
682
+ const path = (part, name, attributes = {}) => {
683
+ const node = svgNode("path", { class: `${this._type}-${name}`, d: shape[part], ...attributes });
684
+ if (from) morph(node, from[part], timing);
685
+ return node;
686
+ };
687
+ group.append(gradient, path("area", "area", { fill: `url(#${id})` }), path("line", "line"));
688
+ if (this.el.classList.contains("points")) group.append(path("dots", "points"));
689
+ return group;
690
+ }
691
+ /** The row under the pointer, or -1. */
692
+ _indexAt(e) {
693
+ const box = this._plot.getBoundingClientRect();
694
+ const fraction = this._horizontal ? (e.clientY - box.top) / box.height : (e.clientX - box.left) / box.width;
695
+ const index = Math.floor((this._reversed ? 1 - fraction : fraction) * this.labels.length);
696
+ return Math.min(this.labels.length - 1, Math.max(0, index));
697
+ }
698
+ /**
699
+ * For a circular chart, the pointer's position from the plot's middle: a
700
+ * fraction of a turn clockwise from the top, and its distance as a share
701
+ * of the plot's width.
702
+ */
703
+ _polarAt(e) {
704
+ const box = this._plot.getBoundingClientRect();
705
+ const [x, y] = [e.clientX - box.left - box.width / 2, e.clientY - box.top - box.height / 2];
706
+ return [(Math.atan2(x, -y) / (2 * Math.PI) + 1) % 1, Math.hypot(x, y) / box.width];
707
+ }
708
+ /** The keys that move to the next row and to the one before. */
709
+ get _arrows() {
710
+ if (this._circular) return [["ArrowRight", "ArrowDown"], ["ArrowLeft", "ArrowUp"]];
711
+ if (this._horizontal) return [["ArrowDown"], ["ArrowUp"]];
712
+ return this._reversed ? [["ArrowLeft"], ["ArrowRight"]] : [["ArrowRight"], ["ArrowLeft"]];
713
+ }
714
+ /** The index a key moves to, or undefined for a key the chart ignores. */
715
+ _keyTarget(key) {
716
+ const last = this.labels.length - 1;
717
+ const [forward, back] = this._arrows;
718
+ const step = (by) => {
719
+ if (!this._circular) return Math.min(last, Math.max(0, this.activeIndex + by));
720
+ if (this.activeIndex < 0) return by > 0 ? 0 : last;
721
+ return (this.activeIndex + by + last + 1) % (last + 1);
722
+ };
723
+ if (key === "Escape") return this.activeIndex < 0 ? void 0 : -1;
724
+ return forward.includes(key) ? step(1) : back.includes(key) ? step(-1) : { Home: 0, End: last }[key];
725
+ }
726
+ };
727
+ LineChart.key = "Expressive_LineChart";
728
+
729
+ export {
730
+ COLORS,
731
+ rowLegend,
732
+ polarPoint,
733
+ seriesColor,
734
+ pace,
735
+ morph,
736
+ niceStep,
737
+ steps,
738
+ numberFormat,
739
+ cellValue,
740
+ numberValue,
741
+ tickText,
742
+ signs,
743
+ affix,
744
+ LineChart
745
+ };
746
+ //# sourceMappingURL=chunk-ZM3XBHWV.mjs.map