@expressivecss/expressive 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/expandingCard.ts"],
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from \"../core/utils\";\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ExpandingCardOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: ExpandingCardOptions = {\n onOpen: null,\n onClose: null,\n};\n\nexport const EXPANDING_CARD_SELECTOR =\n \"article.expanding-card:has(> dialog.expanding-card-dialog)\";\n\n/**\n * Morphs a compact card into a full-screen modal detail surface.\n */\nexport class ExpandingCard extends Component<ExpandingCardOptions> {\n isOpen: boolean = false;\n private readonly trigger: HTMLElement | null;\n private readonly dialog: HTMLDialogElement | null;\n private readonly closeButton: HTMLElement | null;\n private closeGeneration = 0;\n // Trigger attributes as they were before init, so destroy() can restore them.\n private _initialTrigger: Record<string, string | null> = {};\n\n constructor(el: HTMLElement, options: Partial<ExpandingCardOptions>) {\n super(el, options);\n\n this.dialog = this.el.querySelector(\n \":scope > dialog.expanding-card-dialog\",\n );\n this.trigger = this.el.querySelector(\n \":scope > .expanding-card-trigger, :scope > figure > .expanding-card-trigger\",\n );\n this.closeButton =\n this.dialog?.querySelector(\".expanding-card-close\") ?? null;\n\n if (this.trigger && this.dialog) {\n for (const name of [\"aria-expanded\", \"aria-controls\", \"tabindex\", \"role\"])\n this._initialTrigger[name] = this.trigger.getAttribute(name);\n this.trigger.ariaExpanded = \"false\";\n if (this.dialog.id)\n this.trigger.setAttribute(\"aria-controls\", this.dialog.id);\n if (!this.trigger.matches(\"a[href], button, input, select, textarea\")) {\n this.trigger.tabIndex = 0;\n this.trigger.setAttribute(\"role\", \"button\");\n }\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): ExpandingCardOptions {\n return _defaults;\n }\n\n static key = 'Expressive_ExpandingCard';\n\n destroy() {\n this._events.abort();\n this._collapse();\n if (this.dialog?.open) this.dialog.close();\n for (const [name, value] of Object.entries(this._initialTrigger)) restoreAttribute(this.trigger, name, value);\n super.destroy();\n }\n\n private _setupEventHandlers = () => {\n const { signal } = this._events;\n this.trigger?.addEventListener(\"click\", this.open, { signal });\n this.trigger?.addEventListener(\"keypress\", this._handleTriggerKeypress, { signal });\n this.closeButton?.addEventListener(\"click\", this.close, { signal });\n this.dialog?.addEventListener(\"cancel\", this._handleCancel, { signal });\n this.dialog?.addEventListener(\"close\", this._handleNativeClose, { signal });\n };\n\n private _handleTriggerKeypress = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === \" \") {\n event.preventDefault();\n this.open();\n }\n };\n\n private _handleCancel = (event: Event) => {\n event.preventDefault();\n this.close();\n };\n\n private _handleNativeClose = () => {\n // A queued close event can arrive after a caller has reopened the dialog.\n if (this.dialog.open) return;\n // dialog.close() and <form method=\"dialog\"> bypass close(), so report here.\n const wasOpen = this.isOpen;\n this._collapse();\n if (wasOpen) this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n };\n\n /** Marks the card closed and invalidates any pending close. */\n private _collapse() {\n this.closeGeneration++;\n this.isOpen = false;\n if (this.trigger) this.trigger.ariaExpanded = \"false\";\n this.dialog?.classList.remove(\"expanded\");\n }\n\n private _setTransitionOrigin = () => {\n if (!this.dialog) return;\n const card = this.el.getBoundingClientRect();\n const media = this.el.querySelector<HTMLElement>(\n \":scope > figure, :scope > img\",\n );\n const mediaRect = media?.getBoundingClientRect();\n const set = (side: string, px: number) =>\n this.dialog.style.setProperty(\n `--md-comp-expanding-card-from-${side}`,\n `${Math.max(0, px)}px`,\n );\n\n set(\"top\", card.top);\n set(\"right\", window.innerWidth - card.right);\n set(\"bottom\", window.innerHeight - card.bottom);\n set(\"left\", card.left);\n set(\"media-height\", mediaRect?.height ?? 0);\n };\n\n open: () => void = () => {\n if (this.isOpen || !this.dialog || !this.trigger) return;\n this.closeGeneration++;\n\n this._setTransitionOrigin();\n this.isOpen = true;\n this.trigger.ariaExpanded = \"true\";\n this.dialog.showModal();\n // Commit the clipped start frame before asking CSS to expand it.\n void this.dialog.offsetWidth;\n this.dialog.classList.add(\"expanded\");\n this.closeButton?.focus();\n\n this._notify('open', this.options.onOpen, { current: () => this.isOpen });\n };\n\n close: () => void = () => {\n if (!this.isOpen || !this.dialog || !this.trigger) return;\n this._setTransitionOrigin();\n this._collapse();\n const generation = this.closeGeneration;\n\n this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n\n const finish = () => {\n if (generation !== this.closeGeneration || this.isOpen || !this.dialog.open) return;\n this.dialog.close();\n if (this.dialog.isConnected && this.trigger.isConnected) this.trigger.focus();\n };\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n // Wait only for the container's actual clip transition, not arbitrary\n // animations in consumer content. Cancellation also completes cleanup.\n const transitions = reducedMotion ? [] : (this.dialog.getAnimations?.() ?? [])\n .filter((animation) => (animation as CSSTransition).transitionProperty === \"clip-path\");\n if (transitions.length === 0) finish();\n else void Promise.allSettled(transitions.map((animation) => animation.finished)).then(finish);\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {\n if (el[\"Expressive_ExpandingCard\"] == undefined) {\n this.init(el as HTMLElement);\n }\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ import {
2
+ DockedDisplayPlugin
3
+ } from "./chunk-ZKWUWBUB.mjs";
4
+
5
+ // src/ts/plugins/modalDisplayPlugin.ts
6
+ var ModalDisplayPlugin = class {
7
+ constructor(el, container, onDismiss) {
8
+ /** Whether the picker, not the user, is closing the dialog. */
9
+ this._settled = false;
10
+ this._opener = null;
11
+ /** The picker fills the dialog, so a press on the dialog itself is on the scrim. */
12
+ this._handleClick = (e) => {
13
+ if (e.target === this.dialog) this.dialog.close();
14
+ };
15
+ this._handleClose = () => {
16
+ const dismissed = !this._settled;
17
+ this._settled = false;
18
+ this._opener?.focus({ preventScroll: true });
19
+ if (dismissed) this.onDismiss();
20
+ };
21
+ this.destroy = () => {
22
+ this.dialog.removeEventListener("click", this._handleClick);
23
+ this.dialog.removeEventListener("close", this._handleClose);
24
+ this.dialog.remove();
25
+ };
26
+ this.show = () => {
27
+ if (this.dialog.open) return;
28
+ const root = this.dialog.getRootNode();
29
+ this._opener = root.activeElement;
30
+ this.dialog.showModal();
31
+ };
32
+ this.hide = () => {
33
+ if (!this.dialog.open) return;
34
+ this._settled = true;
35
+ this.dialog.close();
36
+ };
37
+ this.triggers = [el];
38
+ this.onDismiss = onDismiss;
39
+ this.dialog = document.createElement("dialog");
40
+ this.dialog.className = "display-modal";
41
+ const label = el.labels?.[0]?.textContent.trim() || el.getAttribute("aria-label");
42
+ if (label) this.dialog.setAttribute("aria-label", label);
43
+ this.dialog.append(container);
44
+ el.parentElement.append(this.dialog);
45
+ this.dialog.addEventListener("click", this._handleClick);
46
+ this.dialog.addEventListener("close", this._handleClose);
47
+ }
48
+ };
49
+ function createDisplayPlugin(type, el, container, options, onDismiss) {
50
+ if (type === "modal") return new ModalDisplayPlugin(el, container, onDismiss);
51
+ if (type === "docked") return new DockedDisplayPlugin(el, container, options);
52
+ return void 0;
53
+ }
54
+ function hideModal(plugin) {
55
+ if (plugin instanceof ModalDisplayPlugin) plugin.hide();
56
+ }
57
+
58
+ export {
59
+ ModalDisplayPlugin,
60
+ createDisplayPlugin,
61
+ hideModal
62
+ };
63
+ //# sourceMappingURL=chunk-OUCHKSAW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/plugins/modalDisplayPlugin.ts"],
4
+ "sourcesContent": ["import { DockedDisplayPlugin, DockedDisplayPluginOptions } from './dockedDisplayPlugin';\n\n/**\n * Shows a picker in a modal <dialog>, which the dialog styles draw as a\n * basic dialog over a scrim. The browser keeps focus inside it. Escape or a\n * press on the scrim closes it, and the picker hears that as Cancel; the\n * picker closes it itself through hide() on Ok or Cancel. Focus goes back\n * to the field that opened it.\n */\nexport class ModalDisplayPlugin {\n /** The fields that open the dialog, as DockedDisplayPlugin keeps them. */\n readonly triggers: HTMLElement[];\n private readonly dialog: HTMLDialogElement;\n private readonly onDismiss: () => void;\n /** Whether the picker, not the user, is closing the dialog. */\n private _settled = false;\n private _opener: HTMLElement | null = null;\n\n constructor(el: HTMLElement, container: HTMLElement, onDismiss: () => void) {\n this.triggers = [el];\n this.onDismiss = onDismiss;\n this.dialog = document.createElement('dialog');\n this.dialog.className = 'display-modal';\n const label = (el as HTMLInputElement).labels?.[0]?.textContent.trim() || el.getAttribute('aria-label');\n if (label) this.dialog.setAttribute('aria-label', label);\n this.dialog.append(container);\n el.parentElement.append(this.dialog);\n this.dialog.addEventListener('click', this._handleClick);\n this.dialog.addEventListener('close', this._handleClose);\n }\n\n /** The picker fills the dialog, so a press on the dialog itself is on the scrim. */\n private _handleClick = (e: MouseEvent) => {\n if (e.target === this.dialog) this.dialog.close();\n };\n\n private _handleClose = () => {\n const dismissed = !this._settled;\n this._settled = false;\n this._opener?.focus({ preventScroll: true });\n if (dismissed) this.onDismiss();\n };\n\n destroy = () => {\n this.dialog.removeEventListener('click', this._handleClick);\n this.dialog.removeEventListener('close', this._handleClose);\n this.dialog.remove();\n };\n\n show = () => {\n if (this.dialog.open) return;\n const root = this.dialog.getRootNode() as Document | ShadowRoot;\n this._opener = root.activeElement as HTMLElement | null;\n this.dialog.showModal();\n };\n\n hide = () => {\n if (!this.dialog.open) return;\n this._settled = true;\n this.dialog.close();\n };\n}\n\nexport type DisplayPlugin = DockedDisplayPlugin | ModalDisplayPlugin;\n\n/**\n * The display plugin a picker's `displayPlugin` option names: 'docked',\n * 'modal', or none for an inline picker. `onDismiss` is the picker's Cancel.\n */\nexport function createDisplayPlugin(\n type: string | null,\n el: HTMLElement,\n container: HTMLElement,\n options: Partial<DockedDisplayPluginOptions>,\n onDismiss: () => void\n): DisplayPlugin | undefined {\n if (type === 'modal') return new ModalDisplayPlugin(el, container, onDismiss);\n if (type === 'docked') return new DockedDisplayPlugin(el, container, options);\n return undefined;\n}\n\n/** Ok and Cancel close a modal picker; a docked one stays until a click outside. */\nexport function hideModal(plugin: DisplayPlugin | undefined) {\n if (plugin instanceof ModalDisplayPlugin) plugin.hide();\n}\n"],
5
+ "mappings": ";;;;;AASO,IAAM,qBAAN,MAAyB;AAAA,EAS9B,YAAY,IAAiB,WAAwB,WAAuB;AAH5E;AAAA,SAAQ,WAAW;AACnB,SAAQ,UAA8B;AAgBtC;AAAA,SAAQ,eAAe,CAAC,MAAkB;AACxC,UAAI,EAAE,WAAW,KAAK,OAAQ,MAAK,OAAO,MAAM;AAAA,IAClD;AAEA,SAAQ,eAAe,MAAM;AAC3B,YAAM,YAAY,CAAC,KAAK;AACxB,WAAK,WAAW;AAChB,WAAK,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3C,UAAI,UAAW,MAAK,UAAU;AAAA,IAChC;AAEA,mBAAU,MAAM;AACd,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,OAAO;AAAA,IACrB;AAEA,gBAAO,MAAM;AACX,UAAI,KAAK,OAAO,KAAM;AACtB,YAAM,OAAO,KAAK,OAAO,YAAY;AACrC,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO,UAAU;AAAA,IACxB;AAEA,gBAAO,MAAM;AACX,UAAI,CAAC,KAAK,OAAO,KAAM;AACvB,WAAK,WAAW;AAChB,WAAK,OAAO,MAAM;AAAA,IACpB;AAzCE,SAAK,WAAW,CAAC,EAAE;AACnB,SAAK,YAAY;AACjB,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,YAAY;AACxB,UAAM,QAAS,GAAwB,SAAS,CAAC,GAAG,YAAY,KAAK,KAAK,GAAG,aAAa,YAAY;AACtG,QAAI,MAAO,MAAK,OAAO,aAAa,cAAc,KAAK;AACvD,SAAK,OAAO,OAAO,SAAS;AAC5B,OAAG,cAAc,OAAO,KAAK,MAAM;AACnC,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AACvD,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AAAA,EACzD;AAgCF;AAQO,SAAS,oBACd,MACA,IACA,WACA,SACA,WAC2B;AAC3B,MAAI,SAAS,QAAS,QAAO,IAAI,mBAAmB,IAAI,WAAW,SAAS;AAC5E,MAAI,SAAS,SAAU,QAAO,IAAI,oBAAoB,IAAI,WAAW,OAAO;AAC5E,SAAO;AACT;AAGO,SAAS,UAAU,QAAmC;AAC3D,MAAI,kBAAkB,mBAAoB,QAAO,KAAK;AACxD;",
6
+ "names": []
7
+ }
@@ -1,9 +1,10 @@
1
- import {
2
- Utils
3
- } from "./chunk-MNPROCZF.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ restoreAttribute
7
+ } from "./chunk-ZVLOUDIJ.mjs";
7
8
 
8
9
  // src/ts/components/cards.ts
9
10
  var _defaults = {
@@ -17,7 +18,7 @@ function hasAccessibleName(trigger) {
17
18
  if (label?.trim()) return true;
18
19
  const labelledBy = trigger.getAttribute("aria-labelledby");
19
20
  if (labelledBy) {
20
- const referencedText = labelledBy.trim().split(/\s+/).map((id) => trigger.ownerDocument.getElementById(id)?.textContent ?? "").join(" ").trim();
21
+ const referencedText = labelledBy.trim().split(/\s+/).map((id) => Utils.getElementById(trigger, id)?.textContent ?? "").join(" ").trim();
21
22
  if (referencedText) return true;
22
23
  }
23
24
  const content = trigger.cloneNode(true);
@@ -35,24 +36,17 @@ function isCardReveal(el) {
35
36
  el.querySelectorAll('button.card-reveal-trigger[type="button"]')
36
37
  ).some((trigger) => isUsableCardTrigger(trigger, el, panels[0]));
37
38
  }
38
- var Cards = class _Cards extends Component {
39
+ var Cards = class extends Component {
39
40
  constructor(el, options = {}) {
40
- super(el, options, _Cards);
41
+ super(el, options);
41
42
  this.isOpen = false;
42
43
  this._ownsRevealInitializedClass = false;
43
44
  this._initialAriaControls = /* @__PURE__ */ new Map();
44
45
  this._lastActivator = null;
45
46
  this._setupEventHandlers = () => {
46
- this._activators.forEach((activator) => {
47
- activator.addEventListener("click", this._handleClickInteraction);
48
- });
49
- this.el.addEventListener("keydown", this._handleKeydownEvent);
50
- };
51
- this._removeEventHandlers = () => {
52
- this._activators.forEach((activator) => {
53
- activator.removeEventListener("click", this._handleClickInteraction);
54
- });
55
- this.el.removeEventListener("keydown", this._handleKeydownEvent);
47
+ const { signal } = this._events;
48
+ this._activators.forEach((activator) => activator.addEventListener("click", this._handleClickInteraction, { signal }));
49
+ this.el.addEventListener("keydown", this._handleKeydownEvent, { signal });
56
50
  };
57
51
  this._handleClickInteraction = (event) => {
58
52
  this._lastActivator = event.currentTarget;
@@ -77,32 +71,24 @@ var Cards = class _Cards extends Component {
77
71
  this.cardReveal.classList.add("open");
78
72
  this.cardReveal.inert = false;
79
73
  this._activators.forEach((activator) => activator.ariaExpanded = "true");
80
- if (typeof this.options.onOpen === "function") {
81
- this.options.onOpen.call(this, this.el);
82
- }
74
+ this._notify("open", this.options.onOpen, { current: () => this.isOpen });
83
75
  };
84
76
  /**
85
77
  * Hide card reveal.
86
78
  */
87
79
  this.close = () => {
88
80
  if (!this.isOpen || !this.cardReveal) return;
89
- const focusWasInside = this.cardReveal.contains(document.activeElement);
81
+ const focused = this.el.getRootNode().activeElement;
82
+ const focusWasInside = this.cardReveal.contains(focused);
90
83
  this.isOpen = false;
91
84
  this.cardReveal.classList.remove("open");
92
85
  this.cardReveal.inert = true;
93
86
  this._activators.forEach((activator) => activator.ariaExpanded = "false");
94
- if (typeof this.options.onClose === "function") {
95
- this.options.onClose.call(this, this.el);
96
- }
87
+ this._notify("close", this.options.onClose, { current: () => !this.isOpen });
97
88
  if (focusWasInside) {
98
89
  (this._lastActivator ?? this._activators[0])?.focus();
99
90
  }
100
91
  };
101
- this.el["Expressive_Cards"] = this;
102
- this.options = {
103
- ..._Cards.defaults,
104
- ...options
105
- };
106
92
  const cardReveals = this.el.querySelectorAll(":scope > aside");
107
93
  const cardReveal = cardReveals.length === 1 ? cardReveals[0] : null;
108
94
  const activators = cardReveal ? Array.from(
@@ -130,22 +116,10 @@ var Cards = class _Cards extends Component {
130
116
  static get defaults() {
131
117
  return _defaults;
132
118
  }
133
- /**
134
- * Initializes instances of Cards.
135
- * @param els HTML elements.
136
- * @param options Component options.
137
- */
138
- static init(els, options) {
139
- return super.init(els, options, _Cards);
140
- }
141
- static getInstance(el) {
142
- return el["Expressive_Cards"];
143
- }
144
119
  /**
145
120
  * {@inheritDoc}
146
121
  */
147
122
  destroy() {
148
- this._removeEventHandlers();
149
123
  if (this.cardReveal) {
150
124
  this.cardReveal.classList.remove("open");
151
125
  this.cardReveal.inert = false;
@@ -154,30 +128,28 @@ var Cards = class _Cards extends Component {
154
128
  this._activators.forEach((activator) => {
155
129
  activator.removeAttribute("aria-expanded");
156
130
  const initialAriaControls = this._initialAriaControls.get(activator);
157
- if (initialAriaControls === null) activator.removeAttribute("aria-controls");
158
- else if (initialAriaControls !== void 0) {
159
- activator.setAttribute("aria-controls", initialAriaControls);
160
- }
131
+ if (initialAriaControls !== void 0) restoreAttribute(activator, "aria-controls", initialAriaControls);
161
132
  });
162
133
  this.isOpen = false;
163
134
  this._activators = [];
164
135
  this._initialAriaControls.clear();
165
136
  this._lastActivator = null;
166
- this.el["Expressive_Cards"] = void 0;
137
+ super.destroy();
167
138
  }
168
139
  static Init() {
169
140
  Utils.onDocumentReady(() => {
170
141
  const cards = Array.from(document.querySelectorAll(CARDS_SELECTOR)).filter(isCardReveal);
171
142
  cards.forEach((el) => {
172
- if (el && el["Expressive_Cards"] == void 0) this.init(el);
143
+ if (el["Expressive_Cards"] == void 0) this.init(el);
173
144
  });
174
145
  });
175
146
  }
176
147
  };
148
+ Cards.key = "Expressive_Cards";
177
149
 
178
150
  export {
179
151
  CARDS_SELECTOR,
180
152
  isCardReveal,
181
153
  Cards
182
154
  };
183
- //# sourceMappingURL=chunk-PM655FXL.mjs.map
155
+ //# sourceMappingURL=chunk-OYNUDOHR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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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",
6
+ "names": []
7
+ }
@@ -1,17 +1,23 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ restoreAttribute
7
+ } from "./chunk-ZVLOUDIJ.mjs";
4
8
 
5
9
  // src/ts/components/appBar.ts
6
10
  var _defaults = {};
7
- var AppBar = class _AppBar extends Component {
11
+ var OPEN_KEYS = ["Enter", "ArrowDown"];
12
+ var AppBar = class extends Component {
8
13
  constructor(el, options) {
9
- super(el, options, _AppBar);
14
+ super(el, options);
10
15
  this._observer = null;
11
16
  this._sentinel = null;
12
17
  this._input = null;
13
18
  this._view = null;
14
- this._searchOpen = false;
19
+ // The docked view's state before the first open, for destroy() to restore.
20
+ this._restore = null;
15
21
  this._onIntersect = (entries) => {
16
22
  const entry = entries[0];
17
23
  if (!entry) return;
@@ -20,49 +26,49 @@ var AppBar = class _AppBar extends Component {
20
26
  !entry.isIntersecting && entry.boundingClientRect.top < this.el.getBoundingClientRect().top
21
27
  );
22
28
  };
23
- this._onSearchViewClose = () => {
24
- this._searchOpen = this._view.open;
25
- };
29
+ // A docked view opens on focus, like a combobox popup. A full-screen
30
+ // dialog takes over the page, so reaching the field with Tab only focuses
31
+ // it (WCAG 3.2.1); a click, Enter or ArrowDown opens it.
26
32
  this._onSearchFocus = () => {
27
- if (!this._view || this._searchOpen) return;
33
+ if (!(this._view instanceof HTMLDialogElement)) this._openSearch();
34
+ };
35
+ this._onSearchKeydown = (e) => {
36
+ if (!OPEN_KEYS.includes(e.key) || Utils.isComposing(e) || !(this._view instanceof HTMLDialogElement)) return;
37
+ e.preventDefault();
38
+ this._openSearch();
39
+ };
40
+ this._openSearch = () => {
28
41
  if (this._view instanceof HTMLDialogElement) {
29
- this._searchOpen = true;
30
42
  if (!this._view.open) this._view.showModal();
31
43
  return;
32
44
  }
45
+ this._restore ?? (this._restore = { hidden: this._view.hidden, expanded: this._input.getAttribute("aria-expanded") });
33
46
  this._view.hidden = false;
34
- this._input?.setAttribute("aria-expanded", "true");
47
+ this._input.setAttribute("aria-expanded", "true");
35
48
  };
36
- this.el["Expressive_AppBar"] = this;
37
- this.options = { ..._AppBar.defaults, ...options };
38
49
  this._setupCollapse();
39
50
  this._setupSearch();
40
51
  }
41
52
  static get defaults() {
42
53
  return _defaults;
43
54
  }
44
- static init(els, options = {}) {
45
- return super.init(els, options, _AppBar);
46
- }
47
- static getInstance(el) {
48
- return el["Expressive_AppBar"];
49
- }
50
55
  destroy() {
51
56
  this._observer?.disconnect();
52
57
  this._observer = null;
53
58
  this._sentinel?.remove();
54
59
  this._sentinel = null;
55
- this._input?.removeEventListener("focus", this._onSearchFocus);
56
- this._input?.removeEventListener("click", this._onSearchFocus);
57
- this._view?.removeEventListener("close", this._onSearchViewClose);
60
+ if (this._restore) {
61
+ this._view.hidden = this._restore.hidden;
62
+ restoreAttribute(this._input, "aria-expanded", this._restore.expanded);
63
+ this._restore = null;
64
+ }
58
65
  this.el.classList.remove("collapsed");
59
- this.el["Expressive_AppBar"] = void 0;
66
+ super.destroy();
60
67
  }
61
68
  _setupCollapse() {
62
69
  if (!this.el.classList.contains("medium") && !this.el.classList.contains("large")) {
63
70
  return;
64
71
  }
65
- if (typeof IntersectionObserver === "undefined") return;
66
72
  this._sentinel = document.createElement("span");
67
73
  this._sentinel.setAttribute("aria-hidden", "true");
68
74
  this._sentinel.style.cssText = "display:block;height:0;position:relative;top:-64px;pointer-events:none;visibility:hidden";
@@ -74,18 +80,17 @@ var AppBar = class _AppBar extends Component {
74
80
  this._input = this.el.querySelector('input[type="search"]');
75
81
  if (!this._input) return;
76
82
  const id = this._input.getAttribute("aria-controls");
77
- if (id) this._view = document.getElementById(id);
78
- if (!this._view) this._view = this.el.querySelector(".search-view");
83
+ this._view = id && Utils.getElementById(this.el, id) || this.el.querySelector(".search-view");
79
84
  if (!this._view) return;
80
- this._input.addEventListener("focus", this._onSearchFocus);
81
- this._input.addEventListener("click", this._onSearchFocus);
82
- if (this._view instanceof HTMLDialogElement) {
83
- this._view.addEventListener("close", this._onSearchViewClose);
84
- }
85
+ const { signal } = this._events;
86
+ this._input.addEventListener("focus", this._onSearchFocus, { signal });
87
+ this._input.addEventListener("click", this._openSearch, { signal });
88
+ this._input.addEventListener("keydown", this._onSearchKeydown, { signal });
85
89
  }
86
90
  };
91
+ AppBar.key = "Expressive_AppBar";
87
92
 
88
93
  export {
89
94
  AppBar
90
95
  };
91
- //# sourceMappingURL=chunk-UEZUJQ66.mjs.map
96
+ //# sourceMappingURL=chunk-P6DRQ6KS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/appBar.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, restoreAttribute } from '../core/utils';\n\nconst _defaults: BaseOptions = {};\n// Keys that open a full-screen search view from its field.\nconst OPEN_KEYS = ['Enter', 'ArrowDown'];\n\n/**\n * Collapse medium/large flexible app bars on scroll, and open the related\n * search view when the search field in a search app bar is selected.\n *\n * Observation is IntersectionObserver on a sentinel after the header.\n * A scroll listener would re-enter layout on every tick; this does not.\n */\nexport class AppBar extends Component<BaseOptions> {\n private _observer: IntersectionObserver | null = null;\n private _sentinel: HTMLElement | null = null;\n private _input: HTMLInputElement | null = null;\n private _view: HTMLElement | null = null;\n // The docked view's state before the first open, for destroy() to restore.\n private _restore: { hidden: HTMLElement['hidden']; expanded: string | null } | null = null;\n\n constructor(el: HTMLElement, options: Partial<BaseOptions>) {\n super(el, options);\n this._setupCollapse();\n this._setupSearch();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n static key = 'Expressive_AppBar';\n\n destroy() {\n this._observer?.disconnect();\n this._observer = null;\n this._sentinel?.remove();\n this._sentinel = null;\n if (this._restore) {\n this._view.hidden = this._restore.hidden;\n restoreAttribute(this._input, 'aria-expanded', this._restore.expanded);\n this._restore = null;\n }\n this.el.classList.remove('collapsed');\n super.destroy();\n }\n\n private _setupCollapse() {\n if (!this.el.classList.contains('medium') && !this.el.classList.contains('large')) {\n return;\n }\n // Collapsing shrinks the header, and scroll anchoring then scrolls the page\n // back by the height it lost. The sentinel follows the header, so it moves\n // with the page and that correction cannot bring it back into view. It sits\n // 64px, the small bar's height, above the header's bottom edge. An expanded\n // bar therefore collapses once the page has scrolled by the height that\n // collapsing removes, and a collapsed bar expands when the page is back at\n // its top. Zero height and no margins keep it out of the layout.\n this._sentinel = document.createElement('span');\n this._sentinel.setAttribute('aria-hidden', 'true');\n this._sentinel.style.cssText =\n 'display:block;height:0;position:relative;top:-64px;pointer-events:none;visibility:hidden';\n this.el.insertAdjacentElement('afterend', this._sentinel);\n this._observer = new IntersectionObserver(this._onIntersect);\n this._observer.observe(this._sentinel);\n }\n\n private _onIntersect = (entries: IntersectionObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n // Collapse only when the sentinel has gone above the pinned header. A\n // sentinel below the viewport would move back into view as the bar shrank,\n // and the bar would switch sizes on every frame.\n this.el.classList.toggle(\n 'collapsed',\n !entry.isIntersecting && entry.boundingClientRect.top < this.el.getBoundingClientRect().top\n );\n };\n\n private _setupSearch() {\n this._input = this.el.querySelector('input[type=\"search\"]');\n if (!this._input) return;\n\n const id = this._input.getAttribute('aria-controls');\n this._view = (id && Utils.getElementById(this.el, id)) || this.el.querySelector('.search-view');\n if (!this._view) return;\n\n const { signal } = this._events;\n this._input.addEventListener('focus', this._onSearchFocus, { signal });\n this._input.addEventListener('click', this._openSearch, { signal });\n this._input.addEventListener('keydown', this._onSearchKeydown, { signal });\n }\n\n // A docked view opens on focus, like a combobox popup. A full-screen\n // dialog takes over the page, so reaching the field with Tab only focuses\n // it (WCAG 3.2.1); a click, Enter or ArrowDown opens it.\n private _onSearchFocus = () => {\n if (!(this._view instanceof HTMLDialogElement)) this._openSearch();\n };\n\n private _onSearchKeydown = (e: KeyboardEvent) => {\n if (!OPEN_KEYS.includes(e.key) || Utils.isComposing(e) || !(this._view instanceof HTMLDialogElement)) return;\n e.preventDefault();\n this._openSearch();\n };\n\n private _openSearch = () => {\n if (this._view instanceof HTMLDialogElement) {\n if (!this._view.open) this._view.showModal();\n return;\n }\n this._restore ??= { hidden: this._view.hidden, expanded: this._input.getAttribute('aria-expanded') };\n this._view.hidden = false;\n this._input.setAttribute('aria-expanded', 'true');\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,99 @@
1
+ import {
2
+ LineChart,
3
+ numberValue
4
+ } from "./chunk-ZM3XBHWV.mjs";
5
+
6
+ // src/ts/components/columnChart.ts
7
+ function rangeValue(cell) {
8
+ const ends = rangeParts(cell).map(numberValue);
9
+ return ends.length === 2 && !ends.includes(null) ? [Math.min(ends[0], ends[1]), Math.max(ends[0], ends[1])] : [null, null];
10
+ }
11
+ function rangeParts(cell) {
12
+ if (!cell) return [];
13
+ return cell.dataset.value?.trim().split(/\s+/) ?? cell.textContent.split(/\s*[–—]\s*|\s+(?:-|to)\s+/);
14
+ }
15
+ var baseAt = (series, index) => series.base?.[index] ?? 0;
16
+ function insets(from, to, y, clamp) {
17
+ return [clamp(Math.max(from, to), y), 100 - clamp(Math.min(from, to), y)];
18
+ }
19
+ var ColumnChart = class extends LineChart {
20
+ get _type() {
21
+ return "column-chart";
22
+ }
23
+ get _fromZero() {
24
+ return true;
25
+ }
26
+ get _points() {
27
+ return false;
28
+ }
29
+ /** A `range` series' low ends become its base; ranges do not stack. */
30
+ _arrange(series) {
31
+ const ranges = this._ranges = series.filter((each) => each.className.split(/\s+/).includes("range"));
32
+ for (const range of ranges) {
33
+ const ends = this._rows.map((row) => rangeValue(row.cells[range.column]));
34
+ range.base = ends.map(([low]) => low);
35
+ range.values = range.tops = ends.map(([, high]) => high);
36
+ }
37
+ super._arrange(series.filter((each) => !ranges.includes(each)));
38
+ }
39
+ _draw(drawn = this.series) {
40
+ const columns = document.createElement("div");
41
+ columns.className = "column-chart-columns";
42
+ columns.setAttribute("aria-hidden", "true");
43
+ const clamp = (value, y = drawn[0]?.y ?? this._y) => Math.min(100, Math.max(0, y(value)));
44
+ const stacked = this.el.classList.contains("stacked");
45
+ const zero = clamp(0);
46
+ columns.style.setProperty("--zero", `${zero}%`);
47
+ this._plot.style.setProperty("--rows", String(this.labels.length));
48
+ this.labels.forEach((_, index) => {
49
+ const row = document.createElement("div");
50
+ let below = zero;
51
+ drawn.forEach((series) => {
52
+ const to = series.tops[index];
53
+ const from = baseAt(series, index);
54
+ if (stacked && (to === null || from === null)) return;
55
+ const column = document.createElement("span");
56
+ if (to !== null) {
57
+ column.className = series.className;
58
+ column.dataset.series = series.color;
59
+ column.classList.toggle("negative", !series.base && to < from);
60
+ column.classList.toggle("floating", this._ranges.includes(series));
61
+ const [top, bottom] = insets(from, to, series.y, clamp);
62
+ column.style.setProperty("--top", `${top}%`);
63
+ column.style.setProperty("--bottom", `${bottom}%`);
64
+ below = this._start(column, series, index, below, clamp);
65
+ if (this._horizontal) column.dataset.text = series.text[index];
66
+ }
67
+ row.append(column);
68
+ });
69
+ columns.append(row);
70
+ });
71
+ return columns;
72
+ }
73
+ /**
74
+ * After update(), writes where a column grows from: its old ends, or for
75
+ * a column new to the chart, the zero line or the segment below it in a
76
+ * stack. Returns the next segment's start in a stack.
77
+ * ponytail: in a stacked mixed chart a new end-scale column starts from
78
+ * the start-scale stack; track `below` per scale if that matters.
79
+ */
80
+ _start(column, series, index, below, clamp) {
81
+ if (!this._before.length) return below;
82
+ const [top, bottom] = this._oldInsets(series, index, clamp) ?? [below, 100 - below];
83
+ column.style.setProperty("--from-top", `${top}%`);
84
+ column.style.setProperty("--from-bottom", `${bottom}%`);
85
+ return this.el.classList.contains("stacked") ? top : below;
86
+ }
87
+ /** A series' column at a row before update(), as its top and bottom insets, or null without one. */
88
+ _oldInsets(series, index, clamp) {
89
+ const old = this._before.find((each) => each.column === series.column);
90
+ const to = old?.tops[index] ?? null;
91
+ return to === null ? null : insets(baseAt(old, index), to, old.y, clamp);
92
+ }
93
+ };
94
+ ColumnChart.key = "Expressive_ColumnChart";
95
+
96
+ export {
97
+ ColumnChart
98
+ };
99
+ //# sourceMappingURL=chunk-PA7NU5AK.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/columnChart.ts"],
4
+ "sourcesContent": ["import { LineChart, LineChartOptions, numberValue, Series } from './lineChart';\n\nexport type ColumnChartOptions = LineChartOptions;\n\n/**\n * A range cell's two ends, low first: data-value=\"12 28\", or text with an\n * en dash, a spaced hyphen or \"to\" between two numbers, such as \"$12\u2013$28\".\n * Anything else is a gap.\n */\nfunction rangeValue(cell: HTMLTableCellElement | undefined): [number | null, number | null] {\n const ends = rangeParts(cell).map(numberValue);\n return ends.length === 2 && !ends.includes(null)\n ? [Math.min(ends[0]!, ends[1]!), Math.max(ends[0]!, ends[1]!)]\n : [null, null];\n}\n\n/** A range cell's data-value split at spaces, or its text split between the ends. */\nfunction rangeParts(cell: HTMLTableCellElement | undefined): string[] {\n if (!cell) return [];\n return cell.dataset.value?.trim().split(/\\s+/) ?? cell.textContent.split(/\\s*[\u2013\u2014]\\s*|\\s+(?:-|to)\\s+/);\n}\n\n/** Clamps a value's distance down the plot to the plot. */\ntype Clamp = (value: number, y: (value: number) => number) => number;\n\n/** Where a series' column starts at a row: its stacked or range base, or zero. */\nconst baseAt = (series: Series, index: number) => series.base?.[index] ?? 0;\n\n/** A column's top and bottom insets, in percent, from its two ends. */\nfunction insets(from: number, to: number, y: (value: number) => number, clamp: Clamp): [number, number] {\n return [clamp(Math.max(from, to), y), 100 - clamp(Math.min(from, to), y)];\n}\n\n/**\n * Column chart. It reads its <table>, scales, labels and tooltip like\n * LineChart, but draws each row as a group of columns from zero, or one\n * column of segments with `stacked`. A series whose header has `range`\n * reads each cell as two ends and floats a column between them. Columns\n * are HTML clipped to their value, so their rounded corners keep their\n * shape at any size.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class ColumnChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** The `range` series, whose columns float. */\n private _ranges: Series[];\n\n protected get _type() {\n return 'column-chart';\n }\n\n protected get _fromZero() {\n return true;\n }\n\n protected get _points() {\n return false;\n }\n\n static key = 'Expressive_ColumnChart';\n\n /** A `range` series' low ends become its base; ranges do not stack. */\n protected _arrange(series: Series[]) {\n const ranges = (this._ranges = series.filter((each) => each.className.split(/\\s+/).includes('range')));\n for (const range of ranges) {\n const ends = this._rows.map((row) => rangeValue(row.cells[range.column]));\n range.base = ends.map(([low]) => low);\n range.values = range.tops = ends.map(([, high]) => high);\n }\n super._arrange(series.filter((each) => !ranges.includes(each)));\n }\n\n protected _draw(drawn = this.series): Element {\n const columns = document.createElement('div');\n columns.className = 'column-chart-columns';\n columns.setAttribute('aria-hidden', 'true');\n const clamp = (value: number, y = drawn[0]?.y ?? this._y) => Math.min(100, Math.max(0, y(value)));\n const stacked = this.el.classList.contains('stacked');\n // Columns grow from zero, or from the plot edge when zero is off the scale.\n const zero = clamp(0);\n columns.style.setProperty('--zero', `${zero}%`);\n this._plot.style.setProperty('--rows', String(this.labels.length));\n\n this.labels.forEach((_, index) => {\n const row = document.createElement('div');\n let below = zero;\n drawn.forEach((series) => {\n // A stacked segment above a gap has no known base, so it is left out.\n const to = series.tops[index];\n const from = baseAt(series, index);\n if (stacked && (to === null || from === null)) return;\n const column = document.createElement('span');\n // A gap in a grouped row keeps its empty slot, so the series stay aligned.\n if (to !== null) {\n column.className = series.className;\n column.dataset.series = series.color;\n // A stacked segment never hangs from zero, so it keeps the top rounding.\n column.classList.toggle('negative', !series.base && to < from);\n column.classList.toggle('floating', this._ranges.includes(series));\n const [top, bottom] = insets(from, to, series.y, clamp);\n column.style.setProperty('--top', `${top}%`);\n column.style.setProperty('--bottom', `${bottom}%`);\n below = this._start(column, series, index, below, clamp);\n // The cell text, which a bar chart with .values writes along its bar.\n if (this._horizontal) column.dataset.text = series.text[index];\n }\n row.append(column);\n });\n columns.append(row);\n });\n return columns;\n }\n\n /**\n * After update(), writes where a column grows from: its old ends, or for\n * a column new to the chart, the zero line or the segment below it in a\n * stack. Returns the next segment's start in a stack.\n * ponytail: in a stacked mixed chart a new end-scale column starts from\n * the start-scale stack; track `below` per scale if that matters.\n */\n private _start(column: HTMLElement, series: Series, index: number, below: number, clamp: Clamp): number {\n if (!this._before.length) return below;\n const [top, bottom] = this._oldInsets(series, index, clamp) ?? [below, 100 - below];\n column.style.setProperty('--from-top', `${top}%`);\n column.style.setProperty('--from-bottom', `${bottom}%`);\n return this.el.classList.contains('stacked') ? top : below;\n }\n\n /** A series' column at a row before update(), as its top and bottom insets, or null without one. */\n private _oldInsets(series: Series, index: number, clamp: Clamp): [number, number] | null {\n const old = this._before.find((each) => each.column === series.column);\n // A stacked or range base is unknown only where the top is too.\n const to = old?.tops[index] ?? null;\n return to === null ? null : insets(baseAt(old!, index), to, old!.y, clamp);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }