@expressivecss/expressive 0.15.0 → 0.17.0

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