@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,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
 
5
5
  // src/ts/components/particles.ts
6
6
  var _defaults = {
@@ -18,6 +18,8 @@ var Particles = class extends Component {
18
18
  this._particles = [];
19
19
  this._width = 0;
20
20
  this._height = 0;
21
+ /** The device pixel ratio the buffer was sized for, which painting scales by. */
22
+ this._dpr = 1;
21
23
  this._frame = 0;
22
24
  this._last = 0;
23
25
  // Pointer offset from the canvas center, kept from its last move inside.
@@ -55,9 +57,10 @@ var Particles = class extends Component {
55
57
  this._theme = new MutationObserver(this._repaint);
56
58
  this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ["theme"], subtree: true });
57
59
  this._still = this._motion.matches;
58
- this._reset();
60
+ this._fit();
61
+ this._scatter();
59
62
  this._resizeObserver = new ResizeObserver(() => {
60
- if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();
63
+ if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._resize();
61
64
  });
62
65
  this._resizeObserver.observe(this.el);
63
66
  this._visibility = new IntersectionObserver((entries) => {
@@ -97,17 +100,36 @@ var Particles = class extends Component {
97
100
  this._frame = 0;
98
101
  window.removeEventListener("pointermove", this._onPointerMove);
99
102
  }
100
- // Matches the pixel buffer to the canvas box and scatters a new set.
101
- _reset() {
103
+ /** Matches the pixel buffer to the canvas box, which clears it. */
104
+ _fit() {
102
105
  this._width = this.el.clientWidth;
103
106
  this._height = this.el.clientHeight;
104
- this.el.width = Math.round(this._width * devicePixelRatio);
105
- this.el.height = Math.round(this._height * devicePixelRatio);
107
+ this._dpr = devicePixelRatio;
108
+ this.el.width = Math.round(this._width * this._dpr);
109
+ this.el.height = Math.round(this._height * this._dpr);
110
+ }
111
+ /** Scatters a new set of particles. */
112
+ _scatter() {
106
113
  this._particles = Array.from({ length: this.options.quantity }, () => this._particle());
107
- if (this._still) {
108
- for (const p of this._particles) p.alpha = p.targetAlpha;
109
- this._paint();
114
+ if (this._still) for (const p of this._particles) p.alpha = p.targetAlpha;
115
+ this._repaint();
116
+ }
117
+ /**
118
+ * Refits the buffer and moves each particle with the box, so a drag that
119
+ * resizes the canvas every frame keeps the same dots. It used to scatter a
120
+ * new set each time. A box that had no size has no positions to keep.
121
+ * Refitting clears the buffer, and the observer runs after this frame's
122
+ * draw, so a moving canvas is painted here too or it shows blank.
123
+ */
124
+ _resize() {
125
+ const [width, height] = [this._width, this._height];
126
+ this._fit();
127
+ if (!width || !height) return this._scatter();
128
+ for (const p of this._particles) {
129
+ p.x *= this._width / width;
130
+ p.y *= this._height / height;
110
131
  }
132
+ this._paint();
111
133
  }
112
134
  _particle() {
113
135
  return {
@@ -145,7 +167,7 @@ var Particles = class extends Component {
145
167
  }
146
168
  _paint() {
147
169
  const ctx = this._ctx;
148
- const dpr = devicePixelRatio;
170
+ const dpr = this._dpr;
149
171
  ctx.setTransform(1, 0, 0, 1, 0, 0);
150
172
  ctx.clearRect(0, 0, this.el.width, this.el.height);
151
173
  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
@@ -165,4 +187,4 @@ Particles.key = "Expressive_Particles";
165
187
  export {
166
188
  Particles
167
189
  };
168
- //# sourceMappingURL=chunk-5KIHWJI2.mjs.map
190
+ //# sourceMappingURL=chunk-TMQDZSDC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/particles.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nexport interface ParticlesOptions extends BaseOptions {\n /**\n * Number of particles.\n * @default 100\n */\n quantity: number;\n /**\n * How firmly particles hold their place against the pointer. Lower\n * follows the pointer further.\n * @default 50\n */\n staticity: number;\n /**\n * Frames a particle takes to catch up with the pointer. Higher is slower.\n * @default 50\n */\n ease: number;\n /**\n * Base radius in pixels. Each particle adds 0 or 1 to it.\n * @default 0.4\n */\n size: number;\n /**\n * A CSS color. Empty uses the canvas's CSS `color`, which defaults to the\n * theme's on-surface color.\n * @default ''\n */\n color: string;\n /**\n * Horizontal drift in pixels per frame. Negative drifts left.\n * @default 0\n */\n vx: number;\n /**\n * Vertical drift in pixels per frame. Negative drifts up.\n * @default 0\n */\n vy: number;\n}\n\nconst _defaults: ParticlesOptions = {\n quantity: 100,\n staticity: 50,\n ease: 50,\n size: 0.4,\n color: '',\n vx: 0,\n vy: 0\n};\n\ninterface Particle {\n x: number;\n y: number;\n translateX: number;\n translateY: number;\n size: number;\n alpha: number;\n targetAlpha: number;\n dx: number;\n dy: number;\n magnetism: number;\n}\n\n/**\n * Particles. A `<canvas class=\"particles\">` covers its nearest positioned\n * ancestor with slowly drifting dots that lean toward the pointer. Under\n * reduced motion the dots are drawn once and stay still.\n */\nexport class Particles extends Component<ParticlesOptions> {\n declare el: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D | null;\n private _style: CSSStyleDeclaration;\n private _particles: Particle[] = [];\n private _width = 0;\n private _height = 0;\n /** The device pixel ratio the buffer was sized for, which painting scales by. */\n private _dpr = 1;\n private _frame = 0;\n private _last = 0;\n // Pointer offset from the canvas center, kept from its last move inside.\n private _mouse = { x: 0, y: 0 };\n private _still = false;\n private _visible = true;\n private _motion: MediaQueryList | null = null;\n private _theme: MutationObserver | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n private _visibility: IntersectionObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<ParticlesOptions>) {\n super(el, options);\n this._ctx = this.el.getContext('2d');\n if (!this._ctx) return;\n this._style = getComputedStyle(this.el);\n this._motion = matchMedia('(prefers-reduced-motion: reduce)');\n const { signal } = this._events;\n this._motion.addEventListener('change', this._onMotion, { signal });\n // Still dots are painted once, so a theme or color-scheme change\n // repaints them. Moving ones read the color every frame anyway.\n matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this._repaint, { signal });\n this._theme = new MutationObserver(this._repaint);\n this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n this._still = this._motion.matches;\n this._fit();\n this._scatter();\n this._resizeObserver = new ResizeObserver(() => {\n if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._resize();\n });\n this._resizeObserver.observe(this.el);\n // Animates only while on screen. A canvas scrolled away, hidden or\n // removed without destroy() stops drawing and following the pointer.\n // Entries arrive oldest first, so the last one is the current state.\n this._visibility = new IntersectionObserver((entries) => {\n this._visible = entries[entries.length - 1].isIntersecting;\n this._animate();\n });\n this._visibility.observe(this.el);\n }\n\n static get defaults(): ParticlesOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Particles';\n\n destroy() {\n this._stop();\n this._theme?.disconnect();\n this._resizeObserver?.disconnect();\n this._visibility?.disconnect();\n if (this._ctx) {\n this._ctx.setTransform(1, 0, 0, 1, 0, 0);\n this._ctx.clearRect(0, 0, this.el.width, this.el.height);\n }\n super.destroy();\n }\n\n private _animate() {\n if (this._visible && !this._still) this._start();\n else this._stop();\n }\n\n private _onMotion = () => {\n this._still = this._motion.matches;\n if (this._still) {\n for (const p of this._particles) p.alpha = p.targetAlpha;\n this._paint();\n }\n this._animate();\n };\n\n private _repaint = () => {\n if (this._still) this._paint();\n };\n\n private _start() {\n if (this._frame) return;\n window.addEventListener('pointermove', this._onPointerMove, { passive: true });\n this._frame = requestAnimationFrame((now) => { this._last = now; this._draw(now); });\n }\n\n private _stop() {\n cancelAnimationFrame(this._frame);\n this._frame = 0;\n window.removeEventListener('pointermove', this._onPointerMove);\n }\n\n private _onPointerMove = (e: PointerEvent) => {\n const r = this.el.getBoundingClientRect();\n const x = e.clientX - r.left - r.width / 2;\n const y = e.clientY - r.top - r.height / 2;\n if (Math.abs(x) < r.width / 2 && Math.abs(y) < r.height / 2) this._mouse = { x, y };\n };\n\n /** Matches the pixel buffer to the canvas box, which clears it. */\n private _fit() {\n this._width = this.el.clientWidth;\n this._height = this.el.clientHeight;\n this._dpr = devicePixelRatio;\n this.el.width = Math.round(this._width * this._dpr);\n this.el.height = Math.round(this._height * this._dpr);\n }\n\n /** Scatters a new set of particles. */\n private _scatter() {\n this._particles = Array.from({ length: this.options.quantity }, () => this._particle());\n if (this._still) for (const p of this._particles) p.alpha = p.targetAlpha;\n this._repaint();\n }\n\n /**\n * Refits the buffer and moves each particle with the box, so a drag that\n * resizes the canvas every frame keeps the same dots. It used to scatter a\n * new set each time. A box that had no size has no positions to keep.\n * Refitting clears the buffer, and the observer runs after this frame's\n * draw, so a moving canvas is painted here too or it shows blank.\n */\n private _resize() {\n const [width, height] = [this._width, this._height];\n this._fit();\n if (!width || !height) return this._scatter();\n for (const p of this._particles) {\n p.x *= this._width / width;\n p.y *= this._height / height;\n }\n this._paint();\n }\n\n private _particle(): Particle {\n return {\n x: Math.floor(Math.random() * this._width),\n y: Math.floor(Math.random() * this._height),\n translateX: 0,\n translateY: 0,\n size: Math.floor(Math.random() * 2) + this.options.size,\n alpha: 0,\n targetAlpha: Math.round((Math.random() * 0.6 + 0.1) * 10) / 10,\n dx: (Math.random() - 0.5) * 0.1,\n dy: (Math.random() - 0.5) * 0.1,\n magnetism: 0.1 + Math.random() * 4\n };\n }\n\n private _draw(now: number) {\n // Frames are counted at 60 per second whatever the display rate.\n const step = Math.min((now - this._last) / (1000 / 60), 4);\n this._last = now;\n const { staticity, ease, vx, vy } = this.options;\n const follow = Math.min(step / ease, 1);\n this._particles = this._particles.map((p) => {\n p.x += (p.dx + vx) * step;\n p.y += (p.dy + vy) * step;\n p.translateX += (this._mouse.x / (staticity / p.magnetism) - p.translateX) * follow;\n p.translateY += (this._mouse.y / (staticity / p.magnetism) - p.translateY) * follow;\n // Fades in, and fades out within 20px of an edge.\n const x = p.x + p.translateX;\n const y = p.y + p.translateY;\n const edge = Math.min(x - p.size, this._width - x - p.size, y - p.size, this._height - y - p.size) / 20;\n p.alpha = edge > 1 ? Math.min(p.alpha + 0.02 * step, p.targetAlpha) : p.targetAlpha * edge;\n const gone = p.x < -p.size || p.x > this._width + p.size || p.y < -p.size || p.y > this._height + p.size;\n return gone ? this._particle() : p;\n });\n this._paint();\n this._frame = requestAnimationFrame((t) => this._draw(t));\n }\n\n private _paint() {\n const ctx = this._ctx!;\n // The ratio the buffer has, not the current one: after the page moves to\n // a screen with another ratio, painting at the new one drew every dot\n // scaled and offset in the old buffer.\n // ponytail: the buffer keeps the old ratio until the next resize; a\n // resolution media query listener if a sharp redraw matters.\n const dpr = this._dpr;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, this.el.width, this.el.height);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Read every frame, so a theme or color-scheme change applies at once.\n ctx.fillStyle = this.options.color || this._style.color;\n for (const p of this._particles) {\n if (p.alpha <= 0) continue;\n ctx.globalAlpha = p.alpha;\n ctx.beginPath();\n ctx.arc(p.x + p.translateX, p.y + p.translateY, p.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n ctx.globalAlpha = 1;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Snackbar
3
- } from "./chunk-KZPSAXIU.mjs";
3
+ } from "./chunk-HEH7E3KO.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-ZVLOUDIJ.mjs";
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/behaviors/copy.ts
9
9
  var _Copy = class _Copy {
@@ -45,4 +45,4 @@ var Copy = _Copy;
45
45
  export {
46
46
  Copy
47
47
  };
48
- //# sourceMappingURL=chunk-ZO6ZLHFF.mjs.map
48
+ //# sourceMappingURL=chunk-TVSX5YA2.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  restoreAttribute
3
- } from "./chunk-ZVLOUDIJ.mjs";
3
+ } from "./chunk-67UNY7RH.mjs";
4
4
 
5
5
  // src/ts/core/formControl.ts
6
6
  var formAssociated = () => typeof ElementInternals !== "undefined" && "setFormValue" in ElementInternals.prototype;
@@ -77,4 +77,4 @@ export {
77
77
  wrapInControl,
78
78
  unwrapControl
79
79
  };
80
- //# sourceMappingURL=chunk-INLZWHLY.mjs.map
80
+ //# sourceMappingURL=chunk-UHO5CV6K.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/core/formControl.ts"],
4
- "sourcesContent": ["import { restoreAttribute } from './utils';\n\n/**\n * A form-associated element that wraps a text input and submits for it, so\n * the browser handles the field's values, reset, validity and disabled state.\n * Chips and Cascader each define one under their own tag.\n */\nexport interface FormControl extends HTMLElement {\n readonly internals: ElementInternals;\n /** Called for a form reset no listener canceled, in the same task. */\n onFormReset: (() => void) | null;\n}\n\n/** Whether the browser has form-associated custom elements. jsdom does not. */\nexport const formAssociated = () => typeof ElementInternals !== 'undefined' && 'setFormValue' in ElementInternals.prototype;\n\n/** Each control's observer of its input's attributes. */\nconst mirrors = new WeakMap<FormControl, MutationObserver>();\n\n/**\n * Defines `tag` on first use, so importing the bundle needs no DOM, and only\n * once, so a second copy of the bundle on the page uses the first one's. The\n * form sees the control, so it answers what a field does; its anchor and\n * focus are the input it wraps.\n */\nfunction define(tag: string) {\n if (customElements.get(tag)) return;\n customElements.define(tag, class extends HTMLElement {\n static formAssociated = true;\n readonly internals = this.attachInternals();\n onFormReset: (() => void) | null = null;\n formResetCallback() { this.onFormReset?.(); }\n get form() { return this.internals.form; }\n get name() { return this.getAttribute('name') ?? ''; }\n get labels() { return this._input?.labels; }\n get validity() { return this.internals.validity; }\n get validationMessage() { return this.internals.validationMessage; }\n get willValidate() { return this.internals.willValidate; }\n checkValidity() { return this.internals.checkValidity(); }\n reportValidity() { return this.internals.reportValidity(); }\n focus(options?: FocusOptions) { this._input?.focus(options); }\n private get _input() { return this.querySelector<HTMLInputElement>(':scope > input'); }\n });\n}\n\n/** The control is disabled with the input, or with a fieldset by itself, and submits to the input's form. */\nfunction copyState(control: FormControl, input: HTMLInputElement) {\n ['disabled', 'form'].forEach((name) => restoreAttribute(control, name, input.getAttribute(name)));\n}\n\n/**\n * Wraps `input` in a `tag` control that takes its name. `display: contents`\n * lays the input out as a child of the field still. The control follows the\n * input's disabled and form attributes, and `onChange` runs after the input's\n * disabled, readonly or form attribute changes.\n */\nexport function wrapInControl(tag: string, input: HTMLInputElement, onChange: () => void): FormControl {\n define(tag);\n const control = document.createElement(tag) as FormControl;\n control.style.display = 'contents';\n control.setAttribute('name', input.getAttribute('name') ?? '');\n input.removeAttribute('name');\n input.replaceWith(control);\n control.append(input);\n copyState(control, input);\n const mirror = new MutationObserver(() => (copyState(control, input), onChange()));\n mirror.observe(input, { attributeFilter: ['disabled', 'readonly', 'form'] });\n mirrors.set(control, mirror);\n return control;\n}\n\n/** Unwraps the control, with whatever else went in it, and gives `input` its name back. */\nexport function unwrapControl(control: FormControl, input: HTMLInputElement) {\n mirrors.get(control)?.disconnect();\n control.replaceWith(...control.childNodes);\n input.setAttribute('name', control.getAttribute('name') ?? '');\n}\n"],
5
- "mappings": ";;;;;AAcO,IAAM,iBAAiB,MAAM,OAAO,qBAAqB,eAAe,kBAAkB,iBAAiB;AAGlH,IAAM,UAAU,oBAAI,QAAuC;AAQ3D,SAAS,OAAO,KAAa;AAzB7B;AA0BE,MAAI,eAAe,IAAI,GAAG,EAAG;AAC7B,iBAAe,OAAO,MAAK,mBAAc,YAAY;AAAA,IAA1B;AAAA;AAEzB,WAAS,YAAY,KAAK,gBAAgB;AAC1C,yBAAmC;AAAA;AAAA,IACnC,oBAAoB;AAAE,WAAK,cAAc;AAAA,IAAG;AAAA,IAC5C,IAAI,OAAO;AAAE,aAAO,KAAK,UAAU;AAAA,IAAM;AAAA,IACzC,IAAI,OAAO;AAAE,aAAO,KAAK,aAAa,MAAM,KAAK;AAAA,IAAI;AAAA,IACrD,IAAI,SAAS;AAAE,aAAO,KAAK,QAAQ;AAAA,IAAQ;AAAA,IAC3C,IAAI,WAAW;AAAE,aAAO,KAAK,UAAU;AAAA,IAAU;AAAA,IACjD,IAAI,oBAAoB;AAAE,aAAO,KAAK,UAAU;AAAA,IAAmB;AAAA,IACnE,IAAI,eAAe;AAAE,aAAO,KAAK,UAAU;AAAA,IAAc;AAAA,IACzD,gBAAgB;AAAE,aAAO,KAAK,UAAU,cAAc;AAAA,IAAG;AAAA,IACzD,iBAAiB;AAAE,aAAO,KAAK,UAAU,eAAe;AAAA,IAAG;AAAA,IAC3D,MAAM,SAAwB;AAAE,WAAK,QAAQ,MAAM,OAAO;AAAA,IAAG;AAAA,IAC7D,IAAY,SAAS;AAAE,aAAO,KAAK,cAAgC,gBAAgB;AAAA,IAAG;AAAA,EACxF,GAf2B,GAClB,iBAAiB,MADC,GAe1B;AACH;AAGA,SAAS,UAAU,SAAsB,OAAyB;AAChE,GAAC,YAAY,MAAM,EAAE,QAAQ,CAAC,SAAS,iBAAiB,SAAS,MAAM,MAAM,aAAa,IAAI,CAAC,CAAC;AAClG;AAQO,SAAS,cAAc,KAAa,OAAyB,UAAmC;AACrG,SAAO,GAAG;AACV,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,MAAM,UAAU;AACxB,UAAQ,aAAa,QAAQ,MAAM,aAAa,MAAM,KAAK,EAAE;AAC7D,QAAM,gBAAgB,MAAM;AAC5B,QAAM,YAAY,OAAO;AACzB,UAAQ,OAAO,KAAK;AACpB,YAAU,SAAS,KAAK;AACxB,QAAM,SAAS,IAAI,iBAAiB,OAAO,UAAU,SAAS,KAAK,GAAG,SAAS,EAAE;AACjF,SAAO,QAAQ,OAAO,EAAE,iBAAiB,CAAC,YAAY,YAAY,MAAM,EAAE,CAAC;AAC3E,UAAQ,IAAI,SAAS,MAAM;AAC3B,SAAO;AACT;AAGO,SAAS,cAAc,SAAsB,OAAyB;AAC3E,UAAQ,IAAI,OAAO,GAAG,WAAW;AACjC,UAAQ,YAAY,GAAG,QAAQ,UAAU;AACzC,QAAM,aAAa,QAAQ,QAAQ,aAAa,MAAM,KAAK,EAAE;AAC/D;",
4
+ "sourcesContent": ["import { restoreAttribute } from './utils';\n\n/**\n * A form-associated element that wraps a text input and submits for it, so\n * the browser handles the field's values, reset, validity and disabled state.\n * Chips and Cascader each define one under their own tag.\n */\nexport interface FormControl extends HTMLElement {\n readonly internals: ElementInternals;\n /** Called for a form reset no listener canceled, in the same task. */\n onFormReset: (() => void) | null;\n}\n\n/** Whether the browser has form-associated custom elements. jsdom does not. */\nexport const formAssociated = () => typeof ElementInternals !== 'undefined' && 'setFormValue' in ElementInternals.prototype;\n\n/** Each control's observer of its input's attributes. */\nconst mirrors = new WeakMap<FormControl, MutationObserver>();\n\n/**\n * Defines `tag` on first use, so importing the bundle needs no DOM, and only\n * once, so a second copy of the bundle on the page uses the first one's. The\n * form sees the control, so it answers what a field does; its anchor and\n * focus are the input it wraps.\n */\nfunction define(tag: string) {\n if (customElements.get(tag)) return;\n customElements.define(tag, class extends HTMLElement {\n static formAssociated = true;\n readonly internals = this.attachInternals();\n onFormReset: (() => void) | null = null;\n formResetCallback() { this.onFormReset?.(); }\n get form() { return this.internals.form; }\n get name() { return this.getAttribute('name') ?? ''; }\n get labels() { return this._input?.labels; }\n get validity() { return this.internals.validity; }\n get validationMessage() { return this.internals.validationMessage; }\n get willValidate() { return this.internals.willValidate; }\n checkValidity() { return this.internals.checkValidity(); }\n reportValidity() { return this.internals.reportValidity(); }\n override focus(options?: FocusOptions) { this._input?.focus(options); }\n private get _input() { return this.querySelector<HTMLInputElement>(':scope > input'); }\n });\n}\n\n/** The control is disabled with the input, or with a fieldset by itself, and submits to the input's form. */\nfunction copyState(control: FormControl, input: HTMLInputElement) {\n ['disabled', 'form'].forEach((name) => restoreAttribute(control, name, input.getAttribute(name)));\n}\n\n/**\n * Wraps `input` in a `tag` control that takes its name. `display: contents`\n * lays the input out as a child of the field still. The control follows the\n * input's disabled and form attributes, and `onChange` runs after the input's\n * disabled, readonly or form attribute changes.\n */\nexport function wrapInControl(tag: string, input: HTMLInputElement, onChange: () => void): FormControl {\n define(tag);\n const control = document.createElement(tag) as FormControl;\n control.style.display = 'contents';\n control.setAttribute('name', input.getAttribute('name') ?? '');\n input.removeAttribute('name');\n input.replaceWith(control);\n control.append(input);\n copyState(control, input);\n const mirror = new MutationObserver(() => (copyState(control, input), onChange()));\n mirror.observe(input, { attributeFilter: ['disabled', 'readonly', 'form'] });\n mirrors.set(control, mirror);\n return control;\n}\n\n/** Unwraps the control, with whatever else went in it, and gives `input` its name back. */\nexport function unwrapControl(control: FormControl, input: HTMLInputElement) {\n mirrors.get(control)?.disconnect();\n control.replaceWith(...control.childNodes);\n input.setAttribute('name', control.getAttribute('name') ?? '');\n}\n"],
5
+ "mappings": ";;;;;AAcO,IAAM,iBAAiB,MAAM,OAAO,qBAAqB,eAAe,kBAAkB,iBAAiB;AAGlH,IAAM,UAAU,oBAAI,QAAuC;AAQ3D,SAAS,OAAO,KAAa;AAzB7B;AA0BE,MAAI,eAAe,IAAI,GAAG,EAAG;AAC7B,iBAAe,OAAO,MAAK,mBAAc,YAAY;AAAA,IAA1B;AAAA;AAEzB,WAAS,YAAY,KAAK,gBAAgB;AAC1C,yBAAmC;AAAA;AAAA,IACnC,oBAAoB;AAAE,WAAK,cAAc;AAAA,IAAG;AAAA,IAC5C,IAAI,OAAO;AAAE,aAAO,KAAK,UAAU;AAAA,IAAM;AAAA,IACzC,IAAI,OAAO;AAAE,aAAO,KAAK,aAAa,MAAM,KAAK;AAAA,IAAI;AAAA,IACrD,IAAI,SAAS;AAAE,aAAO,KAAK,QAAQ;AAAA,IAAQ;AAAA,IAC3C,IAAI,WAAW;AAAE,aAAO,KAAK,UAAU;AAAA,IAAU;AAAA,IACjD,IAAI,oBAAoB;AAAE,aAAO,KAAK,UAAU;AAAA,IAAmB;AAAA,IACnE,IAAI,eAAe;AAAE,aAAO,KAAK,UAAU;AAAA,IAAc;AAAA,IACzD,gBAAgB;AAAE,aAAO,KAAK,UAAU,cAAc;AAAA,IAAG;AAAA,IACzD,iBAAiB;AAAE,aAAO,KAAK,UAAU,eAAe;AAAA,IAAG;AAAA,IAClD,MAAM,SAAwB;AAAE,WAAK,QAAQ,MAAM,OAAO;AAAA,IAAG;AAAA,IACtE,IAAY,SAAS;AAAE,aAAO,KAAK,cAAgC,gBAAgB;AAAA,IAAG;AAAA,EACxF,GAf2B,GAClB,iBAAiB,MADC,GAe1B;AACH;AAGA,SAAS,UAAU,SAAsB,OAAyB;AAChE,GAAC,YAAY,MAAM,EAAE,QAAQ,CAAC,SAAS,iBAAiB,SAAS,MAAM,MAAM,aAAa,IAAI,CAAC,CAAC;AAClG;AAQO,SAAS,cAAc,KAAa,OAAyB,UAAmC;AACrG,SAAO,GAAG;AACV,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,MAAM,UAAU;AACxB,UAAQ,aAAa,QAAQ,MAAM,aAAa,MAAM,KAAK,EAAE;AAC7D,QAAM,gBAAgB,MAAM;AAC5B,QAAM,YAAY,OAAO;AACzB,UAAQ,OAAO,KAAK;AACpB,YAAU,SAAS,KAAK;AACxB,QAAM,SAAS,IAAI,iBAAiB,OAAO,UAAU,SAAS,KAAK,GAAG,SAAS,EAAE;AACjF,SAAO,QAAQ,OAAO,EAAE,iBAAiB,CAAC,YAAY,YAAY,MAAM,EAAE,CAAC;AAC3E,UAAQ,IAAI,SAAS,MAAM;AAC3B,SAAO;AACT;AAGO,SAAS,cAAc,SAAsB,OAAyB;AAC3E,UAAQ,IAAI,OAAO,GAAG,WAAW;AACjC,UAAQ,YAAY,GAAG,QAAQ,UAAU;AACzC,QAAM,aAAa,QAAQ,QAAQ,aAAa,MAAM,KAAK,EAAE;AAC/D;",
6
6
  "names": []
7
7
  }
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  LineChart,
3
3
  rowLegend,
4
- seriesColor
5
- } from "./chunk-ZM3XBHWV.mjs";
4
+ seriesColor,
5
+ tintTooltip
6
+ } from "./chunk-IQOTGGHX.mjs";
6
7
  import {
7
8
  svgNode
8
- } from "./chunk-ZVLOUDIJ.mjs";
9
+ } from "./chunk-67UNY7RH.mjs";
9
10
 
10
11
  // src/ts/components/radialChart.ts
11
12
  var RADIUS = 46;
@@ -72,10 +73,7 @@ var RadialChart = class extends LineChart {
72
73
  this._rings.forEach((ring, i) => ring.classList.toggle("active", i === index));
73
74
  this._sweeps.forEach((sweep, i) => sweep?.classList.toggle("active", i === index));
74
75
  if (this._tooltip.hidden) return;
75
- const color = seriesColor(index);
76
- this._tooltip.querySelectorAll("[data-series]").forEach((span) => {
77
- span.dataset.series = color;
78
- });
76
+ tintTooltip(this._tooltip, seriesColor(index));
79
77
  }
80
78
  /** The tooltip sits where the ring's fill ends. */
81
79
  _place(index) {
@@ -222,4 +220,4 @@ RadialChart.key = "Expressive_RadialChart";
222
220
  export {
223
221
  RadialChart
224
222
  };
225
- //# sourceMappingURL=chunk-7YQBHTK3.mjs.map
223
+ //# sourceMappingURL=chunk-UKCNELUN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/radialChart.ts"],
4
+ "sourcesContent": ["import { LineChart, LineChartOptions, rowLegend, seriesColor, tintTooltip } from './lineChart';\nimport { svgNode as node } from '../core/utils';\n\nexport type RadialChartOptions = LineChartOptions;\n\n/** The outer ring's outer edge in a 100-unit box. */\nconst RADIUS = 46;\n/** The rings never fill more of the radius than this, leaving a middle. */\nconst FILL = 0.8;\n\n/**\n * Radial chart. It reads its <table> like LineChart, but draws each row of\n * the first value column as a ring, outermost first, filled clockwise from\n * the top as a share of `data-max` above zero (100 by default). With `.gauge` the rings\n * are half circles over the middle. With `.labels` they are three quarters\n * of a circle, leaving the top left quarter for each row's name at the\n * ring's start; a gauge's names hang under its base line instead.\n * `data-segments` splits each ring into that many segments, filled whole,\n * and `.gradient` shades each fill along the ring, from a light tint at its\n * start to its full color at its end. A <tfoot>\n * row shows in the middle, and\n * a legend lists the rows when there is more than one. Further columns show\n * in the tooltip.\n *\n * Call `update()` after changing the ring tokens, and after changing the table\n * unless it was started with `watch` or `data-watch`.\n */\nexport class RadialChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Each ring's middle radius, and their shared width. */\n private _radii: number[];\n private _width: number;\n /** The gap between rings, and between segments. */\n private _gap: number;\n /** Each row's share of the maximum, from 0 to 1. */\n private _fractions: number[];\n private _rings: SVGCircleElement[];\n /** With .gradient, each ring's fill drawn again as a conic gradient, or null for none. */\n private _sweeps: (HTMLElement | null)[];\n\n protected get _type() {\n return 'radial-chart';\n }\n\n /** The rings fill to data-max, so there is no value axis. */\n protected get _axis() {\n return false;\n }\n\n protected get _points() {\n return false;\n }\n\n protected get _circular() {\n return true;\n }\n\n private get _gauge() {\n return this.el.classList.contains('gauge');\n }\n\n /** Whether .labels names the rings, which a sparkline never does. */\n private get _labeled() {\n const list = this.el.classList;\n return list.contains('labels') && !list.contains('sparkline');\n }\n\n /** How much of a circle a full ring spans. */\n private get _span() {\n if (this._gauge) return 0.5;\n return this._labeled ? 0.75 : 1;\n }\n\n /** The number of segments data-segments asks for, or 0 for whole rings. */\n private get _segments() {\n const segments = Math.round(this._number('segments') ?? 0);\n return segments > 1 ? segments : 0;\n }\n\n /** A share as drawn: with segments, to the nearest whole segment. */\n private _lit(fraction: number) {\n const segments = this._segments;\n return segments ? Math.round(fraction * segments) / segments : fraction;\n }\n\n /**\n * A ring's dash pattern for a share of its span. Round caps reach half the\n * width past each end of a dash, so a capped dash is one width shorter and\n * its gap one width longer; one shorter than the width is a dot. With\n * segments, each lit segment is a dash with the ring gap after it, and\n * the last gap runs out the circle so the pattern does not repeat.\n */\n private _dash(fraction: number, length: number, capped: boolean) {\n const [cap, segments, span] = [capped ? this._width : 0, this._segments, this._span * length];\n if (!segments) return `${Math.max(0.001, fraction * span - cap).toFixed(3)} ${length.toFixed(3)}`;\n // A dash and its gap make one segment, even where a small ring leaves\n // too little room for the gap and the caps.\n const size = span / segments;\n const dash = Math.max(0.001, size - this._gap - cap);\n const lit = Array.from({ length: Math.round(fraction * segments) }, () => `${dash.toFixed(3)} ${(size - dash).toFixed(3)}`);\n return `${lit.join(' ').replace(/ [\\d.]+$/, '') || 0} ${length.toFixed(3)}`;\n }\n\n /** The distance between rings' middles, or one ring's width. */\n private get _step() {\n return this._radii.length > 1 ? this._radii[0] - this._radii[1] : this._width;\n }\n\n static key = 'Expressive_RadialChart';\n\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n super.show(index);\n this._rings.forEach((ring, i) => ring.classList.toggle('active', i === index));\n this._sweeps.forEach((sweep, i) => sweep?.classList.toggle('active', i === index));\n // LineChart hides the tooltip for -1 and for an index past the last row.\n if (this._tooltip.hidden) return;\n tintTooltip(this._tooltip, seriesColor(index));\n }\n\n /** The tooltip sits where the ring's fill ends. */\n protected _place(index: number) {\n const turn = this._turn(this._fractions[index]);\n const r = this._radii[index];\n const [x, y] = [r * Math.sin(turn * 2 * Math.PI), -r * Math.cos(turn * 2 * Math.PI)];\n this._tooltip.style.left = `${50 + x}%`;\n this._tooltip.style.top = `${((50 + y) / (this._gauge ? 50 : 100)) * 100}%`;\n // On the right half it opens leftwards, over the rings.\n this._tooltip.classList.toggle('end', x > 0);\n }\n\n /** A fraction of the ring as a turn clockwise from the top. */\n private _turn(fraction: number) {\n // A gauge starts at nine o'clock.\n return fraction * this._span - (this._gauge ? 0.25 : 0);\n }\n\n /** For more than one row, a legend of every row with its color and cell. */\n protected _guides(): Element[] {\n if (this.labels.length < 2) return [];\n const text = this.series[0].text;\n const colors = this.labels.map((_, i) => seriesColor(i));\n return [rowLegend('radial-chart-legend', colors, this.labels.map((label, i) => [label, text[i]]))];\n }\n\n /** The ring under the pointer by its distance from the middle, or -1. */\n protected _indexAt(e: PointerEvent) {\n const box = this._plot.getBoundingClientRect();\n // The middle is half the width down in both shapes.\n const [x, y] = [e.clientX - box.left - box.width / 2, e.clientY - box.top - box.width / 2];\n if (this._gauge && y > 0) return this._nameAt(e);\n // A gap belongs to a ring beside it.\n const distance = this._distance(x, y, box.width);\n return this._radii.findIndex((r) => Math.abs(distance - r) <= this._step / 2);\n }\n\n /**\n * How far a point is from the middle in the SVG's 100-unit box. In the\n * top left quarter .labels leaves empty, the names run straight across,\n * so only the height counts and a name picks its own ring.\n */\n private _distance(x: number, y: number, width: number) {\n // Only three-quarter rings leave that quarter empty.\n if (this._span === 0.75 && x < 0 && y < 0) return (-y / width) * 100;\n return (Math.hypot(x, y) / width) * 100;\n }\n\n /** Under a gauge's base line, the ring whose name is under the pointer, or -1. */\n private _nameAt(e: PointerEvent) {\n const name = (e.target as Element).closest('.radial-chart-names > span');\n return name ? [...name.parentElement!.children].indexOf(name) : -1;\n }\n\n /** The rings' turn, from three o'clock to the top or, for a gauge, to nine, and the SVG's box. */\n private get _frame(): [transform: string, viewBox: string] {\n return this._gauge ? ['rotate(180)', '-50 -50 100 50'] : ['rotate(-90)', '-50 -50 100 100'];\n }\n\n /**\n * With .gradient, a ring's fill drawn again in HTML: a conic gradient from\n * a tint of its colour at the ring's start to the full colour where the\n * fill ends, masked to the fill's own dash, so it follows the ring round.\n * An SVG stroke takes no conic gradient.\n */\n private _sweep(r: number, i: number, length: number) {\n const fraction = this._fractions[i];\n if (!fraction || !this.el.classList.contains('gradient')) return null;\n const [transform, viewBox] = this._frame;\n const width = this._width.toFixed(3);\n const dash = this._dash(fraction, length, true);\n const image = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='${viewBox}'><circle r='${r.toFixed(3)}' stroke-width='${width}' transform='${transform}' stroke-dasharray='${dash}' stroke-dashoffset='${(-this._width / 2).toFixed(3)}' stroke-linecap='round' fill='none' stroke='black'/></svg>`;\n const sweep = document.createElement('div');\n sweep.className = 'radial-chart-sweep';\n sweep.dataset.series = seriesColor(i);\n sweep.style.setProperty('--radial-chart-shape', `url(\"data:image/svg+xml,${encodeURIComponent(image)}\")`);\n sweep.style.setProperty('--radial-chart-from', `${this._turn(0)}turn`);\n sweep.style.setProperty('--radial-chart-to', `${fraction * this._span}turn`);\n return sweep;\n }\n\n /**\n * With .labels, each row's name left of its ring's start at the top,\n * ending at the middle line. CSS shrinks the text to fit crowded rings.\n * A gauge's names hang under its base line in a row each, innermost\n * first, starting below their rings' starts.\n */\n private _names(): Element[] {\n if (!this._labeled) return [];\n const count = this._radii.length;\n const names = document.createElement('div');\n names.className = 'radial-chart-names';\n names.style.setProperty('--radial-chart-step', this._step.toFixed(3));\n // The plot leaves room under a gauge for the rows.\n this._plot.style.setProperty('--radial-chart-rows', String(count));\n names.append(...this._radii.map((r, i) => {\n const name = document.createElement('span');\n // The ring's top, or a gauge ring's start along the base line.\n name.style.setProperty('--radial-chart-at', `${(50 - r).toFixed(3)}%`);\n name.style.setProperty('--radial-chart-row', String(count - 1 - i));\n name.textContent = this.labels[i];\n return name;\n }));\n return [names];\n }\n\n /**\n * An SVG of rings in a -50 to 50 box, the top half for a gauge. Each row\n * is a track circle and a fill circle whose dash is its share; CSS draws\n * them from --radial-chart-dash. The total is HTML over it.\n */\n protected _draw(): Element {\n const style = getComputedStyle(this.el);\n const token = (name: string, fallback: number) => {\n const value = parseFloat(style.getPropertyValue(`--md-comp-radial-chart-${name}`));\n return Number.isFinite(value) ? value : fallback;\n };\n const count = this.labels.length;\n let [width, gap] = [Math.max(0, token('thickness', 8)), Math.max(0, token('gap', 2))];\n // Too many rings to leave a middle thin, with their gaps, to fit.\n // ponytail: past about 18 rings they are hairlines; that many values want a bar chart.\n const scale = Math.min(1, (RADIUS * FILL) / (count * width + (count - 1) * gap || 1));\n [width, gap] = [width * scale, gap * scale];\n [this._width, this._gap] = [width, gap];\n this._radii = this.labels.map((_, i) => RADIUS - width / 2 - i * (width + gap));\n // A maximum of zero or less means nothing, so it falls back.\n const max = [parseFloat(this.el.dataset.max ?? ''), this.options.max ?? NaN, 100].find((value) => value > 0)!;\n this._fractions = this.series[0].values.map((value) => this._lit(Math.min(1, Math.max(0, (value ?? 0) / max))));\n\n const [transform, viewBox] = this._frame;\n const svg = node('svg', { viewBox, focusable: 'false' });\n const span = this._span;\n this._sweeps = [];\n this._rings = this._radii.map((r, i) => {\n const length = 2 * Math.PI * r;\n // A capped dash starts half a width in, where its round cap ends.\n const circle = (name: string, fraction: number, capped: boolean) => {\n const ring = node('circle', { class: name, r: r.toFixed(3), transform, 'stroke-width': width.toFixed(3) });\n ring.style.setProperty('--radial-chart-dash', this._dash(fraction, length, capped));\n if (capped) {\n ring.style.setProperty('--radial-chart-offset', (-width / 2).toFixed(3));\n ring.classList.add('capped');\n }\n return ring;\n };\n const ring = circle('radial-chart-ring', this._fractions[i], true) as SVGCircleElement;\n ring.dataset.series = seriesColor(i);\n // An empty ring would still draw its round cap.\n if (!this._fractions[i]) ring.classList.add('empty');\n // Only a track short of a whole circle, or in segments, has ends to round.\n svg.append(circle('radial-chart-track', 1, span < 1 || !!this._segments), ring);\n this._sweeps.push(this._sweep(r, i, length));\n return ring;\n });\n\n const rings = document.createElement('div');\n rings.className = 'radial-chart-rings';\n rings.setAttribute('aria-hidden', 'true');\n rings.style.setProperty('--radial-chart-middle', `${(this._radii[count - 1] - this._width / 2) * 2}%`);\n rings.append(svg, ...this._sweeps.filter((sweep) => sweep !== null), ...this._names());\n\n const total = this._total('radial-chart-total');\n if (total) rings.append(total);\n return rings;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ring"]
7
+ }
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  LineChart,
3
- numberFormat
4
- } from "./chunk-ZM3XBHWV.mjs";
3
+ ROW_COLORS,
4
+ percentLabel,
5
+ seriesColor
6
+ } from "./chunk-IQOTGGHX.mjs";
5
7
 
6
8
  // src/ts/components/treemapChart.ts
7
- var COLORS = 6;
8
9
  var NEXT = ["ArrowRight", "ArrowDown"];
9
10
  var PREVIOUS = ["ArrowLeft", "ArrowUp"];
10
11
  var sum = (areas) => areas.reduce((total, area) => total + area, 0);
@@ -61,22 +62,20 @@ var TreemapChart = class extends LineChart {
61
62
  * one, as when focus asks for the first row. Pass -1 to hide them.
62
63
  */
63
64
  show(index) {
65
+ if (!this._tooltip) return;
64
66
  const row = this._drawnFrom(index);
65
- if (!this._tooltip || row === this.activeIndex) return;
66
- this._boxes.forEach((box, i) => box?.classList.toggle("active", i === row));
67
+ if (row === this.activeIndex) return;
68
+ this._boxes[this.activeIndex]?.classList.remove("active");
69
+ this._boxes[row]?.classList.add("active");
67
70
  super.show(row);
68
- this._share(row);
69
71
  }
70
72
  /** The first row from `index` on with a rectangle, or -1. */
71
73
  _drawnFrom(index) {
72
74
  return index < 0 ? index : this._boxes.findIndex((box, i) => i >= index && box);
73
75
  }
74
- /** Adds the row's share of the whole to its cell in the tooltip, as the pie chart writes it. */
76
+ /** The row's share of the whole, written as the pie chart writes it. */
75
77
  _share(row) {
76
- if (row < 0) return;
77
- const share = this._values[row] / sum(this._values);
78
- const percent = numberFormat(this.el, { style: "percent", maximumFractionDigits: share < 0.1 ? 1 : 0 });
79
- this._tooltip.querySelector("span:nth-of-type(2)").textContent += ` (${percent.format(share)})`;
78
+ return percentLabel(this.el, this._values[row] / sum(this._values));
80
79
  }
81
80
  /**
82
81
  * Opens the tooltip from the middle of the row's rectangle toward the
@@ -126,7 +125,7 @@ var TreemapChart = class extends LineChart {
126
125
  if (!value) return null;
127
126
  const box = document.createElement("div");
128
127
  box.className = "treemap-chart-box";
129
- box.dataset.series = String(drawn++ % COLORS + 1);
128
+ box.dataset.series = seriesColor(drawn++, ROW_COLORS);
130
129
  const [name, text] = [document.createElement("span"), document.createElement("span")];
131
130
  [name.textContent, text.textContent] = [this.labels[i], this.series[0].text[i]];
132
131
  box.append(name, text);
@@ -142,6 +141,7 @@ var TreemapChart = class extends LineChart {
142
141
  }
143
142
  /** Squarifies the positive rows, largest first, equal values in table order, and places their rectangles. */
144
143
  _layout() {
144
+ if (!this._plot) return this._sizes.disconnect();
145
145
  const [width, height] = [this._plot.clientWidth || 1, this._plot.clientHeight || 1];
146
146
  const rows = this._values.map((_, i) => i).filter((i) => this._values[i]).sort((a, b) => this._values[b] - this._values[a]);
147
147
  const scale = width * height / sum(this._values);
@@ -164,4 +164,4 @@ TreemapChart.key = "Expressive_TreemapChart";
164
164
  export {
165
165
  TreemapChart
166
166
  };
167
- //# sourceMappingURL=chunk-VH4BMAZS.mjs.map
167
+ //# sourceMappingURL=chunk-UKQK5GWR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/treemapChart.ts"],
4
+ "sourcesContent": ["import { LineChart, LineChartOptions, ROW_COLORS, percentLabel, seriesColor } from './lineChart';\n\nexport type TreemapChartOptions = LineChartOptions;\n\n/** A rectangle: its inline start, top, width and height. */\ntype Box = [x: number, y: number, width: number, height: number];\n\n// ponytail: rows past six repeat the colors, so neighbours can match.\n/** The keys that move to the next row and to the one before, in any direction. */\nconst NEXT = ['ArrowRight', 'ArrowDown'];\nconst PREVIOUS = ['ArrowLeft', 'ArrowUp'];\n\nconst sum = (areas: number[]) => areas.reduce((total, area) => total + area, 0);\n\n/** The box with its axes swapped, so one strip routine lays out both ways. */\nconst flip = ([x, y, width, height]: Box): Box => [y, x, height, width];\n\n/** How far the least square of `areas` is from square, in a strip along a side `side` long. */\nfunction worst(areas: number[], side: number) {\n const [total, squared] = [sum(areas) ** 2, side ** 2];\n return Math.max(...areas.map((area) => Math.max((squared * area) / total, total / (squared * area))));\n}\n\n/**\n * Lays `areas` out as one strip down the inline start of `free`, or across\n * its top when it is taller than wide, in order, and returns their boxes and\n * the space left beside the strip.\n */\nfunction strip(areas: number[], free: Box): [Box[], Box] {\n if (free[2] < free[3]) {\n const [boxes, rest] = strip(areas, flip(free));\n return [boxes.map(flip), flip(rest)];\n }\n const [x, y, width, height] = free;\n const across = sum(areas) / height;\n let top = y;\n const boxes = areas.map((area): Box => {\n const box: Box = [x, top, across, area / across];\n top += area / across;\n return box;\n });\n return [boxes, [x + across, y, width - across, height]];\n}\n\n/**\n * The squarified treemap of Bruls, Huizing and van Wijk: `areas`, largest\n * first and adding up to the free box's area, each join the current strip\n * while that keeps its rectangles nearer square, and the strip is laid down\n * when it would not.\n */\nfunction squarify(areas: number[], free: Box): Box[] {\n const boxes: Box[] = [];\n let row: number[] = [];\n for (const area of areas) {\n const side = Math.min(free[2], free[3]);\n if (row.length && worst([...row, area], side) > worst(row, side)) {\n const [laid, rest] = strip(row, free);\n boxes.push(...laid);\n [free, row] = [rest, []];\n }\n row.push(area);\n }\n return [...boxes, ...strip(row, free)[0]];\n}\n\n/** Whether a point, as fractions of the plot, lies in a box. */\nconst inside = ([x, y, width, height]: Box, at: number, down: number) =>\n at >= x && at < x + width && down >= y && down < y + height;\n\n/**\n * The tooltip's top or bottom for a box: from its top in the plot's upper\n * half, and up from its bottom in the lower half, so it stays in the plot.\n */\nconst hang = (y: number, height: number) => (y + height / 2 > 0.5\n ? { top: 'auto', bottom: `${(1 - y - height) * 100}%` }\n : { top: `${y * 100}%`, bottom: 'auto' });\n\n/**\n * Treemap chart. It reads its <table> like LineChart, but draws each row of\n * the first value column as a rectangle whose area is its share of the\n * whole, filling the plot, the largest at the top inline-start corner. Rows\n * with no positive value draw nothing. Further columns show in the tooltip.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class TreemapChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Each row's positive value, or 0 for a row with no rectangle. */\n private _values: number[];\n /** Each row's rectangle, or null. */\n private _boxes: (HTMLElement | null)[];\n /** Each drawn row's place as fractions of the plot. */\n private _places: Box[];\n /** Lays the rectangles out again when the plot changes shape. */\n private _sizes: ResizeObserver;\n\n protected get _type() {\n return 'treemap-chart';\n }\n\n /** Area carries the value, so there is no value axis. */\n protected get _axis() {\n return false;\n }\n\n protected get _points() {\n return false;\n }\n\n static key = 'Expressive_TreemapChart';\n\n /**\n * Highlights one row: outlines its rectangle and fills the tooltip, with\n * the row's share. A row with no rectangle passes to the next one with\n * one, as when focus asks for the first row. Pass -1 to hide them.\n */\n show(index: number) {\n if (!this._tooltip) return;\n const row = this._drawnFrom(index);\n if (row === this.activeIndex) return;\n this._boxes[this.activeIndex]?.classList.remove('active');\n this._boxes[row]?.classList.add('active');\n super.show(row);\n }\n\n /** The first row from `index` on with a rectangle, or -1. */\n private _drawnFrom(index: number) {\n return index < 0 ? index : this._boxes.findIndex((box, i) => i >= index && box);\n }\n\n /** The row's share of the whole, written as the pie chart writes it. */\n protected _share(row: number) {\n return percentLabel(this.el, this._values[row] / sum(this._values));\n }\n\n /**\n * Opens the tooltip from the middle of the row's rectangle toward the\n * middle of the plot.\n */\n protected _place(index: number) {\n const [x, y, width, height] = this._places[index];\n const middle = x + width / 2;\n const left = this._reversed ? 1 - middle : middle;\n Object.assign(this._tooltip.style, { left: `${left * 100}%`, ...hang(y, height) });\n this._tooltip.classList.toggle('end', left > 0.5);\n }\n\n /** The row whose rectangle is under the pointer, or -1. */\n protected _indexAt(e: PointerEvent) {\n const box = this._plot.getBoundingClientRect();\n const across = (e.clientX - box.left) / box.width;\n const [at, down] = [this._reversed ? 1 - across : across, (e.clientY - box.top) / box.height];\n return this._places.findIndex((place) => place && inside(place, at, down));\n }\n\n /**\n * The arrows step through the rows with a rectangle in table order, which\n * runs in no one direction on screen, so they do not swap in a\n * right-to-left page. Home and End go to the first and last of them.\n */\n protected _keyTarget(key: string): number | undefined {\n const drawn = this._boxes.flatMap((box, i) => (box ? [i] : []));\n const [at, last] = [drawn.indexOf(this.activeIndex), drawn.length - 1];\n const step = NEXT.includes(key) ? Math.min(at + 1, last)\n : PREVIOUS.includes(key) ? Math.max(at - 1, 0)\n : ({ Home: 0, End: last } as Record<string, number>)[key];\n return step === undefined ? super._keyTarget(key) : drawn[step];\n }\n\n destroy() {\n this._sizes?.disconnect();\n super.destroy();\n }\n\n /** Neither row labels nor a legend: each rectangle carries its name. */\n protected _guides(): Element[] {\n return [];\n }\n\n /** One rectangle per positive row, in table order, placed by _layout(). */\n protected _draw(): Element {\n this._values = this.series[0].values.map((value) => Math.max(0, value ?? 0));\n const container = document.createElement('div');\n container.className = 'treemap-chart-boxes';\n container.setAttribute('aria-hidden', 'true');\n let drawn = 0;\n this._boxes = this._values.map((value, i) => {\n if (!value) return null;\n const box = document.createElement('div');\n box.className = 'treemap-chart-box';\n box.dataset.series = seriesColor(drawn++, ROW_COLORS);\n const [name, text] = [document.createElement('span'), document.createElement('span')];\n [name.textContent, text.textContent] = [this.labels[i], this.series[0].text[i]];\n box.append(name, text);\n container.append(box);\n return box;\n });\n // The squares depend on the plot's shape, so it goes in the page to be measured.\n this.el.append(this._plot);\n this._layout();\n this._sizes?.disconnect();\n this._sizes = new ResizeObserver(() => this._layout());\n this._sizes.observe(this._plot);\n return container;\n }\n\n /** Squarifies the positive rows, largest first, equal values in table order, and places their rectangles. */\n private _layout() {\n // update() with no rows drops the plot without drawing a new one, but\n // the old plot's observer still fires as that plot leaves the page.\n if (!this._plot) return this._sizes.disconnect();\n // A hidden plot has no size; lay it out as a square until it shows.\n const [width, height] = [this._plot.clientWidth || 1, this._plot.clientHeight || 1];\n const rows = this._values.map((_, i) => i).filter((i) => this._values[i]).sort((a, b) => this._values[b] - this._values[a]);\n const scale = (width * height) / sum(this._values);\n const laid = squarify(rows.map((i) => this._values[i] * scale), [0, 0, width, height]);\n this._places = [];\n rows.forEach((row, k) => {\n const [x, y, w, h] = laid[k];\n const place = (this._places[row] = [x / width, y / height, w / width, h / height]);\n Object.assign(this._boxes[row]!.style, {\n insetInlineStart: `${place[0] * 100}%`,\n top: `${place[1] * 100}%`,\n width: `${place[2] * 100}%`,\n height: `${place[3] * 100}%`\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["boxes"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
6
  restoreAttribute
7
- } from "./chunk-ZVLOUDIJ.mjs";
7
+ } from "./chunk-67UNY7RH.mjs";
8
8
 
9
9
  // src/ts/components/cards.ts
10
10
  var _defaults = {
@@ -36,7 +36,7 @@ function isCardReveal(el) {
36
36
  el.querySelectorAll('button.card-reveal-trigger[type="button"]')
37
37
  ).some((trigger) => isUsableCardTrigger(trigger, el, panels[0]));
38
38
  }
39
- var Cards = class extends Component {
39
+ var _Cards = class _Cards extends Component {
40
40
  constructor(el, options = {}) {
41
41
  super(el, options);
42
42
  this.isOpen = false;
@@ -140,16 +140,17 @@ var Cards = class extends Component {
140
140
  Utils.onDocumentReady(() => {
141
141
  const cards = Array.from(document.querySelectorAll(CARDS_SELECTOR)).filter(isCardReveal);
142
142
  cards.forEach((el) => {
143
- if (el["Expressive_Cards"] == void 0) this.init(el);
143
+ if (!_Cards.getInstance(el)) this.init(el);
144
144
  });
145
145
  });
146
146
  }
147
147
  };
148
- Cards.key = "Expressive_Cards";
148
+ _Cards.key = "Expressive_Cards";
149
+ var Cards = _Cards;
149
150
 
150
151
  export {
151
152
  CARDS_SELECTOR,
152
153
  isCardReveal,
153
154
  Cards
154
155
  };
155
- //# sourceMappingURL=chunk-OYNUDOHR.mjs.map
156
+ //# sourceMappingURL=chunk-UTSLYQ65.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/components/cards.ts"],
4
- "sourcesContent": ["import { Utils, restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions, } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * What counts as a card reveal.\n *\n * Shared with `components/registry.ts` so `Cards.Init()` and `AutoInit()` use\n * the same semantic selector.\n */\nexport const CARDS_SELECTOR =\n 'article:has(> aside[id]:not([id=\"\"])):not(:has(> aside ~ aside)):has(> button.card-reveal-trigger[type=\"button\"], > :not(aside) button.card-reveal-trigger[type=\"button\"])';\n\nconst REVEAL_INITIALIZED_CLASS = 'card-reveal-initialized';\n\nfunction hasAccessibleName(trigger: HTMLButtonElement) {\n const label = trigger.getAttribute('aria-label');\n if (label?.trim()) return true;\n\n const labelledBy = trigger.getAttribute('aria-labelledby');\n if (labelledBy) {\n const referencedText = labelledBy\n .trim()\n .split(/\\s+/)\n .map((id) => Utils.getElementById(trigger, id)?.textContent ?? '')\n .join(' ')\n .trim();\n if (referencedText) return true;\n }\n\n const content = trigger.cloneNode(true) as HTMLButtonElement;\n content.querySelectorAll('[aria-hidden=\"true\"]').forEach((node) => node.remove());\n return Boolean(content.textContent?.trim());\n}\n\nfunction isUsableCardTrigger(\n trigger: HTMLButtonElement,\n card: Element,\n panel: HTMLElement\n) {\n return (\n trigger.closest('article') === card &&\n !panel.contains(trigger) &&\n !trigger.disabled &&\n trigger.getAttribute('aria-disabled') !== 'true' &&\n hasAccessibleName(trigger)\n );\n}\n\nexport function isCardReveal(el: Element): el is HTMLElement {\n if (el.tagName !== 'ARTICLE') return false;\n const panels = el.querySelectorAll<HTMLElement>(':scope > aside');\n if (panels.length !== 1 || !panels[0].id) return false;\n\n return Array.from(\n el.querySelectorAll<HTMLButtonElement>('button.card-reveal-trigger[type=\"button\"]')\n ).some((trigger) => isUsableCardTrigger(trigger, el, panels[0]));\n}\n\nexport class Cards extends Component<CardsOptions> {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private _activators: HTMLButtonElement[];\n private _ownsRevealInitializedClass = false;\n private _initialAriaControls = new Map<HTMLButtonElement, string | null>();\n private _lastActivator: HTMLButtonElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions> = {}) {\n super(el, options);\n\n const cardReveals = this.el.querySelectorAll<HTMLElement>(':scope > aside');\n const cardReveal = cardReveals.length === 1 ? cardReveals[0] : null;\n const activators = cardReveal\n ? Array.from(\n this.el.querySelectorAll<HTMLButtonElement>(\n 'button.card-reveal-trigger[type=\"button\"]'\n )\n ).filter(\n (activator) => isUsableCardTrigger(activator, this.el, cardReveal)\n )\n : [];\n\n this.cardReveal = cardReveal?.id && activators.length > 0 ? cardReveal : null;\n this._activators = this.cardReveal ? activators : [];\n\n if (this.cardReveal) {\n this._ownsRevealInitializedClass = !this.el.classList.contains(REVEAL_INITIALIZED_CLASS);\n this.el.classList.add(REVEAL_INITIALIZED_CLASS);\n this._activators.forEach((activator) => {\n this._initialAriaControls.set(activator, activator.getAttribute('aria-controls'));\n activator.ariaExpanded = 'false';\n activator.setAttribute('aria-controls', this.cardReveal.id);\n });\n\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = true;\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Cards';\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n if (this.cardReveal) {\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = false;\n if (this._ownsRevealInitializedClass) this.el.classList.remove(REVEAL_INITIALIZED_CLASS);\n }\n this._activators.forEach((activator) => {\n activator.removeAttribute('aria-expanded');\n const initialAriaControls = this._initialAriaControls.get(activator);\n if (initialAriaControls !== undefined) restoreAttribute(activator, 'aria-controls', initialAriaControls);\n });\n this.isOpen = false;\n this._activators = [];\n this._initialAriaControls.clear();\n this._lastActivator = null;\n super.destroy();\n }\n\n _setupEventHandlers = () => {\n const { signal } = this._events;\n this._activators.forEach((activator) => activator.addEventListener('click', this._handleClickInteraction, { signal }));\n this.el.addEventListener('keydown', this._handleKeydownEvent, { signal });\n };\n\n _handleClickInteraction = (event: MouseEvent) => {\n this._lastActivator = event.currentTarget as HTMLButtonElement;\n this._handleRevealEvent();\n };\n\n _handleKeydownEvent = (event: KeyboardEvent) => {\n const target = event.target instanceof Element ? event.target.closest('article') : null;\n if (target !== this.el || event.key !== 'Escape' || !this.isOpen) return;\n event.preventDefault();\n this.close();\n };\n\n _handleRevealEvent = () => {\n if (this.isOpen) this.close();\n else this.open();\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen || !this.cardReveal) return;\n this.isOpen = true;\n this.cardReveal.classList.add('open');\n this.cardReveal.inert = false;\n this._activators.forEach((activator) => (activator.ariaExpanded = 'true'));\n this._notify('open', this.options.onOpen, { current: () => this.isOpen });\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen || !this.cardReveal) return;\n\n // In a shadow root document.activeElement is the host, never the reveal.\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const focusWasInside = this.cardReveal.contains(focused);\n this.isOpen = false;\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = true;\n this._activators.forEach((activator) => (activator.ariaExpanded = 'false'));\n this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n\n if (focusWasInside) {\n (this._lastActivator ?? this._activators[0])?.focus();\n }\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n const cards = Array.from(document.querySelectorAll(CARDS_SELECTOR)).filter(isCardReveal);\n cards.forEach((el) => {\n if (el['Expressive_Cards'] == undefined) this.init(el);\n });\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions, } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * What counts as a card reveal.\n *\n * Shared with `components/registry.ts` so `Cards.Init()` and `AutoInit()` use\n * the same semantic selector.\n */\nexport const CARDS_SELECTOR =\n 'article:has(> aside[id]:not([id=\"\"])):not(:has(> aside ~ aside)):has(> button.card-reveal-trigger[type=\"button\"], > :not(aside) button.card-reveal-trigger[type=\"button\"])';\n\nconst REVEAL_INITIALIZED_CLASS = 'card-reveal-initialized';\n\nfunction hasAccessibleName(trigger: HTMLButtonElement) {\n const label = trigger.getAttribute('aria-label');\n if (label?.trim()) return true;\n\n const labelledBy = trigger.getAttribute('aria-labelledby');\n if (labelledBy) {\n const referencedText = labelledBy\n .trim()\n .split(/\\s+/)\n .map((id) => Utils.getElementById(trigger, id)?.textContent ?? '')\n .join(' ')\n .trim();\n if (referencedText) return true;\n }\n\n const content = trigger.cloneNode(true) as HTMLButtonElement;\n content.querySelectorAll('[aria-hidden=\"true\"]').forEach((node) => node.remove());\n return Boolean(content.textContent?.trim());\n}\n\nfunction isUsableCardTrigger(\n trigger: HTMLButtonElement,\n card: Element,\n panel: HTMLElement\n) {\n return (\n trigger.closest('article') === card &&\n !panel.contains(trigger) &&\n !trigger.disabled &&\n trigger.getAttribute('aria-disabled') !== 'true' &&\n hasAccessibleName(trigger)\n );\n}\n\nexport function isCardReveal(el: Element): el is HTMLElement {\n if (el.tagName !== 'ARTICLE') return false;\n const panels = el.querySelectorAll<HTMLElement>(':scope > aside');\n if (panels.length !== 1 || !panels[0].id) return false;\n\n return Array.from(\n el.querySelectorAll<HTMLButtonElement>('button.card-reveal-trigger[type=\"button\"]')\n ).some((trigger) => isUsableCardTrigger(trigger, el, panels[0]));\n}\n\nexport class Cards extends Component<CardsOptions> {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private _activators: HTMLButtonElement[];\n private _ownsRevealInitializedClass = false;\n private _initialAriaControls = new Map<HTMLButtonElement, string | null>();\n private _lastActivator: HTMLButtonElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions> = {}) {\n super(el, options);\n\n const cardReveals = this.el.querySelectorAll<HTMLElement>(':scope > aside');\n const cardReveal = cardReveals.length === 1 ? cardReveals[0] : null;\n const activators = cardReveal\n ? Array.from(\n this.el.querySelectorAll<HTMLButtonElement>(\n 'button.card-reveal-trigger[type=\"button\"]'\n )\n ).filter(\n (activator) => isUsableCardTrigger(activator, this.el, cardReveal)\n )\n : [];\n\n this.cardReveal = cardReveal?.id && activators.length > 0 ? cardReveal : null;\n this._activators = this.cardReveal ? activators : [];\n\n if (this.cardReveal) {\n this._ownsRevealInitializedClass = !this.el.classList.contains(REVEAL_INITIALIZED_CLASS);\n this.el.classList.add(REVEAL_INITIALIZED_CLASS);\n this._activators.forEach((activator) => {\n this._initialAriaControls.set(activator, activator.getAttribute('aria-controls'));\n activator.ariaExpanded = 'false';\n activator.setAttribute('aria-controls', this.cardReveal.id);\n });\n\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = true;\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Cards';\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n if (this.cardReveal) {\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = false;\n if (this._ownsRevealInitializedClass) this.el.classList.remove(REVEAL_INITIALIZED_CLASS);\n }\n this._activators.forEach((activator) => {\n activator.removeAttribute('aria-expanded');\n const initialAriaControls = this._initialAriaControls.get(activator);\n if (initialAriaControls !== undefined) restoreAttribute(activator, 'aria-controls', initialAriaControls);\n });\n this.isOpen = false;\n this._activators = [];\n this._initialAriaControls.clear();\n this._lastActivator = null;\n super.destroy();\n }\n\n _setupEventHandlers = () => {\n const { signal } = this._events;\n this._activators.forEach((activator) => activator.addEventListener('click', this._handleClickInteraction, { signal }));\n this.el.addEventListener('keydown', this._handleKeydownEvent, { signal });\n };\n\n _handleClickInteraction = (event: MouseEvent) => {\n this._lastActivator = event.currentTarget as HTMLButtonElement;\n this._handleRevealEvent();\n };\n\n _handleKeydownEvent = (event: KeyboardEvent) => {\n const target = event.target instanceof Element ? event.target.closest('article') : null;\n if (target !== this.el || event.key !== 'Escape' || !this.isOpen) return;\n event.preventDefault();\n this.close();\n };\n\n _handleRevealEvent = () => {\n if (this.isOpen) this.close();\n else this.open();\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen || !this.cardReveal) return;\n this.isOpen = true;\n this.cardReveal.classList.add('open');\n this.cardReveal.inert = false;\n this._activators.forEach((activator) => (activator.ariaExpanded = 'true'));\n this._notify('open', this.options.onOpen, { current: () => this.isOpen });\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen || !this.cardReveal) return;\n\n // In a shadow root document.activeElement is the host, never the reveal.\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const focusWasInside = this.cardReveal.contains(focused);\n this.isOpen = false;\n this.cardReveal.classList.remove('open');\n this.cardReveal.inert = true;\n this._activators.forEach((activator) => (activator.ariaExpanded = 'false'));\n this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n\n if (focusWasInside) {\n (this._lastActivator ?? this._activators[0])?.focus();\n }\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n const cards = Array.from(document.querySelectorAll(CARDS_SELECTOR)).filter(isCardReveal);\n cards.forEach((el) => {\n if (!Cards.getInstance(el)) this.init(el);\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Utils,
3
3
  controllerFor
4
- } from "./chunk-ZVLOUDIJ.mjs";
4
+ } from "./chunk-67UNY7RH.mjs";
5
5
 
6
6
  // src/ts/behaviors/paneResize.ts
7
7
  var container = ":is(.panes, .pane-layout, .list-detail, .supporting-pane-layout):not(.equal, .three-pane)";
@@ -105,4 +105,4 @@ var PaneResize = _PaneResize;
105
105
  export {
106
106
  PaneResize
107
107
  };
108
- //# sourceMappingURL=chunk-7W7TV6NY.mjs.map
108
+ //# sourceMappingURL=chunk-VS5OJBOD.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/behaviors/paneResize.ts"],
4
- "sourcesContent": ["import { Utils, controllerFor } from '../core/utils';\n\nconst container = ':is(.panes, .pane-layout, .list-detail, .supporting-pane-layout):not(.equal, .three-pane)';\nconst handleSelector = `${container} > button.drag-handle`;\n// The narrowest a resized pane may get, and the arrow-key step.\nconst minWidth = 240;\nconst step = 16;\n\n/**\n * Resizable panes. A `<button class=\"drag-handle\">` between the two panes of a\n * list-detail or supporting layout resizes the pane whose width is a token:\n * the list pane, or the supporting pane. Dragging moves the boundary; Left and\n * Right move it 16px (64px with Shift); Home and End jump to the narrowest\n * and widest; a click, Enter or Space steps through narrow, middle and wide,\n * the single-pointer alternative to dragging. The other pane keeps at least\n * `--md-comp-pane-primary-min-width`.\n *\n * The width is written as `--md-comp-pane-list-width` or\n * `--md-comp-pane-supporting-width` on the container's style.\n */\nexport class PaneResize {\n private static _dragged = false;\n\n // A second Init adds nothing: addEventListener ignores a listener it has.\n static Init() {\n if (typeof document === 'undefined') return;\n document.addEventListener('pointerdown', PaneResize._onPointerDown);\n document.addEventListener('keydown', PaneResize._onKeyDown);\n document.addEventListener('click', PaneResize._onClick);\n }\n\n /** The current width of the handle's resizable pane, or null for a handle outside a supported layout. */\n static width(handle: Element): number | null {\n const pane = PaneResize._pane(handle);\n return pane ? pane.getBoundingClientRect().width : null;\n }\n\n /** Sets the resizable pane's width, clamped to what the layout can hold. */\n static setWidth(handle: Element, width: number) {\n const pane = PaneResize._pane(handle);\n if (!pane) return;\n const [min, max] = PaneResize._bounds(handle);\n const layout = handle.parentElement;\n layout.style.setProperty(PaneResize._token(layout), `${Math.round(Math.min(Math.max(width, min), max))}px`);\n }\n\n private static _token(layout: Element) {\n return layout.matches('.supporting, .supporting-pane-layout')\n ? '--md-comp-pane-supporting-width'\n : '--md-comp-pane-list-width';\n }\n\n /** The pane the handle resizes: the list or supporting pane beside it. */\n private static _pane(handle: Element): Element | null {\n if (!handle.matches(handleSelector)) return null;\n const layout = handle.parentElement;\n const trailing = layout.matches('.supporting, .supporting-pane-layout') && !layout.matches('.start, .left');\n return trailing ? handle.nextElementSibling : handle.previousElementSibling;\n }\n\n private static _bounds(handle: Element): [number, number] {\n const layout = handle.parentElement;\n const style = getComputedStyle(layout);\n const other = parseFloat(style.getPropertyValue('--md-comp-pane-primary-min-width')) || 360;\n // The separated appearance pads the layout, so measure its content box.\n const content = layout.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);\n const room = content - handle.getBoundingClientRect().width - other;\n return [minWidth, Math.max(minWidth, room)];\n }\n\n /** True when the resizable pane sits physically left of the handle, so moving right widens it. */\n private static _paneIsLeft(handle: Element) {\n return PaneResize._pane(handle).getBoundingClientRect().left < handle.getBoundingClientRect().left;\n }\n\n private static _onPointerDown(e: PointerEvent) {\n const handle = Utils.closestInPath(e, handleSelector) as HTMLElement;\n if (!handle || e.button !== 0) return;\n const pane = PaneResize._pane(handle);\n if (!pane) return;\n const startX = e.clientX;\n const startWidth = pane.getBoundingClientRect().width;\n const sign = PaneResize._paneIsLeft(handle) ? 1 : -1;\n PaneResize._dragged = false;\n handle.setPointerCapture(e.pointerId);\n const move = (event: PointerEvent) => {\n const delta = event.clientX - startX;\n // A few pixels of travel is still a click.\n if (Math.abs(delta) < 4 && !PaneResize._dragged) return;\n PaneResize._dragged = true;\n PaneResize.setWidth(handle, startWidth + sign * delta);\n };\n const drag = controllerFor(handle);\n const end = () => drag.abort();\n const { signal } = drag;\n handle.addEventListener('pointermove', move, { signal });\n handle.addEventListener('pointerup', end, { signal });\n handle.addEventListener('pointercancel', end, { signal });\n }\n\n private static _onClick(e: MouseEvent) {\n const handle = Utils.closestInPath(e, handleSelector);\n if (!handle) return;\n // The click that ends a mouse drag is not a request to step. A keyboard\n // click (detail 0) always is, even after a touch drag that left the flag\n // set; the next pointerdown clears it. BottomSheets guards the same way.\n if (e.detail !== 0 && PaneResize._dragged) return;\n const [min, max] = PaneResize._bounds(handle);\n const current = PaneResize.width(handle);\n const next = [min, (min + max) / 2, max].find((width) => width > current + 1) ?? min;\n PaneResize.setWidth(handle, next);\n }\n\n private static _onKeyDown(e: KeyboardEvent) {\n const handle = Utils.closestInPath(e, handleSelector);\n if (!handle || !Utils.plainKey(e)) return;\n const current = PaneResize.width(handle);\n const [min, max] = PaneResize._bounds(handle);\n const amount = e.shiftKey ? step * 4 : step;\n const physical = { ArrowLeft: -amount, ArrowRight: amount }[e.key];\n let width: number;\n if (physical) width = current + (PaneResize._paneIsLeft(handle) ? physical : -physical);\n else if (e.key === 'Home') width = min;\n else if (e.key === 'End') width = max;\n else return;\n e.preventDefault();\n PaneResize.setWidth(handle, width);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Utils, controllerFor } from '../core/utils';\n\nconst container = ':is(.panes, .pane-layout, .list-detail, .supporting-pane-layout):not(.equal, .three-pane)';\nconst handleSelector = `${container} > button.drag-handle`;\n// The narrowest a resized pane may get, and the arrow-key step.\nconst minWidth = 240;\nconst step = 16;\n\n/**\n * Resizable panes. A `<button class=\"drag-handle\">` between the two panes of a\n * list-detail or supporting layout resizes the pane whose width is a token:\n * the list pane, or the supporting pane. Dragging moves the boundary; Left and\n * Right move it 16px (64px with Shift); Home and End jump to the narrowest\n * and widest; a click, Enter or Space steps through narrow, middle and wide,\n * the single-pointer alternative to dragging. The other pane keeps at least\n * `--md-comp-pane-primary-min-width`.\n *\n * The width is written as `--md-comp-pane-list-width` or\n * `--md-comp-pane-supporting-width` on the container's style.\n */\nexport class PaneResize {\n private static _dragged = false;\n\n // A second Init adds nothing: addEventListener ignores a listener it has.\n static Init() {\n if (typeof document === 'undefined') return;\n document.addEventListener('pointerdown', PaneResize._onPointerDown);\n document.addEventListener('keydown', PaneResize._onKeyDown);\n document.addEventListener('click', PaneResize._onClick);\n }\n\n /** The current width of the handle's resizable pane, or null for a handle outside a supported layout. */\n static width(handle: Element): number | null {\n const pane = PaneResize._pane(handle);\n return pane ? pane.getBoundingClientRect().width : null;\n }\n\n /** Sets the resizable pane's width, clamped to what the layout can hold. */\n static setWidth(handle: Element, width: number) {\n const pane = PaneResize._pane(handle);\n if (!pane) return;\n const [min, max] = PaneResize._bounds(handle);\n const layout = handle.parentElement;\n layout.style.setProperty(PaneResize._token(layout), `${Math.round(Math.min(Math.max(width, min), max))}px`);\n }\n\n private static _token(layout: Element) {\n return layout.matches('.supporting, .supporting-pane-layout')\n ? '--md-comp-pane-supporting-width'\n : '--md-comp-pane-list-width';\n }\n\n /** The pane the handle resizes: the list or supporting pane beside it. */\n private static _pane(handle: Element): Element | null {\n if (!handle.matches(handleSelector)) return null;\n const layout = handle.parentElement;\n const trailing = layout.matches('.supporting, .supporting-pane-layout') && !layout.matches('.start, .left');\n return trailing ? handle.nextElementSibling : handle.previousElementSibling;\n }\n\n private static _bounds(handle: Element): [number, number] {\n const layout = handle.parentElement;\n const style = getComputedStyle(layout);\n const other = parseFloat(style.getPropertyValue('--md-comp-pane-primary-min-width')) || 360;\n // The separated appearance pads the layout, so measure its content box.\n const content = layout.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);\n const room = content - handle.getBoundingClientRect().width - other;\n return [minWidth, Math.max(minWidth, room)];\n }\n\n /** True when the resizable pane sits physically left of the handle, so moving right widens it. */\n private static _paneIsLeft(handle: Element) {\n return PaneResize._pane(handle).getBoundingClientRect().left < handle.getBoundingClientRect().left;\n }\n\n private static _onPointerDown(e: PointerEvent) {\n const handle = Utils.closestInPath<HTMLElement>(e, handleSelector);\n if (!handle || e.button !== 0) return;\n const pane = PaneResize._pane(handle);\n if (!pane) return;\n const startX = e.clientX;\n const startWidth = pane.getBoundingClientRect().width;\n const sign = PaneResize._paneIsLeft(handle) ? 1 : -1;\n PaneResize._dragged = false;\n handle.setPointerCapture(e.pointerId);\n const move = (event: PointerEvent) => {\n const delta = event.clientX - startX;\n // A few pixels of travel is still a click.\n if (Math.abs(delta) < 4 && !PaneResize._dragged) return;\n PaneResize._dragged = true;\n PaneResize.setWidth(handle, startWidth + sign * delta);\n };\n const drag = controllerFor(handle);\n const end = () => drag.abort();\n const { signal } = drag;\n handle.addEventListener('pointermove', move, { signal });\n handle.addEventListener('pointerup', end, { signal });\n handle.addEventListener('pointercancel', end, { signal });\n }\n\n private static _onClick(e: MouseEvent) {\n const handle = Utils.closestInPath(e, handleSelector);\n if (!handle) return;\n // The click that ends a mouse drag is not a request to step. A keyboard\n // click (detail 0) always is, even after a touch drag that left the flag\n // set; the next pointerdown clears it. BottomSheets guards the same way.\n if (e.detail !== 0 && PaneResize._dragged) return;\n const [min, max] = PaneResize._bounds(handle);\n const current = PaneResize.width(handle);\n const next = [min, (min + max) / 2, max].find((width) => width > current + 1) ?? min;\n PaneResize.setWidth(handle, next);\n }\n\n private static _onKeyDown(e: KeyboardEvent) {\n const handle = Utils.closestInPath(e, handleSelector);\n if (!handle || !Utils.plainKey(e)) return;\n const current = PaneResize.width(handle);\n const [min, max] = PaneResize._bounds(handle);\n const amount = e.shiftKey ? step * 4 : step;\n const physical = { ArrowLeft: -amount, ArrowRight: amount }[e.key];\n let width: number;\n if (physical) width = current + (PaneResize._paneIsLeft(handle) ? physical : -physical);\n else if (e.key === 'Home') width = min;\n else if (e.key === 'End') width = max;\n else return;\n e.preventDefault();\n PaneResize.setWidth(handle, width);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }