@expressivecss/expressive 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/CHANGELOG.md +306 -1
  2. package/README.md +1 -1
  3. package/dist/css/expressive.css +540 -646
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/js/chunks/{chunk-PA7NU5AK.mjs → chunk-26VUH75M.mjs} +6 -3
  8. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  9. package/dist/js/chunks/{chunk-NBJAUGPP.mjs → chunk-2LFCOGC3.mjs} +12 -23
  10. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  11. package/dist/js/chunks/{chunk-OP43LLIC.mjs → chunk-36GELQGX.mjs} +4 -4
  12. package/dist/js/chunks/{chunk-OP43LLIC.mjs.map → chunk-36GELQGX.mjs.map} +2 -2
  13. package/dist/js/chunks/{chunk-EC26RU2D.mjs → chunk-3FKWIRHW.mjs} +6 -2
  14. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  15. package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs → chunk-3KF65KGL.mjs} +3 -3
  16. package/dist/js/chunks/{chunk-4QUCNFSD.mjs → chunk-3KLZRQZI.mjs} +31 -10
  17. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  18. package/dist/js/chunks/{chunk-75E5EDJF.mjs → chunk-3XORNED5.mjs} +2 -2
  19. package/dist/js/chunks/{chunk-NNHVANQA.mjs → chunk-4WBGAQN3.mjs} +3 -3
  20. package/dist/js/chunks/{chunk-ZJNLAGY5.mjs → chunk-5F4URJHL.mjs} +2 -2
  21. package/dist/js/chunks/{chunk-ZVLOUDIJ.mjs → chunk-67UNY7RH.mjs} +50 -2
  22. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-P6DRQ6KS.mjs → chunk-7CXNATJS.mjs} +6 -5
  24. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  25. package/dist/js/chunks/{chunk-4TRZ2AER.mjs → chunk-7X44MKEQ.mjs} +15 -14
  26. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  27. package/dist/js/chunks/{chunk-GWZ76SR4.mjs → chunk-7ZAMOMGY.mjs} +12 -7
  28. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  29. package/dist/js/chunks/{chunk-GVZQH2H5.mjs → chunk-AEG6LOAJ.mjs} +2 -2
  30. package/dist/js/chunks/{chunk-Y6TLRA3U.mjs → chunk-AQNFCJJ5.mjs} +27 -21
  31. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  32. package/dist/js/chunks/{chunk-OUCHKSAW.mjs → chunk-B55LWKBM.mjs} +16 -4
  33. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  34. package/dist/js/chunks/{chunk-AI73GJKG.mjs → chunk-BB5VXYXT.mjs} +2 -2
  35. package/dist/js/chunks/{chunk-2RLBDFH4.mjs → chunk-BDATLH3H.mjs} +4 -4
  36. package/dist/js/chunks/{chunk-2CS6TITK.mjs → chunk-CWMQOT4O.mjs} +23 -10
  37. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-ZKWUWBUB.mjs → chunk-CY2CTOVM.mjs} +2 -2
  39. package/dist/js/chunks/{chunk-CSYWKEK3.mjs → chunk-DWA5UYLJ.mjs} +58 -27
  40. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  41. package/dist/js/chunks/{chunk-CMGXGYUC.mjs → chunk-EB2V4OKL.mjs} +14 -9
  42. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  43. package/dist/js/chunks/{chunk-Z4GICXR2.mjs → chunk-EWO662ZC.mjs} +5 -7
  44. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  45. package/dist/js/chunks/{chunk-VGY4M57S.mjs → chunk-F7LAKFMX.mjs} +67 -34
  46. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  47. package/dist/js/chunks/{chunk-67ZPPKXS.mjs → chunk-FNIIH2LU.mjs} +3 -3
  48. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  49. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-DZYVU75J.mjs → chunk-GFWYMWYN.mjs} +18 -14
  51. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-3L3QIYLC.mjs → chunk-H5ISU45X.mjs} +8 -6
  53. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  54. package/dist/js/chunks/{chunk-QXKWVHBD.mjs → chunk-H6YIKFAQ.mjs} +67 -46
  55. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  56. package/dist/js/chunks/{chunk-KZPSAXIU.mjs → chunk-HEH7E3KO.mjs} +22 -12
  57. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  58. package/dist/js/chunks/{chunk-T3BNSRP3.mjs → chunk-HQRLBTNM.mjs} +3 -3
  59. package/dist/js/chunks/{chunk-NAC72P7R.mjs → chunk-I2F7MLUU.mjs} +2 -2
  60. package/dist/js/chunks/{chunk-ZM3XBHWV.mjs → chunk-IQOTGGHX.mjs} +86 -35
  61. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  62. package/dist/js/chunks/{chunk-QACZ6TUP.mjs → chunk-JH3YWKA6.mjs} +5 -4
  63. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  64. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  65. package/dist/js/chunks/{chunk-4IKVPCSU.mjs.map → chunk-JOLJAYIJ.mjs.map} +1 -1
  66. package/dist/js/chunks/{chunk-BPF3I2MN.mjs → chunk-KOTGMCMI.mjs} +9 -2
  67. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-ANKFWNWT.mjs → chunk-LC4O5LFS.mjs} +3 -3
  69. package/dist/js/chunks/{chunk-4PIXLDNJ.mjs → chunk-LEF33SCP.mjs} +2 -2
  70. package/dist/js/chunks/{chunk-ILDRRG7T.mjs → chunk-LFORZRPH.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-Z4OARDZ7.mjs → chunk-LWLNV5EC.mjs} +26 -17
  72. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-WU7XJ4RR.mjs → chunk-LXRHUQAX.mjs} +66 -25
  74. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-VMY55K2X.mjs → chunk-MA2SZZFB.mjs} +11 -7
  76. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-VJVQIXHC.mjs → chunk-MDBZAMIV.mjs} +8 -10
  78. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-4EWGD4V2.mjs → chunk-NODZ5VAD.mjs} +2 -2
  80. package/dist/js/chunks/{chunk-UGJHCHXG.mjs → chunk-O2WJB6TH.mjs} +79 -55
  81. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  82. package/dist/js/chunks/{chunk-7YZ5CN3V.mjs → chunk-PCABY5BN.mjs} +5 -3
  83. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  84. package/dist/js/chunks/{chunk-X7SDA2J5.mjs → chunk-PWKYVMND.mjs} +9 -5
  85. package/dist/js/chunks/{chunk-X7SDA2J5.mjs.map → chunk-PWKYVMND.mjs.map} +2 -2
  86. package/dist/js/chunks/{chunk-SPPHF7YZ.mjs → chunk-QHZZT7YO.mjs} +35 -14
  87. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  88. package/dist/js/chunks/{chunk-LDXCC2L3.mjs → chunk-QND56EW2.mjs} +5 -4
  89. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  90. package/dist/js/chunks/{chunk-NVQ5EHCU.mjs → chunk-QNODAANY.mjs} +4 -4
  91. package/dist/js/chunks/{chunk-7NLUI3RR.mjs → chunk-QRO5FV3I.mjs} +23 -13
  92. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  93. package/dist/js/chunks/{chunk-FCNF4GRJ.mjs → chunk-R7A7JRC5.mjs} +6 -11
  94. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  95. package/dist/js/chunks/{chunk-S23RJ3XY.mjs → chunk-RKG2CBFE.mjs} +4 -16
  96. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  97. package/dist/js/chunks/{chunk-6FSEUFVW.mjs → chunk-RSNS5OYS.mjs} +6 -6
  98. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-ROH2HDB4.mjs → chunk-RUDYMEJ3.mjs} +2 -2
  100. package/dist/js/chunks/{chunk-BIGU5RCJ.mjs → chunk-STJR62SU.mjs} +13 -5
  101. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  102. package/dist/js/chunks/{chunk-752ADW4M.mjs → chunk-SUSD4UTN.mjs} +27 -32
  103. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  104. package/dist/js/chunks/{chunk-B7DQFHA5.mjs → chunk-SYBOA5HC.mjs} +7 -12
  105. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  106. package/dist/js/chunks/{chunk-TFABTUAZ.mjs → chunk-T4MOBP3J.mjs} +2 -2
  107. package/dist/js/chunks/{chunk-GCWWEZKO.mjs → chunk-TM7HPGTV.mjs} +3 -3
  108. package/dist/js/chunks/{chunk-5KIHWJI2.mjs → chunk-TMQDZSDC.mjs} +34 -12
  109. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  110. package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs → chunk-TVSX5YA2.mjs} +3 -3
  111. package/dist/js/chunks/{chunk-INLZWHLY.mjs → chunk-UHO5CV6K.mjs} +2 -2
  112. package/dist/js/chunks/{chunk-INLZWHLY.mjs.map → chunk-UHO5CV6K.mjs.map} +2 -2
  113. package/dist/js/chunks/{chunk-7YQBHTK3.mjs → chunk-UKCNELUN.mjs} +6 -8
  114. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-VH4BMAZS.mjs → chunk-UKQK5GWR.mjs} +13 -13
  116. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-OYNUDOHR.mjs → chunk-UTSLYQ65.mjs} +7 -6
  118. package/dist/js/chunks/{chunk-OYNUDOHR.mjs.map → chunk-UTSLYQ65.mjs.map} +2 -2
  119. package/dist/js/chunks/{chunk-7W7TV6NY.mjs → chunk-VS5OJBOD.mjs} +2 -2
  120. package/dist/js/chunks/{chunk-7W7TV6NY.mjs.map → chunk-VS5OJBOD.mjs.map} +2 -2
  121. package/dist/js/chunks/{chunk-KYIEG4U3.mjs → chunk-VZMROW5A.mjs} +43 -14
  122. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  123. package/dist/js/chunks/{chunk-VFV75DHF.mjs → chunk-XB6Y7P5W.mjs} +11 -12
  124. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  125. package/dist/js/chunks/{chunk-CZSQHXEV.mjs → chunk-XDAMOMVD.mjs} +20 -21
  126. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  127. package/dist/js/chunks/{chunk-EVCVFEV3.mjs → chunk-XJPMW5SP.mjs} +21 -35
  128. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  129. package/dist/js/chunks/{chunk-VR3L2WN5.mjs → chunk-YKANQILZ.mjs} +7 -6
  130. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  131. package/dist/js/chunks/{chunk-JUKBBN6P.mjs → chunk-YLZOJLDI.mjs} +2 -2
  132. package/dist/js/chunks/{chunk-U4B3VHFS.mjs → chunk-ZK7YY322.mjs} +28 -21
  133. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  134. package/dist/js/expressive.cjs +2739 -2387
  135. package/dist/js/expressive.cjs.map +4 -4
  136. package/dist/js/expressive.js +2739 -2387
  137. package/dist/js/expressive.js.map +4 -4
  138. package/dist/js/expressive.min.js +7 -7
  139. package/dist/js/expressive.min.js.map +4 -4
  140. package/dist/js/expressive.mjs +76 -75
  141. package/dist/js/expressive.mjs.map +1 -1
  142. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  143. package/dist/js/internal/behaviors/copy.mjs +3 -3
  144. package/dist/js/internal/behaviors/dataTables.mjs +2 -4
  145. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  146. package/dist/js/internal/behaviors/forms.mjs +2 -2
  147. package/dist/js/internal/behaviors/imageCompare.mjs +2 -2
  148. package/dist/js/internal/behaviors/lists.mjs +2 -2
  149. package/dist/js/internal/behaviors/paneResize.mjs +2 -2
  150. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  151. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  152. package/dist/js/internal/behaviors/sortable.mjs +2 -2
  153. package/dist/js/internal/behaviors/theme.mjs +2 -2
  154. package/dist/js/internal/behaviors/tour.mjs +2 -2
  155. package/dist/js/internal/behaviors/transferList.mjs +2 -2
  156. package/dist/js/internal/components/appBar.mjs +3 -3
  157. package/dist/js/internal/components/autocomplete.mjs +5 -4
  158. package/dist/js/internal/components/backToTop.mjs +3 -3
  159. package/dist/js/internal/components/barChart.mjs +5 -5
  160. package/dist/js/internal/components/buttonGroup.mjs +3 -3
  161. package/dist/js/internal/components/buttons.mjs +3 -3
  162. package/dist/js/internal/components/cards.mjs +3 -3
  163. package/dist/js/internal/components/carousel.mjs +3 -3
  164. package/dist/js/internal/components/cascader.mjs +4 -4
  165. package/dist/js/internal/components/characterCounter.mjs +3 -3
  166. package/dist/js/internal/components/chips.mjs +7 -6
  167. package/dist/js/internal/components/colorPicker.mjs +3 -3
  168. package/dist/js/internal/components/columnChart.mjs +4 -4
  169. package/dist/js/internal/components/commandPalette.mjs +3 -3
  170. package/dist/js/internal/components/confetti.mjs +3 -3
  171. package/dist/js/internal/components/currencyInput.mjs +3 -3
  172. package/dist/js/internal/components/datepicker.mjs +8 -7
  173. package/dist/js/internal/components/expandingCard.mjs +3 -3
  174. package/dist/js/internal/components/funnelChart.mjs +4 -4
  175. package/dist/js/internal/components/heatmapChart.mjs +4 -4
  176. package/dist/js/internal/components/hoverCard.mjs +3 -3
  177. package/dist/js/internal/components/index.mjs +60 -59
  178. package/dist/js/internal/components/inputMask.mjs +3 -3
  179. package/dist/js/internal/components/keypad.mjs +3 -3
  180. package/dist/js/internal/components/lightbox.mjs +3 -3
  181. package/dist/js/internal/components/lineChart.mjs +23 -7
  182. package/dist/js/internal/components/loadingOverlay.mjs +3 -3
  183. package/dist/js/internal/components/mapView.mjs +3 -3
  184. package/dist/js/internal/components/menu.mjs +3 -3
  185. package/dist/js/internal/components/menubar.mjs +4 -4
  186. package/dist/js/internal/components/messageScroller.mjs +3 -3
  187. package/dist/js/internal/components/mixedChart.mjs +5 -5
  188. package/dist/js/internal/components/navigationRail.mjs +3 -3
  189. package/dist/js/internal/components/particles.mjs +3 -3
  190. package/dist/js/internal/components/pieChart.mjs +4 -4
  191. package/dist/js/internal/components/pullToRefresh.mjs +3 -3
  192. package/dist/js/internal/components/questionnaire.mjs +3 -3
  193. package/dist/js/internal/components/radarChart.mjs +4 -4
  194. package/dist/js/internal/components/radialChart.mjs +4 -4
  195. package/dist/js/internal/components/registry.mjs +59 -58
  196. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  197. package/dist/js/internal/components/sankeyChart.mjs +4 -4
  198. package/dist/js/internal/components/scatterChart.mjs +4 -4
  199. package/dist/js/internal/components/scrollspy.mjs +3 -3
  200. package/dist/js/internal/components/select.mjs +5 -4
  201. package/dist/js/internal/components/showMore.mjs +3 -3
  202. package/dist/js/internal/components/slider.mjs +3 -3
  203. package/dist/js/internal/components/snackbar.mjs +2 -2
  204. package/dist/js/internal/components/swipeActions.mjs +3 -3
  205. package/dist/js/internal/components/tabs.mjs +3 -3
  206. package/dist/js/internal/components/timepicker.mjs +5 -5
  207. package/dist/js/internal/components/tooltip.mjs +3 -3
  208. package/dist/js/internal/components/treeSelect.mjs +6 -5
  209. package/dist/js/internal/components/treemapChart.mjs +4 -4
  210. package/dist/js/internal/core/component.mjs +6 -4
  211. package/dist/js/internal/core/formControl.mjs +2 -2
  212. package/dist/js/internal/core/imageURL.mjs +7 -0
  213. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  214. package/dist/js/internal/core/utils.mjs +11 -1
  215. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  216. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +3 -3
  217. package/dist/js/modular.mjs +76 -75
  218. package/dist/types/behaviors/bottomSheets.d.ts +5 -3
  219. package/dist/types/behaviors/dataTables.d.ts +2 -6
  220. package/dist/types/behaviors/forms.d.ts +7 -7
  221. package/dist/types/behaviors/imageCompare.d.ts +2 -1
  222. package/dist/types/behaviors/transferList.d.ts +2 -0
  223. package/dist/types/components/autocomplete.d.ts +14 -3
  224. package/dist/types/components/carousel.d.ts +7 -0
  225. package/dist/types/components/chips.d.ts +15 -0
  226. package/dist/types/components/colorPicker.d.ts +14 -0
  227. package/dist/types/components/currencyInput.d.ts +5 -4
  228. package/dist/types/components/datepicker.d.ts +54 -27
  229. package/dist/types/components/funnelChart.d.ts +1 -4
  230. package/dist/types/components/heatmapChart.d.ts +3 -0
  231. package/dist/types/components/hoverCard.d.ts +1 -0
  232. package/dist/types/components/inputMask.d.ts +0 -2
  233. package/dist/types/components/lineChart.d.ts +43 -5
  234. package/dist/types/components/mapView.d.ts +113 -11
  235. package/dist/types/components/menu.d.ts +14 -0
  236. package/dist/types/components/particles.d.ts +14 -1
  237. package/dist/types/components/pieChart.d.ts +1 -2
  238. package/dist/types/components/richTextEditor.d.ts +40 -9
  239. package/dist/types/components/select.d.ts +1 -3
  240. package/dist/types/components/showMore.d.ts +2 -0
  241. package/dist/types/components/slider.d.ts +0 -1
  242. package/dist/types/components/snackbar.d.ts +7 -1
  243. package/dist/types/components/tabs.d.ts +3 -3
  244. package/dist/types/components/timepicker.d.ts +15 -6
  245. package/dist/types/components/tooltip.d.ts +1 -1
  246. package/dist/types/components/treemapChart.d.ts +2 -2
  247. package/dist/types/core/component.d.ts +9 -3
  248. package/dist/types/core/imageURL.d.ts +2 -0
  249. package/dist/types/core/utils.d.ts +39 -1
  250. package/dist/types/modular.d.ts +1 -1
  251. package/dist/types/plugins/modalDisplayPlugin.d.ts +8 -1
  252. package/package.json +8 -6
  253. package/src/sass/abstracts/_mixins.scss +459 -59
  254. package/src/sass/abstracts/_variables.scss +25 -0
  255. package/src/sass/components/_accordion.scss +1 -3
  256. package/src/sass/components/_aura.scss +1 -0
  257. package/src/sass/components/_back-to-top.scss +3 -3
  258. package/src/sass/components/_bar-chart.scss +2 -83
  259. package/src/sass/components/_bottom-sheet.scss +7 -0
  260. package/src/sass/components/_breadcrumb.scss +1 -7
  261. package/src/sass/components/_button-groups.scss +15 -38
  262. package/src/sass/components/_buttons.scss +24 -74
  263. package/src/sass/components/_calendar.scss +1 -3
  264. package/src/sass/components/_carousel.scss +10 -10
  265. package/src/sass/components/_cascader.scss +3 -14
  266. package/src/sass/components/_column-chart.scss +1 -19
  267. package/src/sass/components/_confetti.scss +3 -4
  268. package/src/sass/components/_data-table.scss +10 -0
  269. package/src/sass/components/_dialog.scss +10 -18
  270. package/src/sass/components/_expanding-card.scss +1 -5
  271. package/src/sass/components/_fab-menu.scss +4 -12
  272. package/src/sass/components/_funnel-chart.scss +1 -62
  273. package/src/sass/components/_heatmap-chart.scss +2 -6
  274. package/src/sass/components/_icon-buttons.scss +1 -4
  275. package/src/sass/components/_line-chart.scss +2 -70
  276. package/src/sass/components/_map.scss +4 -0
  277. package/src/sass/components/_marquee.scss +3 -3
  278. package/src/sass/components/_mega-menu.scss +8 -17
  279. package/src/sass/components/_menu.scss +10 -11
  280. package/src/sass/components/_menubar.scss +1 -13
  281. package/src/sass/components/_mixed-chart.scss +1 -37
  282. package/src/sass/components/_navbar.scss +11 -16
  283. package/src/sass/components/_navigation-bar.scss +2 -5
  284. package/src/sass/components/_navigation-rail.scss +25 -15
  285. package/src/sass/components/_page-footer.scss +1 -3
  286. package/src/sass/components/_pagination.scss +3 -14
  287. package/src/sass/components/_panes.scss +3 -16
  288. package/src/sass/components/_particles.scss +3 -4
  289. package/src/sass/components/_pie-chart.scss +8 -70
  290. package/src/sass/components/_progress.scss +31 -13
  291. package/src/sass/components/_radar-chart.scss +2 -32
  292. package/src/sass/components/_radial-chart.scss +2 -48
  293. package/src/sass/components/_sankey-chart.scss +5 -28
  294. package/src/sass/components/_scatter-chart.scss +2 -11
  295. package/src/sass/components/_search.scss +1 -4
  296. package/src/sass/components/_side-sheet.scss +9 -14
  297. package/src/sass/components/_skeleton.scss +24 -15
  298. package/src/sass/components/_snackbar.scss +11 -13
  299. package/src/sass/components/_table_of_contents.scss +1 -3
  300. package/src/sass/components/_tabs.scss +4 -20
  301. package/src/sass/components/_timepicker.scss +2 -1
  302. package/src/sass/components/_toolbar.scss +1 -4
  303. package/src/sass/components/_tooltip.scss +9 -5
  304. package/src/sass/components/_tree.scss +5 -17
  305. package/src/sass/components/_treemap-chart.scss +2 -26
  306. package/src/sass/components/forms/_checkboxes.scss +2 -21
  307. package/src/sass/components/forms/_drop-zone.scss +1 -4
  308. package/src/sass/components/forms/_fieldset.scss +1 -4
  309. package/src/sass/components/forms/_file-input.scss +6 -0
  310. package/src/sass/components/forms/_input-fields.scss +21 -4
  311. package/src/sass/components/forms/_radio-buttons.scss +2 -24
  312. package/src/sass/components/forms/_select.scss +6 -7
  313. package/src/sass/components/forms/_slider.scss +1 -4
  314. package/src/sass/components/forms/_switches.scss +14 -21
  315. package/src/sass/utilities/_helpers.scss +1 -1
  316. package/src/sass/utilities/_visibility.scss +1 -3
  317. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +0 -7
  318. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +0 -7
  319. package/dist/js/chunks/chunk-4IKVPCSU.mjs +0 -7
  320. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +0 -7
  321. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +0 -7
  322. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +0 -7
  323. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +0 -7
  324. package/dist/js/chunks/chunk-752ADW4M.mjs.map +0 -7
  325. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +0 -7
  326. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +0 -7
  327. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +0 -7
  328. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +0 -7
  329. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +0 -7
  330. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +0 -7
  331. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +0 -7
  332. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +0 -7
  333. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +0 -7
  334. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +0 -7
  335. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +0 -7
  336. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +0 -7
  337. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +0 -7
  338. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +0 -7
  339. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +0 -7
  340. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +0 -7
  341. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +0 -7
  342. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +0 -7
  343. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +0 -7
  344. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +0 -7
  345. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +0 -7
  346. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +0 -7
  347. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +0 -7
  348. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +0 -7
  349. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +0 -7
  350. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +0 -7
  351. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +0 -7
  352. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +0 -7
  353. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +0 -7
  354. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +0 -7
  355. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +0 -7
  356. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +0 -7
  357. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +0 -7
  358. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +0 -7
  359. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +0 -7
  360. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +0 -7
  361. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +0 -7
  362. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +0 -7
  363. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +0 -7
  364. /package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs.map → chunk-3KF65KGL.mjs.map} +0 -0
  365. /package/dist/js/chunks/{chunk-75E5EDJF.mjs.map → chunk-3XORNED5.mjs.map} +0 -0
  366. /package/dist/js/chunks/{chunk-NNHVANQA.mjs.map → chunk-4WBGAQN3.mjs.map} +0 -0
  367. /package/dist/js/chunks/{chunk-ZJNLAGY5.mjs.map → chunk-5F4URJHL.mjs.map} +0 -0
  368. /package/dist/js/chunks/{chunk-GVZQH2H5.mjs.map → chunk-AEG6LOAJ.mjs.map} +0 -0
  369. /package/dist/js/chunks/{chunk-AI73GJKG.mjs.map → chunk-BB5VXYXT.mjs.map} +0 -0
  370. /package/dist/js/chunks/{chunk-2RLBDFH4.mjs.map → chunk-BDATLH3H.mjs.map} +0 -0
  371. /package/dist/js/chunks/{chunk-ZKWUWBUB.mjs.map → chunk-CY2CTOVM.mjs.map} +0 -0
  372. /package/dist/js/chunks/{chunk-67ZPPKXS.mjs.map → chunk-FNIIH2LU.mjs.map} +0 -0
  373. /package/dist/js/chunks/{chunk-T3BNSRP3.mjs.map → chunk-HQRLBTNM.mjs.map} +0 -0
  374. /package/dist/js/chunks/{chunk-NAC72P7R.mjs.map → chunk-I2F7MLUU.mjs.map} +0 -0
  375. /package/dist/js/chunks/{chunk-ANKFWNWT.mjs.map → chunk-LC4O5LFS.mjs.map} +0 -0
  376. /package/dist/js/chunks/{chunk-4PIXLDNJ.mjs.map → chunk-LEF33SCP.mjs.map} +0 -0
  377. /package/dist/js/chunks/{chunk-ILDRRG7T.mjs.map → chunk-LFORZRPH.mjs.map} +0 -0
  378. /package/dist/js/chunks/{chunk-4EWGD4V2.mjs.map → chunk-NODZ5VAD.mjs.map} +0 -0
  379. /package/dist/js/chunks/{chunk-NVQ5EHCU.mjs.map → chunk-QNODAANY.mjs.map} +0 -0
  380. /package/dist/js/chunks/{chunk-ROH2HDB4.mjs.map → chunk-RUDYMEJ3.mjs.map} +0 -0
  381. /package/dist/js/chunks/{chunk-TFABTUAZ.mjs.map → chunk-T4MOBP3J.mjs.map} +0 -0
  382. /package/dist/js/chunks/{chunk-GCWWEZKO.mjs.map → chunk-TM7HPGTV.mjs.map} +0 -0
  383. /package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs.map → chunk-TVSX5YA2.mjs.map} +0 -0
  384. /package/dist/js/chunks/{chunk-JUKBBN6P.mjs.map → chunk-YLZOJLDI.mjs.map} +0 -0
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
+ numberValue,
6
7
  svgNode
7
- } from "./chunk-ZVLOUDIJ.mjs";
8
+ } from "./chunk-67UNY7RH.mjs";
8
9
 
9
10
  // src/ts/components/lineChart.ts
10
11
  var _defaults = {
@@ -13,6 +14,7 @@ var _defaults = {
13
14
  watch: false
14
15
  };
15
16
  var COLORS = 4;
17
+ var ROW_COLORS = 6;
16
18
  var LABEL_GAP = 4;
17
19
  function labelBoxes(items, rtl) {
18
20
  const range = document.createRange();
@@ -71,7 +73,27 @@ function polarPoint(turn, r) {
71
73
  const angle = turn * 2 * Math.PI;
72
74
  return `${(r * Math.sin(angle)).toFixed(3)},${(-r * Math.cos(angle)).toFixed(3)}`;
73
75
  }
74
- var seriesColor = (i) => String(i % COLORS + 1);
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
+ }
75
97
  var _gradientId = 0;
76
98
  var startsFrom = (series) => matchMedia("(prefers-reduced-motion: reduce)").matches ? [] : series;
77
99
  var splines = (easing) => /cubic-bezier\(([^)]*)\)/.exec(easing)?.[1] ?? "0.2, 0, 0, 1";
@@ -89,9 +111,9 @@ var buttons = (nodes) => nodes.flatMap((node) => Array.from(node.querySelectorAl
89
111
  var drawable = (series) => series.values.some((value) => value !== null);
90
112
  var NICE = [1, 2, 2.5, 5, 10];
91
113
  function niceStep(span, parts = 4) {
92
- const raw = span / parts || 1;
114
+ const raw = Math.abs(span) / parts || 1;
93
115
  const power = 10 ** Math.floor(Math.log10(raw));
94
- return power * NICE.find((multiple) => multiple * power >= raw * (1 - 1e-9));
116
+ return power * (NICE.find((multiple) => multiple * power >= raw * (1 - 1e-9)) ?? 10);
95
117
  }
96
118
  function steps(low, high, step) {
97
119
  const values = [];
@@ -103,16 +125,36 @@ function steps(low, high, step) {
103
125
  function numberFormat(el, options) {
104
126
  return new Intl.NumberFormat(Utils.locale(el), options);
105
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
+ }
106
154
  function cellValue(cell) {
107
155
  if (!cell) return null;
108
156
  return numberValue(cell.dataset.value ?? cell.textContent);
109
157
  }
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
158
  function tickText(format, tick, [prefix, suffix]) {
117
159
  return format.format(tick).replace(/^[-\u2212]?/, (sign) => sign + prefix) + suffix;
118
160
  }
@@ -195,6 +237,7 @@ var LineChart = class extends Component {
195
237
  this.show(-1);
196
238
  };
197
239
  this._onKeyDown = (e) => {
240
+ if (!Utils.plainKey(e)) return;
198
241
  const next = this._keyTarget(e.key);
199
242
  if (next === void 0) return;
200
243
  e.preventDefault();
@@ -338,6 +381,7 @@ var LineChart = class extends Component {
338
381
  const title = document.createElement("strong");
339
382
  title.textContent = this.labels[index];
340
383
  this._tooltip.replaceChildren(title);
384
+ let share = this._share(index);
341
385
  this.series.forEach((series) => {
342
386
  const value = series.values[index];
343
387
  if (value === null) return;
@@ -354,7 +398,8 @@ var LineChart = class extends Component {
354
398
  name.dataset.series = color;
355
399
  name.textContent = series.name;
356
400
  const text = document.createElement("span");
357
- text.textContent = series.text[index];
401
+ text.textContent = withShare(series.text[index], share);
402
+ share = void 0;
358
403
  this._tooltip.append(name, text);
359
404
  });
360
405
  this._place(index);
@@ -371,7 +416,10 @@ var LineChart = class extends Component {
371
416
  }
372
417
  _read() {
373
418
  const table = this.el.querySelector(":scope > table");
374
- if (!table) return;
419
+ if (!table) {
420
+ [this._header, this._rows, this.labels, this.series, this._all] = [[], [], [], [], []];
421
+ return;
422
+ }
375
423
  const headerRow = table.tHead?.rows[0] ?? table.rows[0];
376
424
  const header = Array.from(headerRow?.cells ?? []);
377
425
  const rows = Array.from(table.tBodies).flatMap((body) => Array.from(body.rows)).filter((row) => row !== headerRow);
@@ -548,26 +596,15 @@ var LineChart = class extends Component {
548
596
  */
549
597
  _axes() {
550
598
  if (!this._axis) return [];
551
- const isEnd = (series) => series.className.split(/\s+/).includes("end");
599
+ const isEnd = (series) => hasClass(series, "end");
552
600
  const start = this.series.find((series) => !isEnd(series)) ?? this.series[0];
553
601
  const end = this.series.find((series) => series.y !== start.y);
554
602
  return [start, end].filter(Boolean).map((series, i) => this._valueAxis(series, i > 0));
555
603
  }
556
604
  /** One scale's labels, each placed by --at, its value's distance down the plot. */
557
605
  _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;
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);
571
608
  }
572
609
  /**
573
610
  * The series legend, for more than one series. With .toggle each item is
@@ -606,6 +643,17 @@ var LineChart = class extends Component {
606
643
  }
607
644
  /** Draws the series, which fill the plot. */
608
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) {
609
657
  const svg = svgNode("svg", {
610
658
  viewBox: "0 0 100 100",
611
659
  preserveAspectRatio: "none",
@@ -648,12 +696,7 @@ var LineChart = class extends Component {
648
696
  * data breaks it into runs.
649
697
  */
650
698
  _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);
699
+ const filled = splitRuns(series.tops).filter((run) => run.length);
657
700
  const points = (run, y) => run.map((index) => [this._x(index), y(index)]);
658
701
  const curve = this.el.classList.contains("straight") ? straightPath : monotonePath;
659
702
  const tops = filled.map((run) => curve(points(run, top)));
@@ -728,19 +771,27 @@ LineChart.key = "Expressive_LineChart";
728
771
 
729
772
  export {
730
773
  COLORS,
774
+ ROW_COLORS,
731
775
  rowLegend,
732
776
  polarPoint,
733
777
  seriesColor,
778
+ splitRuns,
779
+ tickAxis,
734
780
  pace,
735
781
  morph,
736
782
  niceStep,
737
783
  steps,
738
784
  numberFormat,
785
+ tickFormat,
786
+ percentLabel,
787
+ hasClass,
788
+ tintTooltip,
789
+ textSpan,
790
+ linearKey,
739
791
  cellValue,
740
- numberValue,
741
792
  tickText,
742
793
  signs,
743
794
  affix,
744
795
  LineChart
745
796
  };
746
- //# sourceMappingURL=chunk-ZM3XBHWV.mjs.map
797
+ //# sourceMappingURL=chunk-IQOTGGHX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/lineChart.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, numberValue, svgNode } from '../core/utils';\n\nexport interface LineChartOptions extends BaseOptions {\n /**\n * Lowest value on the y axis. Defaults to the data minimum less 10% of\n * the range; a stacked chart starts at zero or its lowest total, and a\n * column chart always includes zero. Overridden by `data-min` on the chart.\n */\n min: number | null;\n /**\n * Highest value on the y axis. Defaults to the data maximum plus 10% of\n * the range. Overridden by `data-max` on the chart.\n */\n max: number | null;\n /**\n * Redraws the chart whenever its table changes, once for the edits a\n * script makes in one run, so page script need not call `update()`.\n * `data-watch` on the chart turns it on too. Read when the chart starts.\n */\n watch: boolean;\n}\n\nconst _defaults: LineChartOptions = {\n min: null,\n max: null,\n watch: false\n};\n\nexport const COLORS = 4;\n/** Charts that color each row, not each series, cycle through six colors. */\nexport const ROW_COLORS = 6;\n\n/** The least space between two row labels. */\nconst LABEL_GAP = 4;\n\n/** A label's text width, and where the column it labels starts and ends. */\ninterface LabelBox {\n width: number;\n start: number;\n end: number;\n}\n\n/** Measures each label along the inline axis, which runs leftward in a right-to-left chart. */\nfunction labelBoxes(items: Element[], rtl: boolean): LabelBox[] {\n const range = document.createRange();\n return items.map((item) => {\n range.selectNodeContents(item);\n const width = range.getBoundingClientRect().width;\n const { left, right } = item.getBoundingClientRect();\n return rtl ? { width, start: -right, end: -left } : { width, start: left, end: right };\n });\n}\n\n/**\n * Where a kept label's text starts, as the CSS places it: the first and last\n * against the outer ends of their columns, the rest centred on theirs.\n */\nfunction labelStart(boxes: LabelBox[], index: number) {\n const box = boxes[index];\n if (index === 0) return box.start;\n if (index === boxes.length - 1) return box.end - box.width;\n return (box.start + box.end - box.width) / 2;\n}\n\n/** Whether keeping every stepth label leaves them apart and inside the chart. */\nfunction labelsFit(boxes: LabelBox[], step: number) {\n const edge = boxes[boxes.length - 1].end;\n let previous = -Infinity;\n for (let index = 0; index < boxes.length; index += step) {\n const start = labelStart(boxes, index);\n if (start < previous + LABEL_GAP || start + boxes[index].width > edge) return false;\n previous = start + boxes[index].width;\n }\n return true;\n}\n\n/**\n * How many columns apart the kept labels are: 1 when every label fits its\n * column, else the fewest that keeps them apart. When none does, 1 again,\n * and every label is cut to an ellipsis as before.\n */\nfunction labelStep(boxes: LabelBox[]) {\n if (boxes.every((box) => box.width + LABEL_GAP <= box.end - box.start)) return 1;\n for (let step = 2; step <= boxes.length; step++) {\n if (labelsFit(boxes, step)) return step;\n }\n return 1;\n}\n\n/**\n * Keeps every nth column label when they are wider than their columns, so a\n * narrow chart shows whole labels rather than cutting each to an ellipsis.\n * The container gets data-thinned and each hidden label data-skip.\n */\nfunction thinLabels(container: Element, items: Element[]) {\n const step = labelStep(labelBoxes(items, getComputedStyle(container).direction === 'rtl'));\n container.toggleAttribute('data-thinned', step > 1);\n items.forEach((item, index) => item.toggleAttribute('data-skip', index % step > 0));\n}\n\n/** Whether the changes reach the data: inside the table, or a table added or removed. */\nfunction tableChanged(records: MutationRecord[], el: Element) {\n const isTable = (node: Node) => node.nodeName === 'TABLE';\n return records.some((record) =>\n record.target !== el || [...record.addedNodes, ...record.removedNodes].some(isTable));\n}\n\n/**\n * The legend of a pie or radial chart: an item per row, colored as\n * `colors[i]` when that is set, holding a span for each of `rows[i]`.\n */\nexport function rowLegend(className: string, colors: (string | undefined)[], rows: string[][]): HTMLUListElement {\n const legend = document.createElement('ul');\n legend.className = className;\n legend.setAttribute('aria-hidden', 'true');\n legend.append(...rows.map((cells, i) => {\n const li = document.createElement('li');\n if (colors[i]) li.dataset.series = colors[i];\n li.append(...cells.map((content) => Object.assign(document.createElement('span'), { textContent: content })));\n return li;\n }));\n return legend;\n}\n\n/** A point at a turn clockwise from the top and a distance from the middle, as \"x,y\". */\nexport function polarPoint(turn: number, r: number): string {\n const angle = turn * 2 * Math.PI;\n return `${(r * Math.sin(angle)).toFixed(3)},${(-r * Math.cos(angle)).toFixed(3)}`;\n}\n\n/** A series' color number, for its `data-series`, from a palette of `colors`. */\nexport const seriesColor = (i: number, colors = COLORS) => String((i % colors) + 1);\n\n/** A value's tooltip text, with the row's share after it when there is one. */\nconst withShare = (text: string, share: string | undefined) => (share ? `${text} (${share})` : text);\n\n/** The rows of a series split at each null into runs of indexes, empty runs included. */\nexport function splitRuns(values: (number | null)[]) {\n const runs: number[][] = [[]];\n values.forEach((value, index) => (value === null ? runs.push([]) : runs[runs.length - 1].push(index)));\n return runs;\n}\n\n/** An axis of tick labels, each placed by --at, its distance along the plot. */\nexport function tickAxis(className: string, ticks: number[], text: (tick: number) => string, at: (tick: number) => number) {\n const axis = document.createElement('ol');\n axis.className = className;\n axis.setAttribute('aria-hidden', 'true');\n for (const tick of ticks) {\n const li = document.createElement('li');\n const label = document.createElement('span');\n label.textContent = text(tick);\n li.style.setProperty('--at', `${at(tick)}%`);\n li.append(label);\n axis.append(li);\n }\n return axis;\n}\nlet _gradientId = 0;\n\n/** The series update() moves the marks from: none when the reader asked for less motion. */\nconst startsFrom = (series: Series[]) =>\n matchMedia('(prefers-reduced-motion: reduce)').matches ? [] : series;\n\n/** A cubic-bezier() easing's four numbers, or the standard curve's for any other easing. */\nconst splines = (easing: string) => /cubic-bezier\\(([^)]*)\\)/.exec(easing)?.[1] ?? '0.2, 0, 0, 1';\n\n/**\n * The timing of the paths' motion after update(), from the chart's motion\n * tokens, as the columns' CSS transition reads them. Null for a zero\n * duration, which SVG would take as indefinite and hold the old shape.\n * ponytail: a curve that overshoots is not a valid SVG spline, so the\n * paths then skip their motion; a linear() token gets the standard curve.\n */\nexport function pace(el: Element) {\n const style = getComputedStyle(el);\n const dur = style.getPropertyValue('--md-sys-motion-duration-medium4').trim() || '400ms';\n return parseFloat(dur) > 0 ? { dur, keySplines: splines(style.getPropertyValue('--md-sys-motion-easing-standard')) } : null;\n}\n\n/**\n * Moves a path from the path data `from` to its own. SVG animation rather\n * than a CSS transition, since WebKit cannot transition the d property.\n */\nexport function morph(path: SVGElement, from: string, timing: Pace) {\n const to = path.getAttribute('d');\n if (from === to) return;\n path.append(svgNode('animate', { attributeName: 'd', from, to, ...timing, calcMode: 'spline', keyTimes: '0;1', fill: 'remove' }));\n}\n\n/** The paths' motion timing. */\ntype Pace = NonNullable<ReturnType<typeof pace>>;\n\n/** A series' line, the fill under it and its dots, as path data. */\ninterface Shape {\n line: string;\n area: string;\n dots: string;\n}\n\n/** A row's distance down the plot, in percent. */\ntype RowY = (index: number) => number;\n\n/** The buttons in a chart's generated parts, such as a .toggle legend's. */\nconst buttons = (nodes: Element[]) => nodes.flatMap((node) => Array.from(node.querySelectorAll('button')));\n\n/**\n * Whether a series has data. Its values, not its tops: stacked over another\n * series' gaps a series can have no top, yet still draws once that one hides.\n */\nconst drawable = (series: Series) => series.values.some((value) => value !== null);\n\n/** Axis steps, as multiples of a power of ten. */\nconst NICE = [1, 2, 2.5, 5, 10];\n\n/** A round step that cuts `span` into at most `parts` pieces. A reversed span, as an author's `data-min` above the data gives, is measured by its size. */\nexport function niceStep(span: number, parts = 4) {\n const raw = Math.abs(span) / parts || 1;\n const power = 10 ** Math.floor(Math.log10(raw));\n return power * (NICE.find((multiple) => multiple * power >= raw * (1 - 1e-9)) ?? 10);\n}\n\n/** The multiples of `step` from `low` to `high`, without float error. */\nexport function steps(low: number, high: number, step: number) {\n const values: number[] = [];\n for (let i = Math.ceil(low / step - 1e-9); i * step <= high + step * 1e-9; i++) {\n values.push(Number((i * step).toPrecision(12)));\n }\n return values;\n}\n\n/** A number format in the element's language, or the browser's for an invalid lang attribute. */\nexport function numberFormat(el: Element, options: Intl.NumberFormatOptions) {\n return new Intl.NumberFormat(Utils.locale(el), options);\n}\n\n/**\n * A compact format that gives each tick its own label: three significant\n * digits, or more when two ticks would read the same, as 10,050 and 10,100\n * both do at \"10.1K\". 21 is the most Intl allows.\n */\nexport function tickFormat(el: Element, ticks: number[]) {\n for (let digits = 3; ; digits++) {\n const format = numberFormat(el, { notation: 'compact', maximumSignificantDigits: digits });\n if (digits === 21 || new Set(ticks.map((tick) => format.format(tick))).size === ticks.length) return format;\n }\n}\n\n/**\n * A share of a whole as a percentage: whole numbers, with a tenth below 10%\n * so a small part is not 0%. A chart that writes many keeps `formats` and\n * clears it when the language may have changed.\n */\nexport function percentLabel(el: Element, share: number, formats: Intl.NumberFormat[] = []) {\n const digits = share < 0.1 ? 1 : 0;\n formats[digits] ??= numberFormat(el, { style: 'percent', maximumFractionDigits: digits });\n return formats[digits].format(share);\n}\n\n/** Whether a series header cell has a class. */\nexport const hasClass = (series: Series, name: string) => series.className.split(/\\s+/).includes(name);\n\n/** Colors the tooltip's swatches like a mark; no color leaves the default. */\nexport function tintTooltip(tooltip: HTMLElement, color?: string) {\n tooltip.querySelectorAll<HTMLElement>('[data-series]').forEach((span) => {\n if (color) span.dataset.series = color;\n else delete span.dataset.series;\n });\n}\n\n/** A span holding `text`. */\nexport const textSpan = (text: string) => Object.assign(document.createElement('span'), { textContent: text });\n\nconst ARROW_STEPS: Record<string, number> = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n\n/**\n * The mark a key moves to among marks `0` to `last` in table order, from\n * `active`. The arrows keep their meaning in a right-to-left chart, since\n * table order is no direction on screen. With nothing shown, Escape is left\n * to a dialog or sheet around the chart.\n */\nexport function linearKey(key: string, active: number, last: number): number | undefined {\n if (key === 'Escape') return active < 0 ? undefined : -1;\n const step = ARROW_STEPS[key];\n if (step) return Math.min(last, Math.max(0, active + step));\n return ({ Home: 0, End: last } as Record<string, number>)[key];\n}\n\n/** A y scale's ends, and with .axis the values its labels mark. */\nexport interface ChartScale {\n min: number;\n max: number;\n ticks: number[];\n}\n\nexport interface Series {\n name: string;\n /** Header cell classes, such as `dashed`. */\n className: string;\n /** The series' column in the table, from 1, which tells apart two of one name. */\n column: number;\n /** The `data-series` color number, by its column, so hiding a series shifts none. */\n color: string;\n /** Cell text, shown in the tooltip as the author formatted it. */\n text: string[];\n values: (number | null)[];\n /**\n * Where each value is drawn: the value, or in a stacked chart the running\n * total, which is unknown (null) above a gap.\n */\n tops: (number | null)[];\n /** In a stacked chart, the total of the series below, which this area fills down to. */\n base?: (number | null)[];\n /** The series' y scale: a value's distance down the plot, in percent. */\n y: (value: number) => number;\n scale: ChartScale;\n /**\n * The currency, percent or spacing around the first number written as\n * cell text, such as ['$', ''], which the axis labels repeat.\n */\n affix: [string, string];\n}\n\n/**\n * Reads a cell as a number. `data-value` wins over the text, which may carry\n * currency or percent signs, grouping commas and a typographic minus around\n * one number. Anything else, such as \"(1,200)\" or \"3\u20135\", is a gap rather\n * than a guess.\n */\nexport function cellValue(cell: Element | undefined): number | null {\n if (!cell) return null;\n return numberValue((cell as HTMLElement).dataset.value ?? cell.textContent);\n}\n\n/** An axis label: the tick in `format`, with the column's signs after any minus. */\nexport function tickText(format: Intl.NumberFormat, tick: number, [prefix, suffix]: [string, string]) {\n return format.format(tick).replace(/^[-\\u2212]?/, (sign) => sign + prefix) + suffix;\n}\n\n/** The currency, percent and spacing around a cell's number, as [prefix, suffix]. */\nexport function signs(text: string): [string, string] {\n // Each end is read from its own side, so a long run of spaces stays linear.\n const prefix = /^[\\s\\p{Sc}]*/u.exec(text)![0];\n const end = (chars: string) => [...chars].reverse().join('');\n return [prefix, end(/^[\\s%\\p{Sc}]*/u.exec(end(text.slice(prefix.length)))![0])];\n}\n\n/** The signs around the first value a column spells out in its text. */\nexport function affix(cells: (Element | undefined)[]): [string, string] {\n const cell = cells.find((each) => !(each as HTMLElement)?.dataset.value && cellValue(each) !== null);\n return signs(cell?.textContent.trim() ?? '');\n}\n\n/** Straight lines through the points; one point is a dot. */\nfunction straightPath(points: [number, number][]): string {\n return `M${points.join('L')}${points.length > 1 ? '' : 'h0'}`;\n}\n\n/**\n * A monotone cubic through the points (Fritsch-Butland tangents), so the\n * curve never overshoots a data point. Bezier curves keep their shape under\n * the plot's non-uniform scaling, so this can be drawn in a 0-100 box.\n */\nfunction monotonePath(points: [number, number][]): string {\n const n = points.length;\n if (n === 0) return '';\n if (n === 1) return `M${points[0][0]},${points[0][1]}h0`;\n const slopes: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n slopes.push((points[i + 1][1] - points[i][1]) / (points[i + 1][0] - points[i][0]));\n }\n const tangents = points.map((_, i) => {\n if (i === 0) return slopes[0];\n if (i === n - 1) return slopes[n - 2];\n const [a, b] = [slopes[i - 1], slopes[i]];\n return a * b <= 0 ? 0 : 2 / (1 / a + 1 / b);\n });\n let d = `M${points[0][0]},${points[0][1]}`;\n for (let i = 0; i < n - 1; i++) {\n const [[x0, y0], [x1, y1]] = [points[i], points[i + 1]];\n const h = (x1 - x0) / 3;\n d += `C${x0 + h},${y0 + tangents[i] * h} ${x1 - h},${y1 - tangents[i + 1] * h} ${x1},${y1}`;\n }\n return d;\n}\n\n/**\n * Line chart. The data is the chart's <table>; this class draws it as an SVG\n * with x labels, a legend for more than one series, and a cursor and tooltip\n * that follow the pointer or the arrow keys. Styling is CSS.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class LineChart extends Component<LineChartOptions> {\n /** The values' x positions and series, read from the table. */\n labels: string[] = [];\n series: Series[] = [];\n /** The highlighted row, or -1. */\n activeIndex = -1;\n private _generated: Element[] = [];\n /** Watches the row labels' width, to thin them on a narrow chart. */\n private _labelSizes: ResizeObserver | null = null;\n /** With `watch`, redraws the chart when its table changes. */\n private _tableWatch: MutationObserver | null = null;\n /** Every series in the table, shown or not, as the legend lists them. */\n protected _all: Series[] = [];\n /**\n * During update(), the series drawn before it, which the new marks move\n * from. Empty otherwise, and when the reader prefers less motion.\n */\n protected _before: Series[] = [];\n /** The columns of the series a .toggle legend hid, kept through update(). */\n private _hidden = new Set<number>();\n /** The table's header cells and body rows, as read. */\n protected _header: HTMLTableCellElement[] = [];\n protected _rows: HTMLTableRowElement[] = [];\n protected _plot: HTMLElement;\n protected _cursor: HTMLElement;\n protected _tooltip: HTMLElement;\n protected _y: (value: number) => number;\n /**\n * Whether the rows run right to left: a horizontal row axis in a\n * right-to-left context, like the labels. Bar chart rows keep their order.\n */\n protected _reversed = false;\n\n /** The class prefix of the generated parts; ColumnChart reuses this class. */\n protected get _type() {\n return 'line-chart';\n }\n\n /** The column the series start at; a scatter chart's first value column is its x axis. */\n protected get _seriesFrom() {\n return 1;\n }\n\n /** The column the series end before, as slice() takes it; a bubble chart's last column holds sizes. */\n protected get _seriesTo(): number | undefined {\n return undefined;\n }\n\n /** Whether the y axis always includes zero, as columns grow from it. */\n protected get _fromZero() {\n return false;\n }\n\n /**\n * Whether the rows run down the plot and the values across it, as in a\n * bar chart. The rows then keep their order in a right-to-left context.\n */\n protected get _horizontal() {\n return false;\n }\n\n /**\n * Whether the rows go round a circle, as in a pie or radar chart. The\n * arrows then step round it, wrapping from the last row to the first.\n */\n protected get _circular() {\n return false;\n }\n\n /** Whether .axis labels the value scale, which a sparkline never does. */\n protected get _axis() {\n return this.el.classList.contains('axis') && !this.el.classList.contains('sparkline');\n }\n\n /** Whether the cursor marks each series with a point. */\n protected get _points() {\n return true;\n }\n\n /** How many rows `show()` can highlight. */\n protected get _count() {\n return this.labels.length;\n }\n\n constructor(el: HTMLElement, options: Partial<LineChartOptions>) {\n super(el, options);\n\n this._build();\n this._listen();\n if (this.options.watch || this.el.hasAttribute('data-watch')) {\n this._tableWatch = new MutationObserver((records) => tableChanged(records, this.el) && this.update());\n }\n this._watch();\n }\n\n /**\n * Observes the table as it is now, and the chart for a table added or\n * replaced. Reconnecting drops the changes already queued, which the\n * caller has just drawn.\n */\n private _watch() {\n if (!this._tableWatch) return;\n this._tableWatch.disconnect();\n this._tableWatch.observe(this.el, { childList: true });\n const table = this.el.querySelector(':scope > table');\n if (table) {\n this._tableWatch.observe(table, {\n subtree: true,\n childList: true,\n characterData: true,\n attributeFilter: ['data-value', 'class', 'data-label']\n });\n }\n }\n\n /** Reads the table and draws it, when it has data. */\n private _build() {\n this._read();\n if (!this.labels.length || !this.series.length) return;\n this._reversed = !this._horizontal && getComputedStyle(this.el).direction === 'rtl';\n this._render();\n }\n\n /** Whether the pointer and keys pick rows, which a sparkline's do not. */\n private get _interactive() {\n return !this.el.classList.contains('sparkline');\n }\n\n /** Lets the pointer and keys pick rows on the plot. */\n private _listen() {\n if (this._plot && this._interactive) {\n // A tap has no move before it, so the press picks the row too.\n this._plot.addEventListener('pointerdown', this._onPointerMove);\n this._plot.addEventListener('pointermove', this._onPointerMove);\n this._plot.addEventListener('pointerleave', this._onLeave);\n this._plot.addEventListener('pointercancel', this._onCancel);\n this._plot.addEventListener('keydown', this._onKeyDown);\n this._plot.addEventListener('focus', this._onFocus);\n this._plot.addEventListener('blur', this._onLeave);\n }\n }\n\n static get defaults(): LineChartOptions {\n return _defaults;\n }\n\n static key = 'Expressive_LineChart';\n\n destroy() {\n // The listeners live on the plot, which goes with the generated nodes.\n this._generated.forEach((node) => node.remove());\n this._generated = [];\n this._labelSizes?.disconnect();\n this._tableWatch?.disconnect();\n super.destroy();\n }\n\n /**\n * Redraws the chart from its table as it is now. Focus stays on the chart,\n * on the same legend button when one had it, and the highlighted row stays\n * where the table still has it.\n */\n update() {\n if ((this.constructor as typeof LineChart).getInstance(this.el) !== this) return;\n const old = this._generated;\n // Inside a shadow root, the document's active element is the host.\n const active = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const [index, focused] = [this.activeIndex, old.some((node) => node.contains(active))];\n const button = buttons(old).indexOf(active as HTMLButtonElement);\n this._generated = [];\n this.activeIndex = -1;\n this._plot = this._cursor = this._tooltip = undefined;\n this._before = startsFrom(this.series);\n this._build();\n this._before = [];\n // Focus moves before the old plot goes, so a keyboard focus ring carries\n // over, and before the listeners, so focusing picks no row of its own.\n if (focused) (buttons(this._generated)[button] ?? this._plot)?.focus({ preventScroll: true });\n old.forEach((node) => node.remove());\n this._listen();\n this.show(Math.min(index, this._count - 1));\n this._watch();\n }\n\n /**\n * Highlights one row: moves the cursor and fills the tooltip.\n * Pass -1 to hide them. Does nothing for a chart without data.\n */\n show(index: number) {\n // Skipping a repeat also keeps the live tooltip from re-announcing.\n if (!this._tooltip || index === this.activeIndex) return;\n this.activeIndex = index;\n const hidden = index < 0 || index >= this.labels.length;\n this._cursor.hidden = this._tooltip.hidden = hidden;\n if (hidden) return;\n\n this._cursor.replaceChildren();\n const title = document.createElement('strong');\n title.textContent = this.labels[index];\n this._tooltip.replaceChildren(title);\n\n // The row's share goes after its first value only.\n let share = this._share(index);\n this.series.forEach((series) => {\n const value = series.values[index];\n if (value === null) return;\n const color = series.color;\n const top = series.tops[index];\n if (top !== null && this._points) {\n const dot = document.createElement('span');\n dot.className = series.className;\n dot.dataset.series = color;\n dot.style.top = `${series.y(top)}%`;\n this._cursor.append(dot);\n }\n const name = document.createElement('span');\n name.dataset.series = color;\n name.textContent = series.name;\n const text = document.createElement('span');\n text.textContent = withShare(series.text[index], share);\n share = undefined;\n this._tooltip.append(name, text);\n });\n this._place(index);\n }\n\n /**\n * Moves the filled cursor and tooltip to a row: beside its band, with the\n * tooltip opening back over the plot past the middle.\n */\n protected _place(index: number) {\n const x = this._x(index);\n const side = this._horizontal ? 'top' : 'left';\n this._cursor.style[side] = this._tooltip.style[side] = `${x}%`;\n this._tooltip.classList.toggle('end', x > 50);\n }\n\n protected _read() {\n const table = this.el.querySelector<HTMLTableElement>(':scope > table');\n if (!table) {\n // A removed table, as data-watch reports, leaves nothing to draw.\n [this._header, this._rows, this.labels, this.series, this._all] = [[], [], [], [], []];\n return;\n }\n // Without a <thead> the parser puts the header row in the first <tbody>.\n const headerRow = table.tHead?.rows[0] ?? table.rows[0];\n const header = Array.from(headerRow?.cells ?? []);\n const rows = Array.from(table.tBodies)\n .flatMap((body) => Array.from(body.rows))\n .filter((row) => row !== headerRow);\n [this._header, this._rows] = [header, rows];\n this.labels = rows.map((row) => row.cells[0]?.textContent.trim() ?? '');\n const from = this._seriesFrom;\n this.series = header.slice(from, this._seriesTo).map((cell, i) => {\n const values = rows.map((row) => cellValue(row.cells[i + from]));\n return {\n name: cell.textContent.trim(),\n className: cell.className,\n column: i + from,\n color: seriesColor(i),\n text: rows.map((row) => row.cells[i + from]?.textContent.trim() ?? ''),\n values,\n tops: values,\n y: undefined as Series['y'],\n scale: undefined as ChartScale,\n affix: affix(rows.map((row) => row.cells[i + from]))\n };\n });\n this._all = this.series;\n this.series = this._shown(this._all);\n const option = (name: 'min' | 'max') => this._number(name) ?? this.options[name];\n this._y = this._scale(this.series, option('min'), option('max'));\n }\n\n /**\n * The series to draw, arranged: those the legend has not hidden, or none\n * without data. When the ones shown hold no data, as after the table\n * changed, the hidden ones come back, so the legend never hides the only\n * data there is.\n */\n private _shown(all: Series[]): Series[] {\n const shown = all.filter((series) => !this._hidden.has(series.column));\n this._arrange(shown);\n if (shown.some(drawable)) return shown;\n if (!this._hidden.size) return [];\n this._hidden.clear();\n return this._shown(all);\n }\n\n /** Turns the values read into what is drawn: with .stacked, running totals. */\n protected _arrange(series: Series[]) {\n if (this.el.classList.contains('stacked')) this._stack(series);\n }\n\n /**\n * Stacks each series on the ones before it: its tops become running\n * totals and its base the total below. A gap leaves the total unknown, so\n * the series above break there too.\n */\n protected _stack(series: Series[]) {\n // ponytail: negative values overlap the band below; diverging stacks if needed.\n const totals: (number | null)[] = this.labels.map(() => 0);\n for (const each of series) {\n each.base = [...totals];\n each.tops = each.values.map((value, i) =>\n (totals[i] = value === null || totals[i] === null ? null : totals[i] + value));\n }\n }\n\n /** A number from one of the chart's data attributes, or null. */\n protected _number(name: string) {\n const value = parseFloat(this.el.dataset[name] ?? '');\n return Number.isFinite(value) ? value : null;\n }\n\n /**\n * Fits a y scale to the series' tops, between `min` and `max` where they\n * are set, and gives it to each series.\n */\n protected _scale(series: Series[], min: number | null, max: number | null, fromZero = this._fromZero) {\n const fixed = [min !== null, max !== null] as const;\n const stacked = this.el.classList.contains('stacked');\n let [low, high] = [Infinity, -Infinity];\n // A base below zero, such as a range's low end, needs room on the scale too.\n for (const { tops, base = [] } of series) {\n for (const value of [...tops, ...base]) {\n if (value === null) continue;\n low = Math.min(low, value);\n high = Math.max(high, value);\n }\n }\n if (low > high) low = high = 0;\n if (fromZero) {\n // Zero is on the scale, with 10% of the span to spare on each side\n // that has data.\n const [bottom, top] = [Math.min(0, low), Math.max(0, high)];\n const room = (top - (min ?? bottom)) * 0.1 || 1;\n min ??= bottom < 0 ? bottom - room : 0;\n max ??= top + room;\n } else {\n const pad = (high - low) * 0.1 || 1;\n // Stacked areas are read against zero, with the headroom of that span.\n min ??= stacked ? Math.min(0, low) : low - pad;\n max ??= high + (stacked ? (high - min) * 0.1 || 1 : pad);\n }\n return this._apply(series, this._fit(min, max, fixed));\n }\n\n /**\n * With .axis, widens each end the chart chose to a round step and lists\n * the steps for the labels. An end set by the author stays where it is.\n */\n protected _fit(min: number, max: number, [fixedMin, fixedMax]: readonly boolean[]): ChartScale {\n if (!this._axis) return { min, max, ticks: [] };\n const step = niceStep(max - min);\n const low = fixedMin ? min : Math.floor(min / step + 1e-9) * step;\n const high = fixedMax ? max : Math.ceil(max / step - 1e-9) * step;\n return { min: low, max: high, ticks: steps(low, high, step) };\n }\n\n /** Gives the series a scale and the y function it draws with. */\n protected _apply(series: Series[], scale: ChartScale) {\n const y = (value: number) => 100 - ((value - scale.min) / (scale.max - scale.min || 1)) * 100;\n for (const each of series) Object.assign(each, { y, scale });\n return y;\n }\n\n /** Each row sits in the middle of an equal band, beside its label. */\n private _x(index: number) {\n const x = ((index + 0.5) / this.labels.length) * 100;\n return this._reversed ? 100 - x : x;\n }\n\n private _render() {\n const type = this._type;\n this._plot = document.createElement('div');\n this._plot.className = `${type}-plot`;\n const caption = this.el.querySelector(':scope > figcaption')?.textContent.trim();\n this._plot.setAttribute('role', 'group');\n this._plot.setAttribute('aria-roledescription', type.replace(/-/g, ' '));\n if (caption) this._plot.setAttribute('aria-label', caption);\n if (this._interactive) this._plot.tabIndex = 0;\n\n this._cursor = document.createElement('div');\n this._cursor.className = `${type}-cursor`;\n this._cursor.hidden = true;\n this._tooltip = document.createElement('div');\n this._tooltip.className = `${type}-tooltip`;\n this._tooltip.hidden = true;\n this._tooltip.setAttribute('aria-live', 'polite');\n this._plot.append(...this._axes(), this._draw(), this._cursor, this._tooltip);\n\n this._generated = [this._plot, ...this._guides()];\n this.el.append(...this._generated);\n }\n\n /**\n * The <tfoot> row as a total to show over the plot, its value over its\n * label, or null without one.\n */\n protected _total(className: string): HTMLElement | null {\n const footer = this.el.querySelector<HTMLTableElement>(':scope > table')?.tFoot?.rows[0];\n if (!footer) return null;\n const total = document.createElement('div');\n total.className = className;\n const [label, value] = [document.createElement('span'), document.createElement('strong')];\n label.textContent = footer.cells[0]?.textContent.trim() ?? '';\n value.textContent = footer.cells[1]?.textContent.trim() ?? '';\n total.append(value, label);\n return total;\n }\n\n /** The parts below the plot: the row labels and the legend. */\n protected _guides(): Element[] {\n const labels = document.createElement('ol');\n labels.className = `${this._type}-labels`;\n labels.setAttribute('aria-hidden', 'true');\n // A loop rather than a spread: a spread of every row overflows the stack.\n for (const text of this.labels) {\n const li = document.createElement('li');\n // In a span, so a kept label can overflow its column centred.\n li.append(document.createElement('span'));\n li.firstChild.textContent = text;\n labels.append(li);\n }\n this._observeLabels(labels, Array.from(labels.children));\n return [labels, ...this._legend()];\n }\n\n /**\n * Thins the column labels in container whenever its width changes. A bar\n * chart's labels run down instead, and no labels leaves nothing to watch.\n */\n protected _observeLabels(container: HTMLElement, items: Element[]) {\n this._labelSizes?.disconnect();\n if (this._horizontal || !items.length) return;\n this._labelSizes = new ResizeObserver(() => thinLabels(container, items));\n this._labelSizes.observe(container);\n }\n\n /**\n * With .axis, the value labels, behind the marks: the start scale's with\n * a grid line at each, and a mixed chart's end scale on the far side.\n */\n protected _axes(): Element[] {\n if (!this._axis) return [];\n const isEnd = (series: Series) => hasClass(series, 'end');\n const start = this.series.find((series) => !isEnd(series)) ?? this.series[0];\n const end = this.series.find((series) => series.y !== start.y);\n return [start, end].filter(Boolean).map((series, i) => this._valueAxis(series!, i > 0));\n }\n\n /** One scale's labels, each placed by --at, its value's distance down the plot. */\n private _valueAxis(series: Series, end: boolean) {\n const number = tickFormat(this.el, series.scale.ticks);\n return tickAxis(`${this._type}-axis${end ? ' end' : ''}`, series.scale.ticks, (tick) => tickText(number, tick, series.affix), series.y);\n }\n\n /**\n * The series legend, for more than one series. With .toggle each item is\n * a button that shows or hides its series, and the scale refits.\n */\n protected _legend(): Element[] {\n if (this._all.length < 2) return [];\n const toggle = this.el.classList.contains('toggle');\n const legend = document.createElement('ul');\n legend.className = `${this._type}-legend`;\n if (!toggle) legend.setAttribute('aria-hidden', 'true');\n legend.append(...this._all.map((series) => {\n const li = document.createElement('li');\n li.dataset.series = series.color;\n li.append(toggle ? this._toggle(series) : series.name);\n return li;\n }));\n return [legend];\n }\n\n /** A button that shows or hides a series, though never the last one shown. */\n private _toggle(series: Series) {\n const button = document.createElement('button');\n const shown = this.series.includes(series);\n button.type = 'button';\n button.className = 'chart-toggle';\n button.textContent = series.name;\n button.setAttribute('aria-pressed', String(shown));\n // The last series shown with data stays, so the chart never empties.\n if (shown && drawable(series) && this.series.filter(drawable).length < 2) button.setAttribute('aria-disabled', 'true');\n button.addEventListener('click', () => {\n if (button.hasAttribute('aria-disabled')) return;\n if (shown) this._hidden.add(series.column);\n else this._hidden.delete(series.column);\n this.update();\n });\n return button;\n }\n\n /** Draws the series, which fill the plot. */\n protected _draw(drawn = this.series): Element {\n return this._drawLines(drawn);\n }\n\n /**\n * A row's share of the whole, written after its first value in the\n * tooltip, or undefined. Pie, funnel and treemap charts give one.\n */\n protected _share(_index: number): string | undefined {\n return undefined;\n }\n\n /** The series as lines and areas, which a chart that overrides _draw can still call. */\n protected _drawLines(drawn = this.series): Element {\n const svg = svgNode('svg', {\n viewBox: '0 0 100 100',\n preserveAspectRatio: 'none',\n 'aria-hidden': 'true',\n focusable: 'false'\n });\n const timing = this._before.length ? pace(this.el) : null;\n const starts = timing ? this._starts(drawn) : [];\n svg.append(...drawn.map((series, i) => this._line(series, starts[i], timing)));\n return svg;\n }\n\n /**\n * After update(), the shape each series moves from: where it was drawn,\n * and for a row it had no value at, its base. That is the plot bottom,\n * or in a stack where the series below starts, so the stack stays joined.\n */\n private _starts(drawn: Series[]): Shape[] {\n let below: RowY | undefined;\n return drawn.map((series) => {\n const base: RowY = !series.base ? () => 100 : below ?? this._baseY(series);\n below = this._was(series, base);\n return this._shape(series, below, base);\n });\n }\n\n /** Where a series drew each row before update(), or its base for a row it had no value at. */\n private _was(series: Series, base: RowY): RowY {\n const old = this._before.find((each) => each.column === series.column);\n return (index) => {\n const top = old?.tops[index] ?? null;\n return top === null ? base(index) : old!.y(top);\n };\n }\n\n /** Where a stacked area's base runs: the series below, or the plot bottom when zero is off the scale. */\n private _baseY(series: Series): RowY {\n return (index) => Math.min(100, series.y(series.base![index]!));\n }\n\n /**\n * A series' paths, with its rows at `top` and a stacked area's base at\n * `base`. The line is smooth, or with .straight straight, and a gap in the\n * data breaks it into runs.\n */\n private _shape(series: Series, top: RowY, base: RowY): Shape {\n const filled = splitRuns(series.tops).filter((run) => run.length);\n const points = (run: number[], y: RowY) => run.map((index): [number, number] => [this._x(index), y(index)]);\n const curve = this.el.classList.contains('straight') ? straightPath : monotonePath;\n const tops = filled.map((run) => curve(points(run, top)));\n return {\n line: tops.join(''),\n // A stacked area runs back along the series below; the reversed curve\n // is the same curve.\n area: filled\n .map((run, r) => series.base\n ? `${tops[r]}L${curve(points(run, base).reverse()).slice(1)}Z`\n : `${tops[r]}V100H${this._x(run[0])}Z`)\n .join(''),\n // Round caps on zero-length lines, so CSS sizes the dots in pixels.\n dots: filled.flatMap((run) => points(run, top)).map(([x, y]) => `M${x},${y}h0`).join('')\n };\n }\n\n /**\n * One series' group: its line, the fill under it, and with .points a dot\n * at each value. After update() each path moves from its `from` shape.\n */\n private _line(series: Series, from?: Shape, timing?: Pace | null) {\n const group = svgNode('g', {\n class: `${this._type}-series ${series.className}`.trim(),\n 'data-series': series.color\n });\n const shape = this._shape(series, (index) => series.y(series.tops[index]!), this._baseY(series));\n\n const id = `line-chart-gradient-${++_gradientId}`;\n const gradient = svgNode('linearGradient', { id, x2: '0', y2: '1' });\n gradient.append(svgNode('stop'), svgNode('stop', { offset: '1' }));\n\n const path = (part: keyof Shape, name: string, attributes: Record<string, string> = {}) => {\n const node = svgNode('path', { class: `${this._type}-${name}`, d: shape[part], ...attributes });\n // A start shape comes with the timing it moves on.\n if (from) morph(node, from[part], timing!);\n return node;\n };\n group.append(gradient, path('area', 'area', { fill: `url(#${id})` }), path('line', 'line'));\n if (this.el.classList.contains('points')) group.append(path('dots', 'points'));\n return group;\n }\n\n private _onPointerMove = (e: PointerEvent) => {\n this.show(this._indexAt(e));\n };\n\n /** The row under the pointer, or -1. */\n protected _indexAt(e: PointerEvent) {\n const box = this._plot.getBoundingClientRect();\n const fraction = this._horizontal\n ? (e.clientY - box.top) / box.height\n : (e.clientX - box.left) / box.width;\n const index = Math.floor((this._reversed ? 1 - fraction : fraction) * this.labels.length);\n return Math.min(this.labels.length - 1, Math.max(0, index));\n }\n\n /**\n * For a circular chart, the pointer's position from the plot's middle: a\n * fraction of a turn clockwise from the top, and its distance as a share\n * of the plot's width.\n */\n protected _polarAt(e: PointerEvent): [turn: number, distance: number] {\n const box = this._plot.getBoundingClientRect();\n const [x, y] = [e.clientX - box.left - box.width / 2, e.clientY - box.top - box.height / 2];\n return [(Math.atan2(x, -y) / (2 * Math.PI) + 1) % 1, Math.hypot(x, y) / box.width];\n }\n\n /** The keys that move to the next row and to the one before. */\n protected get _arrows(): [string[], string[]] {\n // Round a circle both pairs work. The rows run clockwise in RTL too, so\n // right still moves the way the top row turns.\n if (this._circular) return [['ArrowRight', 'ArrowDown'], ['ArrowLeft', 'ArrowUp']];\n // Arrows move the cursor the way they point, so they swap in RTL.\n if (this._horizontal) return [['ArrowDown'], ['ArrowUp']];\n return this._reversed ? [['ArrowLeft'], ['ArrowRight']] : [['ArrowRight'], ['ArrowLeft']];\n }\n\n private _onFocus = () => {\n // Only keyboard focus picks the first row; a press off the marks, which\n // focuses the plot too, leaves the tooltip hidden.\n if (this.activeIndex < 0 && this._plot.matches(':focus-visible')) this.show(0);\n };\n\n private _onLeave = (e: Event) => {\n // A touch leaves as it lifts; the tapped row stays until the plot blurs.\n if ((e as PointerEvent).pointerType === 'touch' || this._plot.matches(':focus-visible')) return;\n this.show(-1);\n };\n\n /** The browser took the touch to scroll the page. */\n private _onCancel = () => {\n this.show(-1);\n };\n\n /** The index a key moves to, or undefined for a key the chart ignores. */\n protected _keyTarget(key: string): number | undefined {\n const last = this.labels.length - 1;\n const [forward, back] = this._arrows;\n const step = (by: number) => {\n if (!this._circular) return Math.min(last, Math.max(0, this.activeIndex + by));\n // Round a circle the ends meet; from no row, back starts at the last.\n if (this.activeIndex < 0) return by > 0 ? 0 : last;\n return (this.activeIndex + by + last + 1) % (last + 1);\n };\n // With nothing shown, Escape is left to a dialog or sheet around the chart.\n if (key === 'Escape') return this.activeIndex < 0 ? undefined : -1;\n return forward.includes(key) ? step(1)\n : back.includes(key) ? step(-1)\n : { Home: 0, End: last }[key];\n }\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (!Utils.plainKey(e)) return;\n const next = this._keyTarget(e.key);\n if (next === undefined) return;\n e.preventDefault();\n this.show(next);\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-ZVLOUDIJ.mjs";
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/components/keypad.ts
9
9
  var _defaults = {
@@ -31,7 +31,8 @@ var segmenter;
31
31
  function keyFor(e) {
32
32
  const key = e.target.closest?.("button");
33
33
  if (!key) return null;
34
- const keypad = key.closest(".keypad, .keyboard")?.["Expressive_Keypad"];
34
+ const host = key.closest(".keypad, .keyboard");
35
+ const keypad = host && Keypad.getInstance(host);
35
36
  if (keypad) return [keypad, key];
36
37
  const wrapper = key.dataset.key && key.closest(".field");
37
38
  if (!wrapper) return null;
@@ -221,4 +222,4 @@ Keypad.key = "Expressive_Keypad";
221
222
  export {
222
223
  Keypad
223
224
  };
224
- //# sourceMappingURL=chunk-QACZ6TUP.mjs.map
225
+ //# sourceMappingURL=chunk-JH3YWKA6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/keypad.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface KeypadOptions extends BaseOptions {\n /**\n * Called after every key press with the text typed ('7', 'A', ' ') or the\n * function key's name ('Backspace', 'Enter', 'Shift').\n * @default null\n */\n onKey: ((key: string) => void) | null;\n /** Text the keypad writes. */\n i18n: Partial<KeypadI18n>;\n}\n\nexport interface KeypadI18n {\n /**\n * The validation message for a field whose keypad-typed value is shorter\n * than its minlength, which the browser only checks after typing.\n */\n tooShort: (minLength: number) => string;\n}\n\nconst _defaults: KeypadOptions = {\n onKey: null,\n i18n: {\n tooShort: (minLength) => `Use at least ${minLength} characters.`\n }\n};\n\ntype Field = HTMLInputElement | HTMLTextAreaElement;\ntype Root = Document | ShadowRoot;\n\nconst isField = (el: unknown): el is Field => el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;\n\nconst instances = new Set<Keypad>();\n// Fields that have had focus, so their caret is one a person placed.\nconst touched = new WeakSet<Field>();\n// Fields a keypad typed into, with that keypad. A value set by script skips\n// minlength, so the keypad checks the length itself on every input.\nconst typed = new WeakMap<Field, Keypad>();\n// The too-short message a keypad set on a field, so it clears only that one.\nconst marked = new WeakMap<Field, string>();\n\n/** Sets the keypad's too-short message, unless the page set one; '' clears the keypad's own. */\nfunction markShort(field: Field, message: string) {\n if (!message) return unmark(field);\n if (field.validity.customError) return;\n field.setCustomValidity(message);\n marked.set(field, message);\n}\n\n/** Clears the keypad's message, unless the page has since put its own in its place. */\nconst unmark = (field: Field) => {\n if (marked.get(field) === field.validationMessage) field.setCustomValidity('');\n marked.delete(field);\n};\nlet segmenter: Intl.Segmenter | undefined;\n\n// One listener per document or shadow root serves every keypad in it, kept\n// while any keypad lives there. A key inside a keypad belongs to that keypad.\n// A `data-key` key inside a field's `.field` wrapper, such as a trailing\n// Backspace, belongs to the keypad that controls the field, found at press\n// time: a field rendered after init or a changed aria-controls still works,\n// and a press runs once however many keypads share the field. Other buttons\n// there, such as a password toggle, stay their own.\nfunction keyFor(e: Event): [Keypad, HTMLButtonElement] | null {\n const key = (e.target as Element).closest?.('button');\n if (!key) return null;\n const host = key.closest('.keypad, .keyboard');\n const keypad = host && Keypad.getInstance(host);\n if (keypad) return [keypad, key];\n const wrapper = key.dataset.key && key.closest('.field');\n if (!wrapper) return null;\n for (const other of instances) {\n const field = other.target;\n if (field && wrapper.contains(field)) return [other, key];\n }\n return null;\n}\n\nconst rootListeners: [string, EventListener][] = [\n // A pointer press on a key would move focus off the field and hide its\n // caret. Keep focus where it is while the field has it.\n ['mousedown', (e) => {\n const hit = keyFor(e);\n if (hit && hit[0]._root?.activeElement === hit[0].target) e.preventDefault();\n }],\n ['click', (e) => {\n const hit = keyFor(e);\n if (hit) hit[0]._press(hit[1]);\n }],\n ['focusin', (e) => {\n if (isField(e.target)) touched.add(e.target);\n }],\n ['input', (e) => {\n if (isField(e.target)) typed.get(e.target)?._checkLength(e.target);\n }],\n // A reset empties the fields, so the keypad's messages go with their values.\n ['reset', (e) => {\n for (const el of (e.target as HTMLFormElement).elements ?? []) if (isField(el)) unmark(el);\n }],\n // A hardware key held down in a field lights the keypad key it matches.\n ['keydown', (e) => light(e, true)],\n ['keyup', (e) => light(e, false)]\n];\nconst attachEvents = ['focusin', 'mousedown', 'click'];\n\n/** Lights or clears the key matching a hardware key; a release clears it wherever focus went. */\nfunction light(e: Event, on: boolean) {\n for (const keypad of instances) {\n if (!on || keypad.target === e.target) keypad._light((e as KeyboardEvent).key, on);\n }\n}\n\n/** Whether a button types its value or runs a function key; any other button is not a key. */\nconst isKey = (key: HTMLButtonElement) => !key.disabled && (!!key.dataset.key || key.hasAttribute('value'));\n\n/** Whether a keypad key is the one a hardware key names, by its function or, ignoring case, its value. */\nconst matches = (key: HTMLButtonElement, name: string) =>\n key.dataset.key === name || (key.hasAttribute('value') && key.value.toLowerCase() === name.toLowerCase());\n\n/**\n * Keypad and keyboard. A `.keypad` or `.keyboard` whose `aria-controls`\n * names a text field types into it: a key's `value` is inserted at the caret,\n * and `data-key=\"Backspace\"`, `\"Enter\"`, `\"Shift\"` and `\"CapsLock\"` edit,\n * submit and capitalize. A `data-key=\"Layer\"` key shows the elements whose\n * `data-layer` matches its `value` and hides the other layers. The field\n * receives the same `input` event typing would fire.\n */\nexport class Keypad extends Component<KeypadOptions> {\n /** @internal */\n _root: Root | null;\n /** Fields this keypad typed into, whose messages it clears on destroy. */\n private _fields = new Set<Field>();\n\n constructor(el: HTMLElement, options: Partial<KeypadOptions>) {\n super(el, options);\n this._root = null;\n instances.add(this);\n this._attach();\n }\n\n // Listen on the keypad's document (9) or shadow root (11). A keypad\n // initialized while detached has neither yet, so it waits on its own element\n // for the first focus or press after insertion. The root listeners added\n // then still hear that same event as it bubbles up.\n private _attach = () => {\n const root = this.el.getRootNode();\n const attached = root.nodeType === 9 || root.nodeType === 11;\n this._waitForInsertion(!attached);\n if (!attached) return;\n this._root = root as Root;\n this._listen('addEventListener');\n const active = this._root.activeElement;\n if (isField(active)) touched.add(active);\n };\n\n private _waitForInsertion(wait: boolean) {\n for (const type of attachEvents) this.el[wait ? 'addEventListener' : 'removeEventListener'](type, this._attach);\n }\n\n // Only the first keypad on a root adds the listeners, and only the last removes them.\n private _listen(method: 'addEventListener' | 'removeEventListener') {\n if (!this._root || this._shared()) return;\n for (const [type, listener] of rootListeners) this._root[method](type, listener);\n }\n\n static get defaults(): KeypadOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Keypad';\n\n destroy() {\n instances.delete(this);\n for (const field of this._fields) {\n unmark(field);\n if (typed.get(field) === this) typed.delete(field);\n }\n this._waitForInsertion(false);\n this._listen('removeEventListener');\n super.destroy();\n }\n\n /** The text field named by `aria-controls`, if there is one. */\n get target(): Field | null {\n const id = this.el.getAttribute('aria-controls');\n const field = id ? Utils.getElementById(this.el, id) : null;\n return isField(field) ? field : null;\n }\n\n // Whether another keypad already listens on this one's root.\n private _shared() {\n for (const other of instances) if (other !== this && other._root === this._root) return true;\n return false;\n }\n\n /** @internal */\n _press(key: HTMLButtonElement) {\n if (!isKey(key)) return;\n // Run the key first: an optional call skips its argument when there is no onKey.\n const pressed = this._act(key);\n this.options.onKey?.(pressed);\n }\n\n /** Runs a key and returns what onKey hears: the typed text or the function key's name. */\n private _act(key: HTMLButtonElement) {\n const name = key.dataset.key;\n if (name === 'Layer') return this._layer(key);\n if (name === 'Shift' || name === 'CapsLock') return this._latch(key, name);\n return this._type(key, name);\n }\n\n /** Shift and Caps Lock latch: pressed until pressed again, or for Shift until the next character. */\n private _latch(key: HTMLButtonElement, name: string) {\n key.setAttribute('aria-pressed', String(key.getAttribute('aria-pressed') !== 'true'));\n return name;\n }\n\n /** Shows the layer the key names and hides the others. */\n private _layer(key: HTMLButtonElement) {\n for (const part of this.el.querySelectorAll<HTMLElement>('[data-layer]')) part.hidden = part.dataset.layer !== key.value;\n return 'Layer';\n }\n\n private _type(key: HTMLButtonElement, name: string | undefined) {\n const text = name ? '' : this._case(key.value);\n const field = this._editable;\n if (field) this._apply(field, name, text);\n return name ?? text;\n }\n\n /** A character as Shift or Caps Lock writes it. Shift is one-shot: it releases after one character. */\n private _case(text: string) {\n const shift = this.el.querySelector('[data-key=\"Shift\"][aria-pressed=\"true\"]');\n shift?.setAttribute('aria-pressed', 'false');\n const upper = shift || this.el.querySelector('[data-key=\"CapsLock\"][aria-pressed=\"true\"]');\n return upper ? text.toUpperCase() : text;\n }\n\n /** The target field, unless it is disabled or read-only. */\n private get _editable(): Field | null {\n const field = this.target;\n return field && !field.matches(':disabled') && !field.readOnly ? field : null;\n }\n\n private _apply(field: Field, name: string | undefined, text: string) {\n if (name === 'Enter') return this._enter(field);\n if (name === 'Backspace') return this._edit(field, '', 'deleteContentBackward');\n if (text) this._edit(field, text, 'insertText');\n }\n\n /** Enter submits an input's form and starts a new line in a textarea. */\n private _enter(field: Field) {\n if (field instanceof HTMLInputElement) field.form?.requestSubmit();\n else this._edit(field, '\\n', 'insertLineBreak');\n }\n\n /** @internal Lights or clears every key a hardware key matches. */\n _light(name: string, on: boolean) {\n for (const key of this.el.querySelectorAll<HTMLButtonElement>('button')) {\n if (matches(key, name)) key.classList.toggle('pressed', on);\n }\n }\n\n /** @internal A non-empty value shorter than minlength is invalid, as typing would make it. */\n _checkLength(field: Field) {\n // Without minlength a field keeps any message the page set.\n if (field.minLength < 1) return;\n const short = field.value.length > 0 && field.value.length < field.minLength;\n markShort(field, short ? this.options.i18n.tooShort!(field.minLength) : '');\n }\n\n private _edit(field: Field, text: string, inputType: string) {\n const { value } = field;\n // Number and email inputs expose no selection; type at the end.\n let start = field.selectionStart ?? value.length;\n let end = field.selectionEnd ?? value.length;\n // A field that has never had focus may report its caret at 0. Type at the\n // end, where a reader expects the next character.\n if (start === 0 && end === 0 && !touched.has(field)) start = end = value.length;\n // Backspace removes the whole character before the caret, emoji included.\n // A short tail holds the last grapheme, so long text is not walked.\n if (inputType === 'deleteContentBackward' && start === end && start) {\n const tail = value.slice(Math.max(0, start - 64), start);\n start -= (segmenter ??= new Intl.Segmenter()).segment(tail).containing(tail.length - 1).segment.length;\n }\n if (start === end && !text) return;\n if (text && field.maxLength >= 0 && value.length - (end - start) + text.length > field.maxLength) return;\n const next = value.slice(0, start) + text + value.slice(end);\n field.value = next;\n // A number input empties itself on a partial value such as \"12.\" or \"-\".\n // Keep what was there; the docs point decimals and signs at a text field.\n if (next && !field.value) {\n field.value = value;\n return;\n }\n if (field.selectionStart !== null) field.setSelectionRange(start + text.length, start + text.length);\n touched.add(field);\n typed.set(field, this);\n this._fields.add(field);\n // Composed, so listeners outside a shadow root hear it as they do typing.\n field.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType, data: text || null }));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ // src/ts/modular.ts
2
+ var version = "0.17.0";
3
+
4
+ export {
5
+ version
6
+ };
7
+ //# sourceMappingURL=chunk-JOLJAYIJ.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/modular.ts"],
4
- "sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport type { ConfirmOptions } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { Copy } from './behaviors/copy';\nexport { Theme } from './behaviors/theme';\nexport { PaneResize } from './behaviors/paneResize';\nexport { ImageCompare } from './behaviors/imageCompare';\nexport { Tour } from './behaviors/tour';\nexport { Sortable } from './behaviors/sortable';\nexport { Lists } from './behaviors/lists';\nexport { DataTables } from './behaviors/dataTables';\nexport { TransferList } from './behaviors/transferList';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.16.0';\n\nexport type * from './components/autocomplete';\nexport type * from './components/appBar';\nexport type * from './components/buttons';\nexport type * from './components/buttonGroup';\nexport type * from './components/cards';\nexport type * from './components/expandingCard';\nexport type * from './components/carousel';\nexport type * from './components/confetti';\nexport type * from './components/particles';\nexport type * from './components/keypad';\nexport type * from './components/characterCounter';\nexport type * from './components/chips';\nexport type * from './components/cascader';\nexport type * from './components/lineChart';\nexport type * from './components/columnChart';\nexport type * from './components/barChart';\nexport type * from './components/pieChart';\nexport type * from './components/heatmapChart';\nexport type * from './components/radarChart';\nexport type * from './components/radialChart';\nexport type * from './components/mixedChart';\nexport type * from './components/scatterChart';\nexport type * from './components/funnelChart';\nexport type * from './components/sankeyChart';\nexport type * from './components/treemapChart';\nexport type * from './components/pullToRefresh';\nexport type * from './components/loadingOverlay';\nexport type * from './components/backToTop';\nexport type * from './components/swipeActions';\nexport type * from './components/inputMask';\nexport type * from './components/showMore';\nexport type * from './components/hoverCard';\nexport type * from './components/currencyInput';\nexport type * from './components/commandPalette';\nexport type * from './components/questionnaire';\nexport type * from './components/datepicker';\nexport type * from './components/menu';\nexport type * from './components/menubar';\nexport type * from './components/messageScroller';\nexport type * from './components/richTextEditor';\nexport type * from './components/mapView';\nexport type * from './components/lightbox';\nexport type * from './components/slider';\nexport type * from './components/scrollspy';\nexport type * from './components/select';\nexport type * from './components/treeSelect';\nexport type * from './components/navigationRail';\nexport type * from './components/tabs';\nexport type * from './components/timepicker';\nexport type * from './components/snackbar';\nexport type * from './components/tooltip';\n"],
4
+ "sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport type { ConfirmOptions } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { Copy } from './behaviors/copy';\nexport { Theme } from './behaviors/theme';\nexport { PaneResize } from './behaviors/paneResize';\nexport { ImageCompare } from './behaviors/imageCompare';\nexport { Tour } from './behaviors/tour';\nexport { Sortable } from './behaviors/sortable';\nexport { Lists } from './behaviors/lists';\nexport { DataTables } from './behaviors/dataTables';\nexport { TransferList } from './behaviors/transferList';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.17.0';\n\nexport type * from './components/autocomplete';\nexport type * from './components/appBar';\nexport type * from './components/buttons';\nexport type * from './components/buttonGroup';\nexport type * from './components/cards';\nexport type * from './components/expandingCard';\nexport type * from './components/carousel';\nexport type * from './components/confetti';\nexport type * from './components/particles';\nexport type * from './components/keypad';\nexport type * from './components/characterCounter';\nexport type * from './components/chips';\nexport type * from './components/cascader';\nexport type * from './components/lineChart';\nexport type * from './components/columnChart';\nexport type * from './components/barChart';\nexport type * from './components/pieChart';\nexport type * from './components/heatmapChart';\nexport type * from './components/radarChart';\nexport type * from './components/radialChart';\nexport type * from './components/mixedChart';\nexport type * from './components/scatterChart';\nexport type * from './components/funnelChart';\nexport type * from './components/sankeyChart';\nexport type * from './components/treemapChart';\nexport type * from './components/pullToRefresh';\nexport type * from './components/loadingOverlay';\nexport type * from './components/backToTop';\nexport type * from './components/swipeActions';\nexport type * from './components/inputMask';\nexport type * from './components/showMore';\nexport type * from './components/hoverCard';\nexport type * from './components/currencyInput';\nexport type * from './components/commandPalette';\nexport type * from './components/questionnaire';\nexport type * from './components/datepicker';\nexport type * from './components/menu';\nexport type * from './components/menubar';\nexport type * from './components/messageScroller';\nexport type * from './components/richTextEditor';\nexport type * from './components/mapView';\nexport type * from './components/lightbox';\nexport type * from './components/slider';\nexport type * from './components/scrollspy';\nexport type * from './components/select';\nexport type * from './components/treeSelect';\nexport type * from './components/navigationRail';\nexport type * from './components/tabs';\nexport type * from './components/timepicker';\nexport type * from './components/snackbar';\nexport type * from './components/tooltip';\n"],
5
5
  "mappings": ";AAkBO,IAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  LineChart
3
- } from "./chunk-ZM3XBHWV.mjs";
3
+ } from "./chunk-IQOTGGHX.mjs";
4
4
 
5
5
  // src/ts/components/heatmapChart.ts
6
6
  function band(level, steps) {
@@ -17,6 +17,10 @@ var HeatmapChart = class extends LineChart {
17
17
  get _count() {
18
18
  return this.labels.length * this.series.length;
19
19
  }
20
+ destroy() {
21
+ this._resizes?.disconnect();
22
+ super.destroy();
23
+ }
20
24
  /** Redraws the grid, scrolled where it was. */
21
25
  update() {
22
26
  const left = this._scroll?.scrollLeft;
@@ -233,6 +237,9 @@ var HeatmapChart = class extends LineChart {
233
237
  scroll.tabIndex = -1;
234
238
  scroll.addEventListener("focus", () => this._plot.focus());
235
239
  scroll.addEventListener("scroll", () => this._follow(scroll), { passive: true });
240
+ this._resizes?.disconnect();
241
+ this._resizes = new ResizeObserver(() => this._follow(scroll));
242
+ this._resizes.observe(scroll);
236
243
  scroll.append(cells);
237
244
  grid.append(rows, scroll);
238
245
  return grid;
@@ -243,4 +250,4 @@ HeatmapChart.key = "Expressive_HeatmapChart";
243
250
  export {
244
251
  HeatmapChart
245
252
  };
246
- //# sourceMappingURL=chunk-BPF3I2MN.mjs.map
253
+ //# sourceMappingURL=chunk-KOTGMCMI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/heatmapChart.ts"],
4
+ "sourcesContent": ["import { LineChart, LineChartOptions } from './lineChart';\n\nexport type HeatmapChartOptions = LineChartOptions;\n\n/**\n * A shade in one of `steps` bands, each side of zero on a diverging scale:\n * the lowest band is the empty color, and the highest is the full color.\n */\nfunction band(level: number, steps: number) {\n return (Math.sign(level) * Math.min(steps - 1, Math.floor(Math.abs(level) * steps))) / (steps - 1);\n}\n\n/**\n * Heatmap chart. It reads its <table> like LineChart, but draws every cell\n * as a square of the grid, shaded from the lowest value to the highest, with\n * the row headers beside it and the column headers below. A `data-label` on\n * a header cell replaces its text on the grid; an empty one hides it. The\n * tooltip shows one cell, and the arrow keys move round the grid. With\n * `data-mid` the scale diverges either side of that value, and with\n * `data-steps` the shades fall into that many bands.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class HeatmapChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Every cell, row by row. */\n private _cells: HTMLElement[];\n /** Each cell's shade from 0 to 1, or -1 to 1 on a diverging scale, or null for a gap. */\n private _levels: (number | null)[];\n /** The text of the lowest and highest cells, for the legend. */\n private _ends: [string, string];\n /** The shades of the lowest and highest cells, where the legend's gradient runs. */\n private _endLevels: [number, number];\n /** The box the cells scroll in, beside the row labels. */\n private _scroll: HTMLElement;\n /** Keeps the tooltip on its cell when the chart changes size. */\n private _resizes: ResizeObserver;\n\n protected get _type() {\n return 'heatmap-chart';\n }\n\n /** Color carries the value, so there is no value axis. */\n protected get _axis() {\n return false;\n }\n\n static key = 'Expressive_HeatmapChart';\n\n protected get _count() {\n return this.labels.length * this.series.length;\n }\n\n destroy() {\n this._resizes?.disconnect();\n super.destroy();\n }\n\n /** Redraws the grid, scrolled where it was. */\n update() {\n const left = this._scroll?.scrollLeft;\n super.update();\n if (this._scroll && left) this._scroll.scrollLeft = left;\n }\n\n /** Highlights one cell, numbered row by row. Pass -1 to hide the tooltip. */\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n this._activate(this._cells[index], index);\n }\n\n private _activate(cell: HTMLElement | undefined, index: number) {\n // Measure before the writes below, which would otherwise force a layout.\n const box = cell ? this._box(cell) : null;\n this._cells[this.activeIndex]?.classList.remove('active');\n this.activeIndex = index;\n this._tooltip.hidden = !box;\n if (box) this._fill(cell!, index, box);\n }\n\n /**\n * A cell's left, top and width in the plot, past any scrolling of the\n * grid, and the plot's width. A key can move to a cell scrolled out of a\n * wide grid, so it scrolls into view first.\n */\n private _box(cell: HTMLElement) {\n if (this._plot.matches(':focus-visible')) cell.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n return this._measure(cell);\n }\n\n private _measure(cell: HTMLElement) {\n const [box, plot] = [cell.getBoundingClientRect(), this._plot.getBoundingClientRect()];\n return [box.left - plot.left, box.top - plot.top, box.width, this._plot.clientWidth];\n }\n\n /** Keeps the tooltip on its cell as the grid scrolls, and hides it once the cell scrolls out. */\n private _follow(scroll: HTMLElement) {\n const cell = this._cells[this.activeIndex];\n if (!cell) return;\n const [view, box] = [scroll.getBoundingClientRect(), cell.getBoundingClientRect()];\n if (box.right <= view.left || box.left >= view.right) this.show(-1);\n else this._position(this._measure(cell));\n }\n\n /** Marks the cell and fills the tooltip beside it, on the side with more room. */\n private _fill(cell: HTMLElement, index: number, [left, top, width, plotWidth]: number[]) {\n cell.classList.add('active');\n const columns = this.series.length;\n const [row, series] = [Math.floor(index / columns), this.series[index % columns]];\n const title = document.createElement('strong');\n title.textContent = this.labels[row];\n const [name, text] = [document.createElement('span'), document.createElement('span')];\n name.textContent = series.name;\n // A gap's swatch is outlined like its cell.\n if (this._levels[index] === null) name.className = 'gap';\n else name.style.setProperty('--level', String(this._levels[index]));\n text.textContent = series.text[row];\n this._tooltip.replaceChildren(title, name, text);\n this._position([left, top, width, plotWidth]);\n }\n\n private _position([left, top, width, plotWidth]: number[]) {\n const end = left + width / 2 > plotWidth / 2;\n this._tooltip.classList.toggle('end', end);\n this._tooltip.style.left = `${left + (end ? 0 : width)}px`;\n this._tooltip.style.top = `${top}px`;\n }\n\n /** Arrows move the way they point, so left and right swap in RTL. */\n protected _keyTarget(key: string): number | undefined {\n // With nothing shown, Escape is left to a dialog or sheet around the chart.\n if (key === 'Escape') return this.activeIndex < 0 ? undefined : -1;\n const [columns, last] = [this.series.length, this.labels.length - 1];\n const index = Math.max(0, this.activeIndex);\n const [row, column] = [Math.floor(index / columns), index % columns];\n const [next, back] = this._reversed ? ['ArrowLeft', 'ArrowRight'] : ['ArrowRight', 'ArrowLeft'];\n const to = {\n [next]: [row, column + 1],\n [back]: [row, column - 1],\n ArrowDown: [row + 1, column],\n ArrowUp: [row - 1, column],\n Home: [row, 0],\n End: [row, columns - 1]\n }[key];\n if (!to) return undefined;\n // The first key after focus or Escape shows the first cell.\n if (this.activeIndex < 0) return 0;\n const clamp = (value: number, max: number) => Math.min(max, Math.max(0, value));\n return clamp(to[0], last) * columns + clamp(to[1], columns - 1);\n }\n\n /**\n * The cell under the pointer by its position, or -1 off the grid. A touch\n * keeps its first target while it drags, so the target cannot be used. The\n * cells and gaps are even, so each band's edge falls in a gap and a gap\n * counts as the nearer cell.\n */\n protected _indexAt(e: PointerEvent) {\n const [columns, rows] = [this.series.length, this.labels.length];\n const first = this._cells[0].getBoundingClientRect();\n const last = this._cells[this._cells.length - 1].getBoundingClientRect();\n const [left, right] = [Math.min(first.left, last.left), Math.max(first.right, last.right)];\n const [x, y] = [e.clientX, e.clientY];\n if (this._off(x, y, [left, right, first.top, last.bottom])) return -1;\n const band = (offset: number, size: number, count: number) =>\n Math.min(count - 1, Math.floor((offset / (size || 1)) * count));\n const column = band(x - left, right - left, columns);\n return band(y - first.top, last.bottom - first.top, rows) * columns + (this._reversed ? columns - 1 - column : column);\n }\n\n /** Whether a point is off the cells, or on cells scrolled out of view under the row labels. */\n private _off(x: number, y: number, [left, right, top, bottom]: number[]) {\n const view = this._scroll.getBoundingClientRect();\n return x < Math.max(left, view.left) || x > Math.min(right, view.right) || y < top || y > bottom;\n }\n\n /**\n * The legend: a gradient from the lowest cell's shade to the highest's,\n * labelled with their text. A fixed scale wider than the data shows only\n * the part the data uses.\n */\n protected _guides(): Element[] {\n const legend = document.createElement('div');\n legend.className = 'heatmap-chart-legend';\n legend.setAttribute('aria-hidden', 'true');\n const [low, scale, high] = ['span', 'span', 'span'].map((tag) => document.createElement(tag));\n [low.textContent, high.textContent] = this._ends;\n scale.className = 'heatmap-chart-scale';\n if (this._reversed) scale.style.setProperty('--heatmap-chart-to', 'left');\n const [from, to] = this._endLevels;\n scale.style.setProperty('--low', String(from));\n scale.style.setProperty('--high', String(to));\n // A diverging scale whose data crosses the midpoint passes its empty color.\n scale.classList.toggle('diverging', from < 0 && to > 0);\n scale.style.setProperty('--mid', `${(-from / (to - from || 1)) * 100}%`);\n scale.append(...this._bands().filter((level) => level >= from && level <= to).map((level) => {\n const swatch = document.createElement('span');\n swatch.style.setProperty('--level', String(level));\n return swatch;\n }));\n legend.append(low, scale, high);\n return [legend];\n }\n\n /** With data-steps, every band's shade from the lowest to the highest; otherwise none. */\n private _bands() {\n const steps = this._steps;\n if (!steps) return [];\n return Array.from({ length: 2 * steps - 1 }, (_, k) => (k - steps + 1) / (steps - 1));\n }\n\n /** The number of bands data-steps asks for, or 0 for a smooth scale. */\n private get _steps() {\n const steps = Math.round(this._number('steps') ?? 0);\n return steps > 1 ? steps : 0;\n }\n\n /**\n * How a value shades its cell: from 0 at the scale's low end to 1 at its\n * high end, or with data-mid from -1 to 1 either side of that midpoint,\n * as far as the further end. With data-steps the shades fall into bands.\n */\n private _shade(low: number, high: number) {\n const option = (name: 'min' | 'max', fallback: number) => this._number(name) ?? this.options[name] ?? fallback;\n const [min, max, mid] = [option('min', low), option('max', high), this._number('mid')];\n const clamp = (value: number, floor: number) => Math.min(1, Math.max(floor, value));\n const level = mid === null\n ? (value: number) => clamp((value - min) / (max - min || 1), 0)\n : (value: number) => clamp((Math.min(max, Math.max(min, value)) - mid) / (Math.max(max - mid, mid - min) || 1), -1);\n const steps = this._steps;\n return steps ? (value: number) => band(level(value), steps) : level;\n }\n\n /**\n * A grid of the row headers and cells, row by row, with the column headers\n * below. Each cell's --level shades it in CSS.\n */\n protected _draw(): Element {\n const columns = this.series.length;\n let [low, high] = [Infinity, -Infinity];\n this._ends = ['', ''];\n this.series.forEach((series) => series.values.forEach((value, row) => {\n if (value === null) return;\n if (value < low) [low, this._ends[0]] = [value, series.text[row]];\n if (value > high) [high, this._ends[1]] = [value, series.text[row]];\n }));\n const shade = this._shade(low, high);\n this._endLevels = [shade(low), shade(high)];\n\n const grid = document.createElement('div');\n grid.className = 'heatmap-chart-grid';\n grid.setAttribute('aria-hidden', 'true');\n grid.style.setProperty('--columns', String(columns));\n grid.style.setProperty('--rows', String(this.labels.length));\n const span = (className: string, text = '') => {\n const element = document.createElement('span');\n element.className = className;\n element.textContent = text;\n return element;\n };\n const label = (cell: HTMLTableCellElement | undefined) =>\n cell?.dataset.label ?? cell?.textContent.trim() ?? '';\n const values = this.el.classList.contains('values');\n\n this._cells = [];\n this._levels = [];\n // The row labels stay put beside the cells, which scroll when they are too narrow.\n const [rows, cells] = [document.createElement('div'), document.createElement('div')];\n rows.className = 'heatmap-chart-rows';\n cells.className = 'heatmap-chart-cells';\n this.labels.forEach((_, row) => {\n rows.append(span('heatmap-chart-row', label(this._rows[row].cells[0])));\n this.series.forEach((series) => {\n const value = series.values[row];\n const level = value === null ? null : shade(value);\n const cell = span('heatmap-chart-cell', values ? series.text[row] : '');\n if (level === null) cell.classList.add('gap');\n else cell.style.setProperty('--level', String(level));\n this._cells.push(cell);\n this._levels.push(level);\n cells.append(cell);\n });\n });\n\n // A column label runs on over the empty labels after it.\n const labels = this._header.slice(1, columns + 1).map(label);\n const columnLabels: HTMLElement[] = [];\n labels.forEach((text, column) => {\n if (!text) return;\n let end = column + 1;\n while (end < columns && !labels[end]) end++;\n const element = span('heatmap-chart-column', text);\n element.classList.toggle('run', end > column + 1);\n element.style.gridArea = `${this.labels.length + 1} / ${column + 1} / auto / ${end + 1}`;\n cells.append(element);\n columnLabels.push(element);\n });\n // Labels the author already spaced out with empty ones are left as written.\n this._observeLabels(cells, columnLabels.some((element) => element.classList.contains('run')) ? [] : columnLabels);\n\n // The plot is the one Tab stop, so the scroll box is not another, and a\n // press that focuses it hands focus on to the plot.\n const scroll = (this._scroll = document.createElement('div'));\n scroll.className = 'heatmap-chart-scroll';\n scroll.tabIndex = -1;\n scroll.addEventListener('focus', () => this._plot.focus());\n scroll.addEventListener('scroll', () => this._follow(scroll), { passive: true });\n this._resizes?.disconnect();\n this._resizes = new ResizeObserver(() => this._follow(scroll));\n this._resizes.observe(scroll);\n scroll.append(cells);\n grid.append(rows, scroll);\n return grid;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["band"]
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-ZVLOUDIJ.mjs";
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/components/messageScroller.ts
9
9
  var _defaults = {
@@ -265,4 +265,4 @@ MessageScroller.key = "Expressive_MessageScroller";
265
265
  export {
266
266
  MessageScroller
267
267
  };
268
- //# sourceMappingURL=chunk-ANKFWNWT.mjs.map
268
+ //# sourceMappingURL=chunk-LC4O5LFS.mjs.map